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"; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д