El proyecto consiste en una especie de araña que usa una Raspberry Pi3+Wolfson/Cirrus Logic Audio Card como cerebro, un arduino que recibe los datos de los sensores y un Torobot 32 servo controller, para controlar servos, como es lógico.
Me voy a centrar en la Raspberry Pi3+Wolfson/Cirrus Logic Audio Card.
Para preparar la Raps, instalé Raspbian Jessie.
Después añadí controladores de la Wolfson/Cirrus Logic Audio Card desde aquí: http://www.horus.com/~hias/cirrus-driver.html (he seguido los pasos que detalla)
Una vez que tenía el hardware a punto, pasé al software...
Software a instalar:
Pico2wave, para convertir un texto a wav.
Play, como reproductor.
Speechrecognition https://pypi.python.org/pypi/SpeechRecognition , instalado tal cual explican aquí.
Y como no, Gambas.
Una vez hecho todo esto, hice una aplicación de consola en gambas, que escucha a través de un servidor socket lo que reconoce python. Una vez reconocido, lo reproduce. La aplicación tal cual está, no hace otra cosa que reproducir lo que entiende de forma contínua. No es gran cosa, pero espero que pueda servir a alguien.
Yo por mi parte, estoy trabajando en Opencv(ya está integrado) y hacer que solo se ponga en modo escucha cuando detecte un rostro, además de montar algún "sistema", que permita interactuar con ordenes de voz tipo sistema inteligente, que no se limite a ordenes del tipo, anda, para, etc...
El archivo python que uso, es una modificación de uno del ejemplo de su página web. Lo cargo en una RamDisk que genero al inicio de la apli, para que vaya mas fluido el sistema por que la microsd provoca un pequeño retraso, ya que la aplicación python la abro y cierro cada vez que la uso y no daba sensación de mantener una "conversación".
2 cosillas, el código se que no es del todo perfecto, No tengo ni idea de python, solo he modificado uno hasta que ha funcionado y el código no se muestra indentado, por lo que para los legos como yo, quedan advertidos.
#!/usr/bin/env python3.4
# NOTE: this example requires PyAudio because it uses the Microphone class
import speech_recognition as sr
import socket
s = socket.socket()
s.connect(("localhost", 8811))
# this is called from the background thread
def callback(recognizer, audio):
# received audio data, now we'll recognize it 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)`
texto = recognizer.recognize_google(audio)
#print("Has dicho, " + texto)
s.send(texto.encode())
except sr.UnknownValueError:
#print('No entiendo.')
s.send(b"No entiendo.")
except sr.RequestError as e:
print("Could not request results from Google Speech Recognition service; {0}".format(e))
#s.send("No se reciben datos del servicio de reconocimiento de voz.")
#s.close()
r = sr.Recognizer()
m = sr.Microphone()
with m as source:
r.adjust_for_ambient_noise(source) # we only need to calibrate once, before we start listening
# start listening in the background (note that we don't have to do this inside a `with` statement)
stop_listening = r.listen_in_background(m, callback)
# `stop_listening` is now a function that, when called, stops background listening
# do some other computation for 5 seconds, then stop listening and keep doing other computations
import time
for _ in range(10): time.sleep(0.1) # we're still listening even though the main thread is doing other things
#stop_listening() # calling this function requests that the background listener stop listening
while True: time.sleep(0.1)
# NOTE: this example requires PyAudio because it uses the Microphone class
import speech_recognition as sr
import socket
s = socket.socket()
s.connect(("localhost", 8811))
# this is called from the background thread
def callback(recognizer, audio):
# received audio data, now we'll recognize it 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)`
texto = recognizer.recognize_google(audio)
#print("Has dicho, " + texto)
s.send(texto.encode())
except sr.UnknownValueError:
#print('No entiendo.')
s.send(b"No entiendo.")
except sr.RequestError as e:
print("Could not request results from Google Speech Recognition service; {0}".format(e))
#s.send("No se reciben datos del servicio de reconocimiento de voz.")
#s.close()
r = sr.Recognizer()
m = sr.Microphone()
with m as source:
r.adjust_for_ambient_noise(source) # we only need to calibrate once, before we start listening
# start listening in the background (note that we don't have to do this inside a `with` statement)
stop_listening = r.listen_in_background(m, callback)
# `stop_listening` is now a function that, when called, stops background listening
# do some other computation for 5 seconds, then stop listening and keep doing other computations
import time
for _ in range(10): time.sleep(0.1) # we're still listening even though the main thread is doing other things
#stop_listening() # calling this function requests that the background listener stop listening
while True: time.sleep(0.1)
Añado el archivo de gambas por si alguien quiere ver mis vergüenzas
https://mega.nz/#!QZB23BLJ!OB9NyWbXgL7_CH_z0iHnzVvbvq2AbI2K9yyDyNbbrYg
He usado el Wolfson/Cirrus Logic Audio Card, para usar sus pines de audio y ponerle unos altavoces de portátil a la raspberry.
Unas fotos,
Y una archivo de audio de como repite lo que le he dicho:
https://mega.nz/#!9cYAjBpI!9moh63GFa4NFzxxLW23rqdPO_xHuoeO8Ylv3xyxLPLY
Eso es todo, perdonar si entendéis que es una tontería esto que he puesto.
Saludos.