Оффлайн распознавание речи. PocketSphinx.
Модератор: immortal
-
- Сообщения: 65
- Зарегистрирован: Вс янв 12, 2014 12:54 pm
- Откуда: Белгород
- Благодарил (а): 110 раз
- Поблагодарили: 1 раз
Re: Оффлайн распознавание речи. PocketSphinx.
Ещё один микрофон, ещё одна звуковая карта, например usb за 2$
-
- Сообщения: 24
- Зарегистрирован: Чт июн 11, 2015 9:17 pm
- Откуда: Ростов-на-Дону
- Благодарил (а): 2 раза
- Поблагодарили: 7 раз
Re: Оффлайн распознавание речи. PocketSphinx.
Искал как можно идентифицировать человека по голосу.
Вот статья, она состоит из 3 частей, в последней даже исходники есть. Как я понял на делфях.
http://sysadminblog.ru/code/2010/05/13/ ... dniki.html
Я с парнями на работе запускали эту прогу, но с гавно-микрофоном, мы смогли в него только подуть
ну она сохранила в базу 3 образца и потом в другой проге сравнила с ними и выдала процент соответствия.
Вопрос как мне всё это дело переписать на пайтон
И програ работает с wav файлами, а как это всё в потоке сделать.
Надо чтобы сначала определялось, что говорит именно хозяин, а потом уже определять что он сказал и отправлять в умный дом.
Так мы отсечём все звуки, кроме нашего голоса.
upd: добавил файл с библиотеками которые нужны для проги
upd2: ещё нужны библиотеки DelphiX. Они у меня есть, но архив весит 2.9 Мб, а тут предел 1 Мб.
Вот статья, она состоит из 3 частей, в последней даже исходники есть. Как я понял на делфях.
http://sysadminblog.ru/code/2010/05/13/ ... dniki.html
Я с парнями на работе запускали эту прогу, но с гавно-микрофоном, мы смогли в него только подуть

Вопрос как мне всё это дело переписать на пайтон

