Python определяет ключевые слова

Я делаю и приложение, которое делает следующее:

1:Если микрофон обнаруживает какой-либо шум, он начинает записывать звук до тех пор, пока шум не будет обнаружен. После этого звук записывается в wav-файл.

2:Мне нужно найти на нем несколько слов. Есть только, от 5 до 10 слов для обнаружения.

Пока что мой код выполняет только первую часть (обнаруживает шум и записывает звук). Теперь у меня есть список со следующими словами: help, please, yes, no, could, you, after, tomorrow. Мне нужен автономный способ определить, содержит ли мой звук эти слова. Это возможно? Как я могу это сделать? Я использую Linux, и нет возможности изменить мою операционную систему на Windows или использовать виртуальную машину.

Я думаю использовать спектрограмму звука, создать базу данных поездов и использовать какой-нибудь классификатор для прогнозирования. Например, это — это спектрограмма слова. Это хорошая техника для использования?

Спасибо.


person Caaarlos    schedule 06.02.2016    source источник
comment
stackoverflow.com/questions/3644129/ возможно, это поможет   -  person timgeb    schedule 07.02.2016
comment
Вы не показываете никакого кода и не демонстрируете усилий по поиску. Как бы то ни было, ваш вопрос выглядит как тонко завуалированный запрос на рекомендацию по программному обеспечению, что здесь не по теме; а если нет, то уж слишком широко. Я признал предыдущее закрытое голосование слишком широким. Если вы можете отредактировать свой вопрос, чтобы избежать обеих этих проблем, у вас также гораздо больше шансов получить действительно полезные ответы. Дополнительные сведения о переполнении стека см. в справочном центре.   -  person tripleee    schedule 07.02.2016


Ответы (1)


Вы можете использовать pocketsphinx из python, установить с помощью pip install pocketsphinx. Код выглядит так:

import sys, os
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', os.path.join(modeldir, 'en-us/en-us'))
config.set_string('-dict', os.path.join(modeldir, 'en-us/cmudict-en-us.dict'))
config.set_string('-kws', 'command.list')


# Open file to read the data
stream = open(os.path.join(datadir, "goforward.raw"), "rb")

# Alternatively you can read from microphone
# import pyaudio
# 
# p = pyaudio.PyAudio()
# stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
# stream.start_stream()

# Process audio chunk by chunk. On keyword detected perform action and restart search
decoder = Decoder(config)
decoder.start_utt()
while True:
    buf = stream.read(1024)
    if buf:
         decoder.process_raw(buf, False, False)
    else:
         break
    if decoder.hyp() != None:
        print ([(seg.word, seg.prob, seg.start_frame, seg.end_frame) for seg in decoder.seg()])
        print ("Detected keyword, restarting search")
        decoder.end_utt()
        decoder.start_utt()

Список ключевых слов должен выглядеть следующим образом:

  forward /1e-1/
  down /1e-1/
  other phrase /1e-20/

Цифры являются пороговыми для обнаружения

person Nikolay Shmyrev    schedule 07.02.2016
comment
Николай Сэр, не могли бы вы ответить на этот вопрос? stackoverflow.com/q/54022051/9908801 - person Bibin Johny; 04.01.2019
comment
очень плохое распознавание ключевых слов, хорошо распознается только "вперед" и все - person Maxim Akristiniy; 11.08.2019
comment
если у вас возникли проблемы со сборкой PocketSphinx, мне помогла эта ссылка. github.com/deanmalmgren/textract/issues/209 - person Joseph Farah; 27.11.2019