当前位置:   article > 正文

最佳实践 | 用腾讯云智能语音打造智能对话机器人_对话机器人播放音乐如何实现

对话机器人播放音乐如何实现

在AI技术的推动下,智能对话机器人逐渐成为我们工作、生活中的重要效率工具,乃至是伙伴,特别是为企业带来最原始最直观的“降本增效”落地实现。

作为开发者,你是否有想过基于语音技术打造一款智能对话机器人呢?

本文将可以手把手教你技术实现细节。

首先我们分析下智能对话机器人需要些什么东西:

1.语音输入:想要智能对话肯定需要语音的输入,输出。

2.语音识别:将语音识别成文字。

3.智能问答服务:将语音识别结果,输入该服务,并得到结果。

4.语音合成:将智能问答服务回答生成音频

5.语音播报:将智能问答服务回答的问题,用语音的形式播报给您听。

流程图:

语音采集:

1.使用腾讯云语音识别提供的SDK(安卓,IOS,微信小程序)

2.可以自行使用硬件录音设备采集音频

3.自己在端上(IOS,安卓等)调起录音设备采集音频

 

技术流程:

1.先采集音频

2.用音频流数据调用腾讯云语音识别(ASR)

3.将语音识别的文本数据调用智能问答服务

4.使用智能问答服务的回答调用腾讯云语音合成(TTS)

5.最后将语音合成产生的音频返回给端上播放

一、准备工作

1.1开通语音识别服务

笔者使用的是腾讯的语音识别,先开通一下服务,点这里 腾讯云语音识别控制台 , 点击立即开通就能开通服务了。

可以点击这里领取一个新人的体验资源包: 语音识别_实时语音识别_录音文件识别_语音转文本服务 - 腾讯云

1.2获取调用服务的API密钥

访问腾讯云的服务,都需要一个秘钥,在腾讯云访问管理的 API密钥管理页面 ,可以新建一个秘钥,这个可一定要保管好,不能泄露出去,不然就被别人盗用了。秘钥后面我们要用到。

1.3获取语音识别,语音合成SDK

语音识别SDK获取:语音识别 实时语音识别(websocket)-API 文档-文档中心-腾讯云

语音合成SDK获取:语音合成 基础语音合成-API 文档-文档中心-腾讯云

端SDK获取:

1.IOS:登录 - 腾讯云

2.安卓:登录 - 腾讯云

3.微信小程序:腾讯云智能语音 | 小程序插件 | 微信公众平台

1.4、接入智能问答服务 

WeLM:- WeLM

这里也可以使用别的智能问答服务,比如ChatGPT

二、代码开发

逻辑包含:

1.请求ASR实时识别

2.请求智能问答服务

3.请求TTS语音合成,获取音频

代码编译:

1.执行命令生成go.mod环境 go mod init demo

2.go build 编译

3.执行 ./demo -e 16k_zh -f 测试音频地址 -format 1

