当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]该项目将两个StackChan单元(基于M5Stack CoreS3的小型桌面机器人)转变为一对语言学习的对话伙伴。其中一个单元扮演店员,另一个扮演游客,两人轮流进行一段预设的对话——例如在一家台湾便利店的对话,全程使用台湾闽南语,并配有屏幕字幕显示原文、发音以及日文翻译。场景不仅限于台湾闽南语。由于整个对话内容——包括语言、角色、声音和台词——都定义在外部的YAML文件中,只需在启动时更换传递的YAML文件,同一系统便可运行日式居酒屋点餐场景、日本二人喜剧表演(manzai)或一段关于外星人只能说“是”或“否”的英语喜剧小品。

1. 它的功能

该项目将两个StackChan单元(基于M5Stack CoreS3的小型桌面机器人)转变为一对语言学习的对话伙伴。其中一个单元扮演店员,另一个扮演游客,两人轮流进行一段预设的对话——例如在一家台湾便利店的对话,全程使用台湾闽南语,并配有屏幕字幕显示原文、发音以及日文翻译。场景不仅限于台湾闽南语。由于整个对话内容——包括语言、角色、声音和台词——都定义在外部的YAML文件中,只需在启动时更换传递的YAML文件,同一系统便可运行日式居酒屋点餐场景、日本二人喜剧表演(manzai)或一段关于外星人只能说“是”或“否”的英语喜剧小品。

2. 我为什么创建这个项目

我一直学习台湾话,想要一种方式来演示自然流畅的对话,而不是让一个机器人来回回答问题。我的想法是:让一个机器人扮演店主,另一个扮演游客,再由一台电脑协调他们之间的整个对话流程——把一台办公桌上的机器人变成一个小型语言学习剧场。

3. 工作原理

StackChan 的固件(由 IDA-san 开发的 stackchan-idf)支持 XiaoZhi WebSocket 协议,同时兼容 OpenAI Realtime 和 Gemini Live。与另外两个直接连接云 API 的方式不同,XiaoZhi 允许你将设备指向任意 WebSocket 服务器,包括你自己编写的服务器。

因此,我用 Python 构建了一个小型服务器栈:

- tts_server.py:封装了 Microsoft Edge 的免费 TTS 引擎(`edge-tts`),可生成数十种语言和语音的语音输出,无需任何 API 密钥。

- xiaozhi_server.py:从零开始实现 XiaoZhi WebSocket 协议。它接收来自 orchestrator 的文本内容,通过 TTS 服务器进行合成,再编码为 Opus 格式(由于没有现成的库能精确完成所需功能,需手动解析 OGG 容器以提取原始 Opus 数据包),然后以二进制 WebSocket 帧的形式流式传输到 StackChan 设备。

- orchestrator.py:控制整个对话流程。在浏览器中点击“开始”后,它会按场景逐步执行,指示每个 StackChan 单元何时发言,并等待播放完成后再进入下一行。此外,它还提供一个实时字幕网页界面。

每一个场景——包括场景、角色、他们的声音以及每一句对白——都存储在一个单一的 YAML 文件中,如下所示:

切换到完全不同的语言或场景,只需编写一个新的 YAML 文件即可,无需修改任何代码。我甚至编写了一个提示模板,让生成式 AI 可以根据场景和角色的简短描述,自动生成新的场景 YAML 文件。

4. 我遇到的挑战

最初我的计划是将一个 StackChan(CoreS3)与一个 AtomNyan(ATOM S3R + Atomic Echo Base)配对——一个扮演店主,另一个扮演游客。stackchan-idf 确实支持 ATOM S3R,我可以顺利刷写并将其连接到我的 XiaoZhi 服务器上。但音频播放却不可靠,最坏情况下完全静音,最好时也十分卡顿。通过 USB 连接查看串行日志后,发现了问题原因:

Opus 解码器无法分配连续的 2304 字节 DMA 缓冲区,尽管总可用内存看起来足够充足——这正是 ESP32-S3 上经典的堆栈碎片化问题,其内存分布在内部 RAM、PSRAM 和 RTC 快速 RAM 中。我尝试降低 Opus 的比特率、调整帧时序,并切换为原始 PCM,但始终只能实现“基本正常”的效果。最终我决定,更实际的解决方案是使用两个基于 CoreS3 的 StackChan 单元——它们拥有更多的 Flash 和 PSRAM 资源空间——而原本在 ATOM S3R 上出现问题的完全相同的 Opus 流程,在两个 CoreS3 单元上运行得非常顺畅,且无需任何额外调优。有时候正确的选择就是最简单的:让硬件匹配工作负载,而不是去对抗较小的设备。在开发过程中,我还需要手动实现从 OGG 容器中提取 Opus 数据包(即解析 RFC 7845 标准中的 `OggS` 页面头和段表),因为需要原始的 Opus 帧通过 WebSocket 流式传输,而不是完整的 .ogg 文件。

5. 接下来是什么

这是在我家的Wi-Fi网络上测试过的。如果要在公共场所(如创客展)进行演示,我需要解决几个问题:StackChan屏幕上的部分字符仍会以豆腐盒子(□)的形式显示;StackChan仅支持2.4GHz频段的Wi-Fi在人多的场所可能容易受到干扰;内置扬声器在周围噪音环境下可能声音太小。

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