1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "extension_tts_api.h" 6 7 #include <string> 8 9 #include "base/memory/singleton.h" 10 #include "base/values.h" 11 #include "chrome/browser/extensions/extension_function.h" 12 13 #import <Cocoa/Cocoa.h> 14 15 namespace util = extension_tts_api_util; 16 17 class ExtensionTtsPlatformImplMac : public ExtensionTtsPlatformImpl { 18 public: 19 virtual bool Speak( 20 const std::string& utterance, 21 const std::string& language, 22 const std::string& gender, 23 double rate, 24 double pitch, 25 double volume); 26 27 virtual bool StopSpeaking(); 28 29 virtual bool IsSpeaking(); 30 31 // Get the single instance of this class. 32 static ExtensionTtsPlatformImplMac* GetInstance(); 33 34 private: 35 ExtensionTtsPlatformImplMac(); 36 virtual ~ExtensionTtsPlatformImplMac() {} 37 38 NSSpeechSynthesizer* speech_synthesizer_; 39 40 friend struct DefaultSingletonTraits<ExtensionTtsPlatformImplMac>; 41 42 DISALLOW_COPY_AND_ASSIGN(ExtensionTtsPlatformImplMac); 43 }; 44 45 // static 46 ExtensionTtsPlatformImpl* ExtensionTtsPlatformImpl::GetInstance() { 47 return ExtensionTtsPlatformImplMac::GetInstance(); 48 } 49 50 bool ExtensionTtsPlatformImplMac::Speak( 51 const std::string& utterance, 52 const std::string& language, 53 const std::string& gender, 54 double rate, 55 double pitch, 56 double volume) { 57 // NSSpeechSynthesizer equivalents for kGenderKey and kLanguageNameKey do 58 // not exist and thus are not supported. 59 60 if (rate >= 0.0) { 61 // The TTS api defines rate via words per minute. 62 [speech_synthesizer_ 63 setObject:[NSNumber numberWithInt:rate * 400] 64 forProperty:NSSpeechRateProperty error:nil]; 65 } 66 67 if (pitch >= 0.0) { 68 // The TTS api allows an approximate range of 30 to 65 for speech pitch. 69 [speech_synthesizer_ 70 setObject: [NSNumber numberWithInt:(pitch * 35 + 30)] 71 forProperty:NSSpeechPitchBaseProperty error:nil]; 72 } 73 74 if (volume >= 0.0) { 75 [speech_synthesizer_ 76 setObject: [NSNumber numberWithFloat:volume] 77 forProperty:NSSpeechVolumeProperty error:nil]; 78 } 79 80 return [speech_synthesizer_ startSpeakingString: 81 [NSString stringWithUTF8String: utterance.c_str()]]; 82 } 83 84 bool ExtensionTtsPlatformImplMac::StopSpeaking() { 85 [speech_synthesizer_ stopSpeaking]; 86 return true; 87 } 88 89 bool ExtensionTtsPlatformImplMac::IsSpeaking() { 90 return [speech_synthesizer_ isSpeaking]; 91 } 92 93 ExtensionTtsPlatformImplMac::ExtensionTtsPlatformImplMac() { 94 speech_synthesizer_ = [[NSSpeechSynthesizer alloc] init]; 95 } 96 97 // static 98 ExtensionTtsPlatformImplMac* ExtensionTtsPlatformImplMac::GetInstance() { 99 return Singleton<ExtensionTtsPlatformImplMac>::get(); 100 } 101