Chromium Code Reviews| Index: content/browser/speech/speech_recognizer.cc |
| diff --git a/content/browser/speech/speech_recognizer.cc b/content/browser/speech/speech_recognizer.cc |
| index 295f156c7efba488efa9a8457bce92a4a94b20e2..6f0cee2434b00aa336aa2bba986da848c350c1f2 100644 |
| --- a/content/browser/speech/speech_recognizer.cc |
| +++ b/content/browser/speech/speech_recognizer.cc |
| @@ -145,6 +145,7 @@ void SpeechRecognizer::StopRecording() { |
| audio_controller_->Close(); |
| audio_controller_ = NULL; // Releases the ref ptr. |
| + delegate_->DidStopReceivingSpeech(caller_id_); |
| delegate_->DidCompleteRecording(caller_id_); |
| // UploadAudioChunk requires a non-empty final buffer. So we encode a packet |
| @@ -186,7 +187,7 @@ void SpeechRecognizer::HandleOnError(int error_code) { |
| if (!audio_controller_.get()) |
| return; |
| - InformErrorAndCancelRecognition(RECOGNIZER_ERROR_CAPTURE); |
| + InformErrorAndCancelRecognition(kErrorAudio); |
| } |
| void SpeechRecognizer::OnData(AudioInputController* controller, |
| @@ -210,6 +211,8 @@ void SpeechRecognizer::HandleOnData(string* data) { |
| return; |
| } |
| + bool speech_was_heard_before_packet = endpointer_.DidStartReceivingSpeech(); |
| + |
| const short* samples = reinterpret_cast<const short*>(data->data()); |
| DCHECK((data->length() % sizeof(short)) == 0); |
| int num_samples = data->length() / sizeof(short); |
| @@ -246,12 +249,16 @@ void SpeechRecognizer::HandleOnData(string* data) { |
| } |
| // Check if we have waited too long without hearing any speech. |
| - if (!endpointer_.DidStartReceivingSpeech() && |
| + bool speech_was_heard_after_packet = endpointer_.DidStartReceivingSpeech(); |
| + if (!speech_was_heard_after_packet && |
| num_samples_recorded_ >= kNoSpeechTimeoutSec * kAudioSampleRate) { |
| - InformErrorAndCancelRecognition(RECOGNIZER_ERROR_NO_SPEECH); |
| + InformErrorAndCancelRecognition(kErrorNoSpeech); |
| return; |
| } |
| + if (!speech_was_heard_before_packet && speech_was_heard_after_packet) |
| + delegate_->DidStartReceivingSpeech(caller_id_); |
| + |
| // Calculate the input volume to display in the UI, smoothing towards the |
| // new level. |
| float level = (rms - kAudioMeterMinDb) / |
| @@ -271,30 +278,35 @@ void SpeechRecognizer::HandleOnData(string* data) { |
| delegate_->SetInputVolume(caller_id_, did_clip ? 1.0f : audio_level_, |
| noise_level); |
| - if (endpointer_.speech_input_complete()) { |
| + if (endpointer_.speech_input_complete()) |
| StopRecording(); |
| - } |
| // TODO(satish): Once we have streaming POST, start sending the data received |
|
Satish
2011/10/06 09:09:06
This todo looks obsolete as we are uploading audio
Leandro GraciĆ” Gil
2011/10/06 18:26:25
Done.
|
| // here as POST chunks. |
| } |
| void SpeechRecognizer::SetRecognitionResult( |
| - bool error, const SpeechInputResultArray& result) { |
| - if (error || result.empty()) { |
| - InformErrorAndCancelRecognition(error ? RECOGNIZER_ERROR_NETWORK : |
| - RECOGNIZER_ERROR_NO_RESULTS); |
| + bool error, const SpeechInputResult& result) { |
| + if (error) { |
| + // Request failed or received an invalid response that couldn't be parsed. |
| + InformErrorAndCancelRecognition(kErrorNetwork); |
| return; |
| } |
| - delegate_->SetRecognitionResult(caller_id_, error, result); |
| + if (result.error != kErrorNone) { |
| + InformErrorAndCancelRecognition(result.error); |
| + return; |
| + } |
| // Guard against the delegate freeing us until we finish our job. |
| scoped_refptr<SpeechRecognizer> me(this); |
| + delegate_->SetRecognitionResult(caller_id_, error, result); |
| delegate_->DidCompleteRecognition(caller_id_); |
| } |
| -void SpeechRecognizer::InformErrorAndCancelRecognition(ErrorCode error) { |
| +void SpeechRecognizer::InformErrorAndCancelRecognition( |
| + SpeechInputError error) { |
| + DCHECK_NE(error, kErrorNone); |
| CancelRecognition(); |
| // Guard against the delegate freeing us until we finish our job. |