Skip to content

Conversation

@myifeng
Copy link
Collaborator

@myifeng myifeng commented Nov 18, 2025

No description provided.

@Sakura-RanChen
Copy link
Collaborator

工具调用是原对话的自然延伸,不应被割裂为多个独立的 TTS 会话。
如果在每次 chat() 调用中都无条件发送 FIRST 和 LAST,会导致 tts_text_queue 中注入大量空控制消息:
开启一个新会话 → 未发送实际文本 → 立即关闭,如此反复,直到最终生成有效内容。

当前流程为:
用户发起请求(depth=0)时发送 FIRST
工具调用后的递归处理(depth=1)仅推送 MIDDLE 文本,复用原始会话 ID
最终由最外层(depth=0)统一发送 LAST,完整闭环

@myifeng
Copy link
Collaborator Author

myifeng commented Nov 19, 2025

  • MCP 工具调用中,除了会正常响应结果,还会有Progress进度,所以一个工具调用不只会有一个结果;当前的设置默认是一问一答,无法适配一问多答场景
  • FIRST 和 LAST 实质为一段需要TTS内容的开头和结尾,是用来控制和关闭TTS/设备状态的,而不是扩大为一句话的开头和结尾,更和大模型没有关系

你说的场景是当前的局限,只能接受调用工具的结果,一问一答

call mcp tool

response 'success' --> TTS

但实际上,MCP支持异步的,一问多答,所以FIRST 和 LAST在每次TTS都必须存在,没有例外

call mcp tool

  progress 0.3/1.0 --> TTS
  
  progress 0.6/1.0 --> TTS
  
  progress 0.9/1.0 --> TTS

response 'success' --> TTS

@Sakura-RanChen
Copy link
Collaborator

Sakura-RanChen commented Nov 19, 2025

如果你想中间实现进度语音提示,只是需要进行适配进行推送(可能要考虑一下音频包的流控管理)
self.tts.tts_text_queue.put(
TTSMessageDTO(
sentence_id=self.sentence_id,
sentence_type=SentenceType.MIDDLE,
content_type=ContentType.TEXT,
content_detail=content,
)
)

不妨碍一轮多答,因为实质上是同会话的内容的进度展现,而不是每次需要新开会话(如果部分工具不支持进度展现,那就是必须等待完整的结果返回,会出现新开空会话形式的消耗)

image

@myifeng
Copy link
Collaborator Author

myifeng commented Nov 19, 2025

你这个异步时间间隔多少?TTS不会超时断开?在这么长等待进度通知的时间里,TTS要一直处于激活状态即使没有语音要合成?

@Sakura-RanChen
Copy link
Collaborator

这个异步工具的话是3秒左右就能有中间结果了,绝大部分TTS使用websocket链接都能保持一定时间内的文本接收,阿里云是10秒(这个试了一下,解析函数意图需要2-3秒,所以中间层应该是个6秒左右的时间需要传文本,不然那边服务端就自行关闭了),百炼的是1分钟,火山的是2分钟,部分是需要采取重新链接的方式(讯飞),至于那些使用http的,本身就是随到随用就不用考虑链接问题了。
还有个问题就是如果推送的文本数量不够(或者没识别到句子等的中止符号)服务端是不会去合成的,这时候就得控制first和last的发送来间接控制TTS会话的开始和结束,让服务端强行合成进度文本。

@myifeng
Copy link
Collaborator Author

myifeng commented Nov 20, 2025

这个异步工具的话是3秒左右就能有中间结果了?这个结论是哪里来的,progress的存在是为了耗时操作的,这个耗时可能是5s,20s,120s,甚至5分钟,MCP协议也没有规定3秒就必须有结果。

"message": "quota exceeded for types: concurrency"
错误原因:并发超过了限定值,需要减少并发调用情况或者增购并发

请求建立链接后,长时间没有发送任何数据,超过10s后服务端会返回此错误信息。 | 请求处理完成后请及时关闭链接,此外,当服务端瞬时压力过大不能及时返回数据时也可能出现此错误,此时可以重试恢复。

你说的是允许TTS空运行,这本身就是不合理的,TTS就是根据文字合成语音,没有文字的情况下就应该释放。火山引擎/阿里云都有并发限制,按需使用,尽早释放链接都是官方建议的。

上面我说的很明白了,TTS是TTS,和大模型不能强耦合,FIRST LAST的目的就是为了标记文字的开头和结尾,方便用来开始初始化/结束TTS。上层应用需要调用TTS就发送FIRST | 待合成文本 | LAST去执行合成就好了。而不是把TTS合成时机一层一层向上耦合

@Sakura-RanChen
Copy link
Collaborator

有道理,应该得适配一下TTS空开(AiBL没文本发送的话会报错)
ERROR-TTS任务失败: InvalidParameter - Please ensure input text is valid.

@myifeng myifeng requested a review from openrz November 20, 2025 10:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants