Procesamiento de voz en Raspberry Pi

43

Quiero hacer procesamiento de voz en Raspberry Pi para detectar personas específicas (algo así como una identificación única).

Preferiría usar solo el procesador de a bordo para esto, podría suponer que Internet no es accesible.

Además, ¿cuáles son las limitaciones con el Raspberry Pi que realiza el procesamiento de voz? Si quiero usar esto como una máquina de asistencia automática, ¿cómo debo proceder?

Ruthvik Vaila
fuente
44
¿De qué tipo de "procesamiento de voz" estás hablando ?: reconocimiento de las muestras de voz pregrabadas (entonces puedes usar algún tipo de índice de similitud entre el original, es decir, el archivo de voz pregrabado y de prueba) o el reconocimiento de voz "real" (puede ser muy pesado) CPU intensiva en tiempo real, especialmente para algunos idiomas y buena tasa de reconocimiento)
TomiL

Respuestas:

61

Este es el proyecto principal al que se dedica mi Raspberry Pi en este momento, así que creo que puedo agregar mis dos centavos. Tenga en cuenta que este proyecto sigue siendo un trabajo en progreso.

Elegí usar el lenguaje de programación C para este proyecto exclusivamente en el sistema operativo Raspbian, y eso puede haber afectado algunas de mis decisiones e instrucciones. Solo voy a enumerar software libre y de código abierto , ya que eso es todo lo que uso.

Para las instrucciones de instalación, supondré que tiene un sistema completamente actualizado .


Reconocimiento de voz

