PDA

Просмотр полной версии : [Статья] Используем Google Speech API в своих программах- Delphi


necrpetrovich
03.01.2014, 10:42
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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

Распознавание происходит в несколько этапов :
1. Запись звука в формате FLAC
2. Отправка данных в гугл
3. Расшифровка принятых данных

И так , все по порядку.
1. Запись звука в формате FLAC. Для этого есть компонент New Audio . О нем я напомню чуть позже.
2. Отправка данных в гугл . Отправлять файл flac нужно на ссылку
[Ссылки могут видеть только зарегистрированные и активированные пользователи] .
Для этого можно использовать функцию :

function TMainForm.[Ссылки могут видеть только зарегистрированные и активированные пользователи](Const URL, FieldName, FileName: String; Const Data: TStream; Const ResultData: TStrings): Boolean;
const
CRLF = #$0D + #$0A;
var
[Ссылки могут видеть только зарегистрированные и активированные пользователи] T[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Bound, Str: String;
begin
Bound := IntToHex(Random(MaxInt), 8) + '_Synapse_boundary';
HTTP := T[Ссылки могут видеть только зарегистрированные и активированные пользователи]
try
if UseProxy then
begin
[Ссылки могут видеть только зарегистрированные и активированные пользователи] := ProxyAddress;
if ProxyPort <> '' then
[Ссылки могут видеть только зарегистрированные и активированные пользователи] := ProxyPort
else
[Ссылки могут видеть только зарегистрированные и активированные пользователи] := '3128';
if ProxyAuth then
begin
[Ссылки могут видеть только зарегистрированные и активированные пользователи] := ProxyUser;
[Ссылки могут видеть только зарегистрированные и активированные пользователи] := ProxyUserPasswd;
end;
end;
Str := '--' + Bound + CRLF;
Str := Str + 'content-disposition: form-data; name="' + FieldName + '";';
Str := Str + ' filename="' + FileName + '"' + CRLF;
Str := Str + 'Content-Type: audio/x-flac; rate='+IntToStr(DXAudioIn.InSampleRate) + CRLF + CRLF;
[Ссылки могут видеть только зарегистрированные и активированные пользователи](Pointer(Str)^, Length(Str));
[Ссылки могут видеть только зарегистрированные и активированные пользователи](Data, 0);
Str := CRLF + '--' + Bound + '--' + CRLF;
[Ссылки могут видеть только зарегистрированные и активированные пользователи](Pointer(Str)^, Length(Str));
[Ссылки могут видеть только зарегистрированные и активированные пользователи] := 'audio/x-flac; rate='+IntToStr(DXAudioIn.InSampleRate);
[Ссылки могут видеть только зарегистрированные и активированные пользователи] := 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36';
Result := [Ссылки могут видеть только зарегистрированные и активированные пользователи]('POST', URL);
ResultData.LoadFromStream([Ссылки могут видеть только зарегистрированные и активированные пользователи]);
finally
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
end;
end;


Эта функция переделанная т.к недавно гугл ожесточил правила.

Использовать можно так :

[Ссылки могут видеть только зарегистрированные и активированные пользователи]('[Ссылки могут видеть только зарегистрированные и активированные пользователи]', 'userfile', ExtractFilename(OutFileName), Stream, StrList);


где
Stream — это поток TFileStream в который мы читаем наш записанный файл в формате FLAC.
StrList — это TStringList с ответом от Google.

3. Расшифровка принятых данных

В ответ к нам придет строка примерно такая :
{«status»:0,«id»:«5e34348f2887c7a3cc27dc3695ab4575-1»,«hypotheses»:[{«utterance»:«привет»,«confidence»:0.7581704}]}
Если статус приходит "0" значит запись распознана. utterance — распознанная фраза .
Ну, а далее можно использовать определенную команду по определенному слову. В среднем, у меня уходит на распознавании 2 сек.


Статью написал : Stas971
Источник: [Ссылки могут видеть только зарегистрированные и активированные пользователи]

NebesaBag
03.01.2014, 22:33
1. Запись звука в формате FLAC. Для этого есть компонент New Audio . О нем я напомню чуть позже.

Когда?)

Sinyss
04.01.2014, 02:14
Зачем прокси и
CRLF = #$0D + #$0A; ?

VeTaL_UA
04.01.2014, 19:20
Зачем прокси
Потому что функция универсальная /md
CRLF = #$0D + #$0A; ?
По коду не видно, что разделитель? /md

Sinyss
05.01.2014, 02:18
Потому что функция универсальная
Это не прибавляет ей универсальности.
По коду не видно, что разделитель?
Разделитель можно нормально оформить и дать нормальное название переменной... а не CRLF (которому сотни расшифровок, например: Common Runtime Language Finded)

VeTaL_UA
05.01.2014, 02:42
Это не прибавляет ей универсальности.
if UseProxy then
Конкретно вот это прибавляет.
Разделитель можно нормально оформить и дать нормальное название переменной...
[Ссылки могут видеть только зарегистрированные и активированные пользователи]