И програ работает с wav файлами, а как это всё в потоке сделать.
Надо чтобы сначала определялось, что говорит именно хозяин, а потом уже определять что он сказал и отправлять в умный дом.
Так мы отсечём все звуки, кроме нашего голоса.
upd: добавил файл с библиотеками которые нужны для проги
upd2: ещё нужны библиотеки DelphiX. Они у меня есть, но архив весит 2.9 Мб, а тут предел 1 Мб.
- Вложения
-
- canman.zip
- (825.74 КБ) 280 скачиваний
Последний раз редактировалось sleepy Вт ноя 03, 2015 9:02 am, всего редактировалось 1 раз.
- За это сообщение автора sleepy поблагодарили (всего 2):
- Amarok (Пн ноя 02, 2015 5:38 pm) • coolermister (Пн ноя 02, 2015 10:00 pm)
- Рейтинг: 2.33%
-
- Сообщения: 49
- Зарегистрирован: Пт июл 31, 2015 9:23 am
- Благодарил (а): 12 раз
- Поблагодарили: 17 раз
Re: Оффлайн распознавание речи. PocketSphinx.
Отличная идея! Надеюсь получится) В потоке не думаю что сложно, в исходниках сфинкса - бесконечный цикл, с задержкой между записями в 100мсек, длинну записи не нашел.Надо чтобы сначала определялось, что говорит именно хозяин, а потом уже определять что он сказал и отправлять в умный дом.
Так мы отсечём все звуки, кроме нашего голоса.
Ну и надеюсь что смогу портировать это на линукс) Единственное что, я считаю что на питоне оно будет работать медленно. Почему они по вашему си используют?) И почему сфинкс тоже си юзает?) Да, сфинкс есть и на джаве, но я бы назвал это вынужденной мерой) На том же андроиде он распознает нормально отсилы пару слов. А когда словарь побольше, начинает жрать оперативу.
-
- Сообщения: 24
- Зарегистрирован: Чт июн 11, 2015 9:17 pm
- Откуда: Ростов-на-Дону
- Благодарил (а): 2 раза
- Поблагодарили: 7 раз
Re: Оффлайн распознавание речи. PocketSphinx.
Захотелось попробовать попроще вариант.
Сфинкс умеет слушать ключевое слово. И пока его нет, то он ничего не вещает.
Что если:
*****************************************
Цикл истина
КлючСлово = получаем переменную из вне. Файл? Скуль?
Если КлючСлово = Истина Тогда
Цикл истина
Слушаем ключевое слово "алиса"
Если СказалиСлово Тогда
КлючСлово = ложь
отправляем слово на веб сервер
прервать цикл
КонецЕсли
КонецЦикла
КонецЕсли
Слушаем все слова
Отправляем на веб сервер всё что сказали
// а вот тут после отправке на серверумный дом должен определять, что команды закончены
// например по слову "спасибо".
// можно конечно и в этом цикле искать слово "спасибо" и менять переменную КлючСлово,
// НО как отработать вариант, когда умный дом отваливается по тайм-ауту?
// Не отказываться же от тайм-аута. Иначе забадаемся говорить спасибо))
КонецЦикла
***********************************************
Вот и как сделать общую переменную из двух разных источников?
Один только читает, другой записывает.
Сфинкс умеет слушать ключевое слово. И пока его нет, то он ничего не вещает.
Что если:
*****************************************
Цикл истина
КлючСлово = получаем переменную из вне. Файл? Скуль?
Если КлючСлово = Истина Тогда
Цикл истина
Слушаем ключевое слово "алиса"
Если СказалиСлово Тогда
КлючСлово = ложь
отправляем слово на веб сервер
прервать цикл
КонецЕсли
КонецЦикла
КонецЕсли
Слушаем все слова
Отправляем на веб сервер всё что сказали
// а вот тут после отправке на серверумный дом должен определять, что команды закончены
// например по слову "спасибо".
// можно конечно и в этом цикле искать слово "спасибо" и менять переменную КлючСлово,
// НО как отработать вариант, когда умный дом отваливается по тайм-ауту?
// Не отказываться же от тайм-аута. Иначе забадаемся говорить спасибо))
КонецЦикла
***********************************************
Вот и как сделать общую переменную из двух разных источников?
Один только читает, другой записывает.
-
- Сообщения: 24
- Зарегистрирован: Чт июн 11, 2015 9:17 pm
- Откуда: Ростов-на-Дону
- Благодарил (а): 2 раза
- Поблагодарили: 7 раз
Re: Оффлайн распознавание речи. PocketSphinx.
На исходниках задавал вопрос про составление lm
http://forum.sources.ru/index.php?s=b17 ... ew=showall
Теперь понятно как предложения подготовить и какой командой из теста в lm сделать.
Кстати собрал srilm под винду через VS. Там в архиве есть папка с исходниками под VS2005, но на 2015 нормально собирается.
Подготовлю все предложения и попробую собрать lm через srilm.
ngram-count -text text.txt -lm text.lm
http://forum.sources.ru/index.php?s=b17 ... ew=showall
Теперь понятно как предложения подготовить и какой командой из теста в lm сделать.
Кстати собрал srilm под винду через VS. Там в архиве есть папка с исходниками под VS2005, но на 2015 нормально собирается.
Подготовлю все предложения и попробую собрать lm через srilm.
ngram-count -text text.txt -lm text.lm
-
- Сообщения: 49
- Зарегистрирован: Пт июл 31, 2015 9:23 am
- Благодарил (а): 12 раз
- Поблагодарили: 17 раз
Re: Оффлайн распознавание речи. PocketSphinx.
Выдержка из исходников:
p.s.И напишите цикл по английски может, а то я ничего не понял..)
И еще, выложите ваш собранный srilm пожалуйста..) Что то не могу его под виндой собрать)
Вот это интересно. Это возможно средствами самого сфинкса сделать? Или придется что то свое писать?)Для активации распознавания лучше использовать режим поиска ключевых слов и переключаться в распознавание только когда ключевое слово обнаружен. Подробно это описано в документации.
p.s.И напишите цикл по английски может, а то я ничего не понял..)
И еще, выложите ваш собранный srilm пожалуйста..) Что то не могу его под виндой собрать)
-
- Сообщения: 24
- Зарегистрирован: Чт июн 11, 2015 9:17 pm
- Откуда: Ростов-на-Дону
- Благодарил (а): 2 раза
- Поблагодарили: 7 раз
Re: Оффлайн распознавание речи. PocketSphinx.
Я просто программист по 1С, привык по русски писать
Вот Вам пару вариантов по ангЭльски=)
*****************************************
***********************************************
Поглядывайте вот сюда:
https://drive.google.com/open?id=0B9o7B ... UZEWm9GYUE
я залью srilm туда архивом. Там в папоче bin будут даже мои тестовые файлы txt и lm.
По поводу поиска по ключу, я пробовал у сфинкса юзать этот режим.
Он мало отличается от обычного. Работает так же, просто "гипотезы", т.е. результат выдаёт ТОЛЬКО когда в нём есть ключевое слово/фраза и выдаёт не весь результат, а только эти ключевые слова.

