Rust 零依赖从零构建语音识别器教程发布
来源标题:Building a Speech Recognizer from Scratch in Rust, No Dependencies
一本名为《Building a Speech Recognizer from Scratch》的书教你用 Rust 从零实现语音识别,全程不依赖任何第三方库。作者坚持自己实现傅里叶变换、矩阵乘法、反向传播等所有组件,Cargo.toml 的依赖项从头到尾为空。读者只需具备 Rust 阅读能力和基础数学,无需信号处理或机器学习背景。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
开始阅读 → 体验交互页面
欢迎来到《从零开始构建语音识别器》。这是一本带你一步步构建一个程序的书,这个程序能听人说话,并把他们说的内容写下来。我们从一个装满数字的文件开始——它恰好是一段某人说“seven”的录音——最终以一个命令行工具结束,它可以从文件或你的麦克风转写语音。
只有一条规则,我们整本书都遵守它:所有东西都由我们自己写。不用 PyTorch,不用 TensorFlow,不用信号处理 crate,不用线性代数 crate,在我们自己构建并训练出一个小型可工作的识别器之前,也不用预训练模型。我们的 Cargo.toml 中的 [dependencies] 部分在第一页是空的,在最后一页仍然是空的。如果我们需要傅里叶变换、矩阵乘法、随机数生成器、反向传播或 JSON 解析器,我们就自己写,并且测试它。
你不需要懂任何信号处理或任何机器学习。你需要能流畅阅读 Rust,以及你十六岁时学过的数学。其他一切都是一点一点从零构建起来的,每一部分都是你可以运行的东西。
四件事,每一件都建立在前一件之上。
我们自始至终尽量诚实地对待数字。我们自己的识别器在自己的测试集上大约每十个词错一个,而且它只认识 35 个词。书中如实说明了这一点,展示了它在哪里失败,并解释了它与 Whisper 的差距所在:大量的数据和算力,以及少数几个想法(注意力机制,以及一个读取自身输出的解码器),最后几章运行了这些想法但没有训练它们。
按顺序。每一章都假定前面的章节已经读过。
各章按你会编写代码的顺序,逐个函数展示代码,整本书的完整代码在 code/ 中。我鼓励你自己敲代码而不是复制。每章结尾都有一些可以自己尝试的东西;大部分学习就发生在这里。
有些概念动手玩比读着学更容易,所以有几章链接到一个小型交互页面。它们是 interactive/ 中的纯 HTML 文件;在浏览器中打开 interactive/index.html 就能看到全部:采样与混叠、加窗、作为旋转相关性的傅里叶变换、mel 滤波器组、DTW 网格、CTC 网格和束搜索。
你需要 Rust 1.88 或更新版本(用 rustup 安装)。本书大部分内容不需要其他东西。第 11 章使用 ffmpeg 来读取麦克风。
git clone <this repository> cd <this repository>/code cargo test --release cargo run --release --example ch01_wav -- ../samples/seven.wav
每一章如果有可运行的内容,都有一个以该章命名的示例(ch01_wav、ch03_fft、ch05_digits、ch09_train 等等)。samples/ 中附带了一些短录音,我们训练的模型放在 models/ 中,所以你可以在读一个字之前就试试完成的识别器:
cargo run --release --bin speech -- transcribe ../samples/utt_yes_right.wav cargo run --release --bin speech -- listen --from-file ../samples/utterances_with_pauses.wav
#数据集
这些样本足以跟上第一部分。从第 5 章开始,我们需要真实数据,而数据太大,无法放在 git 中。所有内容都放在 code/ 旁边的 data/ 目录中(或者任何你设置 SPEECH_DATA 环境变量指向的地方)。每章都会在你需要的地方重复下载说明。
本书在线地址是 speech.tobiokewole.com。各章是纯 Markdown,在 GitHub 上阅读没有问题,但 GitHub 无法在章节内运行交互页面。网站可以:它由相同的 Markdown 文件构建,每当章节说“动手玩”时,页面就在正文中。
cargo run --release --manifest-path site/Cargo.toml
这会把整个网站写入 _site/;在浏览器中打开 _site/index.html。有一个页面——第 11 章在浏览器中运行的识别器——在构建前还需要 rustup target add wasm32-unknown-unknown,并且需要一个本地 Web 服务器来查看(例如在 _site/ 中运行 python3 -m http.server),因为浏览器不会从磁盘文件中加载 WebAssembly 或打开麦克风。
已发布的网站作为静态文件托管在 Cloudflare 上。每次推送到 main 都会由 site/cloudflare-build.sh 在那里构建并发布。site/publish.sh 手动执行相同的操作(wrangler.jsonc 就是全部配置),并设置公开副本增加的两样东西:从列表到本仓库的链接,以及 Cloudflare Web Analytics——一个不设置 cookie 的访问计数器。你自己用上面的简单命令构建的网站既没有这些,也不会从其他地方加载任何内容。
samples/ 中的录音来自 Free Spoken Digit Dataset(CC BY-SA 4.0)和 Google 的 Speech Commands 数据集(CC BY 4.0);samples/README.md 列出了每个文件及其来源。第四部分使用的 Whisper 权重是 OpenAI 的,以 MIT 许可证发布,由你自行下载,而不是包含在此处。
代码采用 MIT 许可证:code/、site/ 和 web/ 中的所有内容、交互页面中的脚本,以及各章中打印的代码清单。文本和图表采用 Creative Commons Attribution 4.0:各章、本页、figures/ 中的图表以及交互页面的文字。models/ 中训练好的模型也采用 MIT 许可证。samples/ 中的录音保留其来源数据集的许可证,如上文致谢所述。
如果你发现错误,或者有解释得不好的地方,请开一个 issue。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。