Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Google语音Api从音频文件中获取文本,并在C中返回{“result”:[]}_C#_Windows_Google Api_Google Speech Api - Fatal编程技术网

C# Google语音Api从音频文件中获取文本,并在C中返回{“result”:[]}

C# Google语音Api从音频文件中获取文本,并在C中返回{“result”:[]},c#,windows,google-api,google-speech-api,C#,Windows,Google Api,Google Speech Api,我正在尝试创建一个windows应用程序,在这个应用程序中,我可以使用Google语音识别API将我拥有的音频文件转录成文本文件。以下是我所做的: 我来到这里,成为了一名会员 我去了我的Google开发者控制台,成功地生成了一个API密钥 3我在网上找到了一些代码并运行了它: private void btnGoogle_Click(object sender, EventArgs e) { string path = @"Z:\path\to\audi

我正在尝试创建一个windows应用程序,在这个应用程序中,我可以使用Google语音识别API将我拥有的音频文件转录成文本文件。以下是我所做的:

我来到这里,成为了一名会员

我去了我的Google开发者控制台,成功地生成了一个API密钥

3我在网上找到了一些代码并运行了它:

private void btnGoogle_Click(object sender, EventArgs e)
        {

            string path = @"Z:\path\to\audio\file\good-morning-google.flac";
            try
            {

                FileStream fileStream = File.OpenRead(path);
                MemoryStream memoryStream = new MemoryStream();
                memoryStream.SetLength(fileStream.Length);
                fileStream.Read(memoryStream.GetBuffer(), 0, (int)fileStream.Length);
                byte[] BA_AudioFile = memoryStream.GetBuffer();
                HttpWebRequest _HWR_SpeechToText = null;
                _HWR_SpeechToText =
                            (HttpWebRequest)HttpWebRequest.Create(
                                "https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=your-api-key-here");
                _HWR_SpeechToText.Credentials = CredentialCache.DefaultCredentials;
                _HWR_SpeechToText.Method = "POST";
                _HWR_SpeechToText.ContentType = "audio/x-flac; rate=44100";
                _HWR_SpeechToText.ContentLength = BA_AudioFile.Length;
                Stream stream = _HWR_SpeechToText.GetRequestStream();
                stream.Write(BA_AudioFile, 0, BA_AudioFile.Length);
                stream.Close();

                HttpWebResponse HWR_Response = (HttpWebResponse)_HWR_SpeechToText.GetResponse();
                if (HWR_Response.StatusCode == HttpStatusCode.OK)
                {
                    Console.WriteLine("looks ok...");
                    StreamReader SR_Response = new StreamReader(HWR_Response.GetResponseStream());
                    Console.WriteLine(SR_Response.ReadToEnd());

                    Console.WriteLine(SR_Response.ReadToEnd());
                    Console.WriteLine("Done");
                }



            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            Console.ReadLine();
        }
上面的代码运行。它提供了以下输出:

looks ok...
{"result":[]}
因此我知道我得到了一个HttpStatusCode.OK响应,因为它看起来很好。。。执行日志行

然而,结果完全是空的。。。为什么呢?我做错什么了吗


编辑:这里是我获得音频文件的地方:

首先,您的代码比需要的更复杂,我使用了以下方法:

string api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
string path = @"C:\temp\good-morning-google.flac";

byte[] bytes = System.IO.File.ReadAllBytes(path);

WebClient client = new WebClient();
client.Headers.Add("Content-Type", "audio/x-flac; rate=44100");
byte[] result = client.UploadData(string.Format(
            "https://www.google.com/speech-api/v2/recognize?client=chromium&lang=en-us&key={0}", api_key), "POST", bytes);

string s = client.Encoding.GetString(result);
你的第二个问题是你的音频文件!它是32位立体声的。它应该是16位PCM单声道。因此,转换为单声道并降到16位。我曾经转换过你的文件。见截图

然后我得到了这样的回答:

{"result":[]}
{"result":[{"alternative":[{"transcript":"good morning Google how are you feeling today","confidence":0.987629}],"final":true}],"result_index":0}

首先,您的代码比需要的代码更复杂,我使用了以下方法:

string api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
string path = @"C:\temp\good-morning-google.flac";

byte[] bytes = System.IO.File.ReadAllBytes(path);

WebClient client = new WebClient();
client.Headers.Add("Content-Type", "audio/x-flac; rate=44100");
byte[] result = client.UploadData(string.Format(
            "https://www.google.com/speech-api/v2/recognize?client=chromium&lang=en-us&key={0}", api_key), "POST", bytes);

string s = client.Encoding.GetString(result);
你的第二个问题是你的音频文件!它是32位立体声的。它应该是16位PCM单声道。因此,转换为单声道并降到16位。我曾经转换过你的文件。见截图

然后我得到了这样的回答:

{"result":[]}
{"result":[{"alternative":[{"transcript":"good morning Google how are you feeling today","confidence":0.987629}],"final":true}],"result_index":0}

如果Google API没有返回结果,则很可能无法满足请求。所以你的代码没有问题,只是测试音频。你试过其他音频文件吗?
我知道这一点,因为我使用过谷歌定制搜索API。如果没有找到结果,它将返回空。

如果Google API没有返回结果,它很可能无法发出请求。所以你的代码没有问题,只是测试音频。你试过其他音频文件吗?
我知道这一点,因为我使用过谷歌定制搜索API。如果没有找到结果,它将返回空。

如果没有音频文件,这将很难判断。你确定格式真的是FLAC,内容完全可以听得见吗?@Gusman是的,我确定。这里是我得到音频文件的地方:嗯。。。我认为您复制的流是错误的,您试图操作底层缓冲区,它只是一个副本,而不是原始的,而不是内存流中的所有代码。为什么不使用byte[]BA_AudioFile=File.ReadAllBytespath?@Gusman感谢您的建议。我试过了,结果完全一样=你检查过BA_音频文件的内容了吗?如果都是0,那么仍然有一些错误,如果没有音频文件,这将很难判断。你确定格式真的是FLAC,内容完全可以听得见吗?@Gusman是的,我确定。这里是我得到音频文件的地方:嗯。。。我认为您复制的流是错误的,您试图操作底层缓冲区,它只是一个副本,而不是原始的,而不是内存流中的所有代码。为什么不使用byte[]BA_AudioFile=File.ReadAllBytespath?@Gusman感谢您的建议。我试过了,结果完全一样=你检查过BA_音频文件的内容了吗?如果它都是0,那么仍然有一些错误的东西在起作用!谢谢几个后续问题1音频文件的长度有限制吗?i、 谷歌是否会接受每个请求的最大秒数?关于如何通过c代码将mp3转换成16位单声道flac格式,你有什么快速的建议吗?我想限制是60秒,但我不确定。只要给他们发一个61秒长的flac,看看会发生什么。MP3->flac,我从来没有自己做过,但是快速的谷歌搜索发现了很多C示例。我不想推荐一个,因为我还没看过。太酷了!谢谢几个后续问题1音频文件的长度有限制吗?i、 谷歌是否会接受每个请求的最大秒数?关于如何通过c代码将mp3转换成16位单声道flac格式,你有什么快速的建议吗?我想限制是60秒,但我不确定。只要给他们发一个61秒长的flac,看看会发生什么。MP3->flac,我从来没有自己做过,但是快速的谷歌搜索发现了很多C示例。我不想推荐,因为我还没看过。