How to reset speeds based on variables?

I am setting my player to have a cool down after running. My problem is:

After running in game, and the timer hits 0, my character is still set to the slow speed instead of reverting back to the original speed.
However, after another 15 seconds of holding down shift, my character reverts to normal, but now after the timer hits 0 will not slow down. Any help is appreciated! Thank you for your time.

public float walkSpeed = 6.0f;
public float walk;
public float runSpeed = 11.0f;
public float run;
public float crouchSpeed = 2.0f;
public float crouch;

public float slowSpeedWalk = 1.0f;
public float slowSpeedRun = 1.5f;
public float slowSpeedCrouch = .5f;

void Start() {
 ........
 ........
    Init ();		
}

public void Init(){
	walk = walkSpeed;
	run = runSpeed;
	crouch = crouchSpeed;
	endTime = runTimer;
}	

void FixedUpdate(){
    .......
    ....... 
    if ((Input.GetKey ("left shift") || Input.GetKey ("right shift"))) {
    	if (endTime <= 15) {
    	        endTime -= Time.deltaTime;
    	}
    	if (endTime <= 0) {
    	    runSpeed = slowSpeedRun;
    	    walkSpeed = slowSpeedWalk;
    	    crouchSpeed = slowSpeedCrouch;
    	    endTime = 0;
    	    StartCoroutine(Reset(6f));
    	}									
    } else {
    	if (endTime <= 15) {
            endTime += Time.deltaTime;
    	}
    	if (endTime >= 15) {
    	    endTime = 15;
        }
    } 
}

 ........
 ........
IEnumerator Reset(float wait){
	yield return new WaitForSeconds(wait);
	Init ();
}

Try the following (using just coroutines):

void Start (){
    StartCoroutine(Speed());
}

private IEnumerator Speed(){
    while (true){
        endTime = 15;
        SetSpeedNormal();
        while (endTime >= 0){
            if((Input.GetKey ("left shift") || Input.GetKey ("right shift"))) {
                endTime -= Time.deltaTime;
            } else {                
                if (endTime < 15){
                    endTime += Time.deltaTime;
                }
            }
            yield return null;
        }
        SetSpeedSlow();
        yield return new WaitForSeconds(6);
    }
}

private void SetSpeedNormal (){
    walk = walkSpeed;
    run = runSpeed;
    crouch = crouchSpeed;
}

private void SetSpeedSlow (){
    walk = slowWalkSpeed;
    run = slowRunSpeed;
    crouch = slowCrouchSpeed;
}

Part of the problem of the original script is you changed the values of runSpeed ect. This meant that your init method would not set them back to the initial values.