if (utterance.isLast()) { speakable.completed(); }
    private boolean outputUtterance(Utterance utterance, BulkTimer timer) {	boolean ok = true;	FreeTTSSpeakable speakable = utterance.getSpeakable();	if (!speakable.isCompleted())  {	    if (utterance.isFirst()) {		audioPlayer.reset();		speakable.started();		log(" --- started ---");	    }	    // log("   utt: " + utterance.getString("input_text"));	    try {		runProcessor(audioOutput, utterance, timer);	    }  catch (ProcessException pe) {		ok = false;	    }	    if (ok && utterance.isLast()) {		audioPlayer.drain();                speakable.completed();                log(" --- completed ---");	    } else if (!ok) {		audioPlayer.drain();		speakable.cancelled();                log(" --- cancelled ---");	    } else {                log(" --- not last: " + speakable.getText() + " --- ");            }            log("Calling speakable.completed() on " + speakable.getText());        } else {	    ok = false;            log("STRANGE: speakable already completed: " +speakable.getText());	}        if (utterance.isLast()) {            speakable.completed();        }	return ok;    }