Estas son algunas opciones para los motores de reconocimiento de voz :

  1. Pocketsphinx : una versión de Sphinx que se puede usar en sistemas integrados (por ejemplo, basado en un procesador ARM).

    • Pros : En desarrollo activo e incorpora características tales como aritmética de punto fijo y algoritmos eficientes para computación GMM . Todo el procesamiento se lleva a cabo en la Raspberry Pi, por lo que puede usarse sin conexión. Es compatible con el reconocimiento de voz en tiempo real

    • Contras : es complicado de configurar y comprender para principiantes. Para mí, era demasiado impreciso para mi aplicación. Todo el procesamiento tiene lugar en la Raspberry Pi, lo que lo hace un poco más lento.

    • Instrucciones de instalación :

      1. Descargue las últimas versiones estables de Sphinxbase y Pocketsphinx :

        $ wget http://sourceforge.net/projects/cmusphinx/files/sphinxbase/0.8/sphinxbase-0.8.tar.gz
        $ wget http://sourceforge.net/projects/cmusphinx/files/pocketsphinx/0.8/pocketsphinx-0.8.tar.gz
        
      2. Extrae los archivos descargados:

        $ tar -zxvf pocketsphinx-0.8.tar.gz; rm -rf pocketsphinx-0.8.tar.gz
        $ tar -zxvf sphinxbase-0.8.tar.gz; rm -rf sphinxbase-0.8.tar.gz
        
      3. Para compilar estos paquetes, necesitará instalar bison y los encabezados de desarrollo de ALSA.

        NOTA : Es importante que los encabezados ALSA se instalen antes de compilar Sphinxbase. De lo contrario, Sphinxbase no utilizará ALSA. También parece que ALSA no se usará si PulseAudio está instalado (algo malo para desarrolladores como yo).

        $ sudo apt-get install bison libasound2-dev
        
      4. cd en el directorio de Sphinxbase y escriba los siguientes comandos:

        $ ./configure --enable-fixed
        $ sudo make
        $ sudo make install
        
      5. cd en el directorio Pocketsphinx y escriba los siguientes comandos:

        $ ./configure
        $ sudo make
        $ sudo make install
        
      6. Pruebe Pocketsphinx ejecutando:

        $ src/programs/pocketsphinx_continuous -samprate 48000 
        

        Si desea modificarlo, le recomiendo que lea algo de información en el CMUSphinx Wiki .

  2. libsprec : una biblioteca de reconocimiento de voz desarrollada por H2CO3 (con pocas contribuciones de mi parte, principalmente correcciones de errores).

    • Pros : Utiliza la API de Google Speech , lo que lo hace más preciso. El código es más fácil de entender (en mi opinión).

    • Contras : tiene dependencias de otras bibliotecas que H2CO3 ha desarrollado (como libjsonz ). El desarrollo es irregular. Utiliza la API de Google Speech, lo que significa que el procesamiento no tiene lugar en la Raspberry Pi en sí misma, y ​​requiere una conexión a Internet. Requiere una pequeña modificación al código fuente antes de que la compilación funcione correctamente en la Raspberry Pi.

    • Instrucciones de instalación :

      1. Instale libflac , libogg y libcurl :

        $ sudo apt-get install libcurl4-openssl-dev libogg-dev libflac-dev
        
      2. Descargue la versión más reciente de libsprec

        $ wget https://github.com/H2CO3/libsprec/archive/master.zip
        
      3. Descomprima el paquete descargado:

        $ unzip master.zip; rm -rf master.zip
        

        Ahora debería tener una carpeta nombrada libsprec-masteren su directorio actual.

      4. Descargue la versión más reciente de libjsonz :

        $ wget https://github.com/H2CO3/libjsonz/archive/master.zip
        
      5. Descomprima el paquete descargado:

        $ unzip master.zip; rm -rf master.zip
        

        Ahora debería tener una carpeta nombrada libjsonz-masteren su directorio actual.

      6. cden el libjsonz-masterdirectorio, compilar e instalar:

        $ cd libjsonz-master
        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      7. cdfuera del libjsonz-masterdirectorio y dentro del libsprec-master/srcdirectorio. Editar línea 227:

        $ err = snd_pcm_open(&handle, "pulse", SND_PCM_STREAM_CAPTURE, 0);
        

        Necesitamos esto para decir:

        $ err = snd_pcm_open(&handle, "plughw:1,0", SND_PCM_STREAM_CAPTURE, 0);
        

        Esto es para que el programa use ALSA para apuntar al micrófono USB.

      8. Compilar e instalar:

        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      9. Ahora puede usar la biblioteca en sus propias aplicaciones. Busque en la carpeta libsprec-masterde ejemplos para ver ejemplos.

  3. Julius : unsoftware decodificador dereconocimiento de voz continuo ( LVCSR ) dealto rendimiento y vocabulario grande de dos pasadaspara investigadores y desarrolladores relacionados con el habla.

    • Pros : puede realizar el reconocimiento de voz casi en tiempo real en la propia Raspberry Pi. Los formatos de modelo de voz estándar se adoptan para hacer frente a otros kits de herramientas de modelado gratuitos.

    • Contras : desarrollo irregular, con su última actualización hace más de un año. Su reconocimiento también es demasiado inexacto y lento para mi uso. Largo tiempo de instalación

    • Instrucciones de instalación :

      1. Hay algunos paquetes que necesitamos instalar para que el sistema funcione correctamente:

        $ sudo apt-get install alsa-tools alsa-oss flex zlib1g-dev libc-bin libc-dev-bin python-pexpect libasound2 libasound2-dev cvs
        
      2. Descargue Julius de la fuente CVS:

        $ cvs -z3 -d:pserver:[email protected]:/cvsroot/julius co julius4
        
      3. Establezca los indicadores del compilador por las variables de entorno:

        $ export CFLAGS="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
        
      4. cden la carpeta julius4y escriba los siguientes comandos

        $ ./configure --with-mictype=alsa
        $ sudo make
        $ sudo make install
        
      5. Julius necesita una variable de entorno llamada ALSADEVpara indicarle qué dispositivo usar para un micrófono:

        $ export ALSADEV="plughw:1,0"
        
      6. Descargue un modelo acústico gratuito para que lo use Julius. Una vez que lo haya descargado, cdingrese al directorio y ejecute:

        $ julius -input mic -C julius.jconf
        

        Después de eso, debería poder comenzar la entrada de voz.

  4. Haga rodar su propia biblioteca : para mi proyecto específico, elijo crear mi propia biblioteca de reconocimiento de voz que graba audio de un micrófono USB usando ALSA a través de PortAudio , lo almacena en un archivo FLAC a través de libsndfile y lo envía a Google para que lo procesen eso. Luego me envían un archivo JSON bien empaquetado que luego proceso para obtener lo que le dije a mi Raspberry Pi.

    • Pros : controlo todo (lo que me gusta). Aprendo mucho (que me gusta).

    • Contras : es mucho trabajo. Además, algunas personas pueden argumentar que en realidad no estoy haciendo ningún procesamiento en la Raspberry Pi con esta biblioteca de reconocimiento de voz. Yo se eso . Google puede procesar mis datos con mucha más precisión que yo en este momento. Estoy trabajando en la construcción de una opción de reconocimiento de voz fuera de línea precisa.


