aichat_sdk
一个语音对话 SDK。用户对着麦克风说话,SDK 负责听懂(语音识别)、想清楚(大模型 + 工具)、说出来(语音合成),宿主程序只需要把声音收进来、把声音放出去。
它能做什么
- 像人一样聊天:回复是口语、短句,不念标题、不念符号,适合直接朗读;用户随时插话就能打断
- 会查东西:天气、笑话、联网搜索(微博、搜狗,不用配 key),还能按需接入外部 MCP 工具
- 会用技能:读取本机
~/.agents/skills下的技能说明,按里面的指引一步步执行命令,比如查飞书群聊、发消息、看日程 - 会放音乐:本地曲库点歌,边放边推歌词
- 知道时间和地点:公历、农历、临近节日、用户所在城市,都会告诉模型
- 自己结束对话:聊完了或者空闲太久,会说句再见然后关会话
它是怎么工作的
整条链路是一根事件驱动的流水线:
- 听:麦克风的声音通过 WebSocket 送到独立的 ASR 服务(单独的
asr_server仓库,识别、断句、声纹都在那边),识别结果回到 SDK - 想:识别出的文字交给大模型。模型可以直接回答,也可以先调工具、读技能、执行命令,拿到结果再回答;整个过程流式进行,第一个字出来就开始往下传
- 说:模型每吐出一点文字就喂给语音合成,合成出的音频编成 Opus 包排进队列
- 播:宿主从队列里按顺序取消息——识别结果、工具调用、每句话的开始和结束、音频包、歌词、结束信号——自己解码播放
有一条必须遵守的约定:收到音频就把麦克风静音,收到「音频播完」再恢复拾音,否则机器会听见自己说话。
大模型这一层
- 支持任何 OpenAI 兼容的接口,实际用过 DeepSeek 和通义千问
- 系统提示词是模板生成的,把角色人设、当前日期、用户位置、可用技能清单一起注入;提示词专门为语音场景写,要求模型说人话、说短话
- 思考模式按需开关:用户刚说完话的第一次调用不开思考,保证回得快;一旦调过工具,后面的调用就打开思考,让推理过程走单独的通道、不会被念出来(
AgentInfo.tool_thinking可关掉,网页控制台上也有对应勾选框)。这么做是因为某些模型关掉思考后会把「让我先看看」这类内心独白直接写进回复,提示词管不住 - 推理内容会保存在对话记录里,web 页面上折叠显示,方便排查模型为什么这么答
语音合成
- 字节跳动(默认):服务端双向流式,逐字喂进去就出声,延迟最低;
tts_engine="bytedancev1"(默认,简写v1)或"bytedancev2"(简写v2) - 微软 Edge:免 key,按标点切成小段并发请求,段短所以首包也快
- 小米 MiMo:
tts_engine="mimo",使用mimo-v2.5-tts预置音色,按标点分段请求、逐段流式输出 24kHz PCM,支持插话打断
各引擎输出格式一致,切换只需要改一个参数。
从 0.1.0 升级到 0.1.1 时,原 bytedance、v2、bytedancev2 配置改用 bytedancev1(简写 v1);原 v3、bytedancev3 改用 bytedancev2(简写 v2)。直接导入 TTS 模块时也需同步调整路径,旧 tts/bytedance/ 实现已删除。默认引擎仍使用原来的实现。
可通过 from aichat_sdk import get_tts_engines 查询 SDK 支持的引擎,返回每个引擎的 name、label、aliases 和 default。查询目录无需配置密钥,也不会加载各引擎依赖或发起连接;web 配置台的下拉选项和配置校验均使用该目录。
使用 MiMo TTS
按 MiMo 官方文档 获取 API Key,在环境变量或 .env 中配置:
MIMO_API_KEY=你的小米MiMo密钥
MIMO_TTS_VOICE=mimo_default
# 可选:语气、语速等自然语言指令,不会被朗读
MIMO_TTS_INSTRUCTIONS=用自然、温柔的语气说话
# 可选,默认地址如下
MIMO_BASE_URL=https://api.xiaomimimo.com/v1
使用 .env 时,在导入 SDK 前加载配置(web 配置台已自动加载):
from dotenv import load_dotenv
load_dotenv()
from aichat_sdk import ChatBot
chat_bot = ChatBot(tts_engine="mimo")
其余初始化、拾音和队列播放流程与现有示例相同;web 配置台也可直接选择 mimo。MIMO_API_KEY 独立于聊天模型的 OPENAI_API_KEY。音色默认 mimo_default,可改为 冰糖、茉莉、苏打、白桦 等预置音色。
MiMo 每次请求接收一段完整文本;SDK 在逗号、句号等停顿处发起请求,段内边收音频边推送,结束时补发未带标点的尾句。当前接入预置音色合成,音色设计和音色克隆模型尚未接入。
怎么试
- 配好
.env:大模型的地址、模型名和 key;用字节 TTS 的话再加它的 App ID 和 Key;ASR 服务地址不改就用默认的本机端口 - 先把
asr_server跑起来 - 有麦克风和扬声器就运行
tests/test_run_v2.py直接对话;没有麦克风就运行tests/test_run.py,它在代码里塞了两句话进去 - 想边聊边改配置,运行
examples/web/main.py,浏览器打开本机 8080 端口:可以换模型、换音色、改人设、开关工具、配外部 MCP,保存后立即生效;页面上还能实时看到每一轮对话、工具调用和模型的思考内容,每轮聊完会自动存一份完整记录
给开发者
要改代码,先看 AGENTS.md:队列和事件的实现细节、MCP 工具怎么注册注销、TTS 会话的生命周期限制、各种踩过的坑都记在那里。
Release files for aichat-sdk 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aichat_sdk-0.1.1.tar.gz | 4.8 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aichat_sdk-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 9.6 MB
Release files / aichat_sdk-0.1.1.tar.gz
| Download URL | aichat_sdk-0.1.1.tar.gz |
|---|---|
| Size | 4.8 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
038509e3027cdebad8903f6255c9eb5606e15b6a16a5518d1d3e13275354aaad
|
|
BLAKE2b-256 checksum How to use checksums |
ecbf874f56bdd48e6dd94f31d6b5925e41c6acf30721629da0ce969d930c13ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.7
|
Release files / aichat_sdk-0.1.1-py3-none-any.whl
| Download URL | aichat_sdk-0.1.1-py3-none-any.whl |
|---|---|
| Size | 4.8 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c10feaef8638750e93eed75dc242d7a0059310b91899cfe6625761fe61d25ef6
|
|
BLAKE2b-256 checksum How to use checksums |
9e142d642f329641a073f192b4020a3e632010ec59b8b79191a3850719e302d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.7
|