- 人工智能
- 大模型
- 机器学习
- 深度学习
- 本地部署
- 模型推理服务
【免费下载链接】candle
Minimalist ML framework for Rust
本篇技术指南以 candle-examples/examples/whisper-microphone/README.md 为骨架,围绕 Candle(Rust 极简机器学习框架)中基于 Whisper 模型、以麦克风作为实时输入源的语音识别(ASR)示例展开。读完本文,你将掌握该示例的启动命令与 feature 机制、输出日志的含义、全部命令行参数、底层"录音 → 重采样 → 梅尔频谱 → 解码"的数据流,以及语言检测、量化推理等进阶用法,并能直接在自己的机器上运行一套实时语音转写程序。
示例简介:从"音频文件"到"麦克风实时输入"
仓库中的常规 candle-whisper 示例 以.wav文件作为输入,而whisper-microphone则把输入源换成了计算机的默认麦克风:程序持续从音频输入设备采集 PCM 数据,经过重采样与梅尔频谱计算后,交给 Candle 实现的 Whisper 模型进行端到端推理,并把识别出的文本按时间分段打印到终端。它对应的源码位于 main.rs 与 multilingual.rs,音频特征计算复用的是 candle-transformers 的 whisper 模块。
值得注意的是,README 本身内容精炼,但源码非常完整——它同时封装了普通 FP32 模型与 GGUF 量化模型两条推理路径、多语言检测、温度回退(temperature fallback)等逻辑,这些都会在后续小节中逐一展开。
运行示例:一条命令开启实时转写
README 给出的启动命令如下:
$ cargo run --example whisper-microphone --features microphone需要特别说明两点:
- 必须启用
microphonefeature。在 candle-examples/Cargo.toml 中定义:microphone = ["cpal", "rubato"]。cpal负责跨平台音频输入(在 Linux/macOS/Windows 上统一抽象麦克风设备),rubato负责采样率重采样。同时 Cargo.toml 中通过[[example]]声明whisper-microphone的required-features = ["microphone"],因此不带 feature 直接运行会编译失败。 - 默认模型是
tiny.en(见下方--model参数),首次运行时程序会通过 candle-examples/src/hub.rs 中的Api(基于hf-hub)自动下载config.json、tokenizer.json、model.safetensors到本地缓存,之后启动会直接复用缓存。
README 给出了一个典型的运行输出:
> transcribing audio... > 480256 160083 > language_token: None > 0.0s -- 30.0s: Hello, hello, I don't know if this is working, but You know, how long did I make this? > 480256 160085其含义为:
transcribing audio...:麦克风音频流已启动,主循环开始阻塞等待音频数据(对应 main.rs);480256 160083:{缓冲的原始 PCM 样本数} {重采样后的 16kHz 样本数}。程序每累积约 10 秒(10 * in_sample_rate)原始样本才触发一次处理,重采样后变成 16 kHz 单声道样本;language_token: None:本次使用英文专用模型(tiny.en),不进行语言检测,因此语言 token 为空;0.0s -- 30.0s: ...:当前音频段对应的时间区间与识别出的文本;- 程序会持续循环,直到用户手动停止(Ctrl+C)。
命令行参数:完整控制推理行为
Args结构体定义在 main.rs,全部参数如下表:
| 参数 | 默认值 | 说明 |
|---|---|---|
--cpu | 自动选择 | 强制在 CPU 上运行;不指定时按cuda → metal → cpu的顺序自动选择设备(见 candle-examples/src/lib.rs) |
--model-id | 随模型而定 | 覆盖模型仓库 ID,例如openai/whisper-tiny;不指定 revision 时默认main |
--revision | 随模型而定 | 覆盖仓库 revision(分支/PR),默认值因模型而异 |
--model | tiny.en | 使用的 Whisper 模型,详见下方模型清单 |
--seed | 299792458 | 随机采样种子,保证温度采样路径可复现 |
--tracing | 关闭 | 生成trace-timestamp.json的 Chrome trace 文件(通过tracing-chrome实现) |
--quantized | 关闭 | 加载 GGUF 量化模型而非 safetensors 权重 |
--language | 自动检测 | 强制指定语言,如en、zh、ja(仅多语言模型可用) |
--task | transcribe | transcribe(原文转写)或translate(翻译成英文) |
--timestamps | 关闭 | 输出逐句时间戳(源码注释注明该模式尚未完全实现) |
--verbose | 关闭 | 打印完整的DecodingResult结构信息 |
--device | 默认输入设备 | 按设备名字符串匹配具体的音频输入设备,例如host.input_devices()返回的某个设备名 |
支持的模型清单
WhichModel枚举定义于 main.rs,支持的模型与仓库/revision 对应关系如下(摘自model_and_revision,main.rs):
- 多语言模型:
tiny、base、small、medium、large、large-v2、large-v3、large-v3-turbo、distil-large-v2; - 仅英文模型:
tiny.en、base.en、small.en、medium.en、distil-medium.en。
多语言模型默认从openai/whisper-*仓库的特定 revision(如refs/pr/22)拉取权重,英文模型与较新版本则使用main。--quantized模式下默认仓库切换为lmz/candle-whisper,并约定文件名规则:config-{ext}.json、tokenizer-{ext}.json、model-{ext}-q80.gguf(ext取tiny或tiny-en),量化模式目前仅支持 tiny/tiny.en 两档(main.rs)。
数据流拆解:麦克风 PCM 如何变成识别文本
从源码可以完整还原整条实时流水线(对应 main.rs 的主流程):
- 采集:通过
cpal::default_host()获取默认主机,用default_input_device()找到默认麦克风,读取default_input_config()(打印采样率、声道数等配置)。回调函数按step_by(channel_count)抽取单声道,通过 mpsc 通道把 PCM 块发送给主线程(main.rs)。 - 缓冲与重采样:主循环用
buffered_pcm累积数据,不足 10 秒(10 * in_sample_rate)则继续等待;每 1024 个样本为一 chunk 交给rubato::Async多项式重采样器,目标采样率统一为 16000 Hz(resample_ratio = 16000. / in_sample_rate)。若输入产生非 1024 倍数的余数,则把余数搬到缓冲头部留到下一轮处理,避免数据丢失(main.rs)。 - 梅尔频谱:调用
audio::pcm_to_mel(&config, &pcm, &mel_filters)生成[1, num_mel_bins, frames]的梅尔频谱张量。底层实现在 candle-transformers/src/models/whisper/audio.rs:对加汉宁窗的样本做 FFT/DFT、计算功率谱、乘以梅尔滤波器组后取log10,并做归一化;FFT 计算按线程数拆分并行(最多 12 线程)。梅尔滤波器权重由melfilters.bytes/melfilters128.bytes按num_mel_bins(80 或 128)选择(main.rs)。 - 语言检测(仅多语言模型):首次迭代时若模型为多语言且未指定
--language,调用multilingual::detect_language(multilingual.rs):编码音频特征后,对 99 种语言的<|xx|>语言 token 打分并 softmax,打印概率最高的前 5 种语言,取最高者作为语言 token。语言代码表(en/zh/de/.../haw等 99 项)同样在 multilingual.rs。若指定了--language,则直接查 tokenizer 中的<|{language}|>token;英文专用模型则固定为None。 - 解码:
decoder.run(&mel, None)把 30 秒窗口的梅尔频谱切成最大 3000 帧(N_FRAMES,见 candle-transformers/src/models/whisper/mod.rs)的片段逐段处理,每段先经decode_with_fallback生成文本与no_speech_prob,再按需打印{start}s -- {end}s: {text}(main.rs)。每轮处理后调用reset_kv_cache()清空跨片段的 KV 缓存。
解码器与温度回退机制
Decoder::decode(main.rs)实现了一次标准的自回归解码:以<|startoftranscript|>(可选语言 token、任务 token、<|notimestamps|>)为起始 token,循环调用decoder_forward与decoder_final_linear,对 logits 施加suppress_tokens(把配置中的抑制 token 与 timestamps 模式下的<|notimestamps|>设为-inf),再按温度选择贪心(t=0)或加权随机采样(t>0),直到遇到<|endoftext|>或超过max_target_positions。
decode_with_fallback(main.rs)则复用了 whisper 模块的阈值常量(定义于 candle-transformers/src/models/whisper/mod.rs):温度序列TEMPERATURES = [0.0, 0.2, 0.4, 0.6, 0.8, 1.0],当compression_ratio > 2.4或avg_logprob < -1.0且no_speech_prob <= 0.6时,用更高温度重试,从而缓解重复文本与低置信度输出的问题。运行期间若no_speech_prob > 0.6且平均对数概率过低,则判定为无语音并跳过该段。
模型加载:普通权重与 GGUF 量化两条路径
Model枚举(main.rs)统一封装了两种后端,并对其暴露相同的encoder_forward/decoder_forward/decoder_final_linear接口:
- Normal:
m::model::Whisper,权重来自model.safetensors,通过VarBuilder::from_mmaped_safetensors以内存映射方式加载,dtype 为F32(m::DTYPE); - Quantized:
m::quantized_model::Whisper,权重来自 GGUF 文件,通过 candle-transformers 的 quantized_var_builder 加载并即时反量化。
两种模型均读取同一份config.json(Config结构含num_mel_bins、d_model、encoder_layers、vocab_size等字段,见 candle-transformers/src/models/whisper/mod.rs)。量化路径可以显著降低内存占用,适合无 GPU 的机器实时转写;选择何种路径由--quantized开关控制。
依赖与运行环境
运行本示例需要:
- 可用的音频输入设备(麦克风),且系统具有
cpal支持的音频后端(ALSA/CoreAudio/WASAPI 等); - 首次运行联网下载模型权重(可由
HF_HUB_CACHE等环境变量控制缓存位置,见 candle-examples/src/hub.rs); - 如需 GPU 加速,可在运行前用
--features cuda(NVIDIA)或--features metal(Apple Silicon)构建,否则默认回退 CPU(candle-examples/src/lib.rs 会打印对应提示)。
小结与扩展
whisper-microphone是 Candle 生态中"实时音频输入 + ASR 推理"的完整参考实现:一条cargo run --example whisper-microphone --features microphone命令即可把默认麦克风变成实时语音转写器,支持多语言自动检测、翻译任务、量化部署与温度回退等生产级细节。对同一套 Whisper 实现的进一步研究,可阅读:
- 音频文件版示例说明:candle-examples/examples/whisper/README.md
- Whisper 模型定义与常量:candle-transformers/src/models/whisper/mod.rs
- 音频预处理(FFT/梅尔谱):candle-transformers/src/models/whisper/audio.rs
- 普通模型网络结构:candle-transformers/src/models/whisper/model.rs
- 量化模型网络结构:candle-transformers/src/models/whisper/quantized_model.rs
- 人工智能
- 大模型
- 机器学习
- 深度学习
- 本地部署
- 模型推理服务
【免费下载链接】candle
Minimalist ML framework for Rust
相关推荐
国家中小学智慧教育平台电子课本下载:批量存成 PDF 离线用,免费
国家中小学智慧教育平台电子课本下载:批量存成 PDF 离线用,免费 开学要上新课,备课先找教材。tchMaterial parser 帮你在国家中小学智慧教育平
网页爬虫教育whisper.cpp 实时语音识别指南:使用 whisper-stream 实现麦克风流式连续转录
whisper.cpp 实时语音识别指南:使用 whisper stream 实现麦克风流式连续转录 导读 whisper stream 是 whisper.c
人工智能语音音频本地部署推理引擎FunASR实时语音转写:前端麦克风采集与实时转写完整指南
FunASR实时语音转写:前端麦克风采集与实时转写完整指南 FunASR是一个强大的端到端语音识别工具包,提供高质量的实时语音转写功能。通过前端麦克风采集技术,
语音音频人工智能大模型模型推理服务本地部署
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考