diff options
-rw-r--r-- | chrome/browser/speech/speech_input_extension_manager.cc | 10 | ||||
-rw-r--r-- | content/browser/speech/google_streaming_remote_engine_unittest.cc | 6 | ||||
-rw-r--r-- | content/browser/speech/speech_recognition_manager_impl.cc | 17 | ||||
-rw-r--r-- | content/browser/speech/speech_recognition_manager_impl.h | 4 | ||||
-rw-r--r-- | content/browser/speech/speech_recognizer.cc (renamed from content/browser/speech/speech_recognizer_impl.cc) | 134 | ||||
-rw-r--r-- | content/browser/speech/speech_recognizer.h (renamed from content/browser/speech/speech_recognizer_impl.h) | 23 | ||||
-rw-r--r-- | content/browser/speech/speech_recognizer_unittest.cc (renamed from content/browser/speech/speech_recognizer_impl_unittest.cc) | 53 | ||||
-rw-r--r-- | content/content_browser.gypi | 4 | ||||
-rw-r--r-- | content/content_tests.gypi | 2 | ||||
-rw-r--r-- | content/public/common/content_switches.cc | 6 |
10 files changed, 124 insertions, 135 deletions
diff --git a/chrome/browser/speech/speech_input_extension_manager.cc b/chrome/browser/speech/speech_input_extension_manager.cc index 0e70502..93c4a80 100644 --- a/chrome/browser/speech/speech_input_extension_manager.cc +++ b/chrome/browser/speech/speech_input_extension_manager.cc @@ -207,7 +207,7 @@ void SpeechInputExtensionManager::ShutdownOnUIThread() { void SpeechInputExtensionManager::AbortAllSessionsOnIOThread() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - // TODO(primiano) The following check should not be really needed if the + // TODO(primiano): The following check should not be really needed if the // SpeechRecognitionManager and this class are destroyed in the correct order // (this class first), as it is in current chrome implementation. // However, it seems the some ChromiumOS tests violate the destruction order @@ -578,12 +578,10 @@ void SpeechInputExtensionManager::StartOnIOThread( if (state_ == kShutdown) return; - // TODO(primiano) These two checks below could be avoided, since they are + // TODO(primiano): These two checks below could be avoided, since they are // already handled in the speech recognition classes. However, since the // speech input extensions tests are bypassing the manager, we need them to - // pass the tests. A complete unit test which puts all the pieces together, - // mocking just the endpoints (the audio input controller and the URL fetcher) - // should be written. + // pass the tests. if (!GetSpeechInputExtensionInterface()->HasAudioInputDevices()) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, @@ -662,7 +660,7 @@ void SpeechInputExtensionManager::StartRecording( context.context_name = extension_name; content::SpeechRecognitionSessionConfig config; - // config.is_one_shot = true; // TODO(primiano) Uncomment when CL2.0 lands. + config.is_one_shot = true; config.language = language; config.grammars.push_back(content::SpeechRecognitionGrammar(grammar)); config.initial_context = context; diff --git a/content/browser/speech/google_streaming_remote_engine_unittest.cc b/content/browser/speech/google_streaming_remote_engine_unittest.cc index 9de06b6..6289fa0 100644 --- a/content/browser/speech/google_streaming_remote_engine_unittest.cc +++ b/content/browser/speech/google_streaming_remote_engine_unittest.cc @@ -309,13 +309,11 @@ void GoogleStreamingRemoteEngineTest::EndMockRecognition() { engine_under_test_->EndRecognition(); ASSERT_FALSE(engine_under_test_->IsRecognitionPending()); - // TODO(primiano): In order to be very pedantic we should check that both - // the upstream and downstream URL fetchers have been disposed at this time. + // TODO(primiano): In order to be very pedantic we should check that both the + // upstream and downstream URL fetchers have been disposed at this time. // Unfortunately it seems that there is no direct way to detect (in tests) // if a url_fetcher has been freed or not, since they are not automatically // de-registered from the TestURLFetcherFactory on destruction. - // ASSERT_FALSE(GetUpstreamFetcher()); - // ASSERT_FALSE(GetDownstreamFetcher()); } void GoogleStreamingRemoteEngineTest::InjectDummyAudioChunk() { diff --git a/content/browser/speech/speech_recognition_manager_impl.cc b/content/browser/speech/speech_recognition_manager_impl.cc index 65351c1..453f7af 100644 --- a/content/browser/speech/speech_recognition_manager_impl.cc +++ b/content/browser/speech/speech_recognition_manager_impl.cc @@ -9,7 +9,7 @@ #include "content/browser/speech/google_one_shot_remote_engine.h" #include "content/browser/speech/google_streaming_remote_engine.h" #include "content/browser/speech/speech_recognition_engine.h" -#include "content/browser/speech/speech_recognizer_impl.h" +#include "content/browser/speech/speech_recognizer.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/resource_context.h" @@ -94,10 +94,9 @@ int SpeechRecognitionManagerImpl::CreateSession( SpeechRecognitionEngineConfig remote_engine_config; remote_engine_config.language = config.language; remote_engine_config.grammars = config.grammars; - remote_engine_config.audio_sample_rate = - SpeechRecognizerImpl::kAudioSampleRate; + remote_engine_config.audio_sample_rate = SpeechRecognizer::kAudioSampleRate; remote_engine_config.audio_num_bits_per_sample = - SpeechRecognizerImpl::kNumBitsPerAudioSample; + SpeechRecognizer::kNumBitsPerAudioSample; remote_engine_config.filter_profanities = config.filter_profanities; remote_engine_config.hardware_info = hardware_info; remote_engine_config.origin_url = can_report_metrics ? config.origin_url : ""; @@ -113,10 +112,10 @@ int SpeechRecognitionManagerImpl::CreateSession( google_remote_engine->SetConfig(remote_engine_config); - session.recognizer = new SpeechRecognizerImpl(this, - session_id, - config.is_one_shot, - google_remote_engine); + session.recognizer = new SpeechRecognizer(this, + session_id, + config.is_one_shot, + google_remote_engine); return session_id; } @@ -365,7 +364,7 @@ void SpeechRecognitionManagerImpl::DispatchEvent(int session_id, // This FSM handles the evolution of each session, from the viewpoint of the // interaction with the user (that may be either the browser end-user which // interacts with UI bubbles, or JS developer intracting with JS methods). -// All the events received by the SpeechRecognizerImpl instances (one for each +// All the events received by the SpeechRecognizer instances (one for each // session) are always routed to the SpeechRecognitionEventListener(s) // regardless the choices taken in this FSM. void SpeechRecognitionManagerImpl::ExecuteTransitionAndGetNextState( diff --git a/content/browser/speech/speech_recognition_manager_impl.h b/content/browser/speech/speech_recognition_manager_impl.h index 37501a5..2c3d015 100644 --- a/content/browser/speech/speech_recognition_manager_impl.h +++ b/content/browser/speech/speech_recognition_manager_impl.h @@ -26,7 +26,7 @@ class SpeechRecognitionManagerDelegate; namespace speech { -class SpeechRecognizerImpl; +class SpeechRecognizer; // This is the manager for speech recognition. It is a single instance in // the browser process and can serve several requests. Each recognition request @@ -124,7 +124,7 @@ class CONTENT_EXPORT SpeechRecognitionManagerImpl : bool listener_is_active; content::SpeechRecognitionSessionConfig config; content::SpeechRecognitionSessionContext context; - scoped_refptr<SpeechRecognizerImpl> recognizer; + scoped_refptr<SpeechRecognizer> recognizer; }; // Callback issued by the SpeechRecognitionManagerDelegate for reporting diff --git a/content/browser/speech/speech_recognizer_impl.cc b/content/browser/speech/speech_recognizer.cc index 1141d9e..69f22ab 100644 --- a/content/browser/speech/speech_recognizer_impl.cc +++ b/content/browser/speech/speech_recognizer.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/speech/speech_recognizer_impl.h" +#include "content/browser/speech/speech_recognizer.h" #include "base/basictypes.h" #include "base/bind.h" @@ -68,16 +68,16 @@ void KeepAudioControllerRefcountedForDtor(scoped_refptr<AudioInputController>) { namespace speech { -const int SpeechRecognizerImpl::kAudioSampleRate = 16000; -const ChannelLayout SpeechRecognizerImpl::kChannelLayout = CHANNEL_LAYOUT_MONO; -const int SpeechRecognizerImpl::kNumBitsPerAudioSample = 16; -const int SpeechRecognizerImpl::kNoSpeechTimeoutMs = 8000; -const int SpeechRecognizerImpl::kEndpointerEstimationTimeMs = 300; +const int SpeechRecognizer::kAudioSampleRate = 16000; +const ChannelLayout SpeechRecognizer::kChannelLayout = CHANNEL_LAYOUT_MONO; +const int SpeechRecognizer::kNumBitsPerAudioSample = 16; +const int SpeechRecognizer::kNoSpeechTimeoutMs = 8000; +const int SpeechRecognizer::kEndpointerEstimationTimeMs = 300; -COMPILE_ASSERT(SpeechRecognizerImpl::kNumBitsPerAudioSample % 8 == 0, +COMPILE_ASSERT(SpeechRecognizer::kNumBitsPerAudioSample % 8 == 0, kNumBitsPerAudioSample_must_be_a_multiple_of_8); -SpeechRecognizerImpl::SpeechRecognizerImpl( +SpeechRecognizer::SpeechRecognizer( SpeechRecognitionEventListener* listener, int session_id, bool is_single_shot, @@ -108,32 +108,32 @@ SpeechRecognizerImpl::SpeechRecognizerImpl( // of causality between events and avoid interleaved event processing due to // synchronous callbacks. -void SpeechRecognizerImpl::StartRecognition() { +void SpeechRecognizer::StartRecognition() { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&SpeechRecognizerImpl::DispatchEvent, + base::Bind(&SpeechRecognizer::DispatchEvent, this, FSMEventArgs(EVENT_START))); } -void SpeechRecognizerImpl::AbortRecognition() { +void SpeechRecognizer::AbortRecognition() { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&SpeechRecognizerImpl::DispatchEvent, + base::Bind(&SpeechRecognizer::DispatchEvent, this, FSMEventArgs(EVENT_ABORT))); } -void SpeechRecognizerImpl::StopAudioCapture() { +void SpeechRecognizer::StopAudioCapture() { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&SpeechRecognizerImpl::DispatchEvent, + base::Bind(&SpeechRecognizer::DispatchEvent, this, FSMEventArgs(EVENT_STOP_CAPTURE))); } -bool SpeechRecognizerImpl::IsActive() const { +bool SpeechRecognizer::IsActive() const { // Checking the FSM state from another thread (thus, while the FSM is // potentially concurrently evolving) is meaningless. DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); return state_ != STATE_IDLE; } -bool SpeechRecognizerImpl::IsCapturingAudio() const { +bool SpeechRecognizer::IsCapturingAudio() const { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); // See IsActive(). const bool is_capturing_audio = state_ >= STATE_STARTING && state_ <= STATE_RECOGNIZING; @@ -143,11 +143,11 @@ bool SpeechRecognizerImpl::IsCapturingAudio() const { } const SpeechRecognitionEngine& -SpeechRecognizerImpl::recognition_engine() const { +SpeechRecognizer::recognition_engine() const { return *(recognition_engine_.get()); } -SpeechRecognizerImpl::~SpeechRecognizerImpl() { +SpeechRecognizer::~SpeechRecognizer() { endpointer_.EndSession(); if (audio_controller_.get()) { audio_controller_->Close(base::Bind(&KeepAudioControllerRefcountedForDtor, @@ -156,16 +156,16 @@ SpeechRecognizerImpl::~SpeechRecognizerImpl() { } // Invoked in the audio thread. -void SpeechRecognizerImpl::OnError(AudioInputController* controller, +void SpeechRecognizer::OnError(AudioInputController* controller, int error_code) { FSMEventArgs event_args(EVENT_AUDIO_ERROR); event_args.audio_error_code = error_code; BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&SpeechRecognizerImpl::DispatchEvent, + base::Bind(&SpeechRecognizer::DispatchEvent, this, event_args)); } -void SpeechRecognizerImpl::OnData(AudioInputController* controller, +void SpeechRecognizer::OnData(AudioInputController* controller, const uint8* data, uint32 size) { if (size == 0) // This could happen when audio capture stops and is normal. return; @@ -174,27 +174,27 @@ void SpeechRecognizerImpl::OnData(AudioInputController* controller, event_args.audio_data = new AudioChunk(data, static_cast<size_t>(size), kNumBitsPerAudioSample / 8); BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&SpeechRecognizerImpl::DispatchEvent, + base::Bind(&SpeechRecognizer::DispatchEvent, this, event_args)); } -void SpeechRecognizerImpl::OnAudioClosed(AudioInputController*) {} +void SpeechRecognizer::OnAudioClosed(AudioInputController*) {} -void SpeechRecognizerImpl::OnSpeechRecognitionEngineResult( +void SpeechRecognizer::OnSpeechRecognitionEngineResult( const content::SpeechRecognitionResult& result) { FSMEventArgs event_args(EVENT_ENGINE_RESULT); event_args.engine_result = result; BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&SpeechRecognizerImpl::DispatchEvent, + base::Bind(&SpeechRecognizer::DispatchEvent, this, event_args)); } -void SpeechRecognizerImpl::OnSpeechRecognitionEngineError( +void SpeechRecognizer::OnSpeechRecognitionEngineError( const content::SpeechRecognitionError& error) { FSMEventArgs event_args(EVENT_ENGINE_ERROR); event_args.engine_error = error; BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&SpeechRecognizerImpl::DispatchEvent, + base::Bind(&SpeechRecognizer::DispatchEvent, this, event_args)); } @@ -210,7 +210,7 @@ void SpeechRecognizerImpl::OnSpeechRecognitionEngineError( // TestAudioInputController is not closing asynchronously as the real controller // does, but they will become flaky if TestAudioInputController will be fixed. -void SpeechRecognizerImpl::DispatchEvent(const FSMEventArgs& event_args) { +void SpeechRecognizer::DispatchEvent(const FSMEventArgs& event_args) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); DCHECK_LE(event_args.event, EVENT_MAX_VALUE); DCHECK_LE(state_, STATE_MAX_VALUE); @@ -221,7 +221,7 @@ void SpeechRecognizerImpl::DispatchEvent(const FSMEventArgs& event_args) { is_dispatching_event_ = true; // Guard against the delegate freeing us until we finish processing the event. - scoped_refptr<SpeechRecognizerImpl> me(this); + scoped_refptr<SpeechRecognizer> me(this); if (event_args.event == EVENT_AUDIO_DATA) { DCHECK(event_args.audio_data.get() != NULL); @@ -235,8 +235,8 @@ void SpeechRecognizerImpl::DispatchEvent(const FSMEventArgs& event_args) { is_dispatching_event_ = false; } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::ExecuteTransitionAndGetNextState( +SpeechRecognizer::FSMState +SpeechRecognizer::ExecuteTransitionAndGetNextState( const FSMEventArgs& event_args) { const FSMEvent event = event_args.event; switch (state_) { @@ -354,7 +354,7 @@ SpeechRecognizerImpl::ExecuteTransitionAndGetNextState( // TODO(primiano): the audio pipeline is currently serial. However, the // clipper->endpointer->vumeter chain and the sr_engine could be parallelized. // We should profile the execution to see if it would be worth or not. -void SpeechRecognizerImpl::ProcessAudioPipeline(const AudioChunk& raw_audio) { +void SpeechRecognizer::ProcessAudioPipeline(const AudioChunk& raw_audio) { const bool route_to_endpointer = state_ >= STATE_ESTIMATING_ENVIRONMENT && state_ <= STATE_RECOGNIZING; const bool route_to_sr_engine = route_to_endpointer; @@ -378,8 +378,8 @@ void SpeechRecognizerImpl::ProcessAudioPipeline(const AudioChunk& raw_audio) { } } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::StartRecording(const FSMEventArgs&) { +SpeechRecognizer::FSMState +SpeechRecognizer::StartRecording(const FSMEventArgs&) { DCHECK(recognition_engine_.get() != NULL); DCHECK(!IsCapturingAudio()); AudioManager* audio_manager = (testing_audio_manager_ != NULL) ? @@ -387,7 +387,7 @@ SpeechRecognizerImpl::StartRecording(const FSMEventArgs&) { BrowserMainLoop::GetAudioManager(); DCHECK(audio_manager != NULL); - DVLOG(1) << "SpeechRecognizerImpl starting audio capture."; + DVLOG(1) << "SpeechRecognizer starting audio capture."; num_samples_recorded_ = 0; audio_level_ = 0; listener_->OnRecognitionStart(session_id_); @@ -425,8 +425,8 @@ SpeechRecognizerImpl::StartRecording(const FSMEventArgs&) { return STATE_STARTING; } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::StartRecognitionEngine(const FSMEventArgs& event_args) { +SpeechRecognizer::FSMState +SpeechRecognizer::StartRecognitionEngine(const FSMEventArgs& event_args) { // This is the first audio packet captured, so the recognition engine is // started and the delegate notified about the event. DCHECK(recognition_engine_.get() != NULL); @@ -440,8 +440,8 @@ SpeechRecognizerImpl::StartRecognitionEngine(const FSMEventArgs& event_args) { return STATE_ESTIMATING_ENVIRONMENT; } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::WaitEnvironmentEstimationCompletion(const FSMEventArgs&) { +SpeechRecognizer::FSMState +SpeechRecognizer::WaitEnvironmentEstimationCompletion(const FSMEventArgs&) { DCHECK(endpointer_.IsEstimatingEnvironment()); if (GetElapsedTimeMs() >= kEndpointerEstimationTimeMs) { endpointer_.SetUserInputMode(); @@ -452,8 +452,8 @@ SpeechRecognizerImpl::WaitEnvironmentEstimationCompletion(const FSMEventArgs&) { } } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::DetectUserSpeechOrTimeout(const FSMEventArgs&) { +SpeechRecognizer::FSMState +SpeechRecognizer::DetectUserSpeechOrTimeout(const FSMEventArgs&) { if (endpointer_.DidStartReceivingSpeech()) { listener_->OnSoundStart(session_id_); return STATE_RECOGNIZING; @@ -464,8 +464,8 @@ SpeechRecognizerImpl::DetectUserSpeechOrTimeout(const FSMEventArgs&) { return STATE_WAITING_FOR_SPEECH; } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::DetectEndOfSpeech(const FSMEventArgs& event_args) { +SpeechRecognizer::FSMState +SpeechRecognizer::DetectEndOfSpeech(const FSMEventArgs& event_args) { // End-of-speech detection is performed only in one-shot mode. // TODO(primiano): What about introducing a longer timeout for continuous rec? if (is_single_shot_ && endpointer_.speech_input_complete()) @@ -473,8 +473,8 @@ SpeechRecognizerImpl::DetectEndOfSpeech(const FSMEventArgs& event_args) { return STATE_RECOGNIZING; } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::StopCaptureAndWaitForResult(const FSMEventArgs&) { +SpeechRecognizer::FSMState +SpeechRecognizer::StopCaptureAndWaitForResult(const FSMEventArgs&) { DCHECK(state_ >= STATE_ESTIMATING_ENVIRONMENT && state_ <= STATE_RECOGNIZING); DVLOG(1) << "Concluding recognition"; @@ -488,16 +488,16 @@ SpeechRecognizerImpl::StopCaptureAndWaitForResult(const FSMEventArgs&) { return STATE_WAITING_FINAL_RESULT; } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::AbortSilently(const FSMEventArgs& event_args) { +SpeechRecognizer::FSMState +SpeechRecognizer::AbortSilently(const FSMEventArgs& event_args) { DCHECK_NE(event_args.event, EVENT_AUDIO_ERROR); DCHECK_NE(event_args.event, EVENT_ENGINE_ERROR); return Abort( SpeechRecognitionError(content::SPEECH_RECOGNITION_ERROR_NONE)); } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::AbortWithError(const FSMEventArgs& event_args) { +SpeechRecognizer::FSMState +SpeechRecognizer::AbortWithError(const FSMEventArgs& event_args) { if (event_args.event == EVENT_AUDIO_ERROR) { return Abort( SpeechRecognitionError(content::SPEECH_RECOGNITION_ERROR_AUDIO)); @@ -508,12 +508,12 @@ SpeechRecognizerImpl::AbortWithError(const FSMEventArgs& event_args) { SpeechRecognitionError(content::SPEECH_RECOGNITION_ERROR_ABORTED)); } -SpeechRecognizerImpl::FSMState SpeechRecognizerImpl::Abort( +SpeechRecognizer::FSMState SpeechRecognizer::Abort( const SpeechRecognitionError& error) { if (IsCapturingAudio()) CloseAudioControllerAsynchronously(); - DVLOG(1) << "SpeechRecognizerImpl canceling recognition. "; + DVLOG(1) << "SpeechRecognizer canceling recognition. "; // The recognition engine is initialized only after STATE_STARTING. if (state_ > STATE_STARTING) { @@ -535,7 +535,7 @@ SpeechRecognizerImpl::FSMState SpeechRecognizerImpl::Abort( return STATE_IDLE; } -SpeechRecognizerImpl::FSMState SpeechRecognizerImpl::ProcessIntermediateResult( +SpeechRecognizer::FSMState SpeechRecognizer::ProcessIntermediateResult( const FSMEventArgs& event_args) { // Provisional results can occur only during continuous (non one-shot) mode. // If this check is reached it means that a continuous speech recognition @@ -546,8 +546,8 @@ SpeechRecognizerImpl::FSMState SpeechRecognizerImpl::ProcessIntermediateResult( return state_; } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::ProcessFinalResult(const FSMEventArgs& event_args) { +SpeechRecognizer::FSMState +SpeechRecognizer::ProcessFinalResult(const FSMEventArgs& event_args) { const SpeechRecognitionResult& result = event_args.engine_result; if (result.is_provisional) { DCHECK(!is_single_shot_); @@ -574,36 +574,36 @@ SpeechRecognizerImpl::ProcessFinalResult(const FSMEventArgs& event_args) { } } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::DoNothing(const FSMEventArgs&) const { +SpeechRecognizer::FSMState +SpeechRecognizer::DoNothing(const FSMEventArgs&) const { return state_; // Just keep the current state. } -SpeechRecognizerImpl::FSMState -SpeechRecognizerImpl::NotFeasible(const FSMEventArgs& event_args) { +SpeechRecognizer::FSMState +SpeechRecognizer::NotFeasible(const FSMEventArgs& event_args) { NOTREACHED() << "Unfeasible event " << event_args.event << " in state " << state_; return state_; } -void SpeechRecognizerImpl::CloseAudioControllerAsynchronously() { +void SpeechRecognizer::CloseAudioControllerAsynchronously() { DCHECK(IsCapturingAudio()); - DVLOG(1) << "SpeechRecognizerImpl closing audio controller."; + DVLOG(1) << "SpeechRecognizer closing audio controller."; // Issues a Close on the audio controller, passing an empty callback. The only // purpose of such callback is to keep the audio controller refcounted until // Close has completed (in the audio thread) and automatically destroy it // afterwards (upon return from OnAudioClosed). - audio_controller_->Close(base::Bind(&SpeechRecognizerImpl::OnAudioClosed, + audio_controller_->Close(base::Bind(&SpeechRecognizer::OnAudioClosed, this, audio_controller_)); audio_controller_ = NULL; // The controller is still refcounted by Bind. } -int SpeechRecognizerImpl::GetElapsedTimeMs() const { +int SpeechRecognizer::GetElapsedTimeMs() const { return (num_samples_recorded_ * 1000) / kAudioSampleRate; } -void SpeechRecognizerImpl::UpdateSignalAndNoiseLevels(const float& rms, - bool clip_detected) { +void SpeechRecognizer::UpdateSignalAndNoiseLevels(const float& rms, + bool clip_detected) { // Calculate the input volume to display in the UI, smoothing towards the // new level. // TODO(primiano): Do we really need all this floating point arith here? @@ -624,19 +624,19 @@ void SpeechRecognizerImpl::UpdateSignalAndNoiseLevels(const float& rms, session_id_, clip_detected ? 1.0f : audio_level_, noise_level); } -void SpeechRecognizerImpl::SetAudioManagerForTesting( +void SpeechRecognizer::SetAudioManagerForTesting( AudioManager* audio_manager) { testing_audio_manager_ = audio_manager; } -SpeechRecognizerImpl::FSMEventArgs::FSMEventArgs(FSMEvent event_value) +SpeechRecognizer::FSMEventArgs::FSMEventArgs(FSMEvent event_value) : event(event_value), audio_error_code(0), audio_data(NULL), engine_error(content::SPEECH_RECOGNITION_ERROR_NONE) { } -SpeechRecognizerImpl::FSMEventArgs::~FSMEventArgs() { +SpeechRecognizer::FSMEventArgs::~FSMEventArgs() { } } // namespace speech diff --git a/content/browser/speech/speech_recognizer_impl.h b/content/browser/speech/speech_recognizer.h index 89e41e6..c523f27 100644 --- a/content/browser/speech/speech_recognizer_impl.h +++ b/content/browser/speech/speech_recognizer.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_IMPL_H_ -#define CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_IMPL_H_ +#ifndef CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_H_ +#define CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_H_ #pragma once #include "base/basictypes.h" @@ -25,14 +25,11 @@ class AudioManager; } namespace speech { - -// TODO(primiano) Next CL: Remove the Impl suffix. - // Handles speech recognition for a session (identified by |session_id|), taking // care of audio capture, silence detection/endpointer and interaction with the // SpeechRecognitionEngine. -class CONTENT_EXPORT SpeechRecognizerImpl - : public base::RefCountedThreadSafe<SpeechRecognizerImpl>, +class CONTENT_EXPORT SpeechRecognizer + : public base::RefCountedThreadSafe<SpeechRecognizer>, public media::AudioInputController::EventHandler, public NON_EXPORTED_BASE(SpeechRecognitionEngineDelegate) { public: @@ -42,7 +39,7 @@ class CONTENT_EXPORT SpeechRecognizerImpl static const int kNoSpeechTimeoutMs; static const int kEndpointerEstimationTimeMs; - SpeechRecognizerImpl( + SpeechRecognizer( content::SpeechRecognitionEventListener* listener, int session_id, bool is_single_shot, @@ -56,8 +53,8 @@ class CONTENT_EXPORT SpeechRecognizerImpl const SpeechRecognitionEngine& recognition_engine() const; private: - friend class base::RefCountedThreadSafe<SpeechRecognizerImpl>; - friend class SpeechRecognizerImplTest; + friend class base::RefCountedThreadSafe<SpeechRecognizer>; + friend class SpeechRecognizerTest; enum FSMState { STATE_IDLE = 0, @@ -91,7 +88,7 @@ class CONTENT_EXPORT SpeechRecognizerImpl content::SpeechRecognitionError engine_error; }; - virtual ~SpeechRecognizerImpl(); + virtual ~SpeechRecognizer(); // Entry point for pushing any new external event into the recognizer FSM. void DispatchEvent(const FSMEventArgs& event_args); @@ -157,9 +154,9 @@ class CONTENT_EXPORT SpeechRecognizerImpl bool is_single_shot_; FSMState state_; - DISALLOW_COPY_AND_ASSIGN(SpeechRecognizerImpl); + DISALLOW_COPY_AND_ASSIGN(SpeechRecognizer); }; } // namespace speech -#endif // CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_IMPL_H_ +#endif // CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_H_ diff --git a/content/browser/speech/speech_recognizer_impl_unittest.cc b/content/browser/speech/speech_recognizer_unittest.cc index 4a487c3..8631217 100644 --- a/content/browser/speech/speech_recognizer_impl_unittest.cc +++ b/content/browser/speech/speech_recognizer_unittest.cc @@ -6,7 +6,7 @@ #include "content/browser/browser_thread_impl.h" #include "content/browser/speech/google_one_shot_remote_engine.h" -#include "content/browser/speech/speech_recognizer_impl.h" +#include "content/browser/speech/speech_recognizer.h" #include "content/public/browser/speech_recognition_event_listener.h" #include "media/audio/audio_manager.h" #include "media/audio/fake_audio_input_stream.h" @@ -92,10 +92,10 @@ class MockAudioManager : public media::AudioManagerBase { namespace speech { -class SpeechRecognizerImplTest : public content::SpeechRecognitionEventListener, - public testing::Test { +class SpeechRecognizerTest : public content::SpeechRecognitionEventListener, + public testing::Test { public: - SpeechRecognizerImplTest() + SpeechRecognizerTest() : io_thread_(BrowserThread::IO, &message_loop_), audio_manager_(new MockAudioManager()), recognition_started_(false), @@ -107,27 +107,26 @@ class SpeechRecognizerImplTest : public content::SpeechRecognitionEventListener, sound_ended_(false), error_(content::SPEECH_RECOGNITION_ERROR_NONE), volume_(-1.0f) { - // SpeechRecognizerImpl takes ownership of sr_engine. + // SpeechRecognizer takes ownership of sr_engine. SpeechRecognitionEngine* sr_engine = new GoogleOneShotRemoteEngine(NULL /* URLRequestContextGetter */); SpeechRecognitionEngineConfig config; - config.audio_num_bits_per_sample = - SpeechRecognizerImpl::kNumBitsPerAudioSample; - config.audio_sample_rate = SpeechRecognizerImpl::kAudioSampleRate; + config.audio_num_bits_per_sample = SpeechRecognizer::kNumBitsPerAudioSample; + config.audio_sample_rate = SpeechRecognizer::kAudioSampleRate; config.filter_profanities = false; sr_engine->SetConfig(config); const int kTestingSessionId = 1; const bool kOneShotMode = true; - recognizer_ = new SpeechRecognizerImpl( + recognizer_ = new SpeechRecognizer( this, kTestingSessionId, kOneShotMode, sr_engine); recognizer_->SetAudioManagerForTesting(audio_manager_.get()); int audio_packet_length_bytes = - (SpeechRecognizerImpl::kAudioSampleRate * + (SpeechRecognizer::kAudioSampleRate * GoogleOneShotRemoteEngine::kAudioPacketIntervalMs * - ChannelLayoutToChannelCount(SpeechRecognizerImpl::kChannelLayout) * - SpeechRecognizerImpl::kNumBitsPerAudioSample) / (8 * 1000); + ChannelLayoutToChannelCount(SpeechRecognizer::kChannelLayout) * + SpeechRecognizer::kNumBitsPerAudioSample) / (8 * 1000); audio_packet_.resize(audio_packet_length_bytes); } @@ -228,7 +227,7 @@ class SpeechRecognizerImplTest : public content::SpeechRecognitionEventListener, protected: MessageLoopForIO message_loop_; BrowserThreadImpl io_thread_; - scoped_refptr<SpeechRecognizerImpl> recognizer_; + scoped_refptr<SpeechRecognizer> recognizer_; scoped_ptr<AudioManager> audio_manager_; bool recognition_started_; bool recognition_ended_; @@ -245,7 +244,7 @@ class SpeechRecognizerImplTest : public content::SpeechRecognitionEventListener, float noise_volume_; }; -TEST_F(SpeechRecognizerImplTest, StopNoData) { +TEST_F(SpeechRecognizerTest, StopNoData) { // Check for callbacks when stopping record before any audio gets recorded. recognizer_->StartRecognition(); recognizer_->StopAudioCapture(); @@ -257,7 +256,7 @@ TEST_F(SpeechRecognizerImplTest, StopNoData) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, CancelNoData) { +TEST_F(SpeechRecognizerTest, CancelNoData) { // Check for callbacks when canceling recognition before any audio gets // recorded. recognizer_->StartRecognition(); @@ -270,7 +269,7 @@ TEST_F(SpeechRecognizerImplTest, CancelNoData) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, StopWithData) { +TEST_F(SpeechRecognizerTest, StopWithData) { // Start recording, give some data and then stop. This should wait for the // network callback to arrive before completion. recognizer_->StartRecognition(); @@ -320,7 +319,7 @@ TEST_F(SpeechRecognizerImplTest, StopWithData) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, CancelWithData) { +TEST_F(SpeechRecognizerTest, CancelWithData) { // Start recording, give some data and then cancel. recognizer_->StartRecognition(); MessageLoop::current()->RunAllPending(); @@ -340,7 +339,7 @@ TEST_F(SpeechRecognizerImplTest, CancelWithData) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, ConnectionError) { +TEST_F(SpeechRecognizerTest, ConnectionError) { // Start recording, give some data and then stop. Issue the network callback // with a connection error and verify that the recognizer bubbles the error up recognizer_->StartRecognition(); @@ -378,7 +377,7 @@ TEST_F(SpeechRecognizerImplTest, ConnectionError) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, ServerError) { +TEST_F(SpeechRecognizerTest, ServerError) { // Start recording, give some data and then stop. Issue the network callback // with a 500 error and verify that the recognizer bubbles the error up recognizer_->StartRecognition(); @@ -415,7 +414,7 @@ TEST_F(SpeechRecognizerImplTest, ServerError) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, AudioControllerErrorNoData) { +TEST_F(SpeechRecognizerTest, AudioControllerErrorNoData) { // Check if things tear down properly if AudioInputController threw an error. recognizer_->StartRecognition(); MessageLoop::current()->RunAllPending(); @@ -431,7 +430,7 @@ TEST_F(SpeechRecognizerImplTest, AudioControllerErrorNoData) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, AudioControllerErrorWithData) { +TEST_F(SpeechRecognizerTest, AudioControllerErrorWithData) { // Check if things tear down properly if AudioInputController threw an error // after giving some audio data. recognizer_->StartRecognition(); @@ -451,7 +450,7 @@ TEST_F(SpeechRecognizerImplTest, AudioControllerErrorWithData) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackIssued) { +TEST_F(SpeechRecognizerTest, NoSpeechCallbackIssued) { // Start recording and give a lot of packets with audio samples set to zero. // This should trigger the no-speech detector and issue a callback. recognizer_->StartRecognition(); @@ -460,7 +459,7 @@ TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackIssued) { audio_input_controller_factory_.controller(); ASSERT_TRUE(controller); - int num_packets = (SpeechRecognizerImpl::kNoSpeechTimeoutMs) / + int num_packets = (SpeechRecognizer::kNoSpeechTimeoutMs) / GoogleOneShotRemoteEngine::kAudioPacketIntervalMs + 1; // The vector is already filled with zero value samples on create. for (int i = 0; i < num_packets; ++i) { @@ -475,7 +474,7 @@ TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackIssued) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackNotIssued) { +TEST_F(SpeechRecognizerTest, NoSpeechCallbackNotIssued) { // Start recording and give a lot of packets with audio samples set to zero // and then some more with reasonably loud audio samples. This should be // treated as normal speech input and the no-speech detector should not get @@ -488,7 +487,7 @@ TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackNotIssued) { controller = audio_input_controller_factory_.controller(); ASSERT_TRUE(controller); - int num_packets = (SpeechRecognizerImpl::kNoSpeechTimeoutMs) / + int num_packets = (SpeechRecognizer::kNoSpeechTimeoutMs) / GoogleOneShotRemoteEngine::kAudioPacketIntervalMs; // The vector is already filled with zero value samples on create. @@ -513,7 +512,7 @@ TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackNotIssued) { CheckFinalEventsConsistency(); } -TEST_F(SpeechRecognizerImplTest, SetInputVolumeCallback) { +TEST_F(SpeechRecognizerTest, SetInputVolumeCallback) { // Start recording and give a lot of packets with audio samples set to zero // and then some more with reasonably loud audio samples. Check that we don't // get the callback during estimation phase, then get zero for the silence @@ -527,7 +526,7 @@ TEST_F(SpeechRecognizerImplTest, SetInputVolumeCallback) { ASSERT_TRUE(controller); // Feed some samples to begin with for the endpointer to do noise estimation. - int num_packets = SpeechRecognizerImpl::kEndpointerEstimationTimeMs / + int num_packets = SpeechRecognizer::kEndpointerEstimationTimeMs / GoogleOneShotRemoteEngine::kAudioPacketIntervalMs; FillPacketWithNoise(); for (int i = 0; i < num_packets; ++i) { diff --git a/content/content_browser.gypi b/content/content_browser.gypi index 7d585ac..f17ab16 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi @@ -680,8 +680,8 @@ 'browser/speech/speech_recognition_engine.h', 'browser/speech/speech_recognition_manager_impl.cc', 'browser/speech/speech_recognition_manager_impl.h', - 'browser/speech/speech_recognizer_impl.cc', - 'browser/speech/speech_recognizer_impl.h', + 'browser/speech/speech_recognizer.cc', + 'browser/speech/speech_recognizer.h', 'browser/ssl/ssl_cert_error_handler.cc', 'browser/ssl/ssl_cert_error_handler.h', 'browser/ssl/ssl_client_auth_handler.cc', diff --git a/content/content_tests.gypi b/content/content_tests.gypi index 5bedd31..6c4ac20 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi @@ -288,7 +288,7 @@ 'browser/speech/endpointer/endpointer_unittest.cc', 'browser/speech/google_one_shot_remote_engine_unittest.cc', 'browser/speech/google_streaming_remote_engine_unittest.cc', - 'browser/speech/speech_recognizer_impl_unittest.cc', + 'browser/speech/speech_recognizer_unittest.cc', 'browser/ssl/ssl_host_state_unittest.cc', 'browser/system_message_window_win_unittest.cc', 'browser/trace_subscriber_stdio_unittest.cc', diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index b9ee10a..7aa4439 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc @@ -202,12 +202,10 @@ const char kEnableScriptedSpeech[] = "enable-scripted-speech"; // TODO(primiano): Remove the two switches below when the URL becomes public. // Specifies the webservice URL for continuous speech recognition. -const char kSpeechRecognitionWebserviceURL[] = - "speech-service"; +const char kSpeechRecognitionWebserviceURL[] = "speech-service"; // Specifies the request key for the continuous speech recognition webservice. -const char kSpeechRecognitionWebserviceKey[] = - "speech-service-key"; +const char kSpeechRecognitionWebserviceKey[] = "speech-service-key"; // Disables animation on the compositor thread. const char kDisableThreadedAnimation[] = "disable-threaded-animation"; |