I'm currently trying to build a voice assistant with Python when I ran into a problem.
I'm using porcupine/picovoice for wakeword detection and then I call a function that recognizes everything I say as soon as I call it.
This is the function:
def recognizevoicecommand():
try:
r = sr.Recognizer()
print("A moment of silence, please...")
with sr.Microphone() as source:
time.sleep(2)
r.adjust_for_ambient_noise(source)
print("Set minimum energy threshold to {}".format(r.energy_threshold))
while True:
print("Say something!")
with m as source:
time.sleep(2)
print("Now!")
audio = r.listen(source)
print("Got it! Now to recognize it...")
try:
# recognize speech using Google Speech Recognition
value = r.recognize_google(audio)
print(value)
return value
break
except sr.UnknownValueError():
print("OOps")
break
except KeyboardInterrupt:
pass
If i just call the function alone, it works perfectly fine, recognizes what I say and then prints it out.
But the problem is that as soon as I use it together with the wakeword detector, I get spammed with
Overflow - reader is not reading fast enough
after
A moment of silence, please...
is printed out.
This is the wakeword detection code, works fine on it's own as well as in the script, the problem seems to be in the recognizing part
porcupine = pvporcupine.create(access_key = accesskey, keywords=['computer'])
recorder = PvRecorder(device_index = 0, frame_length = porcupine.frame_length)
recorder.start()
while True:
pcm = recorder.read()
result = porcupine.process(pcm)
if(result >= 0):
print("Keyword detected")
print(recognizevoicecommand())
except pvporcupine.PorcupineInvalidArgumentError as e:
print("One or more arguments provided to Procupine is invalid!")
raise e
except pvporcupine.PorcupineActivationError as e:
print("Accesskey denied.")
raise e
except pvporcupine.PorcupineActivationLimitError as e:
print("Accesskey has reached it's temporary device limit.")
raise e
except pvporcupine.PorcupineActivationRefusedError as e:
print("Accesskey refused.")
raise e
except pvporcupine.PorcupineActivationThrottledError as e:
print("Accesskey has been throttled.")
raise e
except pvporcupine.PorcupineError as e:
print("Failed to initialize Porcupine.")
raise e
except KeyboardInterrupt:
print("Stopping")
finally:
if porcupine is not None:
porcupine.delete()
if recorder is not None:
recorder.delete()
I am honestly clueless why its not working. Hope to find a solution tho!
I'm working on a similar task and running into the same issue. I've found that the solution is to avoid using two different means of recording audio.
The PvRecorder class represents the recorded data as signed integers.
pcm = recorder.read()
result = porcupine.process(pcm)
This is different AFAIK than how wav data is typically stored in an audio file. If you look to how PvRecorder saves wav files, you can see they use the struct module:
sp = struct.pack("h" * len(pcm), *pcm)
You can use that to construct the audio file to pass along.
I'm using it with Vosk and it works great!
if self.rec.AcceptWaveform(sp):
res = json.loads(self.rec.Result())
if res["text"] != "":
print(res["text"])
I ran in to the same error and it seems to be - as others have indicated - the result of the audio device being used by more than one process. I resolved it by stopping the Pico Voice recorder while the other action was taking place and then starting it again:
# Standard setup
recorder = PvRecorder(
device_index=self._device_index,
frame_length=self._picovoice.frame_length,
)
recorder.start()
# Stop the recordeer
recorder.stop()
# Run other function here that uses the device
# Start the recorder again
recorder.start()
I am a Portuguese High Schooler so sorry if I dont make myself very clear but I will try my best to explain my problem.
So for this project I need to make a program that recognises speech and do what is told to do. But if the speech is not recognisable I want the program to try until it finally catches what is being said. However I dont really know how to do that since this "error" keeps appearing: Error
Here is the code if anyone wants to help:
import speech_recognition as sr
import subprocess as sp
import os
def ouvir_microfone():
audio_Input = sr.Recognizer()
with sr.Microphone() as source:
Ray = "ON"
Open = "Open"
print("Hello my name is Ray pleased to help you")
audio_Input.adjust_for_ambient_noise(source)
print("Say something: ")
audio = audio_Input.listen(source)
frase = audio_Input.recognize_google(audio,language='en-US')
if ValueError: print("Speech not recognised")
else: print("You said: " + frase)
if Open in frase:
print('sucess')
ouvir_microfone()
Use try and exception to handle the error
try:
frase = audio_Input.recognize_google(audio,language='en-US')
print("You said: " + frase)
except ValueError:
print("Speech not recognised")
if Open in frase:
print('sucess')
import speech_recognition as sr
import subprocess as sp
import os
def ouvir_microfone():
audio_Input = sr.Recognizer()
with sr.Microphone() as source:
Ray = "ON"
Open = "Open"
print("Hello my name is Ray pleased to help you")
audio_Input.adjust_for_ambient_noise(source)
print("Say something: ")
audio = audio_Input.listen(source)
try:
# valid
frase = audio_Input.recognize_google(audio,language='en-US')
print("You said: " + frase)
except:
# google could not validate
print("Speech not recognised")
return False
if Open in frase:
print('sucess')
return True
while True:
if ouvir_microfone():
# got a valid response
break
Works as a solid template. Some imports also remain unused as a sidenote. Catch the exception and return False if the speech could not be recognized so it retries. The google voice recognition python library throws an exception in the case that no distinguishable speech can be read.
I'm trying to write a script that uses SpeechRecognition to run a function once say a wake-up word "Run" Everything works perfectly up until I get to my regex search to find my wake-up word in my alpha variable that is assigned to what I say. Upon running I get the error. I have tested my regex alg outside of the SpeechRecognition with a string and it worked perfectly.
ERROR:
raise UnknownValueError()
speech_recognition.UnknownValueError
Could I get some help?
CODE:
import speech_recognition as sr
import re
def stt():
recognizer = sr.Recognizer()
microphone = sr.Microphone()
# check that recognizer and microphone arguments are appropriate type
if not isinstance(recognizer, sr.Recognizer):
raise TypeError("`recognizer` must be `Recognizer` instance")
if not isinstance(microphone, sr.Microphone):
raise TypeError("`microphone` must be `Microphone` instance")
# listen and assign
with microphone as source:
recognizer.adjust_for_ambient_noise(source)
audio = recognizer.listen(source)
# return output
return recognizer.recognize_google(audio)
while True:
alpha = stt()
print(alpha)
if re.search('.+Run.+', alpha):
print("1")
beta = alpha.split()
query = beta.pop()
print("working")
Try putting your whole code under a try and except.
Like this:
import speech_recognition as sr
import re
try:
def stt():
recognizer = sr.Recognizer()
microphone = sr.Microphone()
# check that recognizer and microphone arguments are appropriate type
if not isinstance(recognizer, sr.Recognizer):
raise TypeError("`recognizer` must be `Recognizer` instance")
if not isinstance(microphone, sr.Microphone):
raise TypeError("`microphone` must be `Microphone` instance")
# listen and assign
with microphone as source:
recognizer.adjust_for_ambient_noise(source)
audio = recognizer.listen(source)
# return output
return recognizer.recognize_google(audio)
while True:
alpha = stt()
print(alpha)
if re.search('.+Run.+', alpha):
print("1")
beta = alpha.split()
query = beta.pop()
print("working")
except sr.UnknownValueError() as e:
pass
If that doesn't work. Look at this github issue
I am trying to make a voice typing program in Python using pywinauto. First I recognized the speech using SpeechRecognition module and converted the recognized speech in string and then used the type_keys() method to type the string in notepad.
Here is the code:
from pywinauto import application
import time
import speech_recognition as sr
app = application.Application()
app.start("Notepad.exe")
def type_keys_in_notepad():
r = sr.Recognizer()
with sr.Microphone() as source:
print("Listening...")
r.pause_threshold = 1
r.adjust_for_ambient_noise(source)
audio = r.listen(source)
try:
print("Recognizing...")
content = r.recognize_google(audio, language="en-in")
print(content)
content_str = str(content)
app.Notepad.edit.type_keys(content_str)
except Exception as e:
print(e)
type_keys_in_notepad()
you need to add app.Notepad.edit.type_keys(content_str,with_spaces=True)
This will help to include white spaces
If you don't include with_spaces=True Space will be ignored
I am running the following code in Python 2.7 with pyAudio installed.
import speech_recognition as sr
r = sr.Recognizer()
with sr.Microphone() as source: # use the default microphone as the audio source
audio = r.listen(source) # listen for the first phrase and extract it into audio data
try:
print("You said " + r.recognize(audio)) # recognize speech using Google Speech Recognition
except LookupError: # speech is unintelligible
print("Could not understand audio")
The output gives a blinking pointer. That's it.
The possible reason could be that the recognizer_instance.energy_threshold property is probably set to a value that is too high to start off with. You should decrease this threshold, or call recognizer_instance.adjust_for_ambient_noise(source, duration = 1). You can learn more about it at Speech Recognition
I have solved the same problem for me with the following (noise suppression),
The "listen" function has problems with environment noise. So the running code is only blinking waiting.
Use this ambient noise suppression/adjustment;
r.adjust_for_ambient_noise(source, duration=5)
Referance
Tuesday, March 28, 2017
Easy Speech Recognition in Python with PyAudio and Pocketsphinx
try to add
r.adjust_for_ambient_noise(source,duration=1)
where r is recogniser instance, like this
import speech_recognition as sr
r=sr.Recognizer()
print(sr.Microphone.list_microphone_names())
with sr.Microphone() as source:
r.adjust_for_ambient_noise(source,duration=1)
# r.energy_threshold()
print("say anything : ")
audio= r.listen(source)
try:
text = r.recognize_google(audio)
print(text)
except:
print("sorry, could not recognise")
have you tried replacing
print("You said " + r.recognize(audio))
except LookupError:
print("Could not understand audio")
with
text = r.recognize_google(audio)
print("You said : {}".format(text))
text = r.recognize_google(audio)
except:
print("Sorry could not recognize your voice")
ensure pyaudio.h is installed by running the below command
sudo apt-get install portaudio19-dev python-pyaudio python3-pyaudio
just try;
pip install sounddevice
it works.
check the input volume of your microphone. It is by default set to 0 in ubuntu (in my case). Since your program got stuck on the line audio = r.listen(source), which simply means that the microphone is not able to listen to any voice input. Hope this helps.
try this code:
r = sr.Recognizer()
with sr.Microphone() as source:
r.adjust_for_ambient_noise(source=source)
audio = r.listen(source,timeout=3)
data = ''
try :
data = r.recognize_google(audio)
print(data)
except sr.UnknownValueError:
print(" Error")
except sr.RequestError as e:
print("Request Error")
or add timeout and r.adjust_for_ambient_noise(source=source) to your code as above.please can anyone help me with this
In addition to Tushar's answer, I suggest trying a nicer external USB microphone. PyAudio can have issues with a simple built-in laptop microphone.
You may have to install these things first:
pip install pyaudio
pip install --upgrade pyaudio
pip install wheel
pip install google-api-python-client
sudo apt-get install flac
pip install monotonic
pip install SpeechRecognition
After that, refer the site (https://realpython.com/python-speech-recognition/)
it will clearly explain what you wanted.
Here I am attaching the code I've edited from that site. Since I am new it will not be perfect, but I've tried. This is to check weather the voice input is similar to the text I've given and also it will print what you said.
#!/usr/bin/ python
import time
import speech_recognition as sr
def recognize_speech_from_mic(recognizer, microphone):
"""Transcribe speech from recorded from `microphone`.
Returns a dictionary with three keys:
"success": a boolean indicating whether or not the API request was
successful
"error": `None` if no error occured, otherwise a string containing
an error message if the API could not be reached or
speech was unrecognizable
"transcription": `None` if speech could not be transcribed,
otherwise a string containing the transcribed text
"""
# check that recognizer and microphone arguments are appropriate type
if not isinstance(recognizer, sr.Recognizer):
raise TypeError("`recognizer` must be `Recognizer` instance")
if not isinstance(microphone, sr.Microphone):
raise TypeError("`microphone` must be `Microphone` instance")
# adjust the recognizer sensitivity to ambient noise and record audio
# from the microphone
with microphone as source:
recognizer.adjust_for_ambient_noise(source)
audio = recognizer.listen(source)
# set up the response object
response = {
"success": True,
"error": None,
"transcription": None
}
try:
response["transcription"] = recognizer.recognize_google(audio)
except sr.RequestError:
# API was unreachable or unresponsive
response["success"] = False
response["error"] = "API unavailable"
except sr.UnknownValueError:
# speech was unintelligible
response["error"] = "Unable to recognize speech"
return response
if __name__ == "__main__":
NUM_GUESSES = 1
PROMPT_LIMIT = 2
# create recognizer and mic instances
recognizer = sr.Recognizer()
microphone = sr.Microphone()
word = "hello world"
time.sleep(3)
for i in range(NUM_GUESSES):
for j in range(PROMPT_LIMIT):
print('Guess {}. Speak!'.format(i+1))
guess = recognize_speech_from_mic(recognizer, microphone)
if guess["transcription"]:
break
if not guess["success"]:
break
print("I didn't catch that")
# if there was an error, stop the game
if guess["error"]:
print("ERROR: {}".format(guess["error"]))
break
# show the user the transcription
print("You said: {}".format(guess["transcription"]))
# determine if guess is correct and if any attempts remain
guess_is_correct = guess["transcription"].lower() == word.lower()
user_has_more_attempts = i < NUM_GUESSES - 1
if guess_is_correct:
print("Correct!".format(word))
break
elif user_has_more_attempts:
print("Incorrect. Try again.\n")
else:
print("Sorry, output is not similar to '{}'.".format(word))
break
MY Problem was : the program is running without any error but its not showing any output
THIS IS THE CODE WITH PROBLEM:
import googletrans
import speech_recognition as sr
recognizer = sr.Recognizer()
translator = googletrans.Translator()
try:
with sr.Microphone() as source:
print('Speak Now')
voice= recognizer.listen(source)
text= recognizer.recognize_google(voice)
print(text)
except:
pass
translated = translator.translate(text, dest='es')
print(translated.text)
To Solve this problem :
basically this problem occurs by the background noise or ambient noise
SO just add only one line to your code which is :
recognizer.adjust_for_ambient_noise(source)#recognizer is on line 4 from above code
########
The improved and Solved problem code:
########
import googletrans
import speech_recognition as sr
recognizer = sr.Recognizer()
translator = googletrans.Translator()
try:
with sr.Microphone() as source:
print('Speak Now')
recognizer.adjust_for_ambient_noise(source)#(Problem Solved)
voice= recognizer.listen(source)
text= recognizer.recognize_google(voice)
print(text)
except:
pass
translated = translator.translate(text, dest='es')
print(translated.text)
I guess the problem is with the duration. If you set some duration to the speech recognition engine the problem will be resolved.
Try the following code:
import speech_recognition as sr
r = sr.Recognizer()
with sr.Microphone() as source:
speak(sen)
print("listening...")
audio = r.record(source,duration=3)
try:
str=r.recognize_google(audio)
print(str)
except:
print("some error occurred!")
Put the Try and Except inside the indentation.
Here is my Working code:-
while True:
r = sr.Recognizer()
with sr.Microphone() as source:
print("Say Something")
audio=r.listen(source)
try:
print(r.recognize_google(audio),"\n")
except:
pass
Please set minimum threshold.
After running commend python -m speech_recognition. Set minimum energy threshold which it display.
Setting procedure: press Ctrl then click mouse Recognizer(). Now set energy threshold.
Install in your python prompt (Anaconda Prompt)
pip install pyaudio
pip install --upgrade pyaudio
pip install wheel
pip install google-api-python-client
pip install monotonic
pip install SpeechRecognition
Code:
import speech_recognition as sr
r = sr.Recognizer()
with sr.Microphone() as source:
print("listening...")
audio = r.record(source,duration=3)
try:
str=r.recognize_google(audio)
print(str)
except:
print("some error occurred!")
Try changing the mic index using:
with sr.Microphone(device_index = 0) as source:
To know your mic index use:
print((sr.Microphone.list_microphone_names()))
If this does not work use:
with sr.Microphone(device_index = 0) as source: # use the default microphone as the audio source
r.adjust_for_ambient_noise(source, duration = 1)
audio = r.listen(source)