honk
Honk 是一个基于 PyTorch 开发的开源项目,专注于实现用于关键词检测(Keyword Spotting)的卷积神经网络模型。它复现了谷歌在 TensorFlow 中提出的经典架构,旨在帮助设备高效识别特定的语音指令,如“停止”、“前进”或自定义的唤醒词(类似"Hey Siri")。
Honk 主要解决了在资源受限的边缘设备上部署轻量级语音识别功能的难题。通过优化模型结构,它能够在不依赖云端算力的情况下,让智能代理实时响应简单命令,从而降低延迟并保护用户隐私。
这款工具非常适合人工智能研究人员、嵌入式系统开发者以及希望构建离线语音交互功能的技术团队使用。无论是学术探索还是实际产品落地,Honk 都提供了坚实的代码基础。
其技术亮点在于不仅支持 PyTorch 后端,还兼容 Caffe2 和 ONNX 格式,提供了多种预训练模型以便灵活切换。此外,项目包含了完整的演示应用和针对树莓派等硬件的部署指南,展现了其在低功耗设备上的出色适应能力,是进入端侧语音识别领域的优质入门选择。
使用场景
一家初创团队正在为资源受限的树莓派开发一款离线语音控制智能家居中枢,需要识别“开灯”、“关闭”等特定指令。
没有 honk 时
- 模型移植困难:团队难以将 Google TensorFlow 版本的关键词检测模型高效转换为 PyTorch 架构,导致无法利用团队熟悉的深度学习栈进行迭代。
- 端侧部署受阻:在树莓派等低功耗设备上运行复杂的语音识别库(如 librosa)依赖冲突频发,环境配置耗时数天仍无法跑通 Demo。
- 自定义训练缺失:缺乏针对小 footprint(轻量级)场景的预训练残差网络模型,从头训练“嘿,Siri"类自定义唤醒词需要海量数据和算力支持。
- 实时响应延迟:自行搭建的简易音频处理流程未针对嵌入式优化,导致语音指令识别延迟高,用户体验卡顿。
使用 honk 后
- 无缝架构迁移:直接调用 honk 提供的 PyTorch 复现版本,完美兼容现有代码库,无需手动重写卷积神经网络结构。
- 快速边缘落地:利用官方整理的树莓派部署指南和预编译依赖,迅速在 Raspbian 系统上跑通服务,大幅缩短环境调试周期。
- 灵活定制唤醒词:基于内置的深度残差学习模型,仅需少量自定义音频数据即可微调出高精度的专属命令触发器。
- 流畅交互体验:部署优化的 ONNX 或 PyTorch 后端模型,在低算力设备上实现了低延迟、高准确率的实时语音指令响应。
honk 让开发者能够以极低的成本,将谷歌级别的关键词检测能力快速移植到资源受限的边缘设备上。
运行环境要求
- Linux
- macOS
- 可选
- 支持 CUDA 加速,可通过配置关闭(--no_cuda)
- 未指定具体型号或显存要求
未说明

