谷歌语音到C#中的文本API [英] Google speech to text API in C#

查看:126
本文介绍了谷歌语音到C#中的文本API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当flac文件通过使用windows录音机录制手册并使用软件转换器进行转换时,我的程序从google获得正确的响应。

但是,当我使用我的程序记录的文件时,我从google获得了{结果:[]}
。我该怎么办?
这里是我的代码:

发件人:


  private static void CopyStream(FileStream fileStream,Stream requestStream)
{
var buffer = new byte [32768];
int读取; ((read = fileStream.Read(buffer,0,buffer.Length))> 0)
{
requestStream.Write(buffer,0,read);



private静态无效ConfigureRequest(HttpWebRequest请求)
{
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,如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;

using(var fileStream = new FileStream(@C:\ Users \Ahmad Mustofa \Documents\Visual Studio 2010\Projects\FP\FP\\\\\\\\ Debug \voice.flac,FileMode.Open))
{
const string requestUrl =https://www.google.com/speech-api/v2/recognize?output=json&lang = AR-SA&安培;键= AIzaSyBJ6VJ326Rpb23msih2wGhXENEwU1TF1PA&安培;客户=铬&安培;的maxResults = 1&安培; 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() ;
state.Text = res;
}
}
}
}
}

wav录音机:


  private void sourceStream_DataAvailable(object sender,NAudio.Wave.WaveInEventArgs e) 
{
if(waveWriter == null)return;

waveWriter.WriteData(e.Buffer,0,e.BytesRecorded);
waveWriter.Flush();
}
fileName =C:\\ Users \\Ahmad Mustofa \\Documents\\Visual Studio 2010\\Projects\\\\\\\\ \\FP\\bin\\debug\\voice.wav;
int deviceNumber = hardware.SelectedItems [0] .Index;
尝试
{
sourceStream = new NAudio.Wave.WaveIn();
sourceStream.DeviceNumber = deviceNumber;
sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100,NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);

sourceStream.DataAvailable + = new EventHandler< NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable);
waveWriter = new NAudio.Wave.WaveFileWriter(fileName,sourceStream.WaveFormat);

sourceStream.StartRecording();
}
catch(Exception ex)
{
state.Text =disini+ ex.Message;
}

flac转换器:

  string inputFile = Path.Combine(wav,input); 
string outputFile = Path.Combine(flac,Path.ChangeExtension(input,.flac));

if(!File.Exists(inputFile))
抛出新的ApplicationException(Input file+ inputFile +could not be found!);

WavReader wav = new WavReader(inputFile);

使用(var flacStream = File.Create(outputFile))
{
FlacWriter flac = new FlacWriter(flacStream,wav.BitDepth,wav.Channels,wav.SampleRate);
// 1秒钟音频数据的缓冲区
byte [] buffer = new byte [wav.Bitrate / 8];
int bytesRead;
do
{
bytesRead = wav.InputStream.Read(buffer,0,buffer.Length);
flac.Convert(buffer,0,bytesRead);
} while(bytesRead> 0);
flac.Dispose();
flac = null;
}


解决方案

问题,但提出了一个整洁的解决方案。我使用Fiddler( http://www.telerik.com/fiddler/ )了解Chrome进行语音识别,然后创建一些代码来模拟发送请求的chrome。此方法使用不同的URI,并且还有一个称为对的16个字符的值,对于每个请求都是不同的。我使用一个简单的随机值生成器函数为请求创建一个函数,并将输出值更改为'json'。

注意:结果有时可能是空的,就像上面的情况一样,但是响应中还有另一个json对象,它包含了替代方法。

  private void GoogleSpeechToText()
{
string uri =https://www.google.com/speech-api/full-duplex/v1/up?output=json&key=AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw&pair =+ GenerateUnique(16)+& lang = zh-CN& pFilter = 2& maxAlternatives = 10& client = chromium;
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(uri);
request.Timeout = 10000;
request.Method =POST;
request.Host =www.google.com;
request.KeepAlive = true;
request.SendChunked = true;
request.ContentType =audio / x-flac; rate = 16000;
request.Headers.Set(HttpRequestHeader.AcceptLanguage,en-GB,en-US; q = 0.8,en; q = 0.6);
request.UserAgent =Mozilla / 5.0(Windows NT 6.3; WOW64)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 36.0.1985.143 Safari / 537.36;

string path = @C:\TestFolder\test_audio.flac;
FileInfo fInfo = new FileInfo(path);
var numBytes = fInfo.Length;
byte [] data;

using(FileStream fStream = new FileStream(path,FileMode.Open,FileAccess.Read))
{
data = new Byte [numBytes];
fStream.Read(data,0,(int)numBytes);
fStream.Close();


using(Stream reqStream = request.GetRequestStream())
reqStream.Write(data,0,data.Length);

尝试
{
WebResponse response = request.GetResponse();
Stream respStream = response.GetResponseStream();

if(response.ContentType ==application / json; charset = utf-8)
{
using(var sr = new StreamReader(respStream))
{
var res = sr.ReadToEnd();
textBox1.Text = res;
}
}
}
catch(Exception ex){MessageBox.Show(ex.Message,Error,MessageBoxButtons.OK); }
}

private string GenerateUnique(int length)
{
string [] LETTERS = new string [] {A,B,C D,E,F,G,H,I,J,K,L,M,N,O, P,Q,R,S,T,U,V,W,X,Y,Z
string [] DIGITS =新字符串[] {0,1,2,3,4,5,6,7,8 9};
string buffer =;
Random random = new Random();

for(int i = 0; i {
int rnd = random.Next(2);
if(rnd == 1)
buffer + = LETTERS [random.Next(LETTERS.Length)];
else
buffer + = DIGITS [random.Next(DIGITS.Length)];
}
返回缓冲区;
}


My program get a correct respon from google when the flac file recorded manual by using windows's sound recorder and convert it using a software converter.
But when I use the file that recorded by my program, I got "{"result":[]} " from google. What should I do? here is my code :
the sender :

    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";
    }
    using (var fileStream = new FileStream(@"C:\Users\Ahmad Mustofa\Documents\Visual Studio 2010\Projects\FP\FP\bin\Debug\voice.flac", FileMode.Open))
    {
        const string requestUrl = "https://www.google.com/speech-api/v2/recognize?output=json&lang=ar-sa&key=AIzaSyBJ6VJ326Rpb23msih2wGhXENEwU1TF1PA&client=chromium&maxresults=1&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();
                          state.Text = res;
                     }
                }
            }
        }
    }

