ESP32-S3 上的
离线中文语音合成

LingTTS 是一个 ESP-IDF 组件。传入一段中文,芯片本地合成 16 kHz 语音,边合成边从 I2S 播出。不联网,不调用云端服务,同样的输入每次输出完全一致。

0.2.0-rc1 · 社区版免费 · 示例代码 MIT

串口日志 · 2026-10-23 · web_demo
I (1648) demo: LingTTS 0.2.0-rc1, community (no activation, unlimited)
I (1848) demo: Ready: connect to LingTTS-Demo, open http://192.168.4.1
I (94688) demo: job=1 error=0 first_pcm=267.0ms audio=9.12s compute=4.83s
I (186418) demo: job=2 error=0 first_pcm=309.6ms audio=19.80s compute=10.73s
面包板上的 ESP32-S3 N16R8 开发板、MAX98357A 功放和喇叭
实拍:ESP32-S3 N16R8 开发板、MAX98357A 功放和喇叭。屏幕和麦克风在这个演示里没有用到。

在线试听

服务器上跑的是同一份 C 代码和模型,只是编译成了 PC 版。听到的就是芯片上的声音。

0 / 200
换一句:

每次最多 200 字,16 kHz 单声道。

服务器不保存你输入的文字和生成的音频。

排队限流;需要批量合成请用 SDK。

规格

ESP32-S3 N16R8 · 240 MHz · ESP-IDF 5.5.6,板上实测。

输出
16 kHz · 16 bit · 单声道
PCM 通过回调分段送出,可以边合成边播放。
合成速度 RTF
0.42 / 0.48
PSRAM / 无 PSRAM 配置,hello 示例,含文本前端。网页演示开着热点时为 0.53–0.54。
首段音频
0.27 – 0.32 s
从调用到拿到第一段 PCM,不等于喇叭出声时间。
内存
PSRAM 2.63 MB + 内部 RAM 约 1 KB
无 PSRAM 时改用内部 RAM 151 KB。任务栈、DMA 和应用内存另计。
Flash
约 2.6 MB
库 189 KB · 模型 1.83 MB · 词典 0.54 MB,可放进 4 MB Flash。
CPU
单核
另一个核留给 Wi-Fi、显示和业务逻辑。
文本
中文 · 数字 · 日期 · 金额
英文只认字母和约 80 个常用词。

上板试听

不装开发环境。固件包在 GitHub Releases 下载,自带烧录脚本。

  1. 1接线

    MAX98357A 功放 → 开发板

    BCLKGPIO 15
    LRCGPIO 16
    DINGPIO 7
  2. 2烧录

    python flash.py --port COM5

    先 pip install esptool==4.12.0。脚本会核对文件校验值,再让你输入 YES 确认。

  3. 3播放

    手机连热点 LingTTS-Demo,密码 lingtts-demo,打开 192.168.4.1,输入一句中文,点播放。

    页面会显示这次合成的首段延迟、RTF 和内存。

接入

一个 ESP-IDF 组件,三个头文件。引擎只管出 PCM,播放方式由你决定。

main/app_main.c

#include "lingtts_engine.h"

static int on_pcm(const int16_t *pcm, size_t n, void *user)
{
    size_t written;
    i2s_channel_write(tx, pcm, n * 2, &written, portMAX_DELAY);
    return 0;                     /* 返回非 0 即停止合成 */
}

void app_main(void)
{
    lingtts_engine_cfg_t cfg;
    lingtts_engine_default_cfg(&cfg);    /* 选 PSRAM 或内部 RAM */

    lingtts_engine_t *e;
    lingtts_engine_create(&e, &cfg);
    lingtts_engine_speak(e, "您本次消费23.50元。", on_pcm, NULL);
}

可随时 stop,合成中途切换文本。

I2S DMA 建议留 400 ms 以上缓冲,示例已配好。

当前局限

  • 只有一个普通话基础音色,可根据需求定制。
  • 英文只读字母和约 80 个常用词,带中文口音;整句英文不行。
  • 不支持 SSML、情感和语速控制。
  • 多音字、专名、型号编号可能读错,需要按你的文本适配。
  • 模型还在迭代,音质和长句停顿还有提升空间。

授权

以正式发布包所附许可为准。

免费社区版

个人项目、学习教学,以及公司内部研发、测试和原型演示。不用注册,不联网激活,不限台数和合成时长。

商业部署书面授权

卖产品、收费服务、正式上线需要签书面授权。早期项目可以谈免费或优惠。

工程支持按需

适配你的板子、调文本读法、定制音色。

示例与接入代码使用 MIT 许可;引擎、模型和词典以二进制提供,单独许可,不是整包开源。

SDK、示例、固件包和问题反馈都在 GitHub

商业授权和工程合作:service@lingcorex.cn

github.com/LingCoreX-AI/LingTTS ↗