Allosaurus是验证的通用电话识别器。它可以用来识别2000多种语言的手机。
该工具基于我们的ICASSP 2020工作通用电话识别,并具有多语言同系系统
可以从PIP获得异龙
pip install allosaurus
您也可以克隆此存储库并安装
python setup.py install
基本用法非常简单,您的输入是WAV音频文件,输出是一系列电话。
python -m allosaurus.run -i < audio >
例如,您可以尝试使用此存储库中的附加示例文件。猜猜这个音频文件中有什么:)
python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
您也可以直接在Python中使用异龙
from allosaurus . app import read_recognizer
# load your model
model = read_recognizer ()
# run inference -> æ l u s ɔ ɹ s
model . recognize ( 'sample.wav' )
有关完整功能和详细信息,请参阅以下各节。
命令行接口如下:
python -m allosaurus.run [--lang < language name > ] [--model < model name > ] [--device_id < gpu_id > ] [--output < output_file > ] [--topk < int > ] -i < audio file/directory >
它将识别音频文件中的狭窄电话。只有输入参数是强制性的,其他选项可以忽略。请参阅以下各节以获取其详细信息。
还有一个简单的Python界面,如下:
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 )
两个接口中参数的详细信息如下:
输入可以是一个文件或包含多个音频文件的目录。
如果输入是一个文件,它将仅输出电话序列;如果输入是目录,它将同时输出文件名和电话序列,结果将通过文件名进行排序。
音频文件应采用以下格式:
它应该是一个WAV文件。如果音频不采用WAV格式,请提前使用SOX或FFMPEG将音频转换为WAV格式。
采样率可以是任意的,我们将根据模型的要求自动重新采样它们。
我们假设音频是单渠道音频。
默认情况下,输出为(即它将将所有结果打印到终端)。
如果将文件指定为输出,则所有输出将被定向到该文件。
lang
选项是语言ID。它是指定您要使用的手机清单。默认选项是ipa
,它告诉识别器使用整个库存(约230部电话)。
通常,指定语言清单可以提高您的识别准确性。
您可以使用以下命令检查完整的语言列表。可用语言的数量约为2000年。
python -m allosaurus.bin.list_lang
要查看语言的清单,您可以使用以下命令
python -m allosaurus.bin.list_phone [--lang < language name > ]
例如,
# 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
model
选项是为推理选择模型。默认选项是latest
,它指向您下载的最新型号。如果您没有任何本地型号,它将在第一次推断期间自动下载最新模型。
我们打算训练新的模型并不断释放它们。该更新可能包括声学模型二进制文件和电话清单。通常,该模型的名称表示其训练日期,因此通常应该期望更高的模型ID执行更好。
要下载新型号,您可以运行以下命令。
python -m allosaurus.bin.download_model -m < model >
如果您不知道模型名称,则可以将latest
用作模型的名称使用,它将自动下载最新的型号。
我们注意到,更新到新型号不会删除原始模型。所有型号将存储在您安装异龙的pretrained
目录下。您可能需要修复模型以在一个实验中获得一致的结果。
要查看在本地环境中可用的哪些型号,您可以使用以下命令进行检查
python -m allosaurus.bin.list_model
要删除模型,您可以使用以下命令。当您稍后提到的模型进行微调时,这可能很有用。
python -m allosaurus.bin.remove_model
当前可用的模型是以下
通用模型可以预测与语言无关的电话,并涵盖了许多语言。这是默认模型Allosaurus将尝试下载和使用。如果您在语言依赖模型上找不到语言,请改用此通用模型。
模型 | 目标语言 | 描述 |
---|---|---|
uni2005 | 普遍的 | 这是latest 型号(以前称为200529 ) |
我们计划为某些广泛使用的语言提供与语言有关的模型。此处的模型经过针对目标语言的培训。它应该比目标语言的通用模型更好。这些型号不会自动下载。请使用上面的download_model
命令下载,并在推理过程中使用--model
标志。
模型 | 目标语言 | 描述 |
---|---|---|
eng2102 | 英语(英语) | 仅英语模型 |
device_id
控制要运行推理的设备。
默认情况下,Device_ID为-1,指示该模型仅使用CPU。
但是,如果您拥有GPU,则可以通过将Device_id指定为单个GPU ID来使用它们进行推理。 (请注意,不支持多个GPU推理)
您可以使用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
每行的格式是start_timestamp duration phone
,其中start_timestamp
和duration
以秒为单位显示。
请注意,当前的时间戳只是近似值。它由CTC模型提供,在某些情况下,由于其性质可能不准确。
Python中也可以使用相同的界面,如下所示:
model = read_recognizer ()
model . recognize ( './sample.wav' , timestamp = True )
有时会产生更多的电话可能会有所帮助。指定TOP-K ARG将在每个发射帧中生成K电话。默认值为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)
您可以告诉模型通过更改--emit
或-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
默认电话库存可能不是您想要使用的库存,因此我们在这里提供多个命令供您自定义自己的库存。
我们已经提到您可以使用以下命令检查当前(默认)库存。
python -m allosaurus.bin.list_phone --lang < language name >
当前的电话清单文件可以倾倒到文件中
# dump the phone file
python -m allosaurus.bin.write_phone --lang < language name > --output < a path to save this file >
如果您查看文件,这只是一个简单的格式,每行代表单个手机。例如,以下是英语文件
a
aː
b
d
...
您可以自定义此文件以添加或删除所需的IPA。每行只能包含一个没有任何空间的IPA手机。如果IPA被分类,以后可能会更容易调试,但这不是必需的。
接下来,通过以下命令更新模型的清单
python -m allosaurus.bin.update_phone --lang < language name > --input < the file you customized)
然后该文件已在您的模型中注册,再次运行list_phone命令,您可以看到它正在使用您的更新库存
python -m allosaurus.bin.list_phone --lang < language name >
现在,如果您再次进行推断,您还可以看到结果还反映了您的更新库存。
即使更新后,您也可以轻松地切换回原始库存。在这种情况下,您的更新文件将被删除。
python -m allosaurus.bin.restore_phone --lang < language name >
您还可以通过调整每个手机的先验概率来更改结果。这可以帮助您减少不需要的手机或增加通缉手机。
例如,在示例文件中,我们获取输出
æ l u s ɔ ɹ s
假设您认为第一部手机是错误的,并且想减少此手机的可能性,则可以在以下方式创建一个新文件prior.txt
æ -10.0
该文件可以包含多行,每条线都有每个手机的信息。第一个字段是您的目标电话,第二个字段是基于日志的分数,以调整您的概率。正分数意味着您想提高其预测,负分数将抑制其预测。在这种情况下,我们可以获得新的结果
python -m allosaurus.run -i=sample.wav --lang=eng --prior=prior.txt
ɛ l u s ɔ ɹ s
您可以看到æ
的地方被抑制了,另一个ɛ
更换了。
先验的另一个应用是更改总输出电话的数量。您可能需要更多的电话输出或更少的电话输出。在这种情况下,您可以更改与沉默手机相对应的<blk>
的分数。
正面的<blk>
分数将增加更多的沉默,因此减少输出数量,同样,负<blk>
会增加输出。以下示例说明了这一点。
# <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
第一个示例减少了一部手机,第二个示例添加了新手机。
我们注意到,经过审计的模型对于某些语言可能不够准确,因此我们还提供了一个微观的工具,可以使用户通过适应数据来进一步改善其模型。目前,它仅限于用一种语言进行微调。
要微调数据,您需要准备音频文件及其转录。首先,请在数据目录内创建一个数据目录(名称可以是任意的),创建train
目录和validate
目录。显然, train
目录将包含您的培训集,并且validate
目录将是验证集。
每个目录应包含以下两个文件:
wave
:这是一个将话语与相应音频相关联的文件text
:这是将话语与手机相关联的文件。 wave
是将每个话语映射到您的WAV文件的TXT文件。每行应如下准备:
utt_id /path/to/your/audio.wav
在这里, utt_id
表示话语ID,只要它在数据集中是唯一的,它就可以是任意字符串。 audio.wav
是您的WAV文件,如上所述,它应该是单渠道WAV格式,但是采样率可以是任意的(如有必要,该工具将自动重新采样)此处使用的定界符是空间。
为了获得最佳的微调结果,每个音频文件都不应该很长。我们建议使每种话语都短于10秒钟。
text
是将每个话语映射到您的转录的另一个TXT文件。每行应如下准备
utt_id phone1 phone2 ...
在这里, utt_id
再次是话语ID,应与相应的WAV文件匹配。电话序列是在发音ID是您对WAV文件的语音转录之后进行的。这里的手机应仅限于您的目标语言的电话清单。请确保您的所有手机已经通过list_phone
命令以您的目标语言注册
接下来,我们将从wave
文件和text
文件中提取功能。我们假设您已经准备了train
目录和validate
目录中的wave
文件和text
文件
要准备音频功能,请在train
目录和validate
目录上运行以下命令。
# command to prepare audio features
python -m allosaurus.bin.prep_feat --model=some_pretrained_model --path=/path/to/your/directory (train or validate)
该path
应指向火车或验证目录,该model
应指向您的traget预验证的模型。如果未指定,它将使用最新模型。它将生成三个文件feat.scp
, feat.ark
和shape
。
第一个是将每个话语索引到第二个文件的偏移中的文件。
第二个文件是包含所有音频功能的二进制文件。
第三个包含特征维度信息
如果您很好奇, scp
和ark
格式是Kaldi中使用的标准文件格式。
要准备文本功能,请在train
目录和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)
path
和model
应与上一个命令相同。 lang
是该数据集的3个字符ISO语言ID。请注意,您应该已经验证此语言ID的手机清单包含所有电话转录。否则,这里的提取可能会失败。
在此命令之后,它将生成一个名为token
的文件,该文件将每个话语映射到电话ID序列。
接下来,我们可以使用刚刚准备的数据集开始微调模型。微调命令非常简单。
# 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 >
这里还有其他几个可选论点,但我们描述了所需的论点。
pretrained_model
应该是您在prep_token
和prep_feat
中指定的模型相同的模型。
new_model
可以是一个任意的模型名称(实际上,如果您给出每个模型的格式与预验证的模型(即yymmdd)相同,则可能更容易管理)
path
应指向您的train
和validate
目录的父目录。
lang
是您在prep_token
中指定的语言ID
device_id
是用于微调的GPU ID,如果您没有任何GPU,请使用-1作为Device_ID。不支持多个GPU。
epoch
是您的培训时代的数量
在培训期间,它将显示一些信息,例如培训集和验证集的损失和电话错误率。每个时期之后,将使用验证集评估模型,如果其验证电话错误率优于以前的验证,则将保存此检查点。指定的epoch
完成后,微调过程将结束,新型号应可用。
培训过程后,新型号应在您的型号列表中可用。使用list_model
命令检查您的新型号
# command to check all your models
python -m allosaurus.bin.list_model
如果可用,则该新型号可以与任何其他预告片模型相同的样式使用。只需进行推理以使用新模型即可。
python -m allosaurus.run --lang < language id > --model < your new model > --device_id < gpu_id > -i < audio >
这项工作使用以下代码和库存的一部分。特别是,我们大量使用了Allovera,并且可以使用该模型的手机清单。
如果您在工作中使用代码,请引用以下论文。
如果您有任何建议或建议,请随时向我发送电子邮件(Xinjianl [at] cs.cmu.edu)或在本仓库中提交问题。谢谢!
@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 }
}