Serverless實(shí)戰(zhàn)駕校小程序【語(yǔ)音讀題】六

語(yǔ)音讀題功能

為了更方便查看題目,我們加入讀題功能。語(yǔ)音讀題主要應(yīng)用在智能客服機(jī)器人、電子有聲讀物、智慧教育等領(lǐng)域,了解到目前市場(chǎng)語(yǔ)音合成技術(shù),主要有訊飛語(yǔ)音、百度語(yǔ)音、騰訊語(yǔ)音這幾家大廠。 都支持男女生聲,訊飛價(jià)格比較貴,這里發(fā)現(xiàn)騰訊語(yǔ)音合成暫時(shí)不收費(fèi),

騰訊云的語(yǔ)言合成介紹
https://cloud.tencent.com/product/tts#scenarios

語(yǔ)音合成(Text To Speech)滿足已知文本生成語(yǔ)音的需求,打通人機(jī)交互閉環(huán)。多種音色選擇,支持自定義音量、語(yǔ)速,為企業(yè)客戶提供定制自有領(lǐng)域詞庫(kù)和個(gè)性化發(fā)音人服務(wù),讓發(fā)音更自然、更專業(yè)、更符合場(chǎng)景需求。語(yǔ)音合成廣泛應(yīng)用于語(yǔ)音導(dǎo)航、有聲讀物、標(biāo)準(zhǔn)發(fā)音領(lǐng)讀、自動(dòng)新聞播報(bào)等場(chǎng)景。

本以為這些API廠商,直接提供了API接口,小程序里請(qǐng)求就好了,現(xiàn)實(shí)不是的,做法跟做微信支付有點(diǎn)類似。必須自己實(shí)現(xiàn)一套服務(wù)端API,服務(wù)端實(shí)現(xiàn)接口加密等操作。

這幾家都需要這樣做,這里首先把需要的資料準(zhǔn)備好。

  1. 開發(fā)語(yǔ)言 這里選Golang,官方有服務(wù)端SDK
  2. 騰訊云API密匙,自己在控制臺(tái)查看并記錄
  3. 開發(fā)文檔地址:https://cloud.tencent.com/document/api/441/18086
  4. 選一臺(tái)服務(wù)器,備案好域名,配置好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異常,直接失敗。實(shí)際代碼中可以加入其他的處理。
    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()
}

這里每次的題目可能都不一樣,所以就不更新到數(shù)據(jù)庫(kù)了,需要的時(shí)候,調(diào)用一次接口,如果接口收費(fèi),這里就把語(yǔ)音文件路徑保存到數(shù)據(jù)表里,每次判斷數(shù)據(jù)表是否存在語(yǔ)音就可以了。

目前開發(fā)這讀題還是需要自己有服務(wù)器,如果現(xiàn)成的API調(diào)用就好了。

image.png

這項(xiàng)目目前已經(jīng)上線,大家可以體驗(yàn)下讀題效果。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容