Allosaurus es un reconocimiento de teléfono universal previamente provocado. Se puede usar para reconocer teléfonos en más de 2000 idiomas.
Esta herramienta se basa en nuestro reconocimiento de teléfono universal de trabajo ICASSP 2020 con un sistema de alófonos multilingües
Allosaurus está disponible en Pip
pip install allosaurus
También puede clonar este repositorio e instalar
python setup.py install
El uso básico es bastante simple, su entrada es un archivo de audio WAV y la salida es una secuencia de teléfonos.
python -m allosaurus.run -i < audio >
Por ejemplo, puede intentar usar el archivo de muestra adjunto en este repositorio. Adivina lo que hay en este archivo de audio :)
python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
También puedes usar Allosaurus directamente en Python
from allosaurus . app import read_recognizer
# load your model
model = read_recognizer ()
# run inference -> æ l u s ɔ ɹ s
model . recognize ( 'sample.wav' )
Para obtener funciones y detalles completos, consulte las siguientes secciones.
La interfaz de línea de comando es la siguiente:
python -m allosaurus.run [--lang < language name > ] [--model < model name > ] [--device_id < gpu_id > ] [--output < output_file > ] [--topk < int > ] -i < audio file/directory >
Reconocerá los teléfonos estrechos en los archivos de audio. Solo el argumento de entrada es obligatorio, se pueden ignorar otras opciones. Consulte las siguientes secciones para obtener sus detalles.
También hay una simple interfaz de Python de la siguiente manera:
from allosaurus . app import read_recognizer
# load your model by the <model name>, will use 'latest' if left empty
model = read_recognizer ( model )
# run inference on <audio_file> with <lang>, lang will be 'ipa' if left empty
model . recognize ( audio_file , lang )
Los detalles de los argumentos en ambas interfaz son los siguientes:
La entrada puede ser un solo archivo o un directorio que contenga múltiples archivos de audio.
Si la entrada es un solo archivo, solo emitirá la secuencia del teléfono; Si la entrada es un directorio, generará tanto el nombre del archivo como la secuencia del teléfono, los resultados se ordenarán con los nombres de archivo.
Los archivos de audio deben estar en el siguiente formato:
Debería ser un archivo WAV. Si el audio no está en el formato WAV, convierta su audio en un formato WAV usando SOX o FFMPEG por adelantado.
La tasa de muestreo puede ser arbitraria, los volveremos a probar automáticamente en función de los requisitos de los modelos.
Suponemos que el audio es un audio monoanal.
La salida es por defecto stDout (es decir, imprimirá todos los resultados en el terminal).
Si especifica un archivo como salida, se dirigirá toda la salida a ese archivo.
La opción lang
es la ID del idioma. Es para especificar el inventario del teléfono que desea usar. La opción predeterminada es ipa
, que le dice al reconocedor que use todo el inventario (alrededor de 230 teléfonos).
En general, especificar el inventario del idioma puede mejorar su precisión de reconocimiento.
Puede consultar la lista completa de idiomas con el siguiente comando. El número de idiomas disponibles es de alrededor de 2000.
python -m allosaurus.bin.list_lang
Para verificar el inventario del idioma, puede usar el siguiente comando
python -m allosaurus.bin.list_phone [--lang < language name > ]
Por ejemplo,
# to get English phone inventory
# ['a', 'aː', 'b', 'd', 'd̠', 'e', 'eː', 'e̞', 'f', 'h', 'i', 'iː', 'j', 'k', 'kʰ', 'l', 'm', 'n', 'o', 'oː', 'p', 'pʰ', 'r', 's', 't', 'tʰ', 't̠', 'u', 'uː', 'v', 'w', 'x', 'z', 'æ', 'ð', 'øː', 'ŋ', 'ɐ', 'ɐː', 'ɑ', 'ɑː', 'ɒ', 'ɒː', 'ɔ', 'ɔː', 'ɘ', 'ə', 'əː', 'ɛ', 'ɛː', 'ɜː', 'ɡ', 'ɪ', 'ɪ̯', 'ɯ', 'ɵː', 'ɹ', 'ɻ', 'ʃ', 'ʉ', 'ʉː', 'ʊ', 'ʌ', 'ʍ', 'ʒ', 'ʔ', 'θ']
python -m allosaurus.bin.list_phone --lang eng
# you can also skip lang option to get all inventory
#['I', 'a', 'aː', 'ã', 'ă', 'b', 'bʲ', 'bʲj', 'bʷ', 'bʼ', 'bː', 'b̞', 'b̤', 'b̥', 'c', 'd', 'dʒ', 'dʲ', 'dː', 'd̚', 'd̥', 'd̪', 'd̯', 'd͡z', 'd͡ʑ', 'd͡ʒ', 'd͡ʒː', 'd͡ʒ̤', 'e', 'eː', 'e̞', 'f', 'fʲ', 'fʷ', 'fː', 'g', 'gʲ', 'gʲj', 'gʷ', 'gː', 'h', 'hʷ', 'i', 'ij', 'iː', 'i̞', 'i̥', 'i̯', 'j', 'k', 'kx', 'kʰ', 'kʲ', 'kʲj', 'kʷ', 'kʷʼ', 'kʼ', 'kː', 'k̟ʲ', 'k̟̚', 'k͡p̚', 'l', 'lʲ', 'lː', 'l̪', 'm', 'mʲ', 'mʲj', 'mʷ', 'mː', 'n', 'nj', 'nʲ', 'nː', 'n̪', 'n̺', 'o', 'oː', 'o̞', 'o̥', 'p', 'pf', 'pʰ', 'pʲ', 'pʲj', 'pʷ', 'pʷʼ', 'pʼ', 'pː', 'p̚', 'q', 'r', 'rː', 's', 'sʲ', 'sʼ', 'sː', 's̪', 't', 'ts', 'tsʰ', 'tɕ', 'tɕʰ', 'tʂ', 'tʂʰ', 'tʃ', 'tʰ', 'tʲ', 'tʷʼ', 'tʼ', 'tː', 't̚', 't̪', 't̪ʰ', 't̪̚', 't͡s', 't͡sʼ', 't͡ɕ', 't͡ɬ', 't͡ʃ', 't͡ʃʲ', 't͡ʃʼ', 't͡ʃː', 'u', 'uə', 'uː', 'u͡w', 'v', 'vʲ', 'vʷ', 'vː', 'v̞', 'v̞ʲ', 'w', 'x', 'x̟ʲ', 'y', 'z', 'zj', 'zʲ', 'z̪', 'ä', 'æ', 'ç', 'çj', 'ð', 'ø', 'ŋ', 'ŋ̟', 'ŋ͡m', 'œ', 'œ̃', 'ɐ', 'ɐ̞', 'ɑ', 'ɑ̱', 'ɒ', 'ɓ', 'ɔ', 'ɔ̃', 'ɕ', 'ɕː', 'ɖ̤', 'ɗ', 'ə', 'ɛ', 'ɛ̃', 'ɟ', 'ɡ', 'ɡʲ', 'ɡ̤', 'ɡ̥', 'ɣ', 'ɣj', 'ɤ', 'ɤɐ̞', 'ɤ̆', 'ɥ', 'ɦ', 'ɨ', 'ɪ', 'ɫ', 'ɯ', 'ɯ̟', 'ɯ̥', 'ɰ', 'ɱ', 'ɲ', 'ɳ', 'ɴ', 'ɵ', 'ɸ', 'ɹ', 'ɹ̩', 'ɻ', 'ɻ̩', 'ɽ', 'ɾ', 'ɾj', 'ɾʲ', 'ɾ̠', 'ʀ', 'ʁ', 'ʁ̝', 'ʂ', 'ʃ', 'ʃʲː', 'ʃ͡ɣ', 'ʈ', 'ʉ̞', 'ʊ', 'ʋ', 'ʋʲ', 'ʌ', 'ʎ', 'ʏ', 'ʐ', 'ʑ', 'ʒ', 'ʒ͡ɣ', 'ʔ', 'ʝ', 'ː', 'β', 'β̞', 'θ', 'χ', 'ә', 'ḁ']
python -m allosaurus.bin.list_phone
La opción model
es seleccionar el modelo para la inferencia. La opción predeterminada es latest
, apunta al último modelo que descargó. Descargará automáticamente el último modelo durante su primera inferencia si no tiene modelos locales.
Tenemos la intención de entrenar nuevos modelos y liberarlos continuamente. La actualización puede incluir tanto archivos binarios de modelo acústico como inventario de teléfonos. Por lo general, el nombre del modelo indica su fecha de entrenamiento, por lo que generalmente se espera que una ID de modelo más alta funcione mejor.
Para descargar un nuevo modelo, puede ejecutar el siguiente comando.
python -m allosaurus.bin.download_model -m < model >
Si no conoce el nombre del modelo, puede usar latest
nombre de modelo y descargará automáticamente el último modelo.
Observamos que la actualización de un nuevo modelo no eliminará los modelos originales. Todos los modelos se almacenarán en el directorio pretrained
donde instaló Allosaurus. Es posible que desee arreglar su modelo para obtener resultados consistentes durante un experimento.
Para ver qué modelos están disponibles en su entorno local, puede consultar con el siguiente comando
python -m allosaurus.bin.list_model
Para eliminar un modelo, puede usar el siguiente comando. Esto puede ser útil cuando está ajustando sus modelos mencionados más adelante.
python -m allosaurus.bin.remove_model
Los modelos actuales disponibles son los siguientes
Los modelos universales predicen teléfonos independientes del lenguaje y cubren muchos idiomas. Este es el modelo predeterminado que Allosaurus intentará descargar y usar. Si no puede encontrar su idioma en los modelos dependientes del idioma, utilice este modelo universal en su lugar.
Modelo | Lengua de llegada | Descripción |
---|---|---|
uni2005 | Universal | Este es el latest modelo (anteriormente llamado 200529 ) |
Estamos planeando entregar modelos dependientes del idioma para algunos idiomas ampliamente utilizados. Los modelos aquí están capacitados con el idioma de destino específicamente. Debería funcionar mucho mejor que el modelo universal para el idioma de destino. Esos modelos no se descargarán automáticamente. Utilice el comando download_model
anterior para descargar y use el indicador --model
durante la inferencia.
Modelo | Lengua de llegada | Descripción |
---|---|---|
eng2102 | Inglés (Eng) | Modelo de solo inglés |
device_id
controla qué dispositivo ejecutar la inferencia.
Por defecto, el dispositivo_id será -1, lo que indica que el modelo solo usará CPU.
Sin embargo, si tiene GPU, puede usarlos para inferencia especificando dispositivos a una sola ID de GPU. (Tenga en cuenta que no es compatible con múltiples inferencias de GPU)
Puede recuperar una marca de tiempo aproximada para cada teléfono reconocido utilizando el argumento timestamp
.
python -m allosaurus.run --timestamp=True -i sample.wav
0.210 0.045 æ
0.390 0.045 l
0.450 0.045 u
0.540 0.045 s
0.630 0.045 ɔ
0.720 0.045 ɹ
0.870 0.045 s
El formato aquí en cada línea es start_timestamp duration phone
, donde el start_timestamp
y duration
se muestran en segundos.
Tenga en cuenta que la marca de tiempo actual es solo una aproximación. Es proporcionado por el modelo CTC, que podría no ser preciso en algunos casos debido a su naturaleza.
La misma interfaz también está disponible en Python de la siguiente manera:
model = read_recognizer ()
model . recognize ( './sample.wav' , timestamp = True )
A veces, generar más teléfonos puede ser útil. Especificar el Top-K Arg generará teléfonos K en cada marco emisor. El valor predeterminado es 1.
# default topk is 1
python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
# output top 5 probable phones at emitting frame, "|" is used to delimit frames (no delimiter when topk=1)
# probability is attached for each phone, the left most phone is the most probable phone
# <blk> is blank which can be ignored.
python -m allosaurus.run -i sample.wav --topk=5
æ (0.577) ɛ (0.128) ɒ (0.103) a (0.045) ə (0.021) | l (0.754) l̪ (0.196) lː (0.018) ʁ (0.007) ʀ (0.006) | u (0.233) ɨ (0.218) uː (0.104) ɤ (0.070) ɪ (0.066) | s (0.301) < blk > (0.298) z (0.118) s̪ (0.084) sː (0.046) | ɔ (0.454) ɑ (0.251) < blk > (0.105) ɹ̩ (0.062) uə (0.035) | ɹ (0.867) ɾ (0.067) < blk > (0.024) l̪ (0.018) r (0.015) | s (0.740) z (0.191) s̪ (0.039) zʲ (0.009) sː (0.003)
Puede decirle al modelo que emita más teléfonos o menos teléfonos cambiando el argumento --emit
o -e
.
# default emit is 1.0
python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
# emit more phones when emit > 1
python -m allosaurus.run -e 1.2 -i sample.wav
æ l u s f h ɔ ɹ s
# emit less phones when emit < 1
python -m allosaurus.run -e 0.8 -i sample.wav
æ l u ɹ s
El inventario de teléfono predeterminado podría no ser el inventario que le gustaría usar, por lo que proporcionamos varios comandos aquí para personalizar su propio inventario.
Hemos mencionado que puede verificar su inventario actual (predeterminado) con el siguiente comando.
python -m allosaurus.bin.list_phone --lang < language name >
El archivo de inventario del teléfono actual se puede ver a un archivo
# dump the phone file
python -m allosaurus.bin.write_phone --lang < language name > --output < a path to save this file >
Si echa un vistazo al archivo, es solo un formato simple donde cada línea representa un solo teléfono. Por ejemplo, el siguiente es el archivo inglés
a
aː
b
d
...
Puede personalizar este archivo para agregar o eliminar IPA que desea. Cada línea solo debe contener un teléfono IPA sin ningún espacio. Puede ser más fácil depurar más tarde si se ordenan IPA, pero no es necesario.
A continuación, actualice el inventario de su modelo mediante el siguiente comando
python -m allosaurus.bin.update_phone --lang < language name > --input < the file you customized)
Luego, el archivo se ha registrado en su modelo, ejecute el comando list_phone nuevamente y podría ver que ahora está usando su inventario actualizado
python -m allosaurus.bin.list_phone --lang < language name >
Ahora, si vuelve a ejecutar la inferencia, también puede ver que los resultados también reflejan su inventario actualizado.
Incluso después de su actualización, puede volver fácilmente al inventario original. En este caso, su archivo actualizado se eliminará.
python -m allosaurus.bin.restore_phone --lang < language name >
También puede cambiar los resultados ajustando la probabilidad previa para cada teléfono. Esto puede ayudarlo a reducir los teléfonos no deseados o aumentar los teléfonos buscados.
Por ejemplo, en el archivo de muestra, obtenemos la salida
æ l u s ɔ ɹ s
Supongamos que cree que el primer teléfono está mal y le gustaría reducir la probabilidad de este teléfono, puede crear un nuevo archivo prior.txt
æ -10.0
El archivo puede contener múltiples líneas y cada línea tiene información para cada teléfono. El primer campo es su teléfono objetivo y el segundo campo es el puntaje basado en registro para ajustar su probabilidad. La puntuación positiva significa que desea aumentar su predicción, la puntuación negativa suprimirá su predicción. En este caso, podemos obtener un nuevo resultado
python -m allosaurus.run -i=sample.wav --lang=eng --prior=prior.txt
ɛ l u s ɔ ɹ s
Donde puede ver æ
se suprime y otra vocal ɛ
la reemplazó.
Otra aplicación de Prior es cambiar el número de teléfonos de salida totales. Es posible que desee más salidas de teléfonos o menos salidas de teléfonos. En este caso, puede cambiar la puntuación del <blk>
que corresponde al teléfono Silence.
Una puntuación positiva <blk>
agregará más silencio, por lo tanto, disminuirá el número de salidas, de manera similar, un negativo <blk>
aumentará las salidas. El siguiente ejemplo ilustra esto.
# <blk> 1.0
python -m allosaurus.run -i=sample.wav --lang=eng --prior=prior.txt
æ l u ɔ ɹ s
# <blk> -1.0
$ python -m allosaurus.run -i=sample.wav --lang=eng --prior=prior.txt
æ l u s f ɔ ɹ s
El primer ejemplo reduce un teléfono y el segundo ejemplo agrega un nuevo teléfono.
Notamos que los modelos previos a la petróleo pueden no ser lo suficientemente precisos para algunos idiomas, por lo que también proporcionamos una herramienta de ajuste aquí para permitir a los usuarios mejorar aún más su modelo al adaptarse a sus datos. Actualmente, solo se limita a ajustado con un solo idioma.
Para ajustar sus datos, debe preparar archivos de audio y sus transcripciones. Primero, cree un directorio de datos (el nombre puede ser arbitrario), dentro del directorio de datos, cree un directorio train
y un directorio validate
. Obviamente, el directorio train
contendrá su conjunto de entrenamiento, y el directorio validate
será el conjunto de validación.
Cada directorio debe contener los siguientes dos archivos:
wave
: este es un archivo que asocia un archivo con sus audios correspondientestext
: Este es un archivo que asocia el archivo con sus teléfonos. wave
es un archivo txt que asigna cada enunciado a sus archivos WAV. Cada línea debe prepararse de la siguiente manera:
utt_id /path/to/your/audio.wav
Aquí utt_id
denota la ID de expresión, puede ser una cadena arbitraria siempre que sea única en su conjunto de datos. audio.wav
es su archivo WAV como se mencionó anteriormente, debe ser un formato WAV monoanal, pero la velocidad de muestreo puede ser arbitraria (la herramienta se volvería a muestrear automáticamente) el delimitador utilizado aquí es el espacio.
Para obtener los mejores resultados de ajuste, cada archivo de audio no debe ser muy largo. Recomendamos mantener cada expresión de más de 10 segundos.
text
es otro archivo TXT que asigna cada enunciado a su transcripción. Cada línea debe prepararse de la siguiente manera
utt_id phone1 phone2 ...
Aquí utt_id
es nuevamente la ID de expresión y debe coincidir con el archivo WAV correspondiente. Las secuencias telefónicas se produjeron después de la identificación de la expresión son sus transcripciones fonéticas del archivo WAV. Los teléfonos aquí deben estar restringidos al inventario del teléfono de su idioma de destino. Asegúrese de que todos sus teléfonos ya estén registrados en su idioma de destino mediante el comando list_phone
A continuación, extraeremos la función tanto del archivo wave
como del archivo text
. Asumimos que ya preparó el archivo wave
y el archivo text
tanto en el directorio train
como en el directorio validate
Para preparar las funciones de audio, ejecute el siguiente comando tanto en su directorio train
como en el directorio validate
.
# command to prepare audio features
python -m allosaurus.bin.prep_feat --model=some_pretrained_model --path=/path/to/your/directory (train or validate)
La path
debe estar apuntando al tren o al directorio de validación, el model
debe apuntar a su modelo de petróleo traget. Si no se especifica, usará el último modelo. Generará tres archivos feat.scp
, feat.ark
y shape
.
El primero es un archivo que indexa cada expresión en un desplazamiento del segundo archivo.
El segundo archivo es un archivo binario que contiene todas las funciones de audio.
El tercero contiene la información de la dimensión de la función
Si tiene curiosidad, los formatos scp
y ark
son formatos de archivo estándar utilizados en Kaldi.
Para preparar las funciones de texto, ejecute el siguiente comando nuevamente tanto en su directorio train
como en el directorio validate
.
# command to prepare token
python -m allosaurus.bin.prep_token --model= < some_pretrained_model > --lang= < your_target_language_id > --path=/path/to/your/directory (train or validate)
La path
y model
deben ser los mismos que el comando anterior. El lang
es la ID de lenguaje ISO de 3 caracteres de este conjunto de datos. Tenga en cuenta que ya debe verificar el inventario del teléfono de esta ID de idioma contiene todas las transcripciones de su teléfono. De lo contrario, la extracción aquí podría fallar.
Después de este comando, generará un archivo llamado token
que asigna cada expresión a las secuencias de ID del teléfono.
A continuación, podemos comenzar a ajustar nuestro modelo con el conjunto de datos que acabamos de preparar. El comando ajustado es muy simple.
# command to fine_tune your data
python -m allosaurus.bin.adapt_model --pretrained_model= < pretrained_model > --new_model= < your_new_model > --path=/path/to/your/data/directory --lang= < your_target_language_id > --device_id= < device_id > --epoch= < epoch >
Hay un par de otros argumentos opcionales disponibles aquí, pero describimos los argumentos requeridos.
pretrained_model
debe ser el mismo modelo que especificó antes en prep_token
y prep_feat
.
new_model
puede ser un nombre de modelo arbitrario (en realidad, podría ser más fácil de administrar si le da a cada modelo el mismo formato que el modelo previamente (es decir, yymmdd)))
La path
debe estar apuntando al directorio principal de su train
y validate
directorios.
El lang
es la ID de idioma que especificó en prep_token
El device_id
es la ID de GPU para ajustar, si no tiene ninguna GPU, use -1 como dispositivo_id. Múltiples GPU no es compatible.
epoch
es el número de su época de entrenamiento
Durante la capacitación, mostrará cierta información, como pérdida y tasa de error del teléfono, tanto para su conjunto de entrenamiento como para su conjunto de validación. Después de cada época, el modelo se evaluaría con el conjunto de validación y guardaría este punto de control si su tasa de error de teléfono de validación es mejor que las anteriores. Después de que la epoch
especificada haya terminado, el proceso de ajuste fino finalizará y el nuevo modelo debería estar disponible.
Después de su proceso de capacitación, el nuevo modelo debe estar disponible en su lista de modelos. Use el comando list_model
para verificar que su nuevo modelo esté disponible ahora
# command to check all your models
python -m allosaurus.bin.list_model
Si está disponible, entonces este nuevo modelo se puede usar en el mismo estilo que cualquier otro modelos previos a la aparición. Simplemente ejecute la inferencia para usar su nuevo modelo.
python -m allosaurus.run --lang < language id > --model < your new model > --device_id < gpu_id > -i < audio >
Este trabajo utiliza parte de los siguientes códigos e inventarios. En particular, usamos en gran medida a Allobra y Phoable para construir el inventario telefónico de este modelo.
Cite el siguiente documento si usa código en su trabajo.
Si tiene algún consejo o sugerencia, no dude en enviarme un correo electrónico (Xinjianl [at] cs.cmu.edu) o enviar un problema en este repositorio. ¡Gracias!
@inproceedings { li2020universal ,
title = { Universal phone recognition with a multilingual allophone system } ,
author = { Li, Xinjian and Dalmia, Siddharth and Li, Juncheng and Lee, Matthew and Littell, Patrick and Yao, Jiali and Anastasopoulos, Antonios and Mortensen, David R and Neubig, Graham and Black, Alan W and Florian, Metze } ,
booktitle = { ICASSP 2020-2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP) } ,
pages = { 8249--8253 } ,
year = { 2020 } ,
organization = { IEEE }
}