Síntesis de voz

Estas son algunas opciones para los motores de síntesis de voz :

  1. tritium : un motor de síntesis de voz de calidad premium gratuito, escrito completamente en C (y desarrollado por los suyos).

    • Pros: Extremadamente portátil (sin dependencias además de CMake para construir), extremadamente pequeño (el más pequeño que pude encontrar), fácil de construir.

    • Contras: la salida de voz en sí misma puede ser inexacta a veces. Falta el soporte para una amplia variedad de idiomas, ya que soy el único desarrollador en este momento con poco tiempo libre, pero este es uno de los objetivos futuros del proyecto. Además, a partir de ahora solo se genera una biblioteca cuando se compila y no se puede usar / ejecutar ejecutable.

  2. eSpeak : un sintetizador de voz de software de código abierto compacto para Linux, Windows y otras plataformas.

    • Pros : Utiliza un método de síntesis formante , que proporciona muchos idiomas hablados en un tamaño pequeño. También es muy preciso y fácil de entender. Originalmente usé esto en mi proyecto, pero debido a las desventajas tuve que cambiar a otro motor de síntesis de voz.

    • Contras : tiene algunas dependencias extrañas en X11 , lo que a veces tartamudea. La biblioteca también es considerablemente grande en comparación con otras.

    • Instrucciones de instalación :

      1. Instale el software eSpeak:

        $ sudo apt-get install espaek
        
      2. Para decir lo que quieres en eSpeak:

        $ espeak "Hello world"
        

        Para leer de un archivo en eSpeak:

        $ espeak -f <file>
        
  3. Festival : un sistema general de síntesis de voz multilingüe.

    • Pros : está diseñado para admitir múltiples idiomas hablados. Puede usar el proyecto Festvox que tiene como objetivo hacer que la construcción de nuevas voces sintéticas sea más sistemática y mejor documentada, haciendo posible que cualquiera pueda construir una nueva voz.

    • Contras : está escrito en C ++ (más una desventaja para mí específicamente). También tiene una base de código más grande, por lo que sería difícil para mí entender y portar el código.

    • Instrucciones de instalación :

      1. Instala el software del Festival:

        $ sudo apt-get install festival festival-freebsoft-utils
        
      2. Para ejecutar Festival, canalice el texto o el archivo que desea que lea:

        $ echo  "Hello world" | festival --tts
        
  4. Flite : un pequeño motor de síntesis de voz en tiempo de ejecución derivado del Festival y el proyecto Festvox.

    • Pros : En constante desarrollo en la Universidad Carnegie Mellon. Motor muy pequeño en comparación con otros. También tiene una base de código más pequeña, por lo que es más fácil de recorrer. Casi no tiene dependencias (un gran profesional para mí, y otra razón por la que decidí usar este motor en mi proyecto).

    • Contras : la salida de voz en sí no siempre es precisa. El discurso tiene un sonido muy metálico, no humano (más que los otros motores). No es compatible con muchos idiomas.

    • Instrucciones de instalación :

      1. Instale el software Flite:

        $ sudo apt-get install flite
        
      2. Para ejecutar Flite:

        $ flite -t "text that you want flite to say"
        