注:本代码只包含了服务端部分,可以自行接入SDK将音频流传到服务端识别。

  1. package main
  2. import (
  3. "encoding/base64"
  4. "flag"
  5. "fmt"
  6. ttsCommon "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
  7. "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
  8. "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
  9. tts "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tts/v20190823"
  10. "github.com/tencentcloud/tencentcloud-speech-sdk-go/asr"
  11. "github.com/tencentcloud/tencentcloud-speech-sdk-go/common"
  12. "os"
  13. "sync"
  14. "time"
  15. )
  16. var (
  17. AppID = "输入appid"
  18. SecretID = "输入密钥ID"
  19. SecretKey = "输入密钥key"
  20. EngineModelType = "16k_zh"
  21. SliceSize = 16000
  22. )
  23. // MySpeechRecognitionListener implementation of SpeechRecognitionListener
  24. type MySpeechRecognitionListener struct {
  25. ID int
  26. }
  27. // OnRecognitionStart implementation of SpeechRecognitionListener
  28. func (listener *MySpeechRecognitionListener) OnRecognitionStart(response *asr.SpeechRecognitionResponse) {
  29. }
  30. // OnSentenceBegin implementation of SpeechRecognitionListener
  31. func (listener *MySpeechRecognitionListener) OnSentenceBegin(response *asr.SpeechRecognitionResponse) {
  32. }
  33. // OnRecognitionResultChange implementation of SpeechRecognitionListener
  34. func (listener *MySpeechRecognitionListener) OnRecognitionResultChange(response *asr.SpeechRecognitionResponse) {
  35. }
  36. // OnSentenceEnd implementation of SpeechRecognitionListener
  37. func (listener *MySpeechRecognitionListener) OnSentenceEnd(response *asr.SpeechRecognitionResponse) {
  38. fmt.Printf("语音识别结果: %s \n", response.Result.VoiceTextStr)
  39. ConversationalRobot(response.Result.VoiceTextStr)
  40. }
  41. // OnRecognitionComplete implementation of SpeechRecognitionListener
  42. func (listener *MySpeechRecognitionListener) OnRecognitionComplete(response *asr.SpeechRecognitionResponse) {
  43. }
  44. // OnFail implementation of SpeechRecognitionListener
  45. func (listener *MySpeechRecognitionListener) OnFail(response *asr.SpeechRecognitionResponse, err error) {
  46. fmt.Printf("%s|%s|OnFail: %v\n", time.Now().Format("2006-01-02 15:04:05"), response.VoiceID, err)
  47. }
  48. var proxyURL string
  49. var VoiceFormat *int
  50. var e *string
  51. func main() {
  52. var f = flag.String("f", "test.pcm", "audio file")
  53. var p = flag.String("p", "", "proxy url")
  54. VoiceFormat = flag.Int("format", 0, "voice format")
  55. e = flag.String("e", "", "engine_type")
  56. fmt.Println("input-", *e, "-input")
  57. flag.Parse()
  58. if *e == "" {
  59. panic("please input engine_type")
  60. }
  61. if *VoiceFormat == 0 {
  62. panic("please input voice format")
  63. }
  64. proxyURL = *p
  65. var wg sync.WaitGroup
  66. wg.Add(1)
  67. go processOnce(1, &wg, *f)
  68. fmt.Println("Main: Waiting for workers to finish")
  69. wg.Wait()
  70. fmt.Println("Main: Completed")
  71. }
  72. func processOnce(id int, wg *sync.WaitGroup, file string) {
  73. defer wg.Done()
  74. process(id, file)
  75. }
  76. func process(id int, file string) {
  77. audio, err := os.Open(file)
  78. defer audio.Close()
  79. if err != nil {
  80. fmt.Printf("open file error: %v\n", err)
  81. return
  82. }
  83. listener := &MySpeechRecognitionListener{
  84. ID: id,
  85. }
  86. credential := common.NewCredential(SecretID, SecretKey)
  87. EngineModelType = *e
  88. fmt.Println("engine_type:", EngineModelType)
  89. recognizer := asr.NewSpeechRecognizer(AppID, credential, EngineModelType, listener)
  90. recognizer.ProxyURL = proxyURL
  91. recognizer.VoiceFormat = *VoiceFormat
  92. err = recognizer.Start()
  93. if err != nil {
  94. fmt.Printf("%s|recognizer start failed, error: %v\n", time.Now().Format("2006-01-02 15:04:05"), err)
  95. return
  96. }
  97. data := make([]byte, SliceSize)
  98. //这里的data可以换成实时端上传输过来的音频流
  99. for n, err := audio.Read(data); n > 0; n, err = audio.Read(data) {
  100. if err != nil {
  101. if err.Error() == "EOF" {
  102. break
  103. }
  104. fmt.Printf("read file error: %v\n", err)
  105. break
  106. }
  107. //一句话识别结束会回调上面OnSentenceEnd方法
  108. err = recognizer.Write(data[0:n])
  109. if err != nil {
  110. break
  111. }
  112. time.Sleep(20 * time.Millisecond)
  113. }
  114. recognizer.Stop()
  115. }
  116. func ConversationalRobot(text string) {
  117. //调用智能问答服务,获取回答
  118. Result := SendToGPTService(text)
  119. //把智能问答服务的文案转成音频文件
  120. audioData := TextToVoice(Result)
  121. //将音频文件返回给端上播放
  122. ResponseAudioData(audioData)
  123. }
  124. func ResponseAudioData(audioData []byte) {
  125. //把音频数据audioData推到端上播放
  126. }
  127. func SendToGPTService(text string) string {
  128. // API 调用智能问答服务
  129. // 获取智能问答服务返回结果
  130. result := "智能问答服务返回结果"
  131. fmt.Println("智能问答服务 API调用")
  132. return result
  133. }
  134. func TextToVoice(text string) []byte {
  135. fmt.Println("语音合成调用")
  136. // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
  137. // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
  138. // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
  139. credential := ttsCommon.NewCredential(
  140. SecretID,
  141. SecretKey,
  142. )
  143. // 实例化一个client选项,可选的,没有特殊需求可以跳过
  144. cpf := profile.NewClientProfile()
  145. cpf.HttpProfile.Endpoint = "tts.tencentcloudapi.com"
  146. // 实例化要请求产品的client对象,clientProfile是可选的
  147. client, _ := tts.NewClient(credential, "ap-beijing", cpf)
  148. // 实例化一个请求对象,每个接口都会对应一个request对象
  149. request := tts.NewTextToVoiceRequest()
  150. request.Text = ttsCommon.StringPtr(text)
  151. request.SessionId = ttsCommon.StringPtr("f435g34d23a24y546g")
  152. // 返回的resp是一个TextToVoiceResponse的实例,与请求对象对应
  153. response, err := client.TextToVoice(request)
  154. if _, ok := err.(*errors.TencentCloudSDKError); ok {
  155. fmt.Printf("An API error has returned: %s", err)
  156. return nil
  157. }
  158. if err != nil {
  159. panic(err)
  160. }
  161. // 输出json格式的字符串回包
  162. audioData, _ := base64.StdEncoding.DecodeString(*response.Response.Audio)
  163. fmt.Println("语音合成调用结束")
  164. return audioData
  165. }

以上就是智能语音对话机器人技术细节的实现,感兴趣的同学也可以实操或者进行拓展开发。

目前,智能对话机器人已经在客户触达、营销运营、窗口服务和人机对话交互等经济生产活动环节进入规模化落地阶段,随着AI技术的不断创新,智能对话机器人也将衍生出更高阶、更智能的模式。

腾讯云智能面向企业客户与开发者也提供了一站式的语音技术服务,更多产品信息也可以前往腾讯云官网了解。

腾讯云智能语音识别:语音识别_实时语音识别_录音文件识别_语音转文本服务 - 腾讯云

腾讯云智能语音合成:语音合成_语音定制_文本转语音服务 - 腾讯云

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/70112
推荐阅读
相关标签
  

闽ICP备14008679号