Конвертировать звук в список фонем в питоне

Как преобразовать любой звуковой сигнал в список фонем?

Т.е. фактическая методология и / или код для перехода от цифрового сигнала к списку фонем, с которых производится запись звука.
например:

lPhonemes = audio_to_phonemes(aSignal)

где например

from scipy.io.wavfile import read
iSampleRate, aSignal = read(sRecordingDir)

aSignal = #numpy array for the recorded word 'hear'
lPhonemes = ['HH', 'IY1', 'R']

Мне нужна функция audio_to_phonemes

Не все звуки являются словами языка, поэтому я не могу просто использовать то, что использует, например, Google API.

редактировать
Я не хочу аудио для слов, я хочу аудио для фонем. Кажется, что большинство библиотек не выводят это. Любая библиотека, которую вы рекомендуете, должна иметь возможность выводить упорядоченный список фонем, из которых состоит звук. И это должно быть в питоне.

Я также хотел бы знать, как работает процесс озвучивания фонем. Если не в целях реализации, то ради интереса.

2 ответа

Решение

Точное распознавание фонем нелегко архивировать, потому что сами фонемы определены довольно свободно. Даже в хорошем звуке самые лучшие системы сегодня имеют около 18% ошибок фонем (вы можете проверить результаты LSTM-RNN в TIMIT, опубликованном Алексом Грейвсом).

В CMUSphinx распознавание фонем в Python выполняется так:

from os import environ, path

from pocketsphinx.pocketsphinx import *
from sphinxbase.sphinxbase import *

MODELDIR = "../../../model"
DATADIR = "../../../test/data"

# Create a decoder with certain model
config = Decoder.default_config()
config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us'))
config.set_string('-allphone', path.join(MODELDIR, 'en-us/en-us-phone.lm.dmp'))
config.set_float('-lw', 2.0)
config.set_float('-beam', 1e-10)
config.set_float('-pbeam', 1e-10)

# Decode streaming data.
decoder = Decoder(config)

decoder.start_utt()
stream = open(path.join(DATADIR, 'goforward.raw'), 'rb')
while True:
  buf = stream.read(1024)
  if buf:
    decoder.process_raw(buf, False, False)
  else:
    break
decoder.end_utt()

hypothesis = decoder.hyp()
print ('Phonemes: ', [seg.word for seg in decoder.seg()])

Чтобы запустить этот пример, вам нужно получить последнюю версию pocketsphinx из github. Результат должен выглядеть так:

  ('Best phonemes: ', ['SIL', 'G', 'OW', 'F', 'AO', 'R', 'W', 'ER', 'D', 'T', 'AE', 'N', 'NG', 'IY', 'IH', 'ZH', 'ER', 'Z', 'S', 'V', 'SIL'])

Смотрите также страницу вики

Мне нужно создать функцию audio_to_phonemes

Вы в основном говорите:

Мне нужно заново реализовать 40 лет исследований по распознаванию речи

Вам не следует реализовывать это самостоятельно (если только вы не собираетесь стать профессором в области распознавания речи и иметь революционно новый подход), но должны использовать одну из многих существующих систем. Взгляните на сфинкса / карманного сфинкса!

Взгляните на Allosaurus, универсальный (~2000 языков) распознаватель телефонов, который дает вам фонемы IPA. В образце волнового файла я загрузил последнюю модель и попробовал это на Python3.

$ python -m allosaurus.bin.download_model -m latest
$ python -m allosaurus.run -i sample.wav
æ l u s ɔ ɹ s
Другие вопросы по тегам