ToneBridge 是一个中文造句助手,改句子时很克制:一次只动一点,让初学者慢慢写出自然的中文。它是 Hugging Face Build Small Hackathon 的参赛作品,核心是纠错模型 Alphaplasti/ToneBridge-MiniCPM4.1-8B,在 MiniCPM4.1-8B 上微调而来。
要解决的问题
学中文的人常常知道自己想说什么,但拿不准这句话是否自然、是否礼貌、是否合适当下的场合。
翻译工具往往改得太多,语法工具又解释得太多。初学者真正需要的帮助范围很窄:留住我的意思,只改非改不可的地方,标上拼音,再用简单的英文告诉我为什么。
ToneBridge 就做这一件事。 选一组场景和语气,写下一句中文或者说出来,拿回一条面向学习、不面向翻译的小修改。
功能
ToneBridge 会返回:
- 修改后的中文句子;
- 句子下方的拼音,带声调符号;
- 错误类型,写得很短;
- 一段简单的英文解释;
- 一条下次能用的提示;
- 普通话朗读,以及跟读视图。
纠错 prompt 刻意写得保守:句子本来就正确、自然,就原样返回,不做改动。
工作流程
- 学习者选一种配置:Friendly-informal(朋友-非正式)、Work-informal(工作-非正式)、Work-formal(工作-正式)、Wechat-informal(微信-非正式)或 Wechat-formal(微信-正式)。
- ToneBridge 按这个配置做保守纠错,会考虑语气。
- 学习者输入一句中文,或者用浏览器语音识别说出来。
- MiniCPM 在保留原意和句子长度的前提下改句子。
- 前端在中文下面加上拼音。
- Edge TTS 给修改后的句子快速合成普通话神经网络语音。
- 播放音频时,朗读面板逐字高亮。
技术组成
| 组件 | 模型 / 库 | 运行位置 |
|---|---|---|
| 句子纠错 | Alphaplasti/ToneBridge-MiniCPM4.1-8B,通过 transformers 加载 | ZeroGPU / GPU Space |
| 普通话朗读 | edge-tts,默认音色 zh-CN-YunjianNeural | 服务端 |
| 拼音 | pypinyin,带声调符号 | CPU |
| 语音输入 | 浏览器 Web Speech API | 取决于浏览器 |
| 前端 | 由 gr.Server 提供的自定义 HTML/CSS/JS | 浏览器 |
| 后端 API | gr.Server + @app.api() 端点 | Hugging Face Space |
整个模型管线控制在 32B 参数以内:主纠错模型 8B,朗读默认走服务端的 Edge TTS 轻量调用,不再多加载一个 GPU 模型。
硬件与加载
ToneBridge 是照着 Hugging Face ZeroGPU 设计的:
- 纠错模型在 Space 启动时预加载,不会每次纠错都重新加载。
- 朗读默认用 Edge TTS,重播时不用加载笨重的服务端 TTS 模型。
- MiniCPM4.1 目前要 Transformers 4.x 运行时,
requirements.txt锁的是transformers>=4.56.0,<5.0.0:Transformers 5 删掉了模型远程代码还在用的一个内部函数。
常用环境变量示例:
MODEL_ID=Alphaplasti/ToneBridge-MiniCPM4.1-8B
TTS_PROVIDER=edge
EDGE_TTS_VOICE=zh-CN-YunjianNeural
LOAD_IN_4BIT=true
PRELOAD_MODEL=true
MAX_INPUT_CHARS=1200
MAX_NEW_TOKENS=220
使用统计与反馈
每次保存的纠错,默认写进运行中 Space 应用目录下的 tonebridge_usage_metrics.jsonl。一条记录包括原句、改后的句子、评价(thumbs_up、thumbs_down 或 null)、生成耗时,还有状态、场景、语气、纠错模式、错误类型、模型 ID、时间戳和请求 ID。
每次纠错后应用会显示点赞 / 点踩按钮,投票自动更新对应的 JSONL 记录。开启仓库同步(METRICS_REPO_SYNC=true,配上可写的 HF_METRICS_TOKEN)后,统计文件会出现在 Space 的 Files 页;Space 是公开的,同步出去的数据也就是公开的。
与 Reachy Mini 机器人联动
设置面板能把每次纠错结果从学习者的浏览器发到本地 Reachy Mini 端点。放在浏览器端,是因为 Hugging Face Space 的服务器一般访问不到 192.168.x.x 这种私有局域网 IP。默认端点是:
http://<REACHY_IP>:80/api/tonebridge
请求体示例:
{
"source": "ToneBridge",
"event": "correction",
"status": "correct or corrected",
"emotion": "happy or thinking",
"speech": "encouragement or corrected Mandarin sentence",
"speech_language": "fr-FR or zh-CN",
"original_sentence": "...",
"corrected_sentence": "...",
"error_type": "...",
"generation_time_seconds": 3.2
}
句子本来就没问题时,Reachy 收到 emotion: "happy" 和一句简短的法语鼓励;ToneBridge 改过句子时,Reachy 收到 emotion: "thinking",朗读内容就是改后的中文。本地 Reachy 端点或桥接服务要允许来自 Space 源的浏览器 POST 请求(配 CORS,或者提供 HTTPS 本地端点)。
相关链接
- Hugging Face Space:build-small-hackathon/Tone-Bridge
- 微调模型:Alphaplasti/ToneBridge-MiniCPM4.1-8B
- 数据集:Alphaplasti/tonebridge-metrics
- 社区博客:ToneBridge: Fine-Tuning a Small Mandarin Coach for Context-Aware Corrections
- 演示视频:YouTube
- 社交帖子:X
- 黑客松日记:#1、#2
项目作者:Alphaplasti 与 ZHAO JINGZI。基础模型 MiniCPM4.1-8B 来自 OpenBMB。
