本文介紹如何使用阿里云智能語音服務提供的Go SDK,包括SDK的安裝方法及SDK代碼示例。
前提條件
在使用SDK前,請先閱讀接口說明,詳情請參見接口說明。
下載安裝
SDK支持Go 1.16及以上版本。
請確認已經安裝Golang環境,并完成基本配置。
下載并安裝SDK。
通過以下命令完成SDK下載和安裝。
go get github.com/aliyun/alibabacloud-nls-go-sdk
導入SDK。
在代碼中通過添加以下字段導入SDK。
import ("github.com/aliyun/alibabacloud-nls-go-sdk")
SDK常量
常量 | 含義 |
SDK_VERSION | SDK版本。 |
PCM | PCM音頻格式。 |
WAV | WAV音頻格式。 |
OPUS | OPUS音頻格式。 |
OPU | OPU音頻格式。 |
DEFAULT_DISTRIBUTE | 獲取Token時使用的默認區域,默認為"cn-shanghai"。 |
DEFAULT_DOMAIN | 獲取Token時使用的默認URL,默認為"nls-meta.cn-shanghai.aliyuncs.com"。 |
DEFAULT_VERSION | 獲取Token時使用的協議版本,默認為"2019-02-28"。 |
DEFAULT_URL | 默認公有云URL,默認為"wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"。 |
建立連接
使用Akid和Akkey來獲取Token時,建議針對Token進行緩存,并根據獲取Token時獲得的過期時間參數進行及時更新;請勿頻繁調用獲取Token的接口,否則會造成云端限流。
1.ConnectionConfig
用于建立連接的基礎參數。
參數說明:
參數 | 類型 | 參數說明 |
Url | String | 訪問的公有云URL,如果不確定,可以使用常量DEFAULT_URL。 |
Token | String | 訪問Token,詳情可參見獲取Token概述。 |
Akid | String | 阿里云賬號AccessKey ID。
|
Akkey | String | 阿里云賬號AccessKey Secret。
|
Appkey | String | 對應項目Appkey。 |
2.func NewConnectionConfigWithToken(url string, appkey string, token string) *ConnectionConfig
通過URL、Appkey和Token創建連接參數。
參數說明:
參數 | 類型 | 參數說明 |
Url | String | 訪問的公有云URL,如果不確定,可以使用常量DEFAULT_URL。 |
Appkey | String | 對應項目Appkey。 |
Token | String | 訪問Token,詳情可參見獲取Token概述。 |
返回值:
*ConnectionConfig:連接配置對象指針。
3. func NewConnectionConfigFromJson(jsonStr string) (*ConnectionConfig, error)
通過JSON字符串來創建連接參數。
參數說明:
參數 | 類型 | 參數說明 |
jsonStr | String | 描述連接參數的JSON字符串,有效字段如下:url,token,akid,akkey,appkey。其中必須包含url和appkey,如果包含Token則不需要包含akid和akkey。 |
返回值:
*ConnectionConfig:連接配置對象指針。
語音合成
1.SpeechSynthesisStartParam
實時語音合成參數。
參數 | 類型 | 參數說明 |
Voice | String | 發音人,默認值:“xiaoyun”。 |
Format | String | 音頻格式,默認使用WAV。 |
SampleRate | Integer | 采樣率,默認值:16000 Hz。 |
Volume | Integer | 音量,范圍為0~100,默認值:50。 |
SpeechRate | Integer | 語速,范圍為-500~500,默認值:0。 |
PitchRate | Integer | 音高,范圍為-500~500,默認值:0。 |
EnableSubtitle | Boolean | 是否開啟字幕功能,默認不開啟。
|
2.func DefaultSpeechSynthesisParam() SpeechSynthesisStartParam
創建一個默認的語音合成參數。
參數說明:無。
返回值:
SpeechSynthesisStartParam:默認參數。
3.func NewSpeechSynthesis(...) (*SpeechSynthesis, error)
創建一個新的語音合成對象。
參數說明:
參數 | 類型 | 參數說明 |
config | *ConnectionConfig | 參見建立連接相關內容。 |
logger | *NlsLogger | 參見SDK日志相關內容。 |
realtimeLongText | Boolean |
|
taskfailed | func(string, interface{}) | 識別過程中的錯誤處理回調參數,interface{}為用戶自定義參數。 |
synthesisresult | func([]byte, interface{}) | 語音合成數據回調參數。 |
metainfo | func(string, interface{}) | 字幕數據回調,需要參數中EnableSubtitle為true。 |
completed | func(string, interface{}) | 合成完畢結果回調參數。 |
closed | func(interface{}) | 連接斷開回調參數。 |
param | interface{} | 用戶自定義參數。 |
返回值:無。
4.func (tts *SpeechSynthesis) Start(text string, param SpeechSynthesisStartParam, extra map[string]interface{}) (chan bool, error)
給定文本和參數進行語音合成。
參數說明:
參數 | 類型 | 參數說明 |
text | String | 待合成文本。 |
param | SpeechRecognitionStartParam | 實時合成參數。 |
extra | map[string]interface{} | 額外 |
返回值:
chan bool:語音合成完成通知管道。
error:錯誤異常。
5.func (tts *SpeechSynthesis) Shutdown()
強制停止語音合成。
參數說明:無。
返回值:無。
SDK日志
1.func DefaultNlsLog() *NlsLogger
用于創建全局唯一的默認日志對象,默認日志以NLS為前綴,輸出到標準錯誤。
參數說明:無。
返回值:
NlsLogger:日志對象指針。
2.func NewNlsLogger(w io.Writer, tag string, flag int) *NlsLogger
創建一個新的日志。
參數說明:
參數 | 類型 | 參數說明 |
w | io.Writer | 任意實現io.Writer接口的對象。 |
tag | String | 日志前綴,會打印到日志行首部。 |
flag | Integer | 日志flag,具體請參見Go官方log文檔。 |
返回值:
NlsLogger:日志對象指針。
3.func (logger *NlsLogger) SetLogSil(sil bool)
設置日志是否輸出到對應的io.Writer。
參數說明:
參數 | 類型 | 參數說明 |
sil | Boolean | 是否禁止日志輸出。
|
返回值:無。
4.func (logger *NlsLogger) SetDebug(debug bool)
設置是否打印Debug日志,僅影響通過Debugf或Debugln進行輸出的日志。
參數說明:
參數 | 類型 | 參數說明 |
debug | Boolean | 是否允許Debug日志輸出。
|
返回值:無。
5. func (logger *NlsLogger) SetOutput(w io.Writer)
設置日志輸出方式。
參數說明:
參數 | 類型 | 參數說明 |
w | io.Writer | 任意實現io.Writer接口的對象。 |
返回值:無。
6. func (logger *NlsLogger) SetPrefix(prefix string)
設置日志行的標簽。
參數說明:
參數 | 類型 | 參數說明 |
prefix | String | 日志行標簽,會輸出在日志行行首。 |
返回值:無。
7. func (logger *NlsLogger) SetFlags(flags int)
設置日志屬性。
參數說明:
參數 | 類型 | 參數說明 |
flags | Integer | 日志屬性,具體請參見Go官方文檔。 |
返回值:無。
8. 日志打印
日志打印方法:
方法名 | 方法說明 |
func (l *NlsLogger) Print(v ...interface{}) | 標準日志輸出。 |
func (l *NlsLogger) Println(v ...interface{}) | 標注日志輸出,行尾自動換行。 |
func (l *NlsLogger) Printf(format string, v ...interface{}) | 帶Format的日志輸出,Format方式見具體請參見Go官方文檔。 |
func (l *NlsLogger) Debugln(v ...interface{}) | Debug信息日志輸出,行尾自動換行。 |
func (l *NlsLogger) Debugf(format string, v ...interface{}) | 帶Format的Debug信息日志輸出。 |
func (l *NlsLogger) Fatal(v ...interface{}) | 致命錯誤日志輸出,輸出后自動進程退出。 |
func (l *NlsLogger) Fatalln(v ...interface{}) | 致命錯誤日志輸出,行尾自動換行,輸出后自動進程退出。 |
func (l *NlsLogger) Fatalf(format string, v ...interface{}) | 帶Format的致命錯誤日志輸出,輸出后自動進程退出。 |
func (l *NlsLogger) Panic(v ...interface{}) | 致命錯誤日志輸出,輸出后自動進程退出并打印崩潰信息。 |
func (l *NlsLogger) Panicln(v ...interface{}) | 致命錯誤日志輸出,行尾自動換行,輸出后自動進程退出并打印崩潰信息。 |
func (l *NlsLogger) Panicf(format string, v ...interface{}) | 帶Format的致命錯誤日志輸出,輸出后自動進程退出并打印崩潰信息。 |
代碼示例
package main
import (
"errors"
"io"
"log"
"os"
"sync"
"time"
nls "github.com/aliyun/alibabacloud-nls-go-sdk"
)
const (
//online key
APPKEY = "Your APPKEY" //獲取Appkey請前往控制臺:https://nls-portal.console.aliyun.com/applist
TOKEN = "Your TOKEN" //獲取Token具體操作,請參見:http://bestwisewords.com/document_detail/450514.html
)
type TtsUserParam struct {
F io.Writer
Logger *nls.NlsLogger
}
func onTaskFailed(text string, param interface{}) {
p, ok := param.(*TtsUserParam)
if !ok {
log.Default().Fatal("invalid logger")
return
}
p.Logger.Println("TaskFailed:", text)
}
func onSynthesisResult(data []byte, param interface{}) {
p, ok := param.(*TtsUserParam)
if !ok {
log.Default().Fatal("invalid logger")
return
}
p.F.Write(data)
}
func onCompleted(text string, param interface{}) {
p, ok := param.(*TtsUserParam)
if !ok {
log.Default().Fatal("invalid logger")
return
}
p.Logger.Println("onCompleted:", text)
}
func onClose(param interface{}) {
p, ok := param.(*TtsUserParam)
if !ok {
log.Default().Fatal("invalid logger")
return
}
p.Logger.Println("onClosed:")
}
func waitReady(ch chan bool, logger *nls.NlsLogger) error {
select {
case done := <-ch:
{
if !done {
logger.Println("Wait failed")
return errors.New("wait failed")
}
logger.Println("Wait done")
}
case <-time.After(60 * time.Second):
{
logger.Println("Wait timeout")
return errors.New("wait timeout")
}
}
return nil
}
var lk sync.Mutex
var fail = 0
var reqNum = 0
const (
TEXT = "你好小德,今天天氣怎么樣。"
)
func testMultiInstance() {
param := nls.DefaultSpeechSynthesisParam()
config := nls.NewConnectionConfigWithToken(nls.DEFAULT_URL, APPKEY, TOKEN)
strId := "ID0"
fname := "ttsdump.wav"
ttsUserParam := new(TtsUserParam)
fout, err := os.OpenFile(fname, os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0666)
logger := nls.NewNlsLogger(os.Stderr, strId, log.LstdFlags|log.Lmicroseconds)
logger.SetLogSil(false)
logger.SetDebug(true)
logger.Printf("Test Normal Case for SpeechRecognition:%s", strId)
ttsUserParam.F = fout
ttsUserParam.Logger = logger
//第三個參數控制是否請求長文本語音合成,false為短文本語音合成
tts, err := nls.NewSpeechSynthesis(config, logger, false,
onTaskFailed, onSynthesisResult, nil,
onCompleted, onClose, ttsUserParam)
if err != nil {
logger.Fatalln(err)
return
}
lk.Lock()
reqNum++
lk.Unlock()
logger.Println("SR start")
ch, err := tts.Start(TEXT, param, nil)
if err != nil {
lk.Lock()
fail++
lk.Unlock()
tts.Shutdown()
}
err = waitReady(ch, logger)
if err != nil {
lk.Lock()
fail++
lk.Unlock()
tts.Shutdown()
}
logger.Println("Synthesis done")
tts.Shutdown()
}
func main() {
testMultiInstance()
}