Respuestas a sus preguntas específicas :

¿Cuáles son las limitaciones con el Pi que realiza el procesamiento de voz?

Los programadores no tienen límites. :P

En una nota más seria, la Raspberry Pi tiene muchos recursos para manejar el procesamiento de voz. Mientras la persona que realiza el procesamiento del habla sepa lo que está haciendo, la Raspberry Pi debería ser capaz de manejarlo bien.

Quiero usar esta máquina de asistencia automática, ¿cómo debo proceder?

Ninguna de estas opciones es lo suficientemente precisa como para distinguir la diferencia entre personas específicas todavía . Eso es algo en lo que estoy trabajando en mi proyecto (y probablemente lo será por un tiempo). Si está buscando una mejor opción para la asistencia automática, buscaría en el reconocimiento facial . Sin embargo, existen más limitaciones en el reconocimiento facial para Raspberry Pi, así que tenlo en cuenta.

syb0rg
fuente
66
¡Esta es una respuesta increíble! Realmente sacaste todos los trucos :)
Piotr Kula
Hace +1 'hace un tiempo, pero acabo de notar que H2CO3 ya no está presente en SE. Su enlace a su perfil 404s.
The Guy with The Hat
¿Tiene una manera de enviar sonidos a Google solo si alguien ha dicho una palabra pregrabada primero como palabra de activación? (Estoy hablando de la parte de "Publicar tu propia biblioteca")
Robert
@Robert Sí, pero es bastante complicado y me implicó integrar PocketSphinx para poder haber entrenado el reconocimiento de voz sin conexión. Tal vez pueda actualizar la publicación más tarde con más información sobre esto si lo desea.
syb0rg
@ syb0rg, también estoy esperando tu publicación sobre el seguimiento fuera de línea de una palabra activadora y es posible que luego esté procesando la siguiente oración completa en Google.
Ashish K
5

Fui con pocketsphinx_continuous y una tarjeta de sonido de $ 4 .

Para manejar el hecho de que necesita dejar de escuchar cuando se usa el sintetizador de voz, utilicé un mezclador para manejar el volumen de entrada al micrófono (esta fue la mejor práctica recomendada por CMU, ya que el motor de arranque de parada dará lugar a un reconocimiento más pobre)

echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null 

Con un comando coincidente para silenciar la escucha cuando se reproduce el sintetizador de voz

FILE: mute.sh
#!/bin/sh

sleep $1;
amixer -c 1 set Mic 0 unmute >/dev/null 2>&1 ; 
echo  "** MIC OFF **" >> /home/pi/PIXIE/audio.log

Para calcular los tiempos correctos para silenciar, simplemente ejecuto soxi a través de lua y luego configuro el unmute.sh (opuesto al mute.sh) para ejecutar "x" segundos desde el inicio. No hay duda de muchas maneras de manejar esto. Estoy contento con los resultados de este método.

SNIPPET LUA:

-- Begin parallel timing  
-- MUTE UNTIL THE SOUNDCARD FREES UP 
-- "filename" is a fully qualified path to a wav file 
-- outputted by voice synth in previous operation

-- GET THE LENGTH
local sample_length = io.popen('soxi -D '..filename);
local total_length  = sample_length:read("*a"); 
clean_length = string.gsub(total_length, "\n", "") +1;  
sample_length:close();

-- EXAMPLE LOGGING OUTPUT...
--os.execute( 'echo LENGTH WAS "'.. clean_length .. '" Seconds  >> ./audio.log');   



-- we are about to play something... 
-- MUTE, then schedule UNMUTE.sh in x seconds, then play synth output
-- (have unrolled mute.sh here for clarity)

os.execute( 'amixer -c 1 set Mic '..mic_level..' unmute 2>&1 >/dev/null ');
os.execute( 'echo "** MIC OFF **"  >> ./audio.log ');

-- EXAMPLE LOGGING OUTPUT...    
-- os.execute( 'echo PLAYING: "'.. filename..'" circa ' .. clean_length .. ' Seconds  >> ./audio.log ');