快速开始
Honk:用于关键词检测的卷积神经网络
Honk 是 Google TensorFlow 卷积神经网络用于关键词检测的 PyTorch 重新实现,伴随着他们最近发布的 语音命令数据集。更多详情,请参阅我们的论文:
- Raphael Tang, Jimmy Lin. Honk:用于关键词检测的卷积神经网络的 PyTorch 重新实现。 arXiv:1710.06554, 2017年10月。
- Raphael Tang, Jimmy Lin. 面向小规模部署的关键词检测的深度残差学习。 2018 IEEE 国际声学、语音与信号处理会议论文集,第5479–5483页。
Honk 对于构建交互式智能代理的设备端语音识别功能非常有用。我们的代码可用于识别简单命令(例如“停止”和“开始”),并可进一步调整以检测自定义“命令触发词”(例如“嘿,Siri!”)。
请观看这段视频,了解 Honk 的实际演示!
演示应用
按照以下说明,您也可以运行上面视频中展示的演示应用!
目前,PyTorch 官方仅支持 Linux 和 OS X 系统。因此,Windows 用户将无法轻松运行此演示。
要部署演示程序,请执行以下步骤:
- 如果尚未安装 PyTorch,请访问 官方网站。
- 安装 Python 依赖项:
pip install -r requirements.txt - 通过包管理器安装 GLUT(OpenGL 工具包),例如
apt-get install freeglut3-dev。 - 获取数据和模型:
./fetch_data.sh - 启动 PyTorch 服务器:
python . - 运行演示程序:
python utils/speech_demo.py
如果需要调整选项,例如关闭 CUDA,请编辑 config.json 文件。
Mac OS X 的补充说明:
- Mac OS X 已经预装了 GLUT,因此无需额外安装。
- 如果在安装 pyaudio 时遇到问题,可能是由于缺少 portaudio.h 文件导致的。
服务器
设置与部署
python . 将部署用于识别音频中是否包含命令词的 Web 服务。默认情况下,使用 config.json 进行配置,但也可以通过 --config=<file_name> 更改配置文件。如果服务器位于防火墙之后,一种方法是创建 SSH 隧道,并使用配置文件中指定的端口(默认为 16888)进行端口转发。
在我们的 honk-models 仓库中,提供了多个针对 Caffe2(ONNX)和 PyTorch 的预训练模型。fetch_data.sh 脚本会下载这些模型并将其解压到 model 目录下。您可以在配置文件的 model_path 和 backend 中分别指定使用的模型和后端。其中,backend 可以是 caffe2 或 pytorch,具体取决于 model_path 所在的格式。请注意,要运行我们的 ONNX 模型,您的系统必须安装 onnx 和 onnx_caffe2 包;而这些包并未包含在 requirements.txt 中。
树莓派 (RPi) 基础设施设置
遗憾的是,在 RPi 上使库正常工作,尤其是 librosa,并不像运行几条命令那样简单。我们在此概述了我们的流程,但这可能并不适用于所有人。
- 准备一台 RPi,最好是运行 Raspbian 的 RPi 3 Model B。我们具体使用的是 这个版本的 Raspbian Stretch。
- 安装依赖项:
sudo apt-get install -y protobuf-compiler libprotoc-dev python-numpy python-pyaudio python-scipy python-sklearn - 安装 Protobuf:
pip install protobuf - 安装 ONNX,不带依赖项:
pip install --no-deps onnx - 按照 官方说明 在 Raspbian 上安装 Caffe2。这一过程大约需要两个小时。您可能需要将
caffe2模块路径添加到PYTHONPATH环境变量中。对我们而言,操作如下:export PYTHONPATH=$PYTHONPATH:/home/pi/caffe2/build - 安装 Caffe2 的 ONNX 扩展:
pip install onnx-caffe2 - 安装其他要求:
pip install -r requirements_rpi.txt - 安装 librosa:
pip install --no-deps resampy librosa - 尝试导入 librosa:
python -c "import librosa"。此时应会抛出关于 numba 的错误,因为我们尚未安装它。 - 我们尚未找到在 RPi 上轻松安装 numba 的方法,因此需要从 resampy 中移除 numba。对于我们的设置,我们需要从
/home/pi/.local/lib/python2.7/site-packages/resampy/interpn.py中移除 numba 和@numba.jit。 - 至此,所有依赖项均已安装完毕。我们可以尝试部署一个 ONNX 模型。
- 下载模型和数据:
./fetch_data.sh - 在
config.json中,将backend改为caffe2,并将model_path改为model/google-speech-dataset-full.onnx。 - 部署服务器:
python .如果没有报错,则表示模型已成功部署,默认可通过端口 16888 访问。 - 运行语音命令演示:
python utils/speech_demo.py。您需要一个可用的麦克风和扬声器。如果您远程控制 RPi,可以本地运行语音演示,并通过--server-endpoint=http://[RPi IP地址]:16888指定远程端点。
工具
QA 客户端
遗憾的是,QA 客户端目前尚不支持普通用户,因为它需要一个自定义的 QA 服务。不过,它仍然可以用来重新定位命令关键词。
python client.py 用于运行 QA 客户端。您可以通过 python client.py --mode=retarget 来重新定位关键词。请注意,文本转语音功能在 Linux 发行版上可能表现不佳;在这种情况下,请通过 --watson-username 和 --watson-password 提供 IBM Watson 的凭据。您可以运行 python client.py -h 查看所有选项。
模型的训练与评估
CNN 模型。python -m utils.train --type [train|eval] 用于训练或评估模型。它假定所有训练样本都遵循与 Speech Commands 数据集 相同的格式。推荐的工作流程是下载该数据集并添加自定义关键词,因为该数据集已经包含许多有用的音频样本和背景噪声。
残差模型。我们建议在 Speech Commands 数据集上训练我们的任何 res{8,15,26}[-narrow] 模型时使用以下超参数:
python -m utils.train --wanted_words yes no up down left right on off stop go --dev_every 1 --n_labels 12 --n_epochs 26 --weight_decay 0.00001 --lr 0.1 0.01 0.001 --schedule 3000 6000 --model res{8,15,26}[-narrow]
有关我们深度残差模型的更多信息,请参阅我们的论文:
- Raphael Tang, Jimmy Lin. Deep Residual Learning for Small-Footprint Keyword Spotting. 2018 IEEE 国际声学、语音与信号处理会议(ICASSP 2018)论文集,2018年4月,加拿大阿尔伯塔省卡尔加里。
以下是可用的命令选项:
| 选项 | 输入格式 | 默认值 | 描述 |
|---|---|---|---|
--audio_preprocess_type |
{MFCCs, PCEN} | MFCCs | 使用的音频预处理类型 |
--batch_size |
[1, n) | 100 | 使用的小批量大小 |
--cache_size |
[0, inf) | 32768 | 音频缓存中的项目数量,大约消耗 32 KB * n |
--conv1_pool |
[1, inf) [1, inf) | 2 2 | 池化滤波器的宽度和高度 |
--conv1_size |
[1, inf) [1, inf) | 10 4 | 卷积滤波器的宽度和高度 |
--conv1_stride |
[1, inf) [1, inf) | 1 1 | 步幅的宽度和长度 |
--conv2_pool |
[1, inf) [1, inf) | 1 1 | 池化滤波器的宽度和高度 |
--conv2_size |
[1, inf) [1, inf) | 10 4 | 卷积滤波器的宽度和高度 |
--conv2_stride |
[1, inf) [1, inf) | 1 1 | 步幅的宽度和长度 |
--data_folder |
string | /data/speech_dataset | 数据路径 |
--dev_every |
[1, inf) | 10 | 以 epoch 为单位的验证间隔 |
--dev_pct |
[0, 100] | 10 | 用于验证的总数据百分比 |
--dropout_prob |
[0.0, 1.0) | 0.5 | 使用的丢弃率 |
--gpu_no |
[-1, n] | 1 | 使用的 GPU |
--group_speakers_by_id |
{true, false} | true | 是否按 ID 对训练/验证/测试集中的说话人分组 |
--input_file |
string | 要加载的模型路径 | |
--input_length |
[1, inf) | 16000 | 音频的长度 |
--lr |
(0.0, inf) | {0.1, 0.001} | 使用的学习率 |
--type |
{train, eval} | train | 使用的模式 |
--model |
string | cnn-trad-pool2 | 可选 cnn-trad-pool2, cnn-tstride-{2,4,8}, cnn-tpool{2,3}, cnn-one-fpool3, cnn-one-fstride{4,8}, res{8,15,26}[-narrow], cnn-trad-fpool3, cnn-one-stride1 |
--momentum |
[0.0, 1.0) | 0.9 | 用于 SGD 的动量 |
--n_dct_filters |
[1, inf) | 40 | 使用的 DCT 基础数量 |
--n_epochs |
[0, inf) | 500 | 训练的 epoch 数 |
--n_feature_maps |
[1, inf) | {19, 45} | 残差架构中使用的特征图数量 |
--n_feature_maps1 |
[1, inf) | 64 | 第一个卷积网络使用的特征图数量 |
--n_feature_maps2 |
[1, inf) | 64 | 第二个卷积网络使用的特征图数量 |
--n_labels |
[1, n) | 4 | 使用的标签数量 |
--n_layers |
[1, inf) | {6, 13, 24} | 残差架构中的卷积层数 |
--n_mels |
[1, inf) | 40 | 使用的 Mel 滤波器数量 |
--no_cuda |
开关 | false | 是否使用 CUDA |
--noise_prob |
[0.0, 1.0] | 0.8 | 与噪声混合的概率 |
--output_file |
string | model/google-speech-dataset.pt | 保存模型的文件 |
--seed |
(inf, inf) | 0 | 使用的随机种子 |
--silence_prob |
[0.0, 1.0] | 0.1 | 选择静音的概率 |
--test_pct |
[0, 100] | 10 | 用于测试的总数据百分比 |
--timeshift_ms |
[0, inf) | 100 | 随机偏移音频的时间(毫秒) |
--train_pct |
[0, 100] | 80 | 用于训练的总数据百分比 |
--unknown_prob |
[0.0, 1.0] | 0.1 | 选择未知单词的概率 |
--wanted_words |
string1 string2 ... stringn | command random | 所需的目标词汇 |
基于 JavaScript 的关键词检测
Honkling 是 Honk 的 JavaScript 实现。借助 Honkling,可以在浏览器中实现具有关键词检测功能的各种 Web 应用程序。
关键词检测数据生成器
为了提高 Honk 和 Honkling 的灵活性,我们提供了一个从 YouTube 视频构建数据集的程序。详细信息请参见 keyword_spotting_data_generator 文件夹。
录制音频
您可以执行以下操作来录制连续的音频,并将其保存为与语音命令数据集相同的格式:
python -m utils.record
输入回车键开始录制,向上箭头撤销,输入“q”结束。静音一秒钟后,录制会自动停止。
此外,还提供以下选项:
--output-begin-index: 起始序列号
--output-prefix: 输出音频序列的前缀
--post-process: 音频样本的后处理方式。可选择“trim”和“discard_true”中的一项或多件。
后处理包括修剪或丢弃“无用”的音频。修剪很简单:将音频录音修剪至由 --cutoff-ms 指定的 x 毫秒内最响亮的部分。而丢弃“无用”音频(discard_true)则使用预先训练好的模型来判断哪些样本令人困惑,并丢弃那些被正确标记的样本。预先训练好的模型和正确标签分别由 --config 和 --correct-label 定义。
例如,考虑运行 python -m utils.record --post-process trim discard_true --correct-label no --config config.json。在这种情况下,该工具会记录一系列语音片段,将其修剪至一秒,最后丢弃那些未被 config.json 中的模型标记为“no”的片段。
监听声音级别
python manage_audio.py listen
这有助于为录制设置合理的 --min-sound-lvl 值。
生成对比样本
python manage_audio.py generate-contrastive --directory [目录] 会使用音素分割技术,从 [目录] 中的所有 .wav 文件中生成对比样本。
裁剪音频
语音命令数据集包含时长为一秒钟的音频片段。
python manage_audio.py trim --directory [目录] 会将 [目录] 中所有 .wav 文件裁剪为最响亮的一秒。建议谨慎的用户使用 Audacity 等音频编辑软件手动检查所有音频样本。
常见问题
相似工具推荐
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
GPT-SoVITS
GPT-SoVITS 是一款强大的开源语音合成与声音克隆工具,旨在让用户仅需极少量的音频数据即可训练出高质量的个性化语音模型。它核心解决了传统语音合成技术依赖海量录音数据、门槛高且成本大的痛点,实现了“零样本”和“少样本”的快速建模:用户只需提供 5 秒参考音频即可即时生成语音,或使用 1 分钟数据进行微调,从而获得高度逼真且相似度极佳的声音效果。 该工具特别适合内容创作者、独立开发者、研究人员以及希望为角色配音的普通用户使用。其内置的友好 WebUI 界面集成了人声伴奏分离、自动数据集切片、中文语音识别及文本标注等辅助功能,极大地降低了数据准备和模型训练的技术门槛,让非专业人士也能轻松上手。 在技术亮点方面,GPT-SoVITS 不仅支持中、英、日、韩、粤语等多语言跨语种合成,还具备卓越的推理速度,在主流显卡上可实现实时甚至超实时的生成效率。无论是需要快速制作视频配音,还是进行多语言语音交互研究,GPT-SoVITS 都能以极低的数据成本提供专业级的语音合成体验。
TTS
🐸TTS 是一款功能强大的深度学习文本转语音(Text-to-Speech)开源库,旨在将文字自然流畅地转化为逼真的人声。它解决了传统语音合成技术中声音机械生硬、多语言支持不足以及定制门槛高等痛点,让高质量的语音生成变得触手可及。 无论是希望快速集成语音功能的开发者,还是致力于探索前沿算法的研究人员,亦或是需要定制专属声音的数据科学家,🐸TTS 都能提供得力支持。它不仅预置了覆盖全球 1100 多种语言的训练模型,让用户能够即刻上手,还提供了完善的工具链,支持用户利用自有数据训练新模型或对现有模型进行微调,轻松实现特定风格的声音克隆。 在技术亮点方面,🐸TTS 表现卓越。其最新的 ⓍTTSv2 模型支持 16 种语言,并在整体性能上大幅提升,实现了低于 200 毫秒的超低延迟流式输出,极大提升了实时交互体验。此外,它还无缝集成了 🐶Bark、🐢Tortoise 等社区热门模型,并支持调用上千个 Fairseq 模型,展现了极强的兼容性与扩展性。配合丰富的数据集分析与整理工具,🐸TTS 已成为科研与生产环境中备受信赖的语音合成解决方案。
LocalAI
LocalAI 是一款开源的本地人工智能引擎,旨在让用户在任意硬件上轻松运行各类 AI 模型,包括大语言模型、图像生成、语音识别及视频处理等。它的核心优势在于彻底打破了高性能计算的门槛,无需昂贵的专用 GPU,仅凭普通 CPU 或常见的消费级显卡(如 NVIDIA、AMD、Intel 及 Apple Silicon)即可部署和运行复杂的 AI 任务。 对于担心数据隐私的用户而言,LocalAI 提供了“隐私优先”的解决方案,确保所有数据处理均在本地基础设施内完成,无需上传至云端。同时,它完美兼容 OpenAI、Anthropic 等主流 API 接口,这意味着开发者可以无缝迁移现有应用,直接利用本地资源替代云服务,既降低了成本又提升了可控性。 LocalAI 内置了超过 35 种后端支持(如 llama.cpp、vLLM、Whisper 等),并集成了自主 AI 代理、工具调用及检索增强生成(RAG)等高级功能,且具备多用户管理与权限控制能力。无论是希望保护敏感数据的企业开发者、进行算法实验的研究人员,还是想要在个人电脑上体验最新 AI 技术的极客玩家,都能通过 LocalAI 获
bark
Bark 是由 Suno 推出的开源生成式音频模型,能够根据文本提示创造出高度逼真的多语言语音、音乐、背景噪音及简单音效。与传统仅能朗读文字的语音合成工具不同,Bark 基于 Transformer 架构,不仅能模拟说话,还能生成笑声、叹息、哭泣等非语言声音,甚至能处理带有情感色彩和语气停顿的复杂文本,极大地丰富了音频表达的可能性。 它主要解决了传统语音合成声音机械、缺乏情感以及无法生成非语音类音效的痛点,让创作者能通过简单的文字描述获得生动自然的音频素材。无论是需要为视频配音的内容创作者、探索多模态生成的研究人员,还是希望快速原型设计的开发者,都能从中受益。普通用户也可通过集成的演示页面轻松体验其神奇效果。 技术亮点方面,Bark 支持商业使用(MIT 许可),并在近期更新中实现了显著的推理速度提升,同时提供了适配低显存 GPU 的版本,降低了使用门槛。此外,社区还建立了丰富的提示词库,帮助用户更好地驾驭模型生成特定风格的声音。只需几行 Python 代码,即可将创意文本转化为高质量音频,是连接文字与声音世界的强大桥梁。
airi
airi 是一款开源的本地化 AI 伴侣项目,旨在将虚拟角色(如“二次元老婆”或赛博生命)带入用户的现实世界。它的核心目标是复刻并超越知名 AI 主播 Neuro-sama 的能力,让用户能够拥有完全自主掌控、可私有化部署的智能伙伴。 airi 主要解决了用户对高度定制化、具备情感交互能力且数据隐私安全的 AI 角色的需求。不同于依赖云端服务的通用助手,airi 允许用户在本地运行,不仅保护了对话隐私,还赋予了用户定义角色性格与灵魂的自由。它支持实时语音聊天,甚至能直接参与《我的世界》(Minecraft)和《异星工厂》(Factorio)等游戏,实现了从单纯对话到共同娱乐的跨越。 这款工具非常适合喜爱虚拟角色的普通用户、希望搭建个性化 AI 陪伴的技术爱好者,以及研究多模态交互的开发者。其独特的技术亮点在于跨平台支持(涵盖 Web、macOS 和 Windows)以及强大的游戏交互能力,让 AI 不仅能“说”,还能“玩”。通过容器化的灵魂设计,airi 为每个人创造专属数字生命提供了可能,让虚拟陪伴变得更加真实且触手可及。