Skip to content

bender_speech

Matías Pavez edited this page May 8, 2017 · 1 revision

#bender_speech

Package Summary

bender_speech contiene los nodos y archivos necesarios para interactuar con Bender mediante la voz.

[TOC]

1. Hardware

Para escuchar Bender cuenta con un microfono M-Audio Producer USB Microphone.

2. Software

2.1 Dependencias

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.

2.2 Nodes

2.2.1 synthesizer

2.2.2.1 Topics

2.2.2.2 Services

2.2.2 recognizer

2.2.3 ask_question

  • 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:
      1. Sintetiza pregunta del campo question
      1. Carga el dictionary especificado para el reconocedor
      1. Espera detectar alguna respuesta (indefinidamente)
      1. Repite el proceso, con el diccionario confirmation, para confirmar la detección: "Did you say <answer>?"
      1. En caso de obtener una afirmación: retorna answer. De lo contrario, intenta nuevamente (punto (2)).
      1. Si se reciben max_attempts negaciones, se retorna: answer:="max_attempts_reached".

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'

2.3 Launch

3. Como funciona? - Reconocimiento y síntesis de voz solo en Inglés

  1. Conectar hardware externo (e.g. micrófono USB).

  2. 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.
  3. Lanzar bender.launch roslaunch bender_speech speech.launch

    Este launch lanza los nodos:

    • recognizer
    • sound_play
    • synthesizer
  4. Para el reconocimiento de voz:

    • Ejecutar pavucontrol en el terminal y rutear las entradas y salidas como se muestra a continuación:

    playback.png recording.png

    • 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