Package synthDrivers :: Module espeak
[hide private]
[frames] | no frames]

Source Code for Module synthDrivers.espeak

  1  #synthDrivers/espeak.py 
  2  #A part of NonVisual Desktop Access (NVDA) 
  3  #Copyright (C) 2006-2009 NVDA Contributors <http://www.nvda-project.org/> 
  4  #This file is covered by the GNU General Public License. 
  5  #See the file COPYING for more details. 
  6   
  7  from collections import OrderedDict 
  8  import _espeak 
  9  import Queue 
 10  import threading 
 11  import languageHandler 
 12  from synthDriverHandler import SynthDriver,VoiceInfo,BooleanSynthSetting 
 13  import speech 
 14  from logHandler import log 
15 16 -class SynthDriver(SynthDriver):
17 name = "espeak" 18 description = "eSpeak" 19 20 supportedSettings=( 21 SynthDriver.VoiceSetting(), 22 SynthDriver.VariantSetting(), 23 SynthDriver.RateSetting(), 24 # Translators: This is the name of the rate boost voice toggle 25 # which further increases the speaking rate when enabled. 26 BooleanSynthSetting("rateBoost",_("Rate boos&t")), 27 SynthDriver.PitchSetting(), 28 SynthDriver.InflectionSetting(), 29 SynthDriver.VolumeSetting(), 30 ) 31 32 @classmethod
33 - def check(cls):
34 return True
35
36 - def __init__(self):
37 _espeak.initialize() 38 log.info("Using eSpeak version %s" % _espeak.info()) 39 lang=languageHandler.getLanguage() 40 _espeak.setVoiceByLanguage(lang) 41 self._language=lang 42 self._variantDict=_espeak.getVariantDict() 43 self.variant="max" 44 self.rate=30 45 self.pitch=40 46 self.inflection=75
47
48 - def _get_language(self):
49 return self._language
50
51 - def speak(self,speechSequence):
52 defaultLanguage=self._language 53 textList=[] 54 langChanged=False 55 for item in speechSequence: 56 if isinstance(item,basestring): 57 s=unicode(item) 58 # Replace \01, as this is used for embedded commands. 59 #Also replace < and > as espeak handles xml 60 s.translate({ord(u'\01'):None,ord(u'<'):u'&lt;',ord(u'>'):u'&gt;'}) 61 textList.append(s) 62 elif isinstance(item,speech.IndexCommand): 63 textList.append("<mark name=\"%d\" />"%item.index) 64 elif isinstance(item,speech.CharacterModeCommand): 65 textList.append("<say-as type=\"spell-out\">" if item.state else "</say-as>") 66 elif isinstance(item,speech.LangChangeCommand): 67 if langChanged: 68 textList.append("</voice>") 69 textList.append("<voice xml:lang=\"%s\">"%(item.lang if item.lang else defaultLanguage).replace('_','-')) 70 langChanged=True 71 elif isinstance(item,speech.SpeechCommand): 72 log.debugWarning("Unsupported speech command: %s"%item) 73 else: 74 log.error("Unknown speech: %s"%item) 75 if langChanged: 76 textList.append("</voice>") 77 text=u"".join(textList) 78 _espeak.speak(text)
79
80 - def cancel(self):
81 _espeak.stop()
82
83 - def pause(self,switch):
84 _espeak.pause(switch)
85 86 _rateBoost = False 87 RATE_BOOST_MULTIPLIER = 3 88
89 - def _get_rateBoost(self):
90 return self._rateBoost
91
92 - def _set_rateBoost(self, enable):
93 if enable == self._rateBoost: 94 return 95 rate = self.rate 96 self._rateBoost = enable 97 self.rate = rate
98
99 - def _get_rate(self):
104
105 - def _set_rate(self,rate):
110
111 - def _get_pitch(self):
114
115 - def _set_pitch(self,pitch):
118
119 - def _get_inflection(self):
122
123 - def _set_inflection(self,val):
126
127 - def _get_volume(self):
129
130 - def _set_volume(self,volume):
132
133 - def _getAvailableVoices(self):
134 voices=OrderedDict() 135 for v in _espeak.getVoiceList(): 136 l=v.languages[1:] 137 voices[v.identifier]=VoiceInfo(v.identifier,v.name,l) 138 return voices
139
140 - def _get_voice(self):
141 curVoice=getattr(self,'_voice',None) 142 if curVoice: return curVoice 143 curVoice = _espeak.getCurrentVoice() 144 if not curVoice: 145 return "" 146 return curVoice.identifier.split('+')[0]
147
148 - def _set_voice(self, identifier):
149 if not identifier: 150 return 151 self._voice=identifier 152 _espeak.setVoiceAndVariant(voice=identifier,variant=self._variant) 153 self._language=super(SynthDriver,self).language
154
155 - def _get_lastIndex(self):
156 return _espeak.lastIndex
157
158 - def terminate(self):
160
161 - def _get_variant(self):
162 return self._variant
163
164 - def _set_variant(self,val):
165 self._variant = val if val in self._variantDict else "max" 166 _espeak.setVoiceAndVariant(variant=self._variant)
167
168 - def _getAvailableVariants(self):
169 return OrderedDict((ID,VoiceInfo(ID, name)) for ID, name in self._variantDict.iteritems())
170