Altosaurus é um reconhecedor de telefone universal pré -traido. Pode ser usado para reconhecer telefones em mais de 2000 idiomas.
Esta ferramenta é baseada em nosso reconhecimento universal de telefone universal do ICASSP 2020 com um sistema de alofone multilíngue
Altosaurus está disponível na PIP
pip install allosaurus
Você também pode clonar este repositório e instalar
python setup.py install
O uso básico é bem simples, sua entrada é um arquivo de áudio WAV e a saída é uma sequência de telefones.
python -m allosaurus.run -i < audio >
Por exemplo, você pode tentar usar o arquivo de amostra anexado neste repositório. Adivinha o que há neste arquivo de áudio :)
python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
Você também pode usar o Allosaurus diretamente no Python
from allosaurus . app import read_recognizer
# load your model
model = read_recognizer ()
# run inference -> æ l u s ɔ ɹ s
model . recognize ( 'sample.wav' )
Para obter recursos e detalhes completos, consulte as seções a seguir.
A interface da linha de comando é a seguinte:
python -m allosaurus.run [--lang < language name > ] [--model < model name > ] [--device_id < gpu_id > ] [--output < output_file > ] [--topk < int > ] -i < audio file/directory >
Ele reconhecerá os telefones estreitos no (s) arquivo (s) de áudio. Somente o argumento de entrada é obrigatório, outras opções podem ignorar. Consulte as seções seguintes para obter seus detalhes.
Há também uma interface simples do Python da seguinte maneira:
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 )
Os detalhes dos argumentos em ambas as interface são os seguintes:
A entrada pode ser um único arquivo ou um diretório contendo vários arquivos de áudio.
Se a entrada for um único arquivo, ele produzirá apenas a sequência do telefone; Se a entrada for um diretório, ele produzirá o nome do arquivo e a sequência do telefone, os resultados serão classificados pelos nomes dos arquivos.
O (s) arquivo (s) de áudio deve estar no seguinte formato:
Deve ser um arquivo WAV. Se o áudio não estiver no formato WAV, converta seu áudio em um formato WAV usando o Sox ou o FFMPEG com antecedência.
A taxa de amostragem pode ser arbitrária, resultam automaticamente com base nos requisitos dos modelos.
Assumimos que o áudio é um áudio mono-canal.
A saída é, por padrão, stdout (ou seja, imprimirá todos os resultados do terminal).
Se você especificar um arquivo como saída, toda a saída será direcionada para esse arquivo.
A opção lang
é o ID do idioma. É para especificar o inventário telefônico que você deseja usar. A opção padrão é ipa
, que diz ao reconhecimento para usar o inventário inteiro (cerca de 230 telefones).
Geralmente, especificar o inventário de idiomas pode melhorar sua precisão de reconhecimento.
Você pode verificar a lista de idiomas completa com o seguinte comando. O número de idiomas disponíveis é de cerca de 2000.
python -m allosaurus.bin.list_lang
Para verificar o inventário da linguagem, você pode usar o seguinte comando
python -m allosaurus.bin.list_phone [--lang < language name > ]
Por exemplo,
# 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
A opção model
é selecionar o modelo para inferência. A opção padrão é latest
, está apontando para o modelo mais recente que você baixou. Ele baixará automaticamente o modelo mais recente durante sua primeira inferência, se você não tiver modelos locais.
Pretendemos treinar novos modelos e lançá -los continuamente. A atualização pode incluir arquivos binários do modelo acústico e inventário por telefone. Normalmente, o nome do modelo indica sua data de treinamento; portanto, é esperado que um ID de modelo mais alto tenha um desempenho melhor.
Para baixar um novo modelo, você pode executar o seguinte comando.
python -m allosaurus.bin.download_model -m < model >
Se você não souber o nome do modelo, basta usar o nome latest
como modelo e baixará automaticamente o modelo mais recente.
Observamos que a atualização para um novo modelo não excluirá os modelos originais. Todos os modelos serão armazenados no diretório pretrained
, onde você instalou o Allosaurus. Você pode corrigir seu modelo para obter resultados consistentes durante um experimento.
Para ver quais modelos estão disponíveis no seu ambiente local, você pode verificar com o seguinte comando
python -m allosaurus.bin.list_model
Para excluir um modelo, você pode usar o seguinte comando. Isso pode ser útil quando você está ajustando seus modelos mencionados posteriormente.
python -m allosaurus.bin.remove_model
Os modelos disponíveis atuais são os seguintes
Os modelos universais prevêem telefones independentes da linguagem e abrange muitos idiomas. Este é o modelo padrão que o Allosaurus tentará baixar e usar. Se você não conseguir encontrar seu idioma nos modelos dependentes do idioma, use este modelo universal.
Modelo | Linguagem alvo | Descrição |
---|---|---|
uni2005 | Universal | Este é o modelo latest (anteriormente nomeado como 200529 ) |
Estamos planejando fornecer modelos dependentes de idiomas para alguns idiomas amplamente usados. Os modelos aqui são treinados com o idioma de destino especificamente. Deve ter um desempenho muito melhor do que o modelo universal para o idioma de destino. Esses modelos não serão baixados automaticamente. Por favor, use o comando download_model
acima para baixar e use --model
Sinalizador durante a Inferência.
Modelo | Linguagem alvo | Descrição |
---|---|---|
eng2102 | Inglês (Eng) | Modelo apenas em inglês |
device_id
controla qual dispositivo executar a inferência.
Por padrão, o Device_ID será -1, o que indica que o modelo usará apenas as CPUs.
No entanto, se você tiver GPU, pode usá -las para inferência especificando o Device_ID em um único ID da GPU. (Observe que a inferência de GPU múltipla não é suportada)
Você pode recuperar um carimbo de data / hora aproximado para cada telefone reconhecido usando o argumento de 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
O formato aqui em cada linha é start_timestamp duration phone
, onde o start_timestamp
e duration
são mostrados em segundos.
Observe que o registro de data e hora atual é apenas uma aproximação. É fornecido pelo modelo CTC, que pode não ser preciso em alguns casos devido à sua natureza.
A mesma interface também está disponível no Python da seguinte forma:
model = read_recognizer ()
model . recognize ( './sample.wav' , timestamp = True )
Às vezes, gerar mais telefones pode ser útil. A especificação do Top-K Arg gerará k telefones em cada quadro emissor. O padrão é 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)
Você pode dizer ao modelo para emitir mais telefones ou menos telefones, alterando o argumento --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
O inventário de telefone padrão pode não ser o inventário que você gostaria de usar, por isso fornecemos vários comandos aqui para você personalizar seu próprio inventário.
Mencionamos que você pode verificar seu inventário atual (padrão) com o seguinte comando.
python -m allosaurus.bin.list_phone --lang < language name >
O arquivo de inventário telefônico atual pode ser despejado em um arquivo
# dump the phone file
python -m allosaurus.bin.write_phone --lang < language name > --output < a path to save this file >
Se você dar uma olhada no arquivo, é apenas um formato simples em que cada linha representa um único telefone. Por exemplo, o seguinte é o arquivo inglês
a
aː
b
d
...
Você pode personalizar este arquivo para adicionar ou excluir IPAs que deseja. Cada linha deve conter apenas um telefone IPA sem espaço. Pode ser mais fácil depurar mais tarde se os IPAs forem classificados, mas não for necessário.
Em seguida, atualize o inventário do seu modelo pelo seguinte comando
python -m allosaurus.bin.update_phone --lang < language name > --input < the file you customized)
Em seguida, o arquivo foi registrado em seu modelo, execute o comando list_phone novamente e você pode ver que agora está usando seu inventário atualizado
python -m allosaurus.bin.list_phone --lang < language name >
Agora, se você executar a inferência novamente, também poderá ver os resultados também refletir seu inventário atualizado.
Mesmo após a sua atualização, você pode voltar facilmente para o inventário original. Nesse caso, seu arquivo atualizado será excluído.
python -m allosaurus.bin.restore_phone --lang < language name >
Você também pode alterar os resultados ajustando a probabilidade anterior para cada telefone. Isso pode ajudá -lo a reduzir os telefones indesejados ou aumentar os telefones desejados.
Por exemplo, no arquivo de amostra, obtemos a saída
æ l u s ɔ ɹ s
Suponha que você pense que o primeiro telefone está errado e gostaria de reduzir a probabilidade deste telefone, você pode criar um novo arquivo prior.txt
da seguinte maneira
æ -10.0
O arquivo pode conter várias linhas e cada linha possui informações para cada telefone. O primeiro campo é o seu telefone de destino e o segundo campo é a pontuação baseada em log para ajustar sua probabilidade. Pontuação positiva significa que você deseja aumentar sua previsão, a pontuação negativa suprimirá sua previsão. Nesse caso, podemos obter um novo resultado
python -m allosaurus.run -i=sample.wav --lang=eng --prior=prior.txt
ɛ l u s ɔ ɹ s
onde você pode ver æ
é suprimido e outra ɛ
a substituiu.
Outra aplicação do anterior é alterar o número de telefones totais de saída. Você pode querer mais saídas de telefone ou menos saídas de telefone. Nesse caso, você pode alterar a pontuação para o <blk>
que corresponde ao telefone de silêncio.
Uma pontuação positiva <blk>
adicionará mais silêncio, diminuirá, portanto, o número de saídas, da mesma forma, um <blk>
negativo aumentará as saídas. O exemplo a seguir ilustra isso.
# <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
O primeiro exemplo reduz um telefone e o segundo exemplo adiciona um novo telefone.
Observamos que os modelos pré-treinados podem não ser precisos o suficiente para alguns idiomas, por isso também fornecemos uma ferramenta de ajuste fino aqui para permitir que os usuários melhorem ainda mais seu modelo, adaptando-se aos seus dados. Atualmente, ele está limitado apenas a ajuste fino com um idioma.
Para ajustar seus dados, você precisa preparar arquivos de áudio e suas transcrições. Primeiro, crie um diretório de dados (o nome pode ser arbitrário), dentro do diretório de dados, criar um diretório train
e um diretório validate
. Obviamente, o diretório train
conterá seu conjunto de treinamento e o diretório validate
será o conjunto de validação.
Cada diretório deve conter os dois arquivos a seguir:
wave
: este é um arquivo que associa a expressão aos seus áudios correspondentestext
: Este é um arquivo que associa a expressão a seus telefones. wave
é um arquivo txt mapeando cada enunciada para seus arquivos WAV. Cada linha deve ser preparada da seguinte forma:
utt_id /path/to/your/audio.wav
Aqui utt_id
indica o ID de enunciado, pode ser uma string arbitrária, desde que seja exclusiva no seu conjunto de dados. O audio.wav
é o seu arquivo WAV, conforme mencionado acima, deve ser um formato WAV mono-canal, mas a taxa de amostragem pode ser arbitrária (a ferramenta relemamente automaticamente se necessário) o delimitador usado aqui é espaço.
Para obter os melhores resultados de ajuste fino, cada arquivo de áudio não deve ser muito longo. Recomendamos manter cada enunciada menor que 10 segundos.
text
é outro arquivo txt mapeando cada enunciado para sua transcrição. Cada linha deve ser preparada da seguinte maneira
utt_id phone1 phone2 ...
Aqui utt_id
é novamente o ID do enunciado e deve corresponder ao arquivo WAV correspondente. As seqüências telefônicas vieram após o ID do utternce suas transcrições fonéticas do arquivo WAV. Os telefones aqui devem ser restritos ao inventário telefônico do seu idioma de destino. Verifique se todos os seus telefones já estão registrados em seu idioma de destino pelo comando list_phone
Em seguida, extrairemos o recurso do arquivo wave
e do arquivo text
. Assumimos que você já preparou o arquivo wave
e o arquivo text
no diretório train
e no Diretório validate
Para preparar os recursos de áudio, execute o seguinte comando no diretório train
e validate
o diretório.
# command to prepare audio features
python -m allosaurus.bin.prep_feat --model=some_pretrained_model --path=/path/to/your/directory (train or validate)
O path
deve estar apontando para o trem ou o diretório de validação, o model
deve estar apontando para o seu modelo de traget pré -tedido. Se não especificado, ele usará o modelo mais recente. Ele gerará três arquivos feat.scp
, feat.ark
e shape
.
O primeiro é um arquivo indexando cada enunciado em um deslocamento do segundo arquivo.
O segundo arquivo é um arquivo binário que contém todos os recursos de áudio.
O terceiro contém as informações da dimensão do recurso
Se você está curioso, os formatos scp
e ark
são formatos de arquivo padrão usados no kaldi.
Para preparar os recursos de texto, execute o seguinte comando novamente no diretório do seu train
e validate
o diretório.
# 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)
O path
e model
devem ser os mesmos do comando anterior. O lang
é o ISO ISO ISO ID deste conjunto de dados. Observe que você já deve verificar se o inventário de telefone deste ID de idioma contém todas as suas transcrições de telefone. Caso contrário, a extração aqui pode falhar.
Após esse comando, ele gerará um arquivo chamado token
, que mapeia cada enunciado para as seqüências de ID do telefone.
Em seguida, podemos começar a ajustar o nosso modelo com o conjunto de dados que acabamos de preparar. O comando de ajuste fino é muito simples.
# 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 >
Existem alguns outros argumentos opcionais disponíveis aqui, mas descrevemos os argumentos necessários.
pretrained_model
deve ser o mesmo modelo que você especificou anteriormente no prep_token
e prep_feat
.
new_model
pode ser um nome de modelo arbitrário (na verdade, pode ser mais fácil gerenciar se você fornecer a cada modelo o mesmo formato que o modelo pré -treinado (ou seja, yymmdd))
O path
deve estar apontando para o diretório pai do seu train
e validate
diretórios.
O lang
é o id de idioma que você especificou em prep_token
O device_id
é o ID da GPU para ajuste fino, se você não tiver GPU, use -1 como device_id. Múltiplas GPU não são suportadas.
epoch
é o número de sua época de treinamento
Durante o treinamento, ele mostrará algumas informações como perda e taxa de erro de telefone para o seu conjunto de treinamento e conjunto de validação. Após cada época, o modelo seria avaliado com o conjunto de validação e salvaria esse ponto de verificação se a taxa de erro de telefone da validação for melhor que os anteriores. Depois que a epoch
especificada terminar, o processo de ajuste fino terminará e o novo modelo deve estar disponível.
Após o seu processo de treinamento, o novo modelo deve estar disponível em sua lista de modelos. Use o comando list_model
para verificar seu novo modelo está disponível agora
# command to check all your models
python -m allosaurus.bin.list_model
Se estiver disponível, esse novo modelo poderá ser usado no mesmo estilo que outros modelos pré -treinados. Basta executar a inferência para usar seu novo modelo.
python -m allosaurus.run --lang < language id > --model < your new model > --device_id < gpu_id > -i < audio >
Este trabalho usa parte dos seguintes códigos e inventários. Em particular, usamos fortemente o alovera e fible para criar o inventário telefônico desse modelo.
Cite o documento a seguir se você usar o código em seu trabalho.
Se você tiver algum conselho ou sugestão, sinta -se à vontade para enviar email para mim (Xinjianl [at] cs.cmu.edu) ou enviar um problema neste repositório. Obrigado!
@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 }
}