OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/speech/google_streaming_remote_engine.h" | 5 #include "content/browser/speech/google_streaming_remote_engine.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 downstream_args.push_back( | 320 downstream_args.push_back( |
321 "key=" + net::EscapeQueryParamValue(GetAPIKey(), true)); | 321 "key=" + net::EscapeQueryParamValue(GetAPIKey(), true)); |
322 downstream_args.push_back("pair=" + request_key); | 322 downstream_args.push_back("pair=" + request_key); |
323 downstream_args.push_back("output=pb"); | 323 downstream_args.push_back("output=pb"); |
324 GURL downstream_url(std::string(kWebServiceBaseUrl) + | 324 GURL downstream_url(std::string(kWebServiceBaseUrl) + |
325 std::string(kDownstreamUrl) + | 325 std::string(kDownstreamUrl) + |
326 JoinString(downstream_args, '&')); | 326 JoinString(downstream_args, '&')); |
327 | 327 |
328 downstream_fetcher_.reset(URLFetcher::Create( | 328 downstream_fetcher_.reset(URLFetcher::Create( |
329 kDownstreamUrlFetcherIdForTests, downstream_url, URLFetcher::GET, this)); | 329 kDownstreamUrlFetcherIdForTests, downstream_url, URLFetcher::GET, this)); |
330 downstream_fetcher_->SetRequestContext(url_context_); | 330 downstream_fetcher_->SetRequestContext(url_context_.get()); |
331 downstream_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | | 331 downstream_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | |
332 net::LOAD_DO_NOT_SEND_COOKIES | | 332 net::LOAD_DO_NOT_SEND_COOKIES | |
333 net::LOAD_DO_NOT_SEND_AUTH_DATA); | 333 net::LOAD_DO_NOT_SEND_AUTH_DATA); |
334 downstream_fetcher_->Start(); | 334 downstream_fetcher_->Start(); |
335 | 335 |
336 // Setup upstream fetcher. | 336 // Setup upstream fetcher. |
337 // TODO(hans): Support for user-selected grammars. | 337 // TODO(hans): Support for user-selected grammars. |
338 std::vector<std::string> upstream_args; | 338 std::vector<std::string> upstream_args; |
339 upstream_args.push_back("key=" + | 339 upstream_args.push_back("key=" + |
340 net::EscapeQueryParamValue(GetAPIKey(), true)); | 340 net::EscapeQueryParamValue(GetAPIKey(), true)); |
(...skipping 19 matching lines...) Expand all Loading... |
360 if (config_.interim_results) | 360 if (config_.interim_results) |
361 upstream_args.push_back("interim"); | 361 upstream_args.push_back("interim"); |
362 | 362 |
363 GURL upstream_url(std::string(kWebServiceBaseUrl) + | 363 GURL upstream_url(std::string(kWebServiceBaseUrl) + |
364 std::string(kUpstreamUrl) + | 364 std::string(kUpstreamUrl) + |
365 JoinString(upstream_args, '&')); | 365 JoinString(upstream_args, '&')); |
366 | 366 |
367 upstream_fetcher_.reset(URLFetcher::Create( | 367 upstream_fetcher_.reset(URLFetcher::Create( |
368 kUpstreamUrlFetcherIdForTests, upstream_url, URLFetcher::POST, this)); | 368 kUpstreamUrlFetcherIdForTests, upstream_url, URLFetcher::POST, this)); |
369 upstream_fetcher_->SetChunkedUpload(encoder_->mime_type()); | 369 upstream_fetcher_->SetChunkedUpload(encoder_->mime_type()); |
370 upstream_fetcher_->SetRequestContext(url_context_); | 370 upstream_fetcher_->SetRequestContext(url_context_.get()); |
371 upstream_fetcher_->SetReferrer(config_.origin_url); | 371 upstream_fetcher_->SetReferrer(config_.origin_url); |
372 upstream_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | | 372 upstream_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | |
373 net::LOAD_DO_NOT_SEND_COOKIES | | 373 net::LOAD_DO_NOT_SEND_COOKIES | |
374 net::LOAD_DO_NOT_SEND_AUTH_DATA); | 374 net::LOAD_DO_NOT_SEND_AUTH_DATA); |
375 upstream_fetcher_->Start(); | 375 upstream_fetcher_->Start(); |
376 previous_response_length_ = 0; | 376 previous_response_length_ = 0; |
377 return STATE_BOTH_STREAMS_CONNECTED; | 377 return STATE_BOTH_STREAMS_CONNECTED; |
378 } | 378 } |
379 | 379 |
380 GoogleStreamingRemoteEngine::FSMState | 380 GoogleStreamingRemoteEngine::FSMState |
381 GoogleStreamingRemoteEngine::TransmitAudioUpstream( | 381 GoogleStreamingRemoteEngine::TransmitAudioUpstream( |
382 const FSMEventArgs& event_args) { | 382 const FSMEventArgs& event_args) { |
383 DCHECK(upstream_fetcher_.get()); | 383 DCHECK(upstream_fetcher_.get()); |
384 DCHECK(event_args.audio_data.get()); | 384 DCHECK(event_args.audio_data.get()); |
385 const AudioChunk& audio = *(event_args.audio_data); | 385 const AudioChunk& audio = *(event_args.audio_data.get()); |
386 | 386 |
387 DCHECK_EQ(audio.bytes_per_sample(), config_.audio_num_bits_per_sample / 8); | 387 DCHECK_EQ(audio.bytes_per_sample(), config_.audio_num_bits_per_sample / 8); |
388 encoder_->Encode(audio); | 388 encoder_->Encode(audio); |
389 scoped_refptr<AudioChunk> encoded_data(encoder_->GetEncodedDataAndClear()); | 389 scoped_refptr<AudioChunk> encoded_data(encoder_->GetEncodedDataAndClear()); |
390 upstream_fetcher_->AppendChunkToUpload(encoded_data->AsString(), false); | 390 upstream_fetcher_->AppendChunkToUpload(encoded_data->AsString(), false); |
391 return state_; | 391 return state_; |
392 } | 392 } |
393 | 393 |
394 GoogleStreamingRemoteEngine::FSMState | 394 GoogleStreamingRemoteEngine::FSMState |
395 GoogleStreamingRemoteEngine::ProcessDownstreamResponse( | 395 GoogleStreamingRemoteEngine::ProcessDownstreamResponse( |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 DVLOG(1) << "Closing upstream."; | 487 DVLOG(1) << "Closing upstream."; |
488 | 488 |
489 // The encoder requires a non-empty final buffer. So we encode a packet | 489 // The encoder requires a non-empty final buffer. So we encode a packet |
490 // of silence in case encoder had no data already. | 490 // of silence in case encoder had no data already. |
491 std::vector<short> samples( | 491 std::vector<short> samples( |
492 config_.audio_sample_rate * kAudioPacketIntervalMs / 1000); | 492 config_.audio_sample_rate * kAudioPacketIntervalMs / 1000); |
493 scoped_refptr<AudioChunk> dummy_chunk = | 493 scoped_refptr<AudioChunk> dummy_chunk = |
494 new AudioChunk(reinterpret_cast<uint8*>(&samples[0]), | 494 new AudioChunk(reinterpret_cast<uint8*>(&samples[0]), |
495 samples.size() * sizeof(short), | 495 samples.size() * sizeof(short), |
496 encoder_->bits_per_sample() / 8); | 496 encoder_->bits_per_sample() / 8); |
497 encoder_->Encode(*dummy_chunk); | 497 encoder_->Encode(*dummy_chunk.get()); |
498 encoder_->Flush(); | 498 encoder_->Flush(); |
499 scoped_refptr<AudioChunk> encoded_dummy_data = | 499 scoped_refptr<AudioChunk> encoded_dummy_data = |
500 encoder_->GetEncodedDataAndClear(); | 500 encoder_->GetEncodedDataAndClear(); |
501 DCHECK(!encoded_dummy_data->IsEmpty()); | 501 DCHECK(!encoded_dummy_data->IsEmpty()); |
502 encoder_.reset(); | 502 encoder_.reset(); |
503 | 503 |
504 upstream_fetcher_->AppendChunkToUpload(encoded_dummy_data->AsString(), true); | 504 upstream_fetcher_->AppendChunkToUpload(encoded_dummy_data->AsString(), true); |
505 got_last_definitive_result_ = false; | 505 got_last_definitive_result_ = false; |
506 return STATE_WAITING_DOWNSTREAM_RESULTS; | 506 return STATE_WAITING_DOWNSTREAM_RESULTS; |
507 } | 507 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
547 | 547 |
548 GoogleStreamingRemoteEngine::FSMState | 548 GoogleStreamingRemoteEngine::FSMState |
549 GoogleStreamingRemoteEngine::NotFeasible(const FSMEventArgs& event_args) { | 549 GoogleStreamingRemoteEngine::NotFeasible(const FSMEventArgs& event_args) { |
550 NOTREACHED() << "Unfeasible event " << event_args.event | 550 NOTREACHED() << "Unfeasible event " << event_args.event |
551 << " in state " << state_; | 551 << " in state " << state_; |
552 return state_; | 552 return state_; |
553 } | 553 } |
554 | 554 |
555 std::string GoogleStreamingRemoteEngine::GetAcceptedLanguages() const { | 555 std::string GoogleStreamingRemoteEngine::GetAcceptedLanguages() const { |
556 std::string langs = config_.language; | 556 std::string langs = config_.language; |
557 if (langs.empty() && url_context_) { | 557 if (langs.empty() && url_context_.get()) { |
558 // If no language is provided then we use the first from the accepted | 558 // If no language is provided then we use the first from the accepted |
559 // language list. If this list is empty then it defaults to "en-US". | 559 // language list. If this list is empty then it defaults to "en-US". |
560 // Example of the contents of this list: "es,en-GB;q=0.8", "" | 560 // Example of the contents of this list: "es,en-GB;q=0.8", "" |
561 net::URLRequestContext* request_context = | 561 net::URLRequestContext* request_context = |
562 url_context_->GetURLRequestContext(); | 562 url_context_->GetURLRequestContext(); |
563 DCHECK(request_context); | 563 DCHECK(request_context); |
564 // TODO(pauljensen): GoogleStreamingRemoteEngine should be constructed with | 564 // TODO(pauljensen): GoogleStreamingRemoteEngine should be constructed with |
565 // a reference to the HttpUserAgentSettings rather than accessing the | 565 // a reference to the HttpUserAgentSettings rather than accessing the |
566 // accept language through the URLRequestContext. | 566 // accept language through the URLRequestContext. |
567 std::string accepted_language_list = request_context->GetAcceptLanguage(); | 567 std::string accepted_language_list = request_context->GetAcceptLanguage(); |
(...skipping 19 matching lines...) Expand all Loading... |
587 } | 587 } |
588 | 588 |
589 GoogleStreamingRemoteEngine::FSMEventArgs::FSMEventArgs(FSMEvent event_value) | 589 GoogleStreamingRemoteEngine::FSMEventArgs::FSMEventArgs(FSMEvent event_value) |
590 : event(event_value) { | 590 : event(event_value) { |
591 } | 591 } |
592 | 592 |
593 GoogleStreamingRemoteEngine::FSMEventArgs::~FSMEventArgs() { | 593 GoogleStreamingRemoteEngine::FSMEventArgs::~FSMEventArgs() { |
594 } | 594 } |
595 | 595 |
596 } // namespace content | 596 } // namespace content |
OLD | NEW |