Allosaurus - это предварительно предопределенный универсальный распознаватель телефона. Его можно использовать для распознавания телефонов на более чем 2000 языках.
Этот инструмент основан на нашей работой ICASSP 2020 Универсальное распознавание телефона с многоязычной аллофонной системой
Allosaurus доступен в 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, пожалуйста, преобразуйте свой звук в формат WAV, используя SOX или FFMPEG заранее.
Скорость выборки может быть произвольной, мы автоматически повторно их повторно применяем в зависимости от требований моделей.
Мы предполагаем, что звук-это моноканальный звук.
Вывод по умолчанию STDOUT (то есть он будет печатать все результаты на терминал).
Если вы указываете файл в качестве вывода, то все выводы будут направлены на этот файл.
Вариант lang
- это языковой идентификатор. Это должно указать инвентарь телефона, который вы хотите использовать. Опция по умолчанию - 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
, он указывает на последнюю модель, которую вы загружали. Он автоматически загрузит последнюю модель во время вашего первого вывода, если у вас нет локальных моделей.
Мы намерены обучать новые модели и постоянно выпускать их. Обновление может включать как бинарные файлы акустической модели, так и инвентаризация телефона. Как правило, имя модели указывает на его дату обучения, поэтому обычно следует ожидать, что более высокий идентификатор модели будет работать лучше.
Чтобы загрузить новую модель, вы можете запустить следующую команду.
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, что указывает на то, что модель будет использовать только процессоры.
Однако, если у вас есть графический процессор, вы можете использовать их для вывода, указав Device_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 )
Иногда может быть полезно создание большего количества телефонов. Указание ARG Top-K будет генерировать 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>
, который соответствует телефону Silence.
Положительная оценка <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
- это отображение файлов TXT каждое высказывание с вашими файлами WAV. Каждая строка должна быть подготовлена следующим образом:
utt_id /path/to/your/audio.wav
Здесь utt_id
обозначает идентификатор высказывания, он может быть произвольной строкой, если она уникальна в вашем наборе данных. audio.wav
-это ваш файл wav, как указано выше, это должен быть моноканальный формат WAV, но скорость отбора проб может быть произвольным (инструмент автоматически повторно воспринимает, если это необходимо), используемый здесь разделитель-это пространство.
Чтобы получить наилучшие результаты точной настройки, каждый аудиофайл не должен быть очень длинным. Мы рекомендуем сохранить каждое высказывание меньше 10 секунд.
text
- это еще одно файловое отображение TXT каждое высказывание с вашей транскрипцией. Каждая строка должна быть подготовлена следующим образом
utt_id phone1 phone2 ...
Здесь utt_id
снова идентификатор высказывания и должен соответствовать соответствующему файлу WAV. Последовательности телефона появились после того, как идентификатор высказывания - это ваши фонетические транскрипции файла WAV. Телефоны здесь должны быть ограничены инвентаризацией телефона вашего целевого языка. Пожалуйста, убедитесь, что все ваши телефоны уже зарегистрированы на вашем целевом языке по команде list_phone
Далее мы извлекаем функцию как из wave
файла, так и из text
файла. Мы предполагаем, что вы уже подготовили wave
файл и text
файл как в каталоге train
, так и в validate
.
Чтобы подготовить аудио функции, запустите следующую команду как в каталоге 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
должен указывать на поезд или каталог Validate, model
должна указывать на вашу трагетическую модель. Если он не указан, он будет использовать последнюю модель. Он будет генерировать три файла 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 в этом наборе данных. Обратите внимание, что вам уже следует проверить инвентаризацию телефона этого языка идентификатор, содержащий все ваши транскрипции телефона. В противном случае извлечение здесь может потерпеть неудачу.
После этой команды он будет генерировать файл, вызываемый token
, который отображает каждое высказывание в последовательности идентификатора телефона.
Затем мы можем начать точную настройку нашей модели с набора данных, который мы только что подготовили. Команда с тонкой настройкой очень проста.
# 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
device_id
-это идентификатор GPU для точной настройки, если у вас нет графического процессора, используйте -1 как device_id. Несколько графических процессоров не поддерживаются.
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 и FoOible для создания инвентаря телефона этой модели.
Пожалуйста, цитируйте следующую статью, если вы используете код в своей работе.
Если у вас есть какие -либо советы или предложения, пожалуйста, не стесняйтесь отправлять мне электронное письмо (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 }
}