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 = "http://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.
Вот, что получилось:
Добрый день. Подскажите, как с вами связаться по поводу рекламы?
здесь только белая реклама