Allosaurus est un reconnaissance téléphonique universelle pré-entraînée. Il peut être utilisé pour reconnaître les téléphones dans plus de 2000 langues.
Cet outil est basé sur la reconnaissance du téléphone universel ICASSP 2020 avec un système allophone multilingue
Allosaurus est disponible auprès de PIP
pip install allosaurus
Vous pouvez également cloner ce référentiel et installer
python setup.py install
L'utilisation de base est assez simple, votre entrée est un fichier audio WAV et la sortie est une séquence de téléphones.
python -m allosaurus.run -i < audio >
Par exemple, vous pouvez essayer d'utiliser l'exemple de fichier joint dans ce référentiel. Devinez ce qu'il y a dans ce fichier audio :)
python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
Vous pouvez également utiliser Allosaurus directement dans Python
from allosaurus . app import read_recognizer
# load your model
model = read_recognizer ()
# run inference -> æ l u s ɔ ɹ s
model . recognize ( 'sample.wav' )
Pour les fonctionnalités complètes et les détails, veuillez vous référer aux sections suivantes.
L'interface de ligne de commande est la suivante:
python -m allosaurus.run [--lang < language name > ] [--model < model name > ] [--device_id < gpu_id > ] [--output < output_file > ] [--topk < int > ] -i < audio file/directory >
Il reconnaîtra les téléphones étroits dans les fichiers audio. Seul l'argument d'entrée est obligatoire, d'autres options peuvent ignorer. Veuillez vous référer aux sections suivantes pour leurs détails.
Il existe également une interface Python simple comme suit:
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 )
Les détails des arguments dans les deux interface sont les suivants:
L'entrée peut être un fichier unique ou un répertoire contenant plusieurs fichiers audio.
Si l'entrée est un seul fichier, il ne sortira que la séquence de téléphone; Si l'entrée est un répertoire, il sortira à la fois le nom de fichier et la séquence du téléphone, les résultats seront triés par des noms de fichiers.
Le (s) fichier audio doit être dans le format suivant:
Ce devrait être un fichier WAV. Si l'audio n'est pas au format WAV, veuillez convertir votre audio en format WAV en utilisant SOX ou FFMPEG à l'avance.
Le taux d'échantillonnage peut être arbitraire, nous les rééchantillonnerons automatiquement en fonction des exigences des modèles.
Nous supposons que l'audio est un audio mono-canal.
La sortie est par défaut stdout (c'est-à-dire qu'elle imprimera tous les résultats au terminal).
Si vous spécifiez un fichier en tant que sortie, toutes les sorties seront dirigées vers ce fichier.
L'option lang
est l'ID de langue. C'est pour spécifier l'inventaire du téléphone que vous souhaitez utiliser. L'option par défaut est ipa
qui indique au reconnaissance d'utiliser l'inventaire entier (environ 230 téléphones).
Généralement, la spécification de l'inventaire linguistique peut améliorer votre précision de reconnaissance.
Vous pouvez vérifier la liste des langues complètes avec la commande suivante. Le nombre de langues disponibles est d'environ 2000.
python -m allosaurus.bin.list_lang
Pour vérifier l'inventaire de la langue, vous pouvez utiliser la commande suivante
python -m allosaurus.bin.list_phone [--lang < language name > ]
Par exemple,
# 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
L'option model
consiste à sélectionner le modèle d'inférence. L'option par défaut est latest
, elle pointe vers le dernier modèle que vous avez téléchargé. Il téléchargera automatiquement le dernier modèle lors de votre première inférence si vous n'avez pas de modèles locaux.
Nous avons l'intention de former de nouveaux modèles et de les libérer en continu. La mise à jour peut inclure à la fois les fichiers binaires du modèle acoustique et l'inventaire du téléphone. En règle générale, le nom du modèle indique sa date de formation, donc généralement un ID de modèle plus élevé devrait s'attendre à mieux.
Pour télécharger un nouveau modèle, vous pouvez exécuter la commande suivante.
python -m allosaurus.bin.download_model -m < model >
Si vous ne connaissez pas le nom du modèle, vous pouvez simplement utiliser le nom du modèle latest
et il téléchargera automatiquement le dernier modèle.
Nous notons que la mise à jour d'un nouveau modèle ne supprimera pas les modèles originaux. Tous les modèles seront stockés sous répertoire pretrained
où vous avez installé Allosaurus. Vous voudrez peut-être réparer votre modèle pour obtenir des résultats cohérents au cours d'une expérience.
Pour voir quels modèles sont disponibles dans votre environnement local, vous pouvez vérifier avec la commande suivante
python -m allosaurus.bin.list_model
Pour supprimer un modèle, vous pouvez utiliser la commande suivante. Cela peut être utile lorsque vous avez affiné vos modèles mentionnés plus tard.
python -m allosaurus.bin.remove_model
Les modèles disponibles actuels sont les suivants
Les modèles universels prédisent les téléphones indépendants du langage et couvre de nombreuses langues. Il s'agit du modèle par défaut, Allosaurus essaiera de télécharger et d'utiliser. Si vous ne trouvez pas votre langue sur les modèles dépendants de la langue, veuillez utiliser ce modèle universel à la place.
Modèle | Langue cible | Description |
---|---|---|
uni2005 | Universel | Ceci est le latest modèle (précédemment nommé 200529 ) |
Nous prévoyons de livrer des modèles dépendants de la langue pour certaines langues largement utilisées. Les modèles ici sont formés avec le langage cible spécifiquement. Il devrait fonctionner beaucoup mieux que le modèle universel pour la langue cible. Ces modèles ne seront pas téléchargés automatiquement. Veuillez utiliser la commande download_model
ci-dessus pour télécharger et utiliser --model
Indicateur pendant l'inférence.
Modèle | Langue cible | Description |
---|---|---|
eng2102 | Anglais (Eng) | Modèle d'anglais uniquement |
device_id
contrôle le périphérique pour exécuter l'inférence.
Par défaut, Device_ID sera -1, ce qui indique que le modèle n'utilisera que des processeurs.
Cependant, si vous avez un GPU, vous pouvez les utiliser pour l'inférence en spécifiant device_id à un seul ID de GPU. (Notez que l'inférence GPU multiple n'est pas prise en charge)
Vous pouvez récupérer un horodatage approximatif pour chaque téléphone reconnu en utilisant l'argument 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
Le format ici dans chaque ligne est start_timestamp duration phone
où le start_timestamp
et duration
sont affichés en quelques secondes.
Notez que l'horodatage actuel n'est qu'une approximation. Il est fourni par le modèle CTC, qui pourrait ne pas être précis dans certains cas en raison de sa nature.
La même interface est également disponible en Python que suit:
model = read_recognizer ()
model . recognize ( './sample.wav' , timestamp = True )
Parfois, générer plus de téléphones peut être utile. La spécification de l'ARG Top-K générera des téléphones K à chaque trame émetteur. La valeur par défaut est 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)
Vous pouvez dire au modèle d'émettre plus de téléphones ou moins de téléphones en modifiant l'argument --emit
ou -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
L'inventaire du téléphone par défaut n'est peut-être pas l'inventaire que vous souhaitez utiliser, nous fournissons donc plusieurs commandes ici pour personnaliser votre propre inventaire.
Nous avons mentionné que vous pouvez vérifier votre inventaire actuel (par défaut) avec la commande suivante.
python -m allosaurus.bin.list_phone --lang < language name >
Le fichier d'inventaire du téléphone actuel peut être jeté dans un fichier
# dump the phone file
python -m allosaurus.bin.write_phone --lang < language name > --output < a path to save this file >
Si vous jetez un œil au fichier, c'est juste un format simple où chaque ligne représente un seul téléphone. Par exemple, le suivant est le fichier anglais
a
aː
b
d
...
Vous pouvez personnaliser ce fichier pour ajouter ou supprimer les IPA que vous souhaitez. Chaque ligne ne doit contenir qu'un seul téléphone IPA sans aucun espace. Il peut être plus facile de déboguer plus tard si les IPA sont triées, mais ce n'est pas nécessaire.
Ensuite, mettez à jour l'inventaire de votre modèle par la commande suivante
python -m allosaurus.bin.update_phone --lang < language name > --input < the file you customized)
Ensuite, le fichier a été enregistré dans votre modèle, exécutez à nouveau la commande list_phone et vous pouvez voir qu'il utilise maintenant votre inventaire mis à jour
python -m allosaurus.bin.list_phone --lang < language name >
Maintenant, si vous exécutez à nouveau l'inférence, vous pouvez également voir les résultats refléter également votre inventaire mis à jour.
Même après votre mise à jour, vous pouvez facilement revenir à l'inventaire d'origine. Dans ce cas, votre fichier mis à jour sera supprimé.
python -m allosaurus.bin.restore_phone --lang < language name >
Vous pouvez également modifier les résultats en ajustant la probabilité antérieure pour chaque téléphone. Cela peut vous aider à réduire les téléphones indésirables ou à augmenter les téléphones recherchés.
Par exemple, dans l'exemple de fichier, nous obtenons la sortie
æ l u s ɔ ɹ s
Supposons que vous pensiez que le premier téléphone est faux et que vous souhaitez réduire la probabilité de ce téléphone, vous pouvez créer un nouveau fichier prior.txt
comme suit
æ -10.0
Le fichier peut contenir plusieurs lignes et chaque ligne a des informations pour chaque téléphone. Le premier champ est votre téléphone cible et le deuxième champ est le score basé sur le journal pour ajuster votre probabilité. Un score positif signifie que vous souhaitez augmenter sa prédiction, le score négatif supprimera sa prédiction. Dans ce cas, nous pouvons obtenir un nouveau résultat
python -m allosaurus.run -i=sample.wav --lang=eng --prior=prior.txt
ɛ l u s ɔ ɹ s
où vous pouvez voir æ
est supprimé et une autre voyelle ɛ
l'a remplacé.
Une autre application de Prior consiste à modifier le nombre de téléphones de sortie totaux. Vous voudrez peut-être plus de sorties de téléphones ou moins de sorties de téléphones. Dans ce cas, vous pouvez modifier le score pour le <blk>
qui correspond au téléphone de silence.
Un score <blk>
positif ajoutera plus de silence, donc diminuera le nombre de sorties, de même, un <blk>
négatif augmentera les sorties. L'exemple suivant l'illustre.
# <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
Le premier exemple réduit un téléphone et le deuxième exemple ajoute un nouveau téléphone.
Nous remarquons que les modèles pré-entraînés pourraient ne pas être suffisamment précis pour certaines langues, nous fournissons donc également un outil de réglage fin pour permettre aux utilisateurs d'améliorer davantage leur modèle en s'adaptant à leurs données. Actuellement, il ne se limite qu'à régler une seule langue.
Pour affiner vos données, vous devez préparer des fichiers audio et leurs transcriptions. Tout d'abord, veuillez créer un répertoire de données (le nom peut être arbitraire), à l'intérieur du répertoire de données, créez un répertoire train
et un répertoire validate
. De toute évidence, le répertoire train
contiendra votre ensemble de formation et le répertoire validate
sera l'ensemble de validation.
Chaque répertoire doit contenir les deux fichiers suivants:
wave
: il s'agit d'un fichier associant l'énoncé avec ses audios correspondantstext
: Il s'agit d'un fichier associant l'énoncé avec ses téléphones. wave
est un fichier TXT mappant chaque énoncé de vos fichiers WAV. Chaque ligne doit être préparée comme suit:
utt_id /path/to/your/audio.wav
Ici, utt_id
désigne l'ID d'énoncé, il peut s'agir d'une chaîne arbitraire tant qu'elle est unique dans votre ensemble de données. L' audio.wav
est votre fichier WAV comme mentionné ci-dessus, il devrait être un format WAV mono-canal, mais le taux d'échantillonnage peut être arbitraire (l'outil rééchantillonnerait automatiquement si nécessaire) Le délimiteur utilisé ici est l'espace.
Pour obtenir les meilleurs résultats fins, chaque fichier audio ne doit pas être très long. Nous vous recommandons de garder chaque énoncé plus court que 10 secondes.
text
est un autre fichier TXT mappant chaque énoncé de votre transcription. Chaque ligne doit être préparée comme suit
utt_id phone1 phone2 ...
Ici, utt_id
est à nouveau l'ID d'énonciation et doit correspondre au fichier WAV correspondant. Les séquences de téléphone sont venues après que l'ID d'énoncé est vos transcriptions phonétiques du fichier WAV. Les téléphones ici doivent être limités à l'inventaire du téléphone de votre langue cible. Veuillez vous assurer que tous vos téléphones sont déjà enregistrés dans votre langue cible par la commande list_phone
Ensuite, nous extraire la fonctionnalité du fichier wave
et du fichier text
. Nous supposons que vous avez déjà préparé un fichier wave
et un fichier text
dans le répertoire train
et validate
le répertoire
Pour préparer les fonctionnalités audio, exécutez la commande suivante sur votre répertoire train
et validate
le répertoire.
# command to prepare audio features
python -m allosaurus.bin.prep_feat --model=some_pretrained_model --path=/path/to/your/directory (train or validate)
Le path
doit pointer vers le train ou le répertoire validé, le model
devrait pointer vers votre modèle pré-étiré Traget. S'il n'est pas spécifié, il utilisera le dernier modèle. Il générera trois fichiers feat.scp
, feat.ark
et shape
.
Le premier est un fichier indexant chaque énoncé dans un décalage du deuxième fichier.
Le deuxième fichier est un fichier binaire contenant toutes les fonctionnalités audio.
Le troisième contient les informations de dimension de fonctionnalité
Si vous êtes curieux, les formats scp
et ark
sont des formats de fichiers standard utilisés dans Kaldi.
Pour préparer les fonctionnalités du texte, exécutez à nouveau la commande suivante sur votre répertoire train
et validate
le répertoire.
# 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)
Le path
et model
doivent être les mêmes que la commande précédente. Le lang
est l'ID de langue ISO à 3 caractères de cet ensemble de données. Notez que vous devez déjà vérifier l'inventaire du téléphone de cet ID de langue contient toutes vos transcriptions de téléphone. Sinon, l'extraction ici pourrait échouer.
Après cette commande, il générera un fichier appelé token
qui mappe chaque énoncé aux séquences d'ID de téléphone.
Ensuite, nous pouvons commencer à affiner notre modèle avec l'ensemble de données que nous venons de préparer. La commande de réglage fin est très 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 >
Il existe quelques autres arguments facultatifs disponibles ici, mais nous décrivons les arguments requis.
pretrained_model
devrait être le même modèle que vous avez spécifié auparavant dans le prep_token
et prep_feat
.
new_model
peut être un nom de modèle arbitraire (en fait, il peut être plus facile de gérer si vous donnez à chaque modèle le même format que le modèle pré-entraîné (c'est-à-dire yymmdd))
Le path
doit pointer vers le répertoire parent de votre train
et validate
les répertoires.
Le lang
est l'ID de langue que vous avez spécifié dans prep_token
Le device_id
est l'ID GPU pour le réglage fin, si vous n'avez pas de GPU, utilisez -1 comme device_id. Le GPU multiple n'est pas pris en charge.
epoch
est le nombre de votre entraînement l'époque
Pendant la formation, il montrera certaines informations telles que la perte et le taux d'erreur de téléphone pour votre ensemble de formation et l'ensemble de validation. Après chaque époque, le modèle serait évalué avec l'ensemble de validation et économiserait ce point de contrôle si son taux d'erreur de téléphone de validation est meilleur que les précédents. Une fois l' epoch
spécifiée terminée, le processus de réglage fin se terminera et le nouveau modèle devrait être disponible.
Après votre processus de formation, le nouveau modèle devrait être disponible dans votre liste de modèles. Utilisez la commande list_model
pour vérifier que votre nouveau modèle est disponible maintenant
# command to check all your models
python -m allosaurus.bin.list_model
S'il est disponible, ce nouveau modèle peut être utilisé dans le même style que tous les autres modèles pré-entraînés. Exécutez simplement l'inférence pour utiliser votre nouveau modèle.
python -m allosaurus.run --lang < language id > --model < your new model > --device_id < gpu_id > -i < audio >
Ce travail utilise une partie des codes et des inventaires suivants. En particulier, nous avons fortement utilisé Allovera et Phoible pour construire l'inventaire de téléphone de ce modèle.
Veuillez citer le document suivant si vous utilisez du code dans votre travail.
Si vous avez des conseils ou des suggestions, n'hésitez pas à m'envoyer un e-mail (xinjianl [at] cs.cmu.edu) ou à soumettre un problème dans ce repo. Merci!
@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 }
}