今天寫了一個調用google語音識別api的接口,具體的參數請參考http://blog.csdn.net/dlangu0393/article/details/7214728
下面是我寫的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}]} 仍是挺準的!