Google 语音 Api 在 C# 中从返回 {"result":[]} 的音频文件中获取文本
Google Speech Api get text from audio file returning {"result":[]} in C#
我正在尝试创建一个 windows 应用程序,我可以在其中获取我拥有的音频文件,然后 运行 将其中的声音写入带有 Google 的文本文件语音识别 API。这是我所做的:
1) 我去了这里 https://groups.google.com/a/chromium.org/forum/?fromgroups#!forum/chromium-dev 并成为了会员。
2) 我进入 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
响应,因为 looks ok...
日志行已执行。
然而,结果完全是空的...这是为什么呢?我做错了什么吗?
编辑:这是我获得音频文件的地方:https://github.com/gillesdemey/google-speech-v2
首先你的代码比需要的更复杂,我用了这个:
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 位。我用 http://www.audacityteam.org/ 来转换你的文件。见截图。
然后我得到了这个回复:
{"result":[]}
{"result":[{"alternative":[{"transcript":"good morning Google how are you feeling today","confidence":0.987629}],"final":true}],"result_index":0}
如果Google APIs return没有结果,很可能无法完成请求。所以你的代码没有问题,只是测试音频。您是否尝试过其他音频文件?
我知道这一点是因为我使用过 Google 自定义搜索 API。如果没有找到结果,它将 return 为空。
我正在尝试创建一个 windows 应用程序,我可以在其中获取我拥有的音频文件,然后 运行 将其中的声音写入带有 Google 的文本文件语音识别 API。这是我所做的:
1) 我去了这里 https://groups.google.com/a/chromium.org/forum/?fromgroups#!forum/chromium-dev 并成为了会员。
2) 我进入 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
响应,因为 looks ok...
日志行已执行。
然而,结果完全是空的...这是为什么呢?我做错了什么吗?
编辑:这是我获得音频文件的地方:https://github.com/gillesdemey/google-speech-v2
首先你的代码比需要的更复杂,我用了这个:
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 位。我用 http://www.audacityteam.org/ 来转换你的文件。见截图。
然后我得到了这个回复:
{"result":[]}
{"result":[{"alternative":[{"transcript":"good morning Google how are you feeling today","confidence":0.987629}],"final":true}],"result_index":0}
如果Google APIs return没有结果,很可能无法完成请求。所以你的代码没有问题,只是测试音频。您是否尝试过其他音频文件? 我知道这一点是因为我使用过 Google 自定义搜索 API。如果没有找到结果,它将 return 为空。