17 апр. 2011 г.

Распознавание голоса с помощью технологий Google

В этом посте я расскажу, как сделать автоматическое распознавание голоса с помощью технологий Google.

Что нам потребуется:
- Perl с модулями JSON::XS и LWP,
- утилита flac для работы со звуком,
- исходный звуковой файл test.wav, 11025Hz mono 16 bit, для распознавания.

Вкратце, что надо делать: отправить flac в POST-запросе на адрес гугловского сервиса, а как результат получить JSON с распознанным текстом.

Код очень прост. Вот такой:

#!/usr/bin/perl

use Encode;
use JSON::XS;
use LWP::UserAgent;
$ua = LWP::UserAgent->new;

$file = "test.wav";
$res = `flac $file >/dev/null 2>&1`;
$flacfile = "$file";
$flacfile =~ s/\.wav$/\.flac/;
$filesize = -s "$flacfile";

open(flac, "$flacfile");
binmode flac;
read(flac, $data, $filesize);
close(flac);
unlink("$flacfile");

$url = 'http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU';
my $req = HTTP::Request->new(POST=>$url);
$req->content_type('audio/x-flac; rate=11025');
$req->content_length($filesize);
$req->content($data);

$res = $ua->request($req);
$jstxt = JSON::XS->new->utf8->decode($res->content);
$decoded = $jstxt->{hypotheses}[0]->{utterance};

use utf8;
print "\nDecoded:\n$decoded\n";
no utf8;

Вот и всё :) Как видим, всё достаточно просто. Мы только что заюзали фичу гугла, которая, якобы, существует только в хроме для мобильных телефонов ("голосовой поиск"), причем мы ее заюзали нестандартным образом: нам не нужен поиск как таковой, нам нужен всего лишь промежуточный результат: распознанный голос.

На вход гугловскому сервису подается звук в формате FLAC, который мы предварительно кодируем из исходного файла WAV. Потребуется указать частоту дискретизации звука: в моем случае это 11кГц (11025).

Из проблем этого гугловского сервиса, которые стоит отметить:
-он, похоже, еще очень сырой. Постоянно, вместо ответа с распознанным текстом приходят HTTP 500 Server Error.

Я провел простой эксперимент: запустил распознавание звука 20 раз подряд.
Для длинных звуковых файлов, размер которых больше 300.000 байт (11кГц моно 16 бит звук), сервис Гугла ни разу (!) не вернул результат, все 20 раз было Internal Server Error 500.
При ограничении отправляемого звукового файла размером 200.000 байт (до кодирования его во flac) расклад стал такой: 6 из 20 запусков - Internal Error 500; при повторном запуске этого теста результаты лучше: 2 из 20 запусков вернули Error 500.
Видимо, этот сервис заточен исключительно на поиск, когда юзер говорит поисковую фразу из 2-3 слов (типа, "пицца Нижний Новгород") и получает результаты поиска.

Комментариев нет:

Отправить комментарий