
☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython
一、引言
在《在扣子(coze)配置一个提供TTS语音合成服务+咨询服务的综合智能体:语音合成助手》介绍了如何在coze平台配置一个提供TTS语音合成服务+咨询服务的综合智能体:语音合成助手,提供了Python调用API访问语音合成助手完成语音合成任务的方法。
但上文中提供的智能体及API调用存在如下问题:
上面介绍的实现代码其实存在几个问题:
- 输出太多,初始调试时比较有用,但作为一个需要使用的工具输出太多,影响用户感知。
- 转换成的MP3文件只是给出了链接,并未下载到本地
- 这个智能体不是单纯的TTS合成语音智能体,还有意图解析提供咨询服务的能力,这种情况下怎么确保每个TTS都能正确的被转换而不是需要确认是否咨询?
- 能不能变更输出声音的音色
第一个问题好说,纯粹是代码中的输出控制,进行一些修改和注释即可,在此不展开介绍。后面三个问题都需要采用一定的处理技术。
二、获取智能体应答中的MP3访问地址并下载到本地
智能体的应答中,提供音频的URL地址,类似如下:
已合成音频:[点击播放](https://lf-bot-studio-plugin-resource.coze.cn/obj/bot-studio-platform-plugin-tos/artist/image/f727bd27311b4f2888b689aec3cf2c1c.mp3)
需要从该应答中解析地址,并从网上下载到本地,在此直接提供相关代码:
def getMp3UrlFromText(textInf):
match = re.search(r'https?://[^\s\]\)]+', textInf)
# 如果找到匹配的链接,则提取并打印
if match:
first_link = match.group(0)
print("****提取的HTTP链接是:\n", first_link)
first_link = match.group(0)
return first_link
else:
print("提取HTTP链接失败")
return None
def getMp3UrlFromAnser(response_data):
if response_data['code']:
print("应答异常:",response_data['msg'])
return None
else:
data = response_data['data']
count = 0
for item in data:
if item['type']=='answer':
returnContent = item['content']
#print("大模型应答:",returnContent)
ret = getMp3UrlFromText(returnContent)
if not ret:
print("大模型应答:",returnContent)
return ret
else:continue
return None
def getMp3(response_data,mp3FName):
mp3URL = getMp3UrlFromAnser(response_data)
if not mp3URL:return False
if os.path.exists(mp3FName):os.remove(mp3FName)
response = requests.get(mp3URL)
if response.status_code == 200:
with open(mp3FName, 'wb') as file:
file.write(response.content)
print(f'文件已成功保存为 {mp3FName}')
return True
else:
print(f'请求失败,状态码:{response.status_code}')
return False
上述三个函数,分别实现从大模型应答文本中提取URL地址字符串、从大模型应答中找到请求最终应答内容、从大模型最终应答内容中找到URL地址并下载MP3到本地。
三、修改提示词确保在指令明确情况下直接进行语音合成
针对上面第三个问题,本来以为可以在API开发时解决,但没找到解决办法,最终通过修改提示词来解决,将智能体的【人设与回复逻辑】进行了修改,增加了使用输入【“TTS服务”+冒号】来作为明确进行语音合成的提示词,修改后的【人设与回复逻辑】如下:
# 角色
你是一位专业的语音合成专家兼客户咨询经理,具备出色的意图识别能力,能够精准判断用户需求。当用户输入文本时,你可以识别用户的咨询或合成意图,对于合成意图,能将用户输入的文本精准、流畅地转化为高质量的音频文件输出,保证音频在语调、节奏等方面自然且契合内容情感需求;对于明确咨询意图,直接根据用户输入进行答复,对于疑似咨询问题,会引导用户确认是否进行咨询,并依用户反馈决定后续行动。
## 技能
### 技能 1: 意图识别
当用户输入文本时,仔细剖析文本的意图,识别是否存在明确的咨询意图:
1、对于输入内容是“咨询”+冒号(含半角、全角)开始的,判断为明确咨询意图;
2、对于输入内容是“TTS任务”+冒号(含半角、全角)开始的,判断为明确语音合成意图;
3、对于既不是明确咨询意图、又不是明确语音合成意图的疑问句判断为疑似咨询意图;
4、其他情况判断为语音合成请求。
### 技能 2: 咨询与合成引导
1、对于明确咨询意图,直接根据用户输入进行答复,无需再次确认;
2、对于明确语音合成意图,直接将用户输入转换成语音,无需再次确认
3、对于疑似咨询意图,请询问用户:“要查资料吗?”。若用户回答“是”,则提供咨询结果后结束对话;若回答“否”,则转入语音合成;
4、对于其他输入,作为语音合成请求,无需用户确认,直接进行语音合成。
### 技能 3: 语音合成
对于语音合成意图,依据文本特性,挑选合适的语音风格(如欢快、沉稳、温柔等)进行音频合成,合成完毕后输出合成好的音频文件。
## 限制:
- 仅围绕用户输入文本的咨询或语音合成意图展开工作,拒绝处理与这两者无关的任务。
- 严格按照既定流程进行意图判断、引导和操作,不可偏离流程要求。
- 对于疑似咨询意图需要用户确认是否咨询意图的,限定用户输入“是”或“否”,不让输入其他内容
- 对于不是“咨询”+冒号开头且不是疑问句的,判断为语音合成请求,不需要用户再次确认
四、变更输出声音的音色
智能体使用的声音种类有很多可选的,按API相关文档的说明有上100种音色可选,但作为基础版,通过测试验证有39种可以免费使用,这39种如下:
voiceType = ['爽快思思/Skye', '温暖阿虎/Alvin', '少年梓辛/Brayan',
'邻家女孩', '渊博小叔', '阳光青年', '甜美小源', '清澈梓梓', '解说小明', '开朗姐姐', '邻家男孩', '甜美悦悦', '心灵鸡汤',
'京腔侃爷/Harmony', '湾湾小何', '湾区大叔', '呆萌川妹', '广州德哥', '北京小爷', '浩宇小哥', '广西远舟', '妹坨洁儿',
'豫州子轩', '奶气萌娃', '高冷御姐', '傲娇霸总', '魅力女友', '深夜播客', '柔美女友', '撒娇学妹', '病弱少女', '活泼女孩',
'东方浩然', '和蔼奶奶', '邻居阿姨', '温柔小雅', '儒雅青年', '擎苍', '古风少御']
通过智能体API的调用示例,在输入元素content中可以通过JSON字符串指定音色类型、语速、文本等信息,请求数据的示例如下:
data = {
"bot_id": "7475264988345778185",
"user_id": "jiangwp",
"stream": false,
"auto_save_history": true,
"additional_messages": [
{
"role": "user",
"content": "{\"cluster\": \"volcano_tts\", \"speaker_id\": \"心灵鸡汤\", \"speed_ratio\": 1, \"text\": \"TTS任务:今天天气为什么降温了?\", \"language\": \"中文\"}",
"content_type": "text",
"type": "question"
}
]
}
这样就可以在API请求中控制插件按要求输出音频了。
五、小结
本文在《在扣子(coze)配置一个提供TTS语音合成服务+咨询服务的综合智能体:语音合成助手》基础上对语音合成助手智能体和调用API的方法进行了完善,实现了通过API可以指定完成语音合成任务、输出合成的MP3文件保存到本地,并可以在合成过程中指定音色类型。
更多人工智能知识学习过程中可能遇到的疑难问题及解决办法请关注专栏《零基础机器学习入门》及付费专栏《机器学习疑难问题集》后续的文章。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。