os.execute( './unmute.sh "'.. clean_length ..'" &');


-- THEN PLAY THE THING WHILE THE OTHER PROCESS IS SLEEPING  

os.execute( './sounds-uncached.sh '..filename..' 21000')

Para realmente captar la voz en el pi que uso:

pocketsphinx_continuous -bestpath 0 -adcdev plughw:1  -samprate 20000  \
-nfft 512 -ds2 -topn2 -maxwpf 5 -kdtreefn 3000 -kdmaxdepth 7 -kdmaxbbi 15 \
-pl_window 10 -lm ./LANGUAGE/0892-min.lm -dict ./LANGUAGE/0892-min.dic 2>&1 \
| tee -i 2>/dev/null >( sed -u -n -e 's/^.\{9\}: //p' ) \
>( sed -u -n -e 's/^READY//p' \
-e 's/^Listening//p' -e 's/^FATAL_ERROR: \"continuous\.c\"\, //p') \
> /dev/null

Nuevamente, hay otras formas, pero me gusta mi salida de esta manera.

Para el sintetizador, utilicé la solución Pi Cepstrals incipiente, pero no está disponible en línea, debe contactarlos directamente para organizar la compra y cuesta alrededor de $ 30. Los resultados son aceptables, sin embargo, el discurso crea algunos clics desagradables, la compañía respondió que ya no tienen un RaspPi y no están dispuestos a mejorar el producto. YMMV

El reconocimiento de voz se encuentra en alrededor del 12% de la CPU cuando está "inactivo", y se dispara brevemente cuando se realiza una porción de reconocimiento.

La creación de voz aumenta a aproximadamente 50-80% cuando se procesa.

El play / sox pesa bastante, pero aplico efectos en tiempo real a las voces renderizadas mientras las toco;)

El pi se elimina en gran medida utilizando todas las guías que pude encontrar para detener los servicios no necesarios y se ejecuta en modo CLI completo. 800mhz over-clocked (el más pequeño).

scaling_governor establecido en: rendimiento

Cuando funciona completamente: funciona a aproximadamente 50ºC a la luz solar directa y a 38ºC a la sombra. Tengo disipadores de calor instalados.

Último punto: en realidad ejecuto todo este equipo a la IA "impulsada por Internet" como un buen extra.

El pi maneja todo esto a la perfección, y reproduce cualquier audio en red en tiempo real, y audio en bucle completo a cualquier otra caja de Unix. etc.

Para manejar la gran carga de la CPU de voz, he implementado un sistema de almacenamiento en caché basado en md5sum para que las mismas expresiones no se procesen dos veces. (alrededor de 1000 archivos a 220 mb en total cubren el 70% de las expresiones que generalmente obtengo de la IA), esto realmente ayuda a reducir la carga total de la CPU en general.

En resumen, todo esto es totalmente factible. sin embargo, el reconocimiento de voz solo será tan bueno como la calidad de sus micrófonos, su modelo de idioma, qué tan específicamente están las voces de sus sujetos con la audiencia original (uso un modelo en_US en niños en_UK, no perfecto) y otros detalles minuciosos que con esfuerzo puedes reducir a un resultado decente.

Y para que conste, ya hice todo esto una vez antes con un Kindle (y eso también funcionó con cmu sphinx y flite). Espero que esto ayude.

dos bobos
fuente
La respuesta donde el OP dice "Lo envié a Google para su procesamiento", me encantaría saber exactamente dónde lo envías.
twobob
1
Soy ese OP. Puedes enviarme un ping en esta sala de chat y debería poder contactarte en poco tiempo. Podemos discutir más allí, y también puedo agregar elementos a mi respuesta.
syb0rg
3

Sí. use PocketSphinx para reconocimiento de voz, Festvox para texto a voz (TTS) y algo de audio USB con entrada de línea (o una cámara web antigua compatible que también tiene entrada de línea).

Google busca estos paquetes de software y "Raspberry Pi" proporciona muchos ejemplos y tutoriales para configurarlo.

