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 }
}