HttpWebRequest к Google speech api - C#
Формулировка задачи:
Всем привет!
Давненько уже интересуюсь ASR и TTS от гугла....давненько ищу, читаю материал что есть в инете.
Таить не буду мысли в сторону добавления в свой проект распознания команд на основе некой ASR...есть желание остановиться на гугле или полностью от него отказаться и идти например на разработки ЦРТ, хотя проект ну совсем маленький(честно говоря выгоды не имею). Суть вопроса не в осуждении + и -, ибо этого навалом в сети...
C TTS сразу удалось разобраться...а вот с ASR все примеры в сети не рабочие и как правило возвращают 400: Недопустимый запрос(например http://habrahabr.ru/post/117234/....да и таких статей много)...Единственная прога, работающая с гуглом и имеющая исходники - это Mspeech (https://code.google.com/p/mspeech/) единственное что написана она на Delphi XE4...Откинув все лишнее суть запроса выполняемого в коде есть на хабре - хоть и датировано 2012 но последний релиз в мае этого года имеет такой же код (здесь можно ссылки выкладывать...ведь да) http://habrahabr.ru/post/144535/
Пытаюсь то же самое сделать(или где я в корне ошибаюсь????)
Получаю результат - 400: Недопустимый запрос
Может кто пробовал уже подобное или хотя бы укажет палкой где могу ошибаться? Сразу говорю не гений...
function TGoogleRecognizer.HTTPPostFile(const URL, FieldName, FileName: String; const Data: TStream; const ResultData: TStrings): Boolean;
const
CRLF = #$0D + #$0A;
var
Bound, Str: String;
Bound := IntToHex(Random(MaxInt), 8) + '_Synapse_boundary';
Str := '--' + Bound + CRLF;
Str := Str + 'content-disposition: form-data; name="' + FieldName + '";';
Str := Str + ' filename="' + FileName + '"' + CRLF;
if ExtractFileExt(FileName) = '.wav' then
Str := Str + 'Content-Type: audio/l16; rate='+PCMInSampleRate+'' + CRLF + CRLF
else
Str := Str + 'Content-Type: audio/x-flac; rate='+FLACInSampleRate+'' + CRLF + CRLF;
FHTTP.Timeout := HTTPTimeout;
FHTTP.Sock.OnStatus := HTTPStatus;
FHTTP.Document.Clear;
FHTTP.Headers.Clear;
FHTTP.Document.Write(Pointer(Str)^, Length(Str));
FHTTP.Document.CopyFrom(Data, 0);
Str := CRLF + '--' + Bound + '--' + CRLF;
FHTTP.Document.Write(Pointer(Str)^, Length(Str));
if ExtractFileExt(FileName) = '.wav' then
FHTTP.MimeType := 'audio/l16; rate='+PCMInSampleRate
else
FHTTP.MimeType := 'audio/x-flac; rate='+FLACInSampleRate;
FHTTP.UserAgent := 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36';
Result := FHTTP.HTTPMethod('POST', URL);
ResultData.LoadFromStream(FHTTP.Document);string Str;
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU");
int CRLF = 0x0D + 0x0A;
string FieldName = "userfile";
string FileName = "C:\\test.flac";
string FLACInSampleRate = "8000";
System.Random random = new Random();
string bound = random.Next(32767).ToString("X") + "_Synapse_boundary";
Str = "--" + bound + CRLF.ToString("X");
Str = Str + "content-disposition: form-datFLACInSampleRatea; name='" + FieldName + "';";
Str = Str + " filename='" + FileName + "'" + CRLF.ToString("X");
Str = Str + "Content-Type: audio/x-flac; rate=" + FLACInSampleRate + "" + CRLF.ToString("X") + CRLF.ToString("X");
req.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36";
req.Timeout = 4000;
req.ContentType = "audio/x-flac; rate="+FLACInSampleRate;
req.Method = "POST";
Stream PostData = req.GetRequestStream();
byte[] byteStr = Encoding.ASCII.GetBytes(Str);
byte[] bytes = File.ReadAllBytes(FileName);
Str = CRLF.ToString("X") + "--" + bound + "--" + CRLF.ToString("X");
byte[] byteStr2 = Encoding.ASCII.GetBytes(Str);
byte[] newArray = new byte[byteStr.Length + bytes.Length + byteStr2.Length];
Array.Copy(byteStr, 0, newArray, 0, byteStr.Length);
Array.Copy(bytes, 0, newArray, byteStr.Length, bytes.Length);
Array.Copy(byteStr2, 0, newArray, byteStr.Length + bytes.Length, byteStr2.Length);
PostData.Write(newArray, 0, newArray.Length);
PostData.Close();
HttpWebResponse WebResp = (HttpWebResponse)req.GetResponse();
Толи никто не знает...толи я вообще что-то нето делаю....работа вообще встала
Решение задачи: «HttpWebRequest к Google speech api»
textual
Листинг программы
using System;
using System.IO;
using System.IO.Compression;
using System.Net;
class Program
{
static void Main(string[] args)
{
using (var fileStream = new FileStream(@"C:\LetsArrangeMeeting.flac", FileMode.Open))
{
const string requestUrl = "https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=KEY_GOES_HERE&client=chromium&maxresults=6&pfilter=2";
var request = (HttpWebRequest)WebRequest.Create(requestUrl);
ConfigureRequest(request);
var requestStream = request.GetRequestStream();
CopyStream(fileStream, requestStream);
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var zippedStream = new GZipStream(responseStream, CompressionMode.Decompress))
{
using (var sr = new StreamReader(zippedStream))
{
var res = sr.ReadToEnd();
Console.WriteLine(res);
}
}
}
}
}
Console.ReadLine();
}
private static void CopyStream(FileStream fileStream, Stream requestStream)
{
var buffer = new byte[32768];
int read;
while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
requestStream.Write(buffer, 0, read);
}
}
private static void ConfigureRequest(HttpWebRequest request)
{
request.KeepAlive = true;
request.SendChunked = true;
request.ContentType = "audio/x-flac; rate=44100";
request.UserAgent =
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip,deflate,sdch");
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-GB,en-US;q=0.8,en;q=0.6");
request.Headers.Set(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
request.Method = "POST";
}
}