-
Notifications
You must be signed in to change notification settings - Fork 2
bender_speech
#bender_speech
bender_speech contiene los nodos y archivos necesarios para interactuar con Bender mediante la voz.
[TOC]
Para escuchar Bender cuenta con un microfono M-Audio Producer USB Microphone.
bender_speech depende de los packages:
-
audio_common stack, que contiene:
- audio_capture
- audio_common_msgs
- audio_play
- sound_play
-
cmusphinx-code, librería utilizada para la creación de modelos de lenguajes y diccionarios gramaticales, y para el reconocimiento de voz.
- PocketSphinx para el reconocimiento de voz.
- logios que permite crear diccionarios .dic en base a gramáticas creadas en un archivo .jsgf
- cmuclmtk-0.7 ejecutables necesarios para pasar de .jsgf a .fsg
-
Festival y mbrola_voices para la síntesis de voz.
-
Pulse Audio Volume Control (pavucontrol) para rutear la entrada y salida de audio en speech recognizer.
- Funcionalidad/macro construida sobre los nodos principales (
synthesizer
&recognizer
) - Permite la realización de preguntas a un interlocutor y su respectiva confirmación, por medio del servicio
/bender/speech/ask_question/ask
- El srv utilizado es bender_srvs/AskQuestion.
- Su funcionamiento se detalla a continuación:
-
-
Sintetiza pregunta del campo
question
-
Sintetiza pregunta del campo
-
-
Carga el
dictionary
especificado para el reconocedor
-
Carga el
-
- Espera detectar alguna respuesta (indefinidamente)
-
- Repite el proceso, con el diccionario
confirmation
, para confirmar la detección:"Did you say <answer>?"
- Repite el proceso, con el diccionario
-
- En caso de obtener una afirmación: retorna
answer
. De lo contrario, intenta nuevamente (punto (2)).
- En caso de obtener una afirmación: retorna
-
- Si se reciben
max_attempts
negaciones, se retorna:answer:="max_attempts_reached"
.
- Si se reciben
-
Nota: De momento, el campo bender_srvs/AskQuestion --> hints
no se utiliza, pero se propone una implementación más avanzada del servicio a futuro.
Uso típico:
$ roslaunch bender_speech speech.launch
$ roslaunch bender_speech ask_question.launch
#!/usr/bin/env python
# do some ros imports ...
# required imports
from bender_srvs.srv import AskQuestion
from bender_srvs.srv import AskQuestionRequest
from bender_srvs.srv import AskQuestionResponse
# ros stuff ...
# - - - - - example code - - - - - -
ask_client = rospy.ServiceProxy('/bender/speech/ask_question/ask', AskQuestion)
ask_req = AskQuestionRequest()
ask_req.question = "Do you need water?"
ask_req.dictionary = "confirmation"
ask_req.max_attempts = 3
ask_req.hints = []
while True:
ask_client.wait_for_service()
ask_res = ask_client(ask_req)
if ask_res.answer == 'yes':
return 'water'
elif ask_res.answer == 'no':
return 'not water'
-
Conectar hardware externo (e.g. micrófono USB).
-
Lanzar el script para pre-procesamiento de voz
roscd bender_speech/utils && ./start_input.sh
- Opcionalmente se puede usar
./start_input --auto
para usar los parámetros por defecto.
- Opcionalmente se puede usar
-
Lanzar bender.launch
roslaunch bender_speech speech.launch
Este launch lanza los nodos:
- recognizer
- sound_play
- synthesizer
-
Para el reconocimiento de voz:
- Ejecutar
pavucontrol
en el terminal y rutear las entradas y salidas como se muestra a continuación:
- El diccionario a reconocer debe estar en
bender_speech/Grammar
- Cargar diccionario utilizando el servicio
/bender/speech/recognizer/load_dictionary
- Este comando puede ser util para monitorear el funcionamiento:
rosservice call /bender/speech/recognizer/load_dictionary "dictionary: 'words/quest'" && rosservice call /bender/speech/recognizer/start && rostopic echo /bender/speech/recognizer/output
- Ejecutar