1. Introduction

Не так давно мне пришла идея сделать некоторое приспособление, способное управляться голосовыми командами и выполнять определенные действия. Для реализации этой затеи я приобрел микрокомпьютер Raspberry PI 2 и внешнюю аудиокарту, а также использовал микрофон от наушников.

2. Сет-ап или сколько я мучился с дровами

После некоторых неудачных попыток реализовать распознавалку на C#, языком программирования был выбран Python, т. к. с ним довольно удобно работать на RPI, а также на нем уже были примеры готовых библиотек для распознавания голоса, что позволило посмотреть алгоритмы различных авторов и оптимизировать систему.

С приобретением всех необходимых компонентов я ринулся писать код, но столкнулся с множеством проблем, большинство из них было связано с доступом к микрофону, а также библиотекой для python pyAudio.

Я считаю, что решение возникающих проблем может быть отдельной статьей. В конечном счете я пришел к использовании библиотеки system совместно с утилитой ALSA (arecord, aplay).

3. Конвертация идеи в код.

Подключение всех необходимых библиотек

# -*- coding: utf-8 -*-
from urllib2 import Request, urlopen
from os import system
import json
import uuid
#import pyaudio
import wave
import xml.etree.ElementTree as etree
import RPi.GPIO as gpio

Сразу хочу добавить, что в речь в данной статье не идет об потоковом распозновании.

Необходимые функции для записи и конвертации записанного файла в различные форматы:

def convert_to_flac():
    print("Converting...")
    system("flac -w -f output.wav output.flac")
def convert_to_speex():
    print("Converting to speex")
    system("speexenc -w output.wav output")
def convert_to_raw():
    print("Converting to raw")
    system("sox output.wav output.raw")
def arecord():
    print("Recording...")
    system("arecord -r16000 -d3 output.wav")

А вот и сам запрос на сервера Google.

def speech_to_text_google():
    key = "” #Ключ для API. 
    url = "https://www.google.com/speech-api/v2/recognize?output=json&lang=ru-ru&key="+key
    file_upload = "output.flac"
    audio = open(file_upload, "rb").read()
    header = {"Content-Type": "audio/x-flac; rate=16000"}
    data = Request(url, audio, header)
    post = urlopen(data)
    response = post.read()
    print(response)
    js = json.loads(response[13:])
    slovo = js["result"][0]["alternative"][0]["transcript"]
    global result
    result = slovo

Ключ для api необходимо получить тут (ключ для сервера), и подключить в кабинете speech api тут

Затем структура кода

arecord()
convert_to_flac()
speech_to_text_google()
print(result)
gpio.setmode(gpio.BCM)
gpio.setup(17,gpio.OUT)
gpio.setup(22,gpio.OUT)
gpio.setup(27,gpio.OUT)
if(result == u"Включи красный"):
    gpio.output(17,True)
if(result == u"Включи желтый"):
    gpio.output(22,True)
if(result == u"Включи синий"):
    gpio.output(27,True)
if(result == u"Выключи желтый"):
    gpio.output(22,False)
if(result == u"Выключи красный"):
    gpio.output(17,False)
if(result == u"Выключи синий"):
    gpio.output(27,False)
system("rm output.flac output.wav");

Светодиоды подключены следующим образом: Внимание! Для корректного сравнений результата распознавания со строкой, содержащей unicode, необходимо поставить таг „u“.

Таким образом, мы сделали установку, которая позволяет активировать различные устройства с помощью голосовых команд.

P.S. для удобства настройки микрофона я пользовался библиотекой alsamixer.

Вот, что получилось: