駕校答題小程式實戰全過程【連載】——6.語音讀題
一、目標:
為了更方便檢視題目,我們加入讀題功能。語音讀題主要應用在智慧客服機器人、電子有聲讀物、智慧教育等領域,瞭解到目前市場語音合成技術,主要有訊飛語音、百度語音、騰訊語音這幾家大廠。 都支援男女生聲,訊飛價格比較貴,這裡發現騰訊語音合成暫時不收費。
騰訊雲的語言合成介紹
ofollow,noindex">https://cloud.tencent.com/product/tts#scenarios
摘選:語音合成(Text To Speech)滿足已知文字生成語音的需求,打通人機互動閉環。多種音色選擇,支援自定義音量、語速,為企業客戶提供定製自有領域詞庫和個性化發音人服務,讓發音更自然、更專業、更符合場景需求。語音合成廣泛應用於語音導航、有聲讀物、標準發音領讀、自動新聞播報等場景。
本以為這些API廠商,直接提供了API介面,小程式裡請求就好了,現實不是的,做法跟做微信支付有點類似。必須自己實現一套服務端API,服務端實現介面加密等操作。
這幾家都需要這樣做,這裡首先把需要的資料準備好。
- 開發語言 這裡選Golang,官方有服務端SDK
- 騰訊雲API密匙,自己在控制檯檢視並記錄
- 開發文件地址: https://cloud.tencent.com/document/api/441/18086
- 選一臺伺服器,備案好域名,配置好https
二、編寫程式碼
1.路由
beego.Router("/1/textToVoice", &controllers.CloudController{}, "post:TextToVoice")
2.控制器
func (cloud *CloudController) TextToVoice() { body := cloud.Ctx.Input.CopyBody(beego.BConfig.MaxMemory) js, err := simplejson.NewJson(body) if err != nil { cloud.responseError(err) } //獲取文字資訊 text := js.Get("text").MustString() //判斷不能為空 if strings.TrimSpace(text) == "" { cloud.responseError(fmt.Errorf("text param不能為空")) } //這裡初始化大家傳入自己騰訊雲的key資訊 client, _ := aai.NewClientWithSecretId( "id", "key", regions.Guangzhou) request := aai.NewTextToVoiceRequest() request.Text = common.StringPtr(text) request.SessionId = common.StringPtr(uuid.GetRandomString(16)) request.ModelType = common.Int64Ptr(-1) request.ModelType = common.Int64Ptr(-1) request.Speed = common.Float64Ptr(0.8) response, err := client.TextToVoice(request) // 處理異常 if _, ok := err.(*errors.TencentCloudSDKError); ok { cloud.responseError(fmt.Errorf("An API error has returned: %s", err)) } // 非SDK異常,直接失敗。實際程式碼中可以加入其他的處理。 if err != nil { cloud.responseError(err) } // 列印返回的json字串 var base64Str *string = response.Response.Audio fileByte, err := models.Base64Decode([]byte(*base64Str)) if err != nil { cloud.responseError(err) } fileName := uuid.GetRandomString(16) + "_" + fmt.Sprintf("%d", time.Now().Unix()) + ".wav" filePath := "/data/dyfsuda/app/restful/files/" + fileName url := "https://api.xxxx.com/files/" + fileName //把檔案寫入目錄 if err = ioutil.WriteFile(filePath, fileByte, os.ModeAppend); err != nil { cloud.responseError(err) } if err = os.Chmod(filePath, 0777); err != nil { cloud.responseError(err) } //返回檔案路徑給客戶端 cloud.Data["json"] = map[string]string{"url": url} cloud.ServeJSON() }
這裡每次的題目可能都不一樣,所以就不更新到資料庫了,需要的時候,呼叫一次介面,如果介面收費,這裡就把語音檔案路徑儲存到資料表裡,每次判斷資料表是否存在語音就可以了。
目前開發這讀題還是需要自己有伺服器,如果現成的API呼叫就好了。

1.png
三、開發回顧:
1.駕校答題小程式實戰全過程【連載】——1.資料庫設計
https://www.jianshu.com/p/ce67bfb5254c
2.駕校答題小程式實戰全過程【連載】——2.答題功能
https://www.jianshu.com/p/a63a8abe5223
3.駕校答題小程式實戰全過程【連載】——3.順序練習和模擬考試
https://www.jianshu.com/p/f64fef8edafb
4.駕校答題小程式實戰全過程【連載】——4.題目採集與測試
https://www.jianshu.com/p/60edb4d5562d
5.駕校答題小程式實戰全過程【連載】——5.資料匯入
https://www.jianshu.com/p/ce687502381d
6.駕校答題小程式實戰全過程【連載】——6.語音讀題
該專案目前已經上線,需要原始碼的朋友可以找我溝通,QQ:624235922