Description
Hi, I've hit a problem trying to use pyttsx3
for speech synthesis on Mac OSX Sonoma 14.2
I can get the say function to run ok, but when I try the engine.save_to_file()
method, this crashes on engine.runAndWait()
with the error: AttributeError: 'NSSpeechDriver' object has no attribute '_current_text'
(see trace at bottom). However, the output file appears to produce successfully.
If I catch this error in a try
block, I can get my application to run first time and have the audio file I need, but I think this leaves the NSSS engine in an abortive state - If i run again I get the Error run loop already started
. I've tried also adding:
if engine._inLoop:
engine.endLoop()
to try and force stop the loop but I get Stopper already registered for this runLoop
.
Grateful for any insight!
Trace:
in the `except` block, but this
AttributeError Traceback (most recent call last)
Cell In[4], line 6
3 # render at default 48 kHz rate
4 soni = Sonification(score, events, generator, system,
5 caption=caption_en)
----> 6 soni.render()
7 soni.notebook_display(show_waveform=0)
File ~/Documents/Code/strauss_dev/src/strauss/sonification.py:205, in Sonification.render(self, downsamp)
203 else:
204 pass
--> 205 render_caption(self.caption, self.samprate,
206 self.ttsmodel, str(cpath))
207 rate_in, wavobj = wavfile.read(cpath)
208 wavobj = np.array(wavobj)
File ~/Documents/Code/strauss_dev/src/strauss/tts_caption.py:121, in render_caption(caption, samprate, model, caption_path)
117 engine.save_to_file(caption, caption_path)
119 try:
120 # TODO: explore why NSS triggers error hear without catching
--> 121 engine.runAndWait()
File ~/Documents/Code/strauss_dev/venv/lib/python3.11/site-packages/pyttsx3/engine.py:183, in Engine.runAndWait(self)
181 self._inLoop = True
182 self._driverLoop = True
--> 183 self.proxy.runAndWait()
File ~/Documents/Code/strauss_dev/venv/lib/python3.11/site-packages/pyttsx3/driver.py:195, in DriverProxy.runAndWait(self)
190 '''
191 Called by the engine to start an event loop, process all commands in
192 the queue at the start of the loop, and then exit the loop.
193 '''
194 self._push(self._engine.endLoop, tuple())
--> 195 self._driver.startLoop()
File ~/Documents/Code/strauss_dev/venv/lib/python3.11/site-packages/pyttsx3/drivers/nsss.py:77, in NSSpeechDriver.startLoop(self)
75 if nextfire is not None:
76 nextfire = soon.earlierDate_(nextfire)
---> 77 if not runLoop.runMode_beforeDate_(NSDefaultRunLoopMode, nextfire):
78 stopper.stop()
79 break
File ~/Documents/Code/strauss_dev/venv/lib/python3.11/site-packages/pyttsx3/drivers/nsss.py:159, in NSSpeechDriver.speechSynthesizer_willSpeakWord_ofString_(self, tts, rng, text)
158 def speechSynthesizer_willSpeakWord_ofString_(self, tts, rng, text):
--> 159 if self._current_text:
160 current_word = self._current_text[rng.location:rng.location + rng.length]
161 else:
AttributeError: 'NSSpeechDriver' object has no attribute '_current_text'
Activity