Dr.Avalanche
fuente
3
  • SiriProxy : solo use esto si tiene un dispositivo que usa Siri; no necesita hacer jailbreak. Básicamente, intercepta a Siri en la red en la que lo instala.
  • Speech2Text : puede usar la API de Google para decodificar la voz en texto, pero el ejemplo también contiene algunos otros métodos.
  • Julius : un decodificador de reconocimiento de voz.

Como lo señaló Lenik, necesitará alguna forma de grabar audio o posiblemente enviar archivos de audio a la Raspberry Pi para que se decodifiquen de alguna manera.

Piotr Kula
fuente
SiriProxy y Speech2Text no procesan la voz en la frambuesa pi, usan servidores Apple / Google.
Dr.Avalanche
2
Sí. Yo dije eso. Sin embargo, siguen siendo una solución interesante para el reconocimiento de voz. Además, el OP no impuso ninguna restricción. Gracias por tu voto negativo. gruñido
Piotr Kula
"... ** en ** una frambuesa pi", al cargarlo y realizar el procesamiento en otros servicios, estos no coinciden con los criterios especificados en la pregunta. También es interesante que se queje de votos negativos, dado su historial de publicaciones de votos negativos que afirma que son de baja calidad o no abordan la pregunta.
Dr.Avalanche
2
En Pi no significa más que usar Pi. El Pi es capaz de conectarse a Internet, así que le di la opción, no se dijo específicamente "No quiero usar Internet" O no hay forma de usar Internet. Posiblemente podría actualizar su pregunta y la respuesta se volvería irrelevante. Solo tengo un historial de publicaciones de voto negativo que lo necesitaban. Nunca rechazo a menos que pueda ver margen de mejora. Estoy seguro de que ya lidiamos con eso antes.
Piotr Kula
1
Creo que el último comentario decía algo como "Por favor, mejora esta respuesta" y luego te votaré. Las preguntas frecuentes reales de toda la red fruncen el ceño al vincularse a guías externas. Solo quiero ofrecer buenos consejos, pero aún así eliges enojarte contra mí. Expresé mi opinión sobre la trenza desoldadora, te volviste balístico y aún guardabas rencor. Pero aún así ni siquiera trataste de mejorar la respuesta. Lo marqué, tal vez alguien lo eliminará o lo convertirá en un comentario y el voto negativo se eliminará en su contra. ¿Qué es el acecho y el voto negativo que voy a probar?
Piotr Kula
2

Raspberry Pi no tiene ADC incorporado ni entrada de micrófono. A menos que esté planeando usar un micrófono USB externo, básicamente no hay forma de llevar su transmisión de audio al dispositivo. Además de eso, no hay limitaciones serias, la CPU es lo suficientemente potente como para cualquier procesamiento de sonido que intente implementar.

lenik
fuente
1

En primer lugar, debe seleccionar un conjunto de palabras para el proceso de clasificación. Después de eso, debe recopilar los datos de los usuarios / sujetos. Será señal no estacionaria. Debe reducir sus datos para reducir los costos computacionales / mejorar la relación de éxito con los métodos de extracción de características, por lo que debe buscar métodos de extracción de características adecuados para su aplicación. Puede obtener un vector de características como resultado de estos métodos (valor absoluto medio, RMS, longitud de forma de onda, cruce por cero, valor absoluto integrado, coeficientes AR, frecuencia media, frecuencia media, etc.). Luego, debe usar un método de clasificación como knn, redes neuronales, etc. para clasificar sus datos. Por último, debe verificar su precisión. Para resumir:

  1. Seleccione un conjunto de palabras / oraciones.
  2. Obtenga los datos de los sujetos humanos.
  3. Preproceso (tal vez la señal necesita ser filtrada)
  4. Extracción / procesamiento de características.
  5. Clasificación.
  6. Pruebas

He visto proyectos de procesamiento de video con RPi en Internet para que pueda hacer esta clasificación.

Puede usar NI 6009 USB DAQ (que admite RPi) para recopilar datos analógicos, pero son un poco caros.

cagdas
fuente