Оффлайн распознавание речи. PocketSphinx.

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

mirsum
Сообщения: 65
Зарегистрирован: Вс янв 12, 2014 12:54 pm
Откуда: Белгород
Благодарил (а): 110 раз
Поблагодарили: 1 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение mirsum » Пн ноя 02, 2015 4:18 pm

Ещё один микрофон, ещё одна звуковая карта, например usb за 2$
sleepy
Сообщения: 24
Зарегистрирован: Чт июн 11, 2015 9:17 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 7 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение sleepy » Пн ноя 02, 2015 5:29 pm

Искал как можно идентифицировать человека по голосу.
Вот статья, она состоит из 3 частей, в последней даже исходники есть. Как я понял на делфях.
http://sysadminblog.ru/code/2010/05/13/ ... dniki.html

Я с парнями на работе запускали эту прогу, но с гавно-микрофоном, мы смогли в него только подуть :) ну она сохранила в базу 3 образца и потом в другой проге сравнила с ними и выдала процент соответствия.
Вопрос как мне всё это дело переписать на пайтон :(
И програ работает с 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%
coolermister
Сообщения: 49
Зарегистрирован: Пт июл 31, 2015 9:23 am
Благодарил (а): 12 раз
Поблагодарили: 17 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение coolermister » Пн ноя 02, 2015 10:03 pm

Надо чтобы сначала определялось, что говорит именно хозяин, а потом уже определять что он сказал и отправлять в умный дом.
Так мы отсечём все звуки, кроме нашего голоса.
Отличная идея! Надеюсь получится) В потоке не думаю что сложно, в исходниках сфинкса - бесконечный цикл, с задержкой между записями в 100мсек, длинну записи не нашел.
Ну и надеюсь что смогу портировать это на линукс) Единственное что, я считаю что на питоне оно будет работать медленно. Почему они по вашему си используют?) И почему сфинкс тоже си юзает?) Да, сфинкс есть и на джаве, но я бы назвал это вынужденной мерой) На том же андроиде он распознает нормально отсилы пару слов. А когда словарь побольше, начинает жрать оперативу.
sleepy
Сообщения: 24
Зарегистрирован: Чт июн 11, 2015 9:17 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 7 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение sleepy » Ср ноя 04, 2015 12:01 pm

Захотелось попробовать попроще вариант.
Сфинкс умеет слушать ключевое слово. И пока его нет, то он ничего не вещает.
Что если:

*****************************************
Цикл истина
КлючСлово = получаем переменную из вне. Файл? Скуль?
Если КлючСлово = Истина Тогда
Цикл истина
Слушаем ключевое слово "алиса"
Если СказалиСлово Тогда
КлючСлово = ложь
отправляем слово на веб сервер
прервать цикл
КонецЕсли
КонецЦикла
КонецЕсли

Слушаем все слова
Отправляем на веб сервер всё что сказали
// а вот тут после отправке на серверумный дом должен определять, что команды закончены
// например по слову "спасибо".
// можно конечно и в этом цикле искать слово "спасибо" и менять переменную КлючСлово,
// НО как отработать вариант, когда умный дом отваливается по тайм-ауту?
// Не отказываться же от тайм-аута. Иначе забадаемся говорить спасибо))
КонецЦикла
***********************************************

Вот и как сделать общую переменную из двух разных источников?
Один только читает, другой записывает.
sleepy
Сообщения: 24
Зарегистрирован: Чт июн 11, 2015 9:17 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 7 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение sleepy » Ср ноя 04, 2015 1:22 pm

На исходниках задавал вопрос про составление 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
coolermister
Сообщения: 49
Зарегистрирован: Пт июл 31, 2015 9:23 am
Благодарил (а): 12 раз
Поблагодарили: 17 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение coolermister » Ср ноя 04, 2015 3:32 pm

Выдержка из исходников:
Для активации распознавания лучше использовать режим поиска ключевых слов и переключаться в распознавание только когда ключевое слово обнаружен. Подробно это описано в документации.
Вот это интересно. Это возможно средствами самого сфинкса сделать? Или придется что то свое писать?)
p.s.И напишите цикл по английски может, а то я ничего не понял..)
И еще, выложите ваш собранный srilm пожалуйста..) Что то не могу его под виндой собрать)
sleepy
Сообщения: 24
Зарегистрирован: Чт июн 11, 2015 9:17 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 7 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение sleepy » Ср ноя 04, 2015 5:05 pm

Я просто программист по 1С, привык по русски писать :)
Вот Вам пару вариантов по ангЭльски=)
*****************************************
СпойлерПоказать

Код: Выделить всё

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.

По поводу поиска по ключу, я пробовал у сфинкса юзать этот режим.
Он мало отличается от обычного. Работает так же, просто "гипотезы", т.е. результат выдаёт ТОЛЬКО когда в нём есть ключевое слово/фраза и выдаёт не весь результат, а только эти ключевые слова.
coolermister
Сообщения: 49
Зарегистрирован: Пт июл 31, 2015 9:23 am
Благодарил (а): 12 раз
Поблагодарили: 17 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение coolermister » Ср ноя 04, 2015 6:25 pm

Спасибо огромное) Буду проверять папку) Вообще, у меня сыпется всего пара команд :"день, ночь,включи принтер". Остальные вроде нормально.. Я убрал эти команды из lm, стало веселее)
Ключевое слово было джарвис, но в самом majordomo) Какими параметрами запускается режим ключевого слова?) Ну или где почтитать про это что ли..) Спасибо)
sleepy
Сообщения: 24
Зарегистрирован: Чт июн 11, 2015 9:17 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 7 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение sleepy » Ср ноя 04, 2015 8:09 pm

pocketsphinx_continuous -infile test.wav -dict ru.dic -hmm ru-hmm -keyphrase "интернет" -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
sleepy
Сообщения: 24
Зарегистрирован: Чт июн 11, 2015 9:17 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 7 раз

Re: Оффлайн распознавание речи. PocketSphinx.

Сообщение sleepy » Чт ноя 05, 2015 12:00 am

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

алиса /1e-25/


В итоге 2 проблемы:
1 - чувствительность ключевого слова
2 - переключение режима по ответу от умного дома (общая переменная)

у меня сейчас работает переключение режимов на лм словом "алиса" обратно на ключ.поиск по слову "спасибо"
Ответить