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/
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();
Получаю результат - 400: Недопустимый запрос Может кто пробовал уже подобное или хотя бы укажет палкой где могу ошибаться? Сразу говорю не гений...
Толи никто не знает...толи я вообще что-то нето делаю....работа вообще встала

Решение задачи: «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";
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы