Este es PocketSphinx, uno de los motores de reconocimiento continuo de voz independiente del hablante y de gran vocabulario de código abierto de la Universidad Carnegie Mellon.
Aunque en un momento esto fue un sistema de investigación, el desarrollo activo ha cesado en gran medida y se ha alejado mucho, muy lejos del estado de la técnica. Estoy haciendo un lanzamiento porque la gente todavía lo está usando y hay una serie de errores históricos en el sistema de compilación y la API que debían corregirse.
El número de versión es extrañamente grande porque hubo una "versión" que la gente está usando llamada 5prealpha, y de ahora en adelante usaremos versiones semánticas adecuadas.
Consulte el archivo de LICENCIA para conocer los términos de uso.
Ahora usamos CMake para la construcción, lo que debería dar resultados razonables en Linux y Windows. No estoy seguro acerca de Mac OS X porque no tengo uno de esos. Además, la biblioteca de audio, que nunca se construyó ni funcionó correctamente en ninguna plataforma, simplemente se eliminó.
Ya no existe ninguna dependencia de SphinxBase. Ya no existe SphinxBase. Esta no es la SphinxBase que estás buscando. Todas tus SphinxBase nos pertenecen.
Para instalar el módulo Python en un entorno virtual (reemplace ~/ve_pocketsphinx
con el entorno virtual que desea crear), desde el directorio de nivel superior:
python3 -m venv ~/ve_pocketsphinx . ~/ve_pocketsphinx/bin/activate pip install .
Para instalar la biblioteca C y los enlaces (asumiendo que tiene acceso a /usr/local; si no, use -DCMAKE_INSTALL_PREFIX
para establecer un prefijo diferente en el primer comando cmake
a continuación):
cmake -S . -B build cmake --build build cmake --build build --target install
El programa de línea de comandos pocketsphinx
lee audio PCM de 16 bits de un solo canal desde una entrada estándar o uno o más archivos, e intenta reconocer el habla en él utilizando el modelo acústico y de lenguaje predeterminado. Acepta una gran cantidad de opciones que probablemente no le interesen, un comando que por defecto es live
y una o más entradas (excepto en modo align
), o -
para leer desde la entrada estándar.
Si tiene un archivo WAV de un solo canal llamado "speech.wav" y desea reconocer la voz en él, puede intentar hacer esto (los resultados pueden no ser maravillosos):
pocketsphinx single speech.wav
Si su entrada está en algún otro formato, le sugiero convertirla con sox
como se describe a continuación.
Los comandos son los siguientes:
help
: Imprima una larga lista de aquellas opciones que no le interesan.
config
: volca la configuración como JSON a la salida estándar (se puede cargar con la opción -config
).
live
: detecta segmentos de voz en cada entrada, ejecuta el reconocimiento en ellos (usando aquellas opciones que no te interesan) y escribe los resultados en la salida estándar en JSON delimitado por líneas. Me doy cuenta de que este no es el formato más bonito, pero seguro que supera a XML. Cada línea contiene un objeto JSON con estos campos, que tienen nombres cortos para que las líneas sean más legibles:
b
: Hora de inicio en segundos, desde el inicio de la transmisión
d
: Duración en segundos
p
: Probabilidad estimada del resultado del reconocimiento, es decir, un número entre 0 y 1 que representa la probabilidad de la entrada según el modelo.
t
: Texto completo del resultado del reconocimiento
w
: Lista de segmentos (normalmente palabras), cada uno de los cuales a su vez contiene los campos b
, d
, p
y t
, para el inicio, el final, la probabilidad y el texto de la palabra. Si se ha pasado -phone_align yes
, aparecerá un campo w
que contiene segmentaciones de teléfono, en el mismo formato.
single
: reconoce cada entrada como una única expresión y escribe un objeto JSON en el mismo formato descrito anteriormente.
align
: alinea un único archivo de entrada (o -
para entrada estándar) con una secuencia de palabras y escribe un objeto JSON en el mismo formato descrito anteriormente. El primer argumento posicional es la entrada, y todos los siguientes se concatenan para formar el texto, para evitar sorpresas si olvidas citarlo. Eres responsable de normalizar el texto para eliminar puntuación, mayúsculas, ciempiés, etc. Por ejemplo:
pocketsphinx align goforward.wav "go forward ten meters"
De forma predeterminada, sólo se realiza la alineación a nivel de palabra. Para obtener alineaciones telefónicas, pase -phone_align yes
en las banderas, por ejemplo:
pocketsphinx -phone_align yes align audio.wav $text
Esto hará que el resultado no sea particularmente legible, pero puedes usar jq para limpiarlo. Por ejemplo, puede obtener solo los nombres de las palabras y las horas de inicio como esta:
pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]'
O puede obtener los nombres de los teléfonos y las duraciones de esta manera:
pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]'
Por supuesto, hay muchas, muchas otras posibilidades.
soxflags
: devuelve argumentos a sox
que crearán el formato de entrada apropiado. Tenga en cuenta que debido a que la línea de comandos sox
es un poco peculiar, siempre deben aparecer después del nombre del archivo o -d
(que le indica sox
que lea desde el micrófono). Puede ejecutar el reconocimiento en vivo de esta manera:
sox -d $(pocketsphinx soxflags) | pocketsphinx -
o decodificar desde un archivo llamado "audio.mp3" como este:
sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx -
De forma predeterminada, solo los errores se imprimen en error estándar, pero si desea obtener más información, puede pasar -loglevel INFO
. Los resultados parciales no se imprimen, tal vez lo hagan en el futuro, pero no contenga la respiración.
Para programar, consulte el directorio de ejemplos para ver varios ejemplos de uso de la biblioteca de C y Python. También puede leer la documentación de la API de Python o la API de C.
PocketSphinx se basa en última instancia en Sphinx-II
, que a su vez se basó en algunos sistemas más antiguos de la Universidad Carnegie Mellon, que fueron lanzados como software libre bajo una licencia similar a BSD gracias a los esfuerzos de Kevin Lenzo. Gran parte del decodificador en particular fue escrito por Ravishankar Mosur (busque "rkm" en los comentarios), pero otras personas también contribuyeron; consulte el archivo AUTORES para obtener más detalles.
David Huggins-Daines (el autor de este documento) es responsable de crear PocketSphinx
, que agregó varias optimizaciones de velocidad y memoria, computación de punto fijo, soporte JSGF, portabilidad a varias plataformas y una API algo coherente. Luego desapareció por un tiempo.
Nickolay Shmyrev se hizo cargo del mantenimiento durante bastante tiempo después, y Alexander Solovets, Vyacheslav Klimkov y otros contribuyeron con una gran cantidad de código.
Actualmente esto lo mantiene nuevamente David Huggins-Daines.