Index: content/browser/speech/speech_recognizer_impl.h |
diff --git a/content/browser/speech/speech_recognizer_impl.h b/content/browser/speech/speech_recognizer_impl.h |
index 516dfea1560bd2a33b6f9729de7e7e7c77bda0e5..a2cce74f077a101dd757f7f4225a65a6bd6ac53c 100644 |
--- a/content/browser/speech/speech_recognizer_impl.h |
+++ b/content/browser/speech/speech_recognizer_impl.h |
@@ -12,6 +12,7 @@ |
#include "content/browser/speech/speech_recognition_engine.h" |
#include "content/public/browser/speech_recognizer.h" |
#include "content/public/common/speech_recognition_error.h" |
+#include "content/public/common/speech_recognition_result.h" |
#include "media/audio/audio_input_controller.h" |
#include "net/url_request/url_request_context_getter.h" |
@@ -27,8 +28,13 @@ class AudioManager; |
namespace speech { |
-// Records audio, sends recorded audio to server and translates server response |
-// to recognition result. |
+// TODO(primiano) Next CL: Remove the Impl suffix and the exported |
+// /content/public/browser/speech_recognizer.h interface since this class should |
+// not be visible outside (currently we need it for speech input extension API). |
+ |
+// Handles speech recognition for a session (identified by |caller_id|), taking |
+// care of audio capture, silence detection/endpointer and interaction with the |
+// SpeechRecognitionEngine. |
class CONTENT_EXPORT SpeechRecognizerImpl |
: public NON_EXPORTED_BASE(content::SpeechRecognizer), |
public media::AudioInputController::EventHandler, |
@@ -41,14 +47,9 @@ class CONTENT_EXPORT SpeechRecognizerImpl |
static const int kEndpointerEstimationTimeMs; |
SpeechRecognizerImpl( |
- content::SpeechRecognitionEventListener* listener, |
- int caller_id, |
- const std::string& language, |
- const std::string& grammar, |
- net::URLRequestContextGetter* context_getter, |
- bool filter_profanities, |
- const std::string& hardware_info, |
- const std::string& origin_url); |
+ content::SpeechRecognitionEventListener* listener, |
+ int caller_id, |
+ SpeechRecognitionEngine* engine); |
virtual ~SpeechRecognizerImpl(); |
// content::SpeechRecognizer methods. |
@@ -59,14 +60,86 @@ class CONTENT_EXPORT SpeechRecognizerImpl |
virtual bool IsCapturingAudio() const OVERRIDE; |
const SpeechRecognitionEngine& recognition_engine() const; |
+ private: |
+ friend class SpeechRecognizerImplTest; |
+ |
+ enum FSMState { |
+ STATE_IDLE = 0, |
+ STATE_STARTING, |
+ STATE_ESTIMATING_ENVIRONMENT, |
+ STATE_WAITING_FOR_SPEECH, |
+ STATE_RECOGNIZING, |
+ STATE_WAITING_FINAL_RESULT, |
+ STATE_MAX_VALUE = STATE_WAITING_FINAL_RESULT |
Primiano Tucci (use gerrit)
2012/04/12 17:38:06
Renamed due to a name clash on windows (STATE_MAX
|
+ }; |
+ |
+ enum FSMEvent { |
+ EVENT_ABORT = 0, |
+ EVENT_START, |
+ EVENT_STOP_CAPTURE, |
+ EVENT_AUDIO_DATA, |
+ EVENT_ENGINE_RESULT, |
+ EVENT_ENGINE_ERROR, |
+ EVENT_AUDIO_ERROR, |
+ EVENT_MAX_VALUE = EVENT_AUDIO_ERROR |
+ }; |
+ |
+ struct FSMEventArgs { |
+ explicit FSMEventArgs(FSMEvent event_value); |
+ ~FSMEventArgs(); |
+ |
+ FSMEvent event; |
+ int audio_error_code; |
+ scoped_refptr<AudioChunk> audio_data; |
+ content::SpeechRecognitionResult engine_result; |
+ content::SpeechRecognitionError engine_error; |
+ }; |
+ |
+ // Entry point for pushing any new external event into the recognizer FSM. |
+ void DispatchEvent(const FSMEventArgs& event_args); |
+ |
+ // Defines the behavior of the recognizer FSM, selecting the appropriate |
+ // transition according to the current state and event. |
+ FSMState ExecuteTransitionAndGetNextState(const FSMEventArgs& args); |
+ |
+ // Process a new audio chunk in the audio pipeline (endpointer, vumeter, etc). |
+ void ProcessAudioPipeline(const AudioChunk& raw_audio); |
+ |
+ // The methods below handle transitions of the recognizer FSM. |
+ FSMState StartRecording(const FSMEventArgs& event_args); |
+ FSMState StartRecognitionEngine(const FSMEventArgs& event_args); |
+ FSMState WaitEnvironmentEstimationCompletion(const FSMEventArgs& event_args); |
+ FSMState DetectUserSpeechOrTimeout(const FSMEventArgs& event_args); |
+ FSMState StopCaptureAndWaitForResult(const FSMEventArgs& event_args); |
+ FSMState ProcessIntermediateResult(const FSMEventArgs& event_args); |
+ FSMState ProcessFinalResult(const FSMEventArgs& event_args); |
+ FSMState Abort(const FSMEventArgs& event_args); |
+ FSMState AbortWithError(const content::SpeechRecognitionError* error); |
+ FSMState AbortWithError(const content::SpeechRecognitionError& error); |
+ FSMState DetectEndOfSpeech(const FSMEventArgs& event_args); |
+ FSMState DoNothing(const FSMEventArgs& event_args) const; |
+ FSMState NotFeasible(const FSMEventArgs& event_args); |
+ |
+ // Returns the time span of captured audio samples since the start of capture. |
+ int GetElapsedTimeMs() const; |
+ |
+ // Calculates the input volume to be displayed in the UI, triggering the |
+ // OnAudioLevelsChange event accordingly. |
+ void UpdateSignalAndNoiseLevels(const float& rms, bool clip_detected); |
+ |
+ void CloseAudioControllerAsynchronously(); |
+ void SetAudioManagerForTesting(media::AudioManager* audio_manager); |
+ |
+ // Callback called on IO thread by audio_controller->Close(). |
+ void OnAudioClosed(media::AudioInputController*); |
+ |
// AudioInputController::EventHandler methods. |
virtual void OnCreated(media::AudioInputController* controller) OVERRIDE {} |
virtual void OnRecording(media::AudioInputController* controller) OVERRIDE {} |
virtual void OnError(media::AudioInputController* controller, |
int error_code) OVERRIDE; |
virtual void OnData(media::AudioInputController* controller, |
- const uint8* data, |
- uint32 size) OVERRIDE; |
+ const uint8* data, uint32 size) OVERRIDE; |
// SpeechRecognitionEngineDelegate methods. |
virtual void OnSpeechRecognitionEngineResult( |
@@ -74,40 +147,16 @@ class CONTENT_EXPORT SpeechRecognizerImpl |
virtual void OnSpeechRecognitionEngineError( |
const content::SpeechRecognitionError& error) OVERRIDE; |
- private: |
- friend class SpeechRecognizerImplTest; |
- |
- void InformErrorAndAbortRecognition( |
- content::SpeechRecognitionErrorCode error); |
- void SendRecordedAudioToServer(); |
- |
- void HandleOnError(int error_code); // Handles OnError in the IO thread. |
- |
- // Handles OnData in the IO thread. |
- void HandleOnData(scoped_refptr<AudioChunk> raw_audio); |
- |
- void OnAudioClosed(media::AudioInputController*); |
- |
- // Helper method which closes the audio controller and frees it asynchronously |
- // without blocking the IO thread. |
- void CloseAudioControllerAsynchronously(); |
- |
- void SetAudioManagerForTesting(media::AudioManager* audio_manager); |
- |
content::SpeechRecognitionEventListener* listener_; |
media::AudioManager* testing_audio_manager_; |
scoped_ptr<SpeechRecognitionEngine> recognition_engine_; |
Endpointer endpointer_; |
scoped_refptr<media::AudioInputController> audio_controller_; |
- scoped_refptr<net::URLRequestContextGetter> context_getter_; |
int caller_id_; |
- std::string language_; |
- std::string grammar_; |
- bool filter_profanities_; |
- std::string hardware_info_; |
- std::string origin_url_; |
int num_samples_recorded_; |
float audio_level_; |
+ bool is_dispatching_event_; |
+ FSMState state_; |
DISALLOW_COPY_AND_ASSIGN(SpeechRecognizerImpl); |
}; |