Голосовой ассистент на Raspberry Pi
-
В этой статье я хочу рассказать о своем опыте изготовления голосового ассистента на RasPI.Всем кому интересно,прошу под кат.
Предисловие
В не столь далеком детстве во время просмотра фильма "Железный человек" у меня появилась маленькая мечта,сделать свой Джарвис с блекджеком и скриптами.И вот спустя 4 года я снова загорелся желанием,а наличие дома RasPI 3 выигранной в майском конкурсе только подстегнуло интерес и желание.
Начинаем
Дисклеймер.Все что вы делаете,делается вами на ваш страх и риск.Я лишь описываю вам свой опыт и впечатления.Нам понадобиться:
- Звуковая карта с чипом от C-Media
- Колонка
- Микрофон
- Raspberry Pi
- Интернет соединение
- и много,очень много свободного времени.
Шаг 1.Подготовим систему,установим софт
Подключаем звуковую карту со всей периферией
Логинимся в систему
У меня не получилось по хорошему заставить работать звуковую карту как нужно(Может я криворукий,может гайды в интернете старые) потому я наглым способом вырубил встроенный аудиочип
cd /etc/modprobe.d sudo nano alsa-blacklist.conf
и добавляем строку
blacklist snd_bcm2835
и перезагружаемся - sudo reboot
После этих махинаций запускаем команду aplay -l
На экране должны увидит,что-то похожее на то,что на скрине с моей системыТакже можно через GUI убедиться,что звуковая карта назначена по умолчанию
Для регулировки звука можно воспользоваться alsamixer
Установим синтезатор речи
sudo apt install festival festvox-ru
Перейдем в домашнюю директорию
cd ~/
Создадим конфиг Festival
sudo nano .festivalrc
и внесем в него эти строки
(Parameter.set 'Audio_Command "aplay -Dplug:default -q -c 1 -t raw -f s16 -r $SR $FILE") (Parameter.set 'Audio_Method 'Audio_Command ```) А теперь попробуем что нибудь сказать
echo "Проверка" | festival --tts --language russian
От ввода команды до произношения обычно проходит от 5 до 30 секунд.Медленно,но довольно качественно. Если услышали мужской голос из динамика,значит у нас все получилось ### Установим Python3
sudo apt-get install python3
И модули для него
pip3 install SpeechRecognition
pip3 install pocketsphinx### Шаг 2.Скриптовая часть Для начала проверим,а работает ли у нас микрофон то вообще?
arecord -B --buffer-time=1000000 -f dat -r 16000 -d 4 -D plug:default voice.wav
Говорим что нибудь 4 секунды.
aplay voice.wav -Dplug:default
Слышим себя?Если да,то все прекрасно. Рекомендую создать отдельную директорию под проект.Я использовал имя '0' (ноль)
cd 0
Запишем основной и самый главный скрипт
sudo nano 0.py
#! /usr/bin/env python
#--coding:utf-8--
import os
import speech_recognition as sr
r = sr.Recognizer()
with sr.WavFile("voice.wav") as source: # use "test.wav" as the audio source
audio = r.record(source) # extract audio data from the filetry:
t = r.recognize_google(audio,language = "ru-RU", key = "AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw")
print(t) # recognize speech using Google Speech Recognition
except LookupError: # speech is unintelligible
print("Could not understand audio")
if t == 0:
print("Error")
elif t==("Привет"): #Hi
os.system('echo Привет | festival --tts --language russian')Далее используя аудиозапись из прошлых шагов попробуем что либо распознать
python3 0.py
Если на выводе уводили тот текст,что содержится в записи,то все успешно распозналось(У меня распознает все точно в 99% случаев) и запускалку для этого скрипта
sudo nano launcher
#!/bin/bash
echo "Ассист+ент зап+ущен" |festival --tts --language russian
while [ true ]
do
arecord -B --buffer-time=1000000 -f dat -r 16000 -d 4 -D plug:default voice.wav
filesize=$(stat -c%s "voice.wav")
echo $filesize
python3 0.py
rm voice.wav
echo completed
done
sudo chmod +x launcherи запустим
./launcher
Прервать адский круг можно долгим зажатием CTRL+C ### Шаг 3.Запускалка запускалки Для удобства я сделал запускалку запускалки
sudo nano launcher
#!/bin/bash
while [ true ]
do
arecord -B --buffer-time=1000000 -f dat -r 16000 -d 4 -D plug:default voice.wav
filesize=$(stat -c%s "voice.wav")
echo $filesize
python3 z.py
rm voice.wav
echo completed
done
sudo chmod +x launcher
sudo nano z.pyimport os
import speech_recognition as sr
#Recognizer(language = "ru-RU", key = "AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw")
r = sr.Recognizer()
with sr.WavFile("voice.wav") as source: # use "test.wav" as the audio source
audio = r.record(source) # extract audio data from the filetry:
t = r.recognize_sphinx(audio)
print(t) # recognize speech using Google Speech Recognition
except LookupError: # speech is unintelligible
print("Could not understand audio")
if t==("hi"):
os.system('~/0/assistant')Как можно понять из скриптов,то запускать основной наш скрипт будут только после "hi".Но вот беда,распознает оффлайн утилита очень-очень плохо.Я частично исправил положение наглым выпиливанием половины словаря программы. cd /usr/local/lib/python3.4/dist-packages/speech_recognition/pocketsphinx-data/en-US sudo nano pronounciation-dictionary.dict А теперь нам придется попотеть.Удалим из словаря все не нужное.Кому лень это делать,может написать мне в лс,я скину файлик. И вот после всего этого запускалка начала более менее по божески работать
cd ~/0
sudo nano 0.pyВ конец файла добавим ```elif t==("сон"): #Sleep os.system('~/0/launcher')
Сохраним
Шаг3.А вы верите в скрипты?
в директории 0 создадим еще однуmkdir scripts
cd scripts
и создадим скриптик для того,чтобы нам по запросу говорили,какова погода на улицеsudo nano forecast #!/bin/sh URL='http://www.accuweather.com/en/ru/tolyatti/295302/weather-forecast/295302' wget -q -O- "$URL" | awk -F\' '/acm_RecentLocationsCarousel\.push/{print "сейчас на улице ",$12, "градусов"}'| head -1
Содержимое строки URL меняем на нужное вам местоположение с этого же сайта
Сделаем говорилку для этого скрипта
sudo nano weather
#!/bin/sh
~/0/scripts/forecast | festival --tts --language russian
и наконец в скрипт 0.py добавим еще одно ветвление для IFcd ~/0 sudo nano 0.py elif t==("Какая сейчас погода"): #weather os.system('~/0/scripts/weather') elif t==("погода"): os.system('~/0/scripts/weather') elif t==("Какая погода"): os.system('~/0/scripts/weather')
Вооот собственно и все пожалуй.Вопросы и пожелания можете написать в комментарии или личные сообщения,а также в вк(указано в профиле).Если напишите какой либо скриптик для этого управления,то тоже пишите,добавлю в статью с подписью вашего авторства.
Благодарности
Спасибо администрации Raspberrypi.ru
Михаилу Андрею За помощь в создании проектаФото устройства в собранном виде
В дырочке спрятался микрофонСтатья будет обновляться,обязательно будет,так как я не считаю это проект завершеным.