Вот Вам пару вариантов по ангЭльски=)
*****************************************
СпойлерПоказать
Код: Выделить всё
while 1:
RegimKey = получаем переменную из вне. Файл? Скуль?;
if RegimKey == true:
while 1:
KeyTrue = сфинкс ищет ключевое слово и возвращает его;
if KeyTrue:
RegimKey = false;
отправляем слово на веб сервер;
прервать цикл;
сфинкс ищет все слова;
Отправляем на веб сервер всё что сказали;
while 1{
RegimKey = получаем переменную из вне. Файл? Скуль?;
if RegimKey == true{
while 1{
KeyTrue = сфинкс ищет ключевое слово и возвращает его;
if KeyTrue{
RegimKey = false;
отправляем слово на веб сервер;
прервать цикл;
}
}
}
сфинкс ищет все слова;
Отправляем на веб сервер всё что сказали;
}
Поглядывайте вот сюда:
https://drive.google.com/open?id=0B9o7B ... UZEWm9GYUE
я залью srilm туда архивом. Там в папоче bin будут даже мои тестовые файлы txt и lm.
По поводу поиска по ключу, я пробовал у сфинкса юзать этот режим.
Он мало отличается от обычного. Работает так же, просто "гипотезы", т.е. результат выдаёт ТОЛЬКО когда в нём есть ключевое слово/фраза и выдаёт не весь результат, а только эти ключевые слова.
-
- Сообщения: 49
- Зарегистрирован: Пт июл 31, 2015 9:23 am
- Благодарил (а): 12 раз
- Поблагодарили: 17 раз
Re: Оффлайн распознавание речи. PocketSphinx.
Спасибо огромное) Буду проверять папку) Вообще, у меня сыпется всего пара команд :"день, ночь,включи принтер". Остальные вроде нормально.. Я убрал эти команды из lm, стало веселее)
Ключевое слово было джарвис, но в самом majordomo) Какими параметрами запускается режим ключевого слова?) Ну или где почтитать про это что ли..) Спасибо)
Ключевое слово было джарвис, но в самом majordomo) Какими параметрами запускается режим ключевого слова?) Ну или где почтитать про это что ли..) Спасибо)
-
- Сообщения: 24
- Зарегистрирован: Чт июн 11, 2015 9:17 pm
- Откуда: Ростов-на-Дону
- Благодарил (а): 2 раза
- Поблагодарили: 7 раз
Re: Оффлайн распознавание речи. PocketSphinx.
pocketsphinx_continuous -infile test.wav -dict ru.dic -hmm ru-hmm -keyphrase "интернет" -kws_threshold 1e-40
а вот как у меня это всё делается
Но переключать режимы туда сюда, ещё не пробовал.
Допишу, то что выше предлагал и опробую.
Кстати, там ещё в режиме поиска по ключевым словам, можно указывать чуствительность что-ли... не разбирался.
Параметр -kws_threshold 1e-40
а вот как у меня это всё делается
СпойлерПоказать
Код: Выделить всё
name_lm_file = 'MyModel/sleepy.lm'
gramm = 'MyModel/world.jsgf'
name_fsg_file = 'MyModel/sleepy.fsg'
name_jsgf_rule = 'words.words'
name_key_variant = 'key1'
use_keyphrase = False #Если Истина, тогда используется фраза как ключевое значение. Иначе используеся файл с ключевыми словами.
if use_keyphrase: # тут я переключаю откуда брать ключевые слова из файла или по одной строке
keyphrase_variant= 'алиса'.decode('utf-8').encode('cp1251')
else:
keyphrase_variant= 'MyModel/sleepy.key'
# Добавляем вариант поиска по грамматике
jsgf = Jsgf(gramm)
rule = jsgf.get_rule(name_jsgf_rule)
fsg = jsgf.build_fsg(rule, decoder.get_logmath(), 7.5)
fsg.write(stdout)
fsg.writefile(name_fsg_file)
decoder.set_fsg(name_fsg_file, fsg)
# Добавляем вариант поиска по языковой модели
lm = NGramModel(config, decoder.get_logmath(), name_lm_file)
decoder.set_lm(name_lm_file, lm)
#Добавляем вариант поиска ключевого слова
if use_keyphrase:
decoder.set_keyphrase(name_key_variant, keyphrase_variant)
else:
decoder.set_kws(name_key_variant, keyphrase_variant)
#Выбор варианта поиска!!
#decoder.set_search(name_key_variant)
#decoder.set_search(name_fsg_file)
#decoder.set_search(name_lm_file)
Допишу, то что выше предлагал и опробую.
Кстати, там ещё в режиме поиска по ключевым словам, можно указывать чуствительность что-ли... не разбирался.
Параметр -kws_threshold 1e-40
-
- Сообщения: 24
- Зарегистрирован: Чт июн 11, 2015 9:17 pm
- Откуда: Ростов-на-Дону
- Благодарил (а): 2 раза
- Поблагодарили: 7 раз
Re: Оффлайн распознавание речи. PocketSphinx.
проверил переключение между режимами.
работает отлично, но с режимом поиска по ключевому слову надо будет подолбаться...
там чувствительность надо настраивать и похоже, что только перебором можно её настроить.
кстати, если использовать не одно слово поиска, а брать из файла, то в файле можно задать эту чувствительность к каждому слову.
алиса /1e-25/
В итоге 2 проблемы:
1 - чувствительность ключевого слова
2 - переключение режима по ответу от умного дома (общая переменная)
у меня сейчас работает переключение режимов на лм словом "алиса" обратно на ключ.поиск по слову "спасибо"
работает отлично, но с режимом поиска по ключевому слову надо будет подолбаться...
там чувствительность надо настраивать и похоже, что только перебором можно её настроить.
кстати, если использовать не одно слово поиска, а брать из файла, то в файле можно задать эту чувствительность к каждому слову.
алиса /1e-25/
В итоге 2 проблемы:
1 - чувствительность ключевого слова
2 - переключение режима по ответу от умного дома (общая переменная)
у меня сейчас работает переключение режимов на лм словом "алиса" обратно на ключ.поиск по слову "спасибо"