一 · 先把数字改写成人话
语音模型认的是音素,不是阿拉伯数字。所以第一步是按人会怎么念来改写:「$4.50」变成「4 dollars and 50 cents」,「2:30」变成「2 30」,「1984」变成「19 84」,「Dr.」变成「Doctor」,千分位逗号去掉,免得「12,000」被一位一位念出来。
贴上文字,挑一个英文声音,把音频下载走。Kokoro 模型在你自己的机器上运行,文字不上传,也没有账号这回事。
看起来你在手机上。模型要下载 300 MB 左右,iOS / Android 的浏览器标签页常常撑到一半就因内存不足被杀掉——先试一两句话,或者换台电脑。页面底部那个 Mac 应用能处理长文本,还能导出 MP3。
点任意声音后面的 ▶,它会当场用那个声音念一句给你听——不是事先录好的音频片段,是现在在你机器上生成的。
后面的字母是 Kokoro 模型卡里作者自己给的质量评级:A 的训练音频最多,F 最少。C 及以下的声音遇到生僻词容易含混。
准备好了,随时可以开始。
每次朗读都留在这里,方便你把几个声音摆在一起比。关掉标签页就没了——哪儿都没存。
语音模型认的是音素,不是阿拉伯数字。所以第一步是按人会怎么念来改写:「$4.50」变成「4 dollars and 50 cents」,「2:30」变成「2 30」,「1984」变成「19 84」,「Dr.」变成「Doctor」,千分位逗号去掉,免得「12,000」被一位一位念出来。
Kokoro 一次最多看 510 个音素,大致相当于 500 个英文字符。所以文本先按句末断开(「Mr.」这类缩写和「3.5」这类小数不算句末),再把句子装进一趟一趟塞得下的包里。每一趟一生成完就接着播,所以第一句在响的时候后面还在算。
eSpeak NG 的 WebAssembly 版把每句话转成 IPA 音素,字符级 tokenizer 把音素映射成 id,然后 Kokoro——一个 8,200 万参数的 StyleTTS 2 模型——拿音素加一个 256 维的声音向量,算出 24 kHz 的波形。28 个声音之间的差别,全在那 256 个数字里。
本机实测(M2 Max,Chrome):「放一段小说」那段文字(约 1,850 个字符,111 秒音频)在 WebGPU 上用 9.3 秒,CPU 模式(单条 WebAssembly 线程)用 166 秒;第二次打开从缓存恢复约 1.4 秒。模型:onnx-community/Kokoro-82M-v1.0-ONNX,WebGPU 走 fp32,CPU 走 q4。
不会。页面只在第一次从 CDN 下载模型,之后所有事情——数字改写、音素、神经网络、生成 WAV——都发生在这个标签页里。打开浏览器的网络面板再点「开始朗读」,你会看到一个外发请求都没有。
而且服务器那边也没有地方存:这就是一个静态页面,没有账号也没有数据库。
只读英文:11 个美音女声、9 个美音男声、4 个英音女声、4 个英音男声,一共 28 个,都来自 Kokoro v1.0。
Kokoro 本身带 54 个声音,包含普通话、日语、西班牙语、法语、意大利语、葡萄牙语和印地语。这一页没提供它们,原因见下一条。
Kokoro 认的不是汉字或字母,是音素,所以每种语言都得先有一套「文字转音素」(G2P)放在模型前面。英文这套是 eSpeak NG 编译成 WebAssembly 的版本,1.3 MB 左右,能在浏览器里跑。中文要先分词,再把拼音转成带声调的 IPA;日语要一整套形态分析器加词典——这两样目前都没有能塞进浏览器的现成包。
硬做一个半残的版本,结果就是把中文念得稀烂,所以干脆不列这些声音。页面底部那个 Mac 应用的中文 TTS 是认真做的。
可以。Kokoro v1.0 用 Apache-2.0 许可证发布,允许商业使用,许可证全文随页面打包在 LICENSE-model.txt。你贴进去的文字还是你自己的——它本来就没到过我们这儿。
这些声音是合成的,不是某个具体配音演员的克隆,所以不存在还要另外去谈肖像 / 声音授权的问题。
因为模型跑在你的机器上而不是服务器上,权重总得先到你机器上一次。WebGPU 用 fp32 那份(310 MB),CPU 模式用 4 bit 量化的那份(291 MB)。两份都会被浏览器缓存,所以第二次打开约 1.4 秒就能用,断网也行。
每试一个新声音再加 0.5 MB——那是每个声音各自的 256 维风格向量。
它们在自己的服务器上跑大得多的模型,效果最好的时候确实比 Kokoro 好听,尤其是情绪和长段落的节奏。代价是你的文字要放到它们机器上,要注册,还有每月字数。
Kokoro 是 8,200 万参数,小到能塞进一个浏览器标签页。它的声音干净平稳,但不算有表情。这里换来的是一次性 310 MB 下载,换掉每月额度。
按它实际怎么读来拼。英文名「Siobhan」照写会念错,写成「Shivawn」就对了。想让缩写一个字母一个字母念也是同理:写「S Q L」而不是「SQL」。
标点也在真的干活:逗号、破折号是短停顿,句号更长,段落之间空一行停得最久。
模型输出的就是 24 kHz 音频,WAV 就是它原样、没有二次编码,一分钟约 2.8 MB。要在浏览器里编 MP3,得带上一个 JavaScript 编码器:许可证是 copyleft 的,体积还要占掉这一页字节预算的三分之一左右;而浏览器自带的编码器(WebCodecs)只吐裸 AAC 帧,没有容器可以装。
所以这里只给 WAV;要 MP3 或者带章节的 M4B,用那个 Mac 应用导出。
Utterly 是同一家做的 Mac 应用,专管这一页故意不做的那些事:中文和日文、用你录的一段声音做声音克隆、整个文件夹批量处理、导出 MP3 或带章节的 M4B。思路是一样的——跑在你自己的 Mac 上,不在服务器上。