Code source de NaoCreator.SpeechToText.nao_listen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
"""
import speech_recognition as sr
from NaoCreator.setting import Setting
import ftplib
[docs]def audio_to_text():
"""
Fonction qui va récupérer le fichier audio téléchargé sur nao
puis va l'envoyer au seveur Google speech to text
:return: Le message en chaine de charactère ou renvoie une chaine vide
s'il n'a pas réussi a reconnaître ce qui a été dit
"""
# use "mono.wav" as the audio source
r = sr.Recognizer()
with sr.WavFile("msg.wav") as source:
# read the entire WAV file
audio = r.record(source)
# recognize speech using Google Speech Recognition
try:
# for testing purposes, we're just using the default API key
# to use another API key, use `r.recognize_google(audio, key="GOOGLE_SPEECH_RECOGNITION_API_KEY")`
# instead of `r.recognize_google(audio)`
msg = r.recognize_google(audio, language="fr-FR")
if Setting.DEBUG:
print("Google Speech Recognition found: " + msg)
# on passe de unicode a str utf8
msg = msg.encode('utf8')
if Setting.DEBUG:
# on dit le msg
print "tu a dit {}.".format(msg)
return msg
except sr.UnknownValueError:
if Setting.DEBUG:
print("Google Speech Recognition could not understand audio")
return ""
except sr.RequestError as e:
if Setting.DEBUG:
print("Could not request results from Google Speech Recognition service; {0}".format(e))
return ""
[docs]def download_msg(nao_record):
"""
Fonction qui recupère l'enregistrement du serveur de nao puis le met en local sur le pc
:return:
"""
try:
# on cree une fichier wav sur le pc
local_wav = open("msg.wav", "wb")
# on le telecharge depuis le serveyr ftp
nao_record.retrbinary('RETR msg.wav', local_wav.write)
# on fer la conection ftp
local_wav.close()
except Exception, e:
print "error", e
[docs]def get_sound(tab_no_sound):
"""
Fonction qui va compter le nombre de silence qu'il y a eu.
S'il y a eu asser de silence et un minimum de bruit alors on arrête l'enregistrement
:param tab_no_sound: Tableau de bruit ou silence 1=bruit 0=silence
:return: Renvoie tab_no_sound : contient des 0 pour les silences et des 1 pour les bruits
"""
tab = Setting.naoMemoryProxy.getData("SoundDetected")
# si on a du silence et un minimum de son enregistré
if tab[0][1] == 0 and tab_no_sound.count(1) > Setting.MIN_SOUND_SPEAKING:
if Setting.DEBUG:
print "Silence !"
tab_no_sound.append(0)
return tab_no_sound
# si on a du bruit
elif tab[0][1] == 1:
if Setting.DEBUG:
print "Bruit !"
tab_no_sound.append(1)
return tab_no_sound
# on a du silence mais la personne n'a pas encore commencé à parler
else:
return tab_no_sound
[docs]def is_silence(tab_no_sound):
"""
Fonction qui indique si la personne a fini de parler
:param tab_no_sound: le tableau des 1 et 0
:return: True si la personne a fini de parler, False sinon
"""
l = len(tab_no_sound)
if l < Setting.MIN_TIME_SPEAKING:
return False
else:
ratio = tab_no_sound[l - Setting.MIN_TIME_SPEAKING:l].count(0)/float(Setting.MIN_TIME_SPEAKING)
if ratio >= Setting.SILENCE_MIN_RATE and Setting.DEBUG:
print "ratio : {}".format(ratio)
return ratio >= Setting.SILENCE_MIN_RATE
[docs]def record_message(nao_record):
"""
Cette fonction va enregistrer la voix de l'utilisateur pour pouvoir ensuite la passer au speech to text
:return: le message en chaine de caractères
"""
tab_no_sound = []
end_recording_message = False
# On commence l'enregistrement
Setting.naoAudioRecorder.startMicrophonesRecording("/home/nao/msg.wav", "wav", 16000, Setting.CHANEL)
Setting.naoLed.off("AllLeds")
Setting.naoLed.on("AllLedsBlue") # on allume toutes les led en bleu
# Enregistrement du message
while Setting.naoMemoryProxy.getData("MiddleTactilTouched") != 1 and not end_recording_message:
tab_no_sound = get_sound(tab_no_sound)
end_recording_message = is_silence(tab_no_sound)
Setting.naoLed.off("AllLeds")
Setting.naoLed.on("AllLedsGreen")
Setting.naoAudioRecorder.stopMicrophonesRecording()
download_msg(nao_record)
return audio_to_text()
[docs]def recording(nao_record):
"""
Cette fonction va lancer l'enregistrement pour l'utilisateur
est va contrôler si le serveur google speech to text ne renvoie pas d'erreur
:return: le message trouvé sinon une chaine vide
"""
nb_try = 0
msg = ""
while msg == "" and nb_try < Setting.LIMIT_RECOGNITION_TRIES and \
Setting.naoMemoryProxy.getData("LeftBumperPressed") != 1:
msg = record_message(nao_record)
if Setting.DEBUG:
print msg
if msg == "":
Setting.naoSpeech.say("Je n'ai pas compris ce que tu a dit. Peux-tu répéter ?")
nb_try += 1
if nb_try == Setting.LIMIT_RECOGNITION_TRIES and msg == "":
Setting.naoSpeech.say("Je n'ai rien compris")
return msg
try:
if Setting.NAO_CONNECTED:
[docs] def nao_listen():
"""
Enregistre ce que dit l'utilisateur et en renvoie une chaîne de caractères
:return: Une chaine de caractères de ce qu'a dit l'utilisateur
"""
# Creer la classe pour se connecter au FTP
nao_record = ftplib.FTP(Setting.ROBOT_IP)
nao_record.login("nao", "nao")
Setting.naoSoundDetection.subscribe("SoundDetected")
msg = recording(nao_record).decode("utf-8")
Setting.naoSoundDetection.unsubscribe("SoundDetected")
return msg
else:
import NaoSimulator.get_mic_input as gmi
nao_listen = gmi.record
except Exception as e:
print e
"""
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
"""