Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

'Started-word' event does not work correctly #78

Open
MauroPfister opened this issue Dec 6, 2019 · 16 comments
Open

'Started-word' event does not work correctly #78

MauroPfister opened this issue Dec 6, 2019 · 16 comments

Comments

@MauroPfister
Copy link

MauroPfister commented Dec 6, 2019

In the latest version of pyttsx3 the 'started-word' event does not seem to work correctly anymore. Running the following sample code from the documentation produces the output below.

# Listening for events from https://pyttsx3.readthedocs.io

import pyttsx3

def onStart(name):
    print('starting', name)
def onWord(name, location, length):
    print('word', name, location, length)
def onEnd(name, completed):
    print('finishing', name, completed)

engine = pyttsx3.init()
engine.connect('started-utterance', onStart)
engine.connect('started-word', onWord)
engine.connect('finished-utterance', onEnd)
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()

Output from newest pyttsx3:

starting None
word None 1 0
finishing None True

Running the same code with the pyttsx3 version from pip results in the following output:

starting None
word None 0 3
word None 4 5
word None 10 5
word None 16 3
word None 20 6
word None 27 4
word None 32 3
word None 36 4
word None 41 3
finishing None True

I suspect it has something to do with the recent changes in #75 but unfortunately I was not able to fix it myself.

Edit 1
Checking the documentation of sapi I found that _ISpeechVoiceEvents_StartStream(self, char, length) in sapi5.py should probably be _ISpeechVoiceEvents_Word(self, stream, pos, char, length). However, the callback of the 'started-word' event is still not executed when starting a word but rather at the very end of the sentence.

Edit 2
By digging around in the documentation I learned about the SpeechVoiceSpeakFlags . It seems like the following changes fix the problem, but I'm not sure if this is the proper way to do it. Since I am unsure about the changes and because I have never done a pull request before, I just listed them below.

Speak the given text string asynchronously (SpVoice Flag 1):

def say(self, text):
    self._proxy.setBusy(True)
    self._proxy.notify('started-utterance')
    self._speaking = True
    # self._tts.Speak(fromUtf8(toUtf8(text)))
    self._tts.Speak(fromUtf8(toUtf8(text)), 1)

Purge all pending speak requests prior to this speak call to stop engine (SpVoice Flag 2):

def stop(self):
    if not self._speaking:
        return
    self._proxy.setBusy(True)
    self._stopping = True
    # self._tts.Speak('', 3)
    self._tts.Speak('', 2)
@wjkoontz
Copy link

wjkoontz commented Apr 9, 2020

I just installed with pip3 and am getting the same error! What version does this work in? How do I get my pip3 to install that version? Help!

@nateshmbhat
Copy link
Owner

can u please install 2.71 version and report back here if its working ?

@wjkoontz
Copy link

wjkoontz commented Apr 9, 2020

Tried that but then I get a bunch of these:
pi@raspberrypi:~ $ python3 stop.py
Expression 'alsa_snd_pcm_hw_params_set_period_size_near( pcm, hwParams, &alsaPeriodFrames, &dir )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 924
Expression 'alsa_snd_pcm_hw_params_set_period_size_near( pcm, hwParams, &alsaPeriodFrames, &dir )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 924
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.front
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround21
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround21
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround40
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround41
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround50
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround51
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround71
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.iec958
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.iec958
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.iec958
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'defaults.bluealsa.device'
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5036:(snd_config_expand) Args evaluate error: No such file or directory
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM bluealsa
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'defaults.bluealsa.device'
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5036:(snd_config_expand) Args evaluate error: No such file or directory
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM bluealsa
Expression 'alsa_snd_pcm_hw_params_set_period_size_near( pcm, hwParams, &alsaPeriodFrames, &dir )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 924
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
Expression 'paInvalidSampleRate' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2048
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2722
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2843
wave_open_sound > Pa_OpenStream : err=-9997 (Invalid sample rate)
Expression 'paInvalidSampleRate' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2048
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2722
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2843
Expression 'paInvalidSampleRate' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2048
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2722
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2843
wave_open_sound > Pa_OpenStream : err=-9997 (Invalid sample rate)
Expression 'paInvalidSampleRate' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2048

