今天写了一个调用google语音识别api的接口,具体的参数请参考http://blog.csdn.net/dlangu0393/article/details/7214728
下面是我写的go语言代码
package main
import (
下面是我写的go语言代码
package main
import (
"io"
"os"
"fmt"
"bytes"
"errors"
"encoding/binary"
"io/ioutil"
"net/http"
)
func main() {
file, err := os.Open("A.wav")//打开要识别的语音文件
if err != nil {
panic(err)
}
b, err := ioutil.ReadAll(file)
if err != nil {
panic(err)
}
buf := new(bytes.Buffer)
err = binary.Write(buf, binary.BigEndian, b)
if err != nil {
panic(err)
}
// rate := []string{"8000", "11025", "16000", "22050" ,"24000", "32000", "44100","48000"}google识别的音频频率
body, err := getText(buf, "22050")//我录制的频率是22050
if err != nil {
panic(err)
}
fmt.Println(string(body))
}
func getText(bodys io.Reader, rate string) ([]byte, error) {
req, err := http.NewRequest("POST", "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&maxresults=1&lang=zh-CN", bodys)
if err != nil {
return nil, err
}
var httpclient *http.Client = &http.Client{}
req.Header.Add("User-Agent", "Mozilla/5.0")
req.Header.Add("Content-Type", "audio/L16;rate="+rate)
resp, err := httpclient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var r io.Reader = resp.Body
body, err := ioutil.ReadAll(r)
if err != nil {
return nil, err
}
if resp.StatusCode != 200 {
msg := fmt.Sprintf("handlePost statuscode=%d, body=%s", resp.StatusCode, body)
return nil, errors.New(msg)
}
return body, nil
}
//一开始使用系统自带的录音软件,得到的结果与真实内容相差十万八千里。后来用手机下了一个录音软件,才好使,
几个要点:
1,参数rate 一定要和录制的频率相同,不然解析出来的结果五花八门。
2,lang=zh-CN:如果解析中文这个必须
3,文件不要超过1M,不然无法解析
4,语速最好中等
下面是正确的返回结果
{"status":0,"id":"a8c7af6c66377ae85a687406d6ca0cf8-1","hypotheses":[{"utterance":"喂今天是2012年12月23日周二是不是不是真的不是一定不是绝对不是","confidence":0.66633016}]}
还是挺准的!
"os"
"fmt"
"bytes"
"errors"
"encoding/binary"
"io/ioutil"
"net/http"
)
func main() {
file, err := os.Open("A.wav")//打开要识别的语音文件
if err != nil {
panic(err)
}
b, err := ioutil.ReadAll(file)
if err != nil {
panic(err)
}
buf := new(bytes.Buffer)
err = binary.Write(buf, binary.BigEndian, b)
if err != nil {
panic(err)
}
// rate := []string{"8000", "11025", "16000", "22050" ,"24000", "32000", "44100","48000"}google识别的音频频率
body, err := getText(buf, "22050")//我录制的频率是22050
if err != nil {
panic(err)
}
fmt.Println(string(body))
}
func getText(bodys io.Reader, rate string) ([]byte, error) {
req, err := http.NewRequest("POST", "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&maxresults=1&lang=zh-CN", bodys)
if err != nil {
return nil, err
}
var httpclient *http.Client = &http.Client{}
req.Header.Add("User-Agent", "Mozilla/5.0")
req.Header.Add("Content-Type", "audio/L16;rate="+rate)
resp, err := httpclient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var r io.Reader = resp.Body
body, err := ioutil.ReadAll(r)
if err != nil {
return nil, err
}
if resp.StatusCode != 200 {
msg := fmt.Sprintf("handlePost statuscode=%d, body=%s", resp.StatusCode, body)
return nil, errors.New(msg)
}
return body, nil
}
//一开始使用系统自带的录音软件,得到的结果与真实内容相差十万八千里。后来用手机下了一个录音软件,才好使,
几个要点:
1,参数rate 一定要和录制的频率相同,不然解析出来的结果五花八门。
2,lang=zh-CN:如果解析中文这个必须
3,文件不要超过1M,不然无法解析
4,语速最好中等
下面是正确的返回结果
{"status":0,"id":"a8c7af6c66377ae85a687406d6ca0cf8-1","hypotheses":[{"utterance":"喂今天是2012年12月23日周二是不是不是真的不是一定不是绝对不是","confidence":0.66633016}]}
还是挺准的!