Google Speech API v2结果为空

时间:2014-04-24 12:43:15

标签: c# google-api speech-recognition

我想在我当前的项目中使用Google Speech API。

我从here

获取了有关如何访问api的信息

如github所述,你必须向服务器发送一个post webrequest并以json的形式返回结果。

我还从here

获得了一些用于v1 api的源代码

设置请求并不难:

WebRequest request = WebRequest.Create(Constants.GoogleRequestString);
            request.Method = "POST";
            request.ContentType = "audio/x-flac; rate=" + sampleRate;
            request.ContentLength = bytes.Length;

在我的示例中,Constants.GoogleRequestString等于https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=AIzaSyCnl6MRydhw_5fLXIdASxkLJzcJh5iX0M4

我从github链接下载了.flac文件并在c#中编写了一个小程序,它正在加载flac文件的字节,并使用略微修改的方法GoogleRequest(byte[] bytes, int sampleRate)

将其发送到服务器

我打开流,如方法所示,并将所有字节发送到服务器。我收到了回复,但是

我得到的JSON字符串是:"{\"result\":[]}"

我不知道它为什么不起作用。文件或文件中的语音文字不正确(但是如果我用vlc听它,我清楚地听到语音文字)或者我的程序仍有一些错误。

你有没有遇到过这个问题而没有得到语音api的结果?它不应该说result: couldn't understand what is spoken或任何其他错误消息吗?

我刚尝试了.wav文件。这对我有用。

1 个答案:

答案 0 :(得分:1)

您的代码很好,假设它类似于:

var uriBuilder = new UriBuilder(
    "https",
    "www.google.com",
    443,
    "speech-api/v2/recognize",
    "?output=json&lang=en-us&key=YOURAPIKEY");
int sampleRate = 44100;

using (var stream = File.Open("c:\\tmp\\g2.flac", FileMode.Open))
{

    HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uriBuilder.Uri);
    request.Method = "POST";
    request.ContentType = "audio/x-flac; rate=" + sampleRate;
    request.AutomaticDecompression = DecompressionMethods.GZip;

    stream.CopyTo(request.GetRequestStream());
    try
    {
        using (var resp = request.GetResponse().GetResponseStream())
        {
            using (var sr = new StreamReader(resp))
            {
                Debug.WriteLine(sr.ReadToEnd());
            }
        }
    }
    catch(WebException ee)
    {
        var all = new StreamReader(ee.Response.GetResponseStream()).ReadToEnd();
        Debug.WriteLine(all);
    }
}

重要的是FLAC文件的确切格式。我使用Audacity来控制音轨的保存方式。

录制后我将曲目设置更改为:

  • Mono
  • 样本格式:16位PCM
  • 评分:44100 Hz

以下屏幕截图显示了这些设置:

audacity settings

使用默认的立体声音轨和32位浮点样本格式,我无法获得语音API以产生任何其他结果,然后你也得到了空的json有效载荷。

使用上述设置,我的结果是:

{
    "result" : []
}{
    "result" : [{
            "alternative" : [{
                    "transcript" : "translate this",
                    "confidence" : 0.92849225
                }, {
                    "transcript" : "translate days"
                }, {
                    "transcript" : "translate dish"
                }, {
                    "transcript" : "translate fish"
                }, {
                    "transcript" : "translate these"
                }
            ],
            "final" : true
        }
    ],
    "result_index" : 0
}

我的英语发音不是很好,因为谷歌认为我想翻译鱼......

如果出现http错误(如403 Forbidden),异常处理程序会尝试从http正文中读取完整的响应。如果您的身份验证密钥不正确,它会告诉您。

要使您的api键能够使用Speech API,请按照here

说明进行操作
  

确保您是chromium-dev@chromium.org的成员(您只需subscribe到chrome-dev并选择不接收邮件。)

之后,您可以创建服务器密钥:

enter image description here