the wav recorder:

        private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
        {
             if (waveWriter == null) return;

             waveWriter.WriteData(e.Buffer, 0, e.BytesRecorded);
             waveWriter.Flush();
        }
        fileName = "C:\\Users\\Ahmad Mustofa\\Documents\\Visual Studio 2010\\Projects\\FP\\FP\\bin\\debug\\voice.wav";
        int deviceNumber = hardware.SelectedItems[0].Index;
        try
        {
            sourceStream = new NAudio.Wave.WaveIn();
            sourceStream.DeviceNumber = deviceNumber;
            sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);

            sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable);
            waveWriter = new NAudio.Wave.WaveFileWriter(fileName, sourceStream.WaveFormat);

            sourceStream.StartRecording();
        }
        catch (Exception ex)
        {
            state.Text = "disini" + ex.Message;
        }

flac converter:

        string inputFile = Path.Combine("wav ", input);
        string outputFile = Path.Combine("flac", Path.ChangeExtension(input, ".flac"));

        if (!File.Exists(inputFile))
            throw new ApplicationException("Input file " + inputFile + " cannot be found!");

        WavReader wav = new WavReader(inputFile);

        using (var flacStream = File.Create(outputFile))
        {
            FlacWriter flac = new FlacWriter(flacStream, wav.BitDepth, wav.Channels, wav.SampleRate);
            // Buffer for 1 second's worth of audio data
            byte[] buffer = new byte[wav.Bitrate / 8];
            int bytesRead;
            do
            {
                bytesRead = wav.InputStream.Read(buffer, 0, buffer.Length);
                flac.Convert(buffer, 0, bytesRead);
            } while (bytesRead > 0);
            flac.Dispose();
            flac = null;
        }

解决方案

I was also having the same issue but came up with a neat solution. I used Fiddler (http://www.telerik.com/fiddler/) to figure out how Chrome does the speech recognition and then created some code to emulate chrome sending the request. This approach uses a different URI and there is also a 16-character value called pair which is different for each request. I use a simple random value generator function to create one for the request and I also changed the output value to 'json'.

Note: The result can sometimes be empty as in your case above but there's also another json object in the response that contains the alternatives.

    private void GoogleSpeechToText()
    {
        string uri = "https://www.google.com/speech-api/full-duplex/v1/up?output=json&key=AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw&pair=" + GenerateUnique(16) + "&lang=en-US&pFilter=2&maxAlternatives=10&client=chromium";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.Timeout = 10000;
        request.Method = "POST";
        request.Host = "www.google.com";            
        request.KeepAlive = true;
        request.SendChunked = true;
        request.ContentType = "audio/x-flac; rate=16000";
        request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-GB,en-US;q=0.8,en;q=0.6");
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36";

        string path = @"C:\TestFolder\test_audio.flac";     
        FileInfo fInfo = new FileInfo(path);
        var numBytes = fInfo.Length;
        byte[] data;

        using (FileStream fStream = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            data = new Byte[numBytes];
            fStream.Read(data, 0, (int) numBytes);
            fStream.Close();
        }

        using (Stream reqStream = request.GetRequestStream())
            reqStream.Write(data, 0, data.Length);

        try
        {
            WebResponse response = request.GetResponse();
            Stream respStream = response.GetResponseStream();

            if(response.ContentType == "application/json; charset=utf-8")
            {                    
                using (var sr = new StreamReader(respStream))
                {
                    var res = sr.ReadToEnd();
                    textBox1.Text = res;                        
                }
            }
        }
        catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK); }            
    }

    private string GenerateUnique(int length)
    {
        string[] LETTERS = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
        string[] DIGITS = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
        string buffer = "";
        Random random = new Random();

        for(int i = 0; i < length; i++)
        {                
            int rnd = random.Next(2);
            if (rnd == 1)
                buffer += LETTERS[random.Next(LETTERS.Length)];
            else
                buffer += DIGITS[random.Next(DIGITS.Length)];
        }
        return buffer;
    }

这篇关于谷歌语音到C#中的文本API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