Skip to content
  • Категории
  • Главная
  • Документация
  • Последние
  • Пользователи
Collapse
  1. Главная
  2. Блоги сообщества Raspberry Pi
  3. Голосовой ассистент на Raspberry Pi

Голосовой ассистент на Raspberry Pi

Запланировано Прикреплена Закрыта Перенесена Блоги сообщества Raspberry Pi
1 Сообщения 1 Posters 1.5k Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • piP Не в сети
    piP Не в сети
    pi
    написал в отредактировано pi
    #1

    В этой статье я хочу рассказать о своем опыте изготовления голосового ассистента на 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
    На экране должны увидит,что-то похожее на то,что на скрине с моей системы

    08186409-ecec-4f81-86b3-157b290a7fba-image.png

    Также можно через 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 file
    
    try:
        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.py
    
    import 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 file
    
    try:
        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
    

    В конец файла добавим

    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 добавим еще одно ветвление для IF

    cd ~/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
    Михаилу Андрею За помощь в создании проекта

    Фото устройства в собранном виде
    beab6546-a96b-43f2-9714-a304bb850031-image.png
    56814595-f7ed-4961-80f3-989c4fa0b467-image.png
    В дырочке спрятался микрофон 🙂

    Статья будет обновляться,обязательно будет,так как я не считаю это проект завершеным.

    1 ответ Последний ответ
    0

    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Login or register to search.
    • Первое сообщение
      Последнее сообщение
    0
    • Категории
    • Главная
    • Документация
    • Последние
    • Пользователи