@nateshmbhat
Copy link
Owner

It looks like something related to ur sound card. I think there was some similar issue raised related to sound card. I don't remember the title of it unfortunately.

@wjkoontz
Copy link

wjkoontz commented Apr 10, 2020

Its a raspberry pi 3 b+, sound card works fine, but all versions of this software older than 2.8 or so give those alsa errors, and the 2.8 or above ones don't respond correctly to started-word, but seem to work fine in all other respects. Unfortunately this renders started-word event unusable with pyttsx3 on raspbian buster unless I want to figure out what versions of what softwares and libraries I have to roll back in order to get older versions of pyttsx3 to work. Perhaps if I run it before running apt-get upgrade for example, not sure, just trying this out but unfortunately can't use started-word right now.

@wjkoontz
Copy link

Update ALSA errors seem to be related to https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=241814 and trying that fix got it sorta working. I still get a bunch of ALSA errors but not nearly as many and it actually speaks, and actually stops, so yea started-word works in 2.7 if that helps.

@wjkoontz
Copy link

Spoke too soon on ALSA working but started-word seems to function fine. At this point for me I'm in over my head on this so going back to later version and waiting for fix for started-word.

@nateshmbhat
Copy link
Owner

Is this working now in the latest version?

@wjkoontz
Copy link

Sorry If I confused the issues, the started-word event does not work with Python3 and pyttsx3 2.87. The event seems to work with Python2.7 which is using pyttsx3 2.7 however with that combination I get ALSA errors, and inconsistent behavior at best.

@laundmo
Copy link

laundmo commented Jun 19, 2020

same issue:
python 3.8.3
pyttsx3 2.88
windwos 10

@fghp
Copy link

fghp commented Jun 25, 2020

same problem here, it's not fixed yet.
python 3.8.3
pyttsx3 2.88
windwos 10

@uEternali
Copy link

same problem here, it's not fixed yet.

@somewhatrobotic
Copy link

I am using
python 3.8.3
pyttsx3 2.88
windows 10

I was also having issues where my tts would not use the connect "started-word" callback. After edits 1 and 2, that fixed it for me changing the voice flags and sapi.py file were needed.

I can now properly use the connect() function to break mid utterance but struggle to get it to work after 1 break.

I am stuck on restarting the tts properly. If at anypoint I use engine. endloop() or engine.stop() I can't get it to start up again

dr0id added a commit to dr0id/pyttsx3 that referenced this issue Mar 24, 2021
@DedFishy
Copy link

DedFishy commented Aug 2, 2022

This is still not fixed in pyttsx3 v2.90 on Windows 11!

Edit: I was able to get it to work by manually pasting the latest version of sapi5.py into my version. Pip installed an out dated version of it for some reason.

@fgras
Copy link

fgras commented Aug 18, 2022

There are two problems in code:

  1. spvoice.Speak is blocking.
    So the program can not entry in startLoop function and PumpWaitingMessages function is never called (Windows function with manage event)
    Proposal fix> add async flag in Speak
    sapi5.py:56: self._tts.Speak(fromUtf8(toUtf8(text)), 1)
    like there is in line.63

  2. It miss the 'Word' event in 'Sink' object
    Necessary to have progression of speech
    proposal fix> add this member in class SAPI5DriverEventSink
    def _ISpeechVoiceEvents_Word(self, streamNum, streamPos, charPos, charLen):

Bonus stage
3) _ISpeechVoiceEvents_StartStream callback uses wrong argument
It is not (self, char, length) but (self, streamNumber, streamPosition)

@Ncohen10
Copy link

Ncohen10 commented Jun 9, 2023

This issue still exists in the latest version. I've also tried the aforementioned solutions, but it still does not work.

Windows 10
Python 3.8

EDIT: I fixed the issue by replacing my pyttsx3 external library with a downloaded version from here

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

10 participants