用 Candle 实现麦克风实时语音转写:whisper-microphone 示例深度解读

发布时间:2026/10/2 1:53:03

用 Candle 实现麦克风实时语音转写:whisper-microphone 示例深度解读 人工智能大模型机器学习深度学习本地部署模型推理服务【免费下载链接】candleMinimalist ML framework for Rust项目地址https://gitcode.com/GitHub_Trending/ca/candle点击查看免费下载本篇技术指南以 candle-examples/examples/whisper-microphone/README.md 为骨架围绕 CandleRust 极简机器学习框架中基于 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 dont know if this is working, but You know, how long did I make this? 480256 160085其含义为transcribing audio...麦克风音频流已启动主循环开始阻塞等待音频数据对应 main.rs480256 160083{缓冲的原始 PCM 样本数} {重采样后的 16kHz 样本数}。程序每累积约 10 秒10 * in_sample_rate原始样本才触发一次处理重采样后变成 16 kHz 单声道样本language_token: None本次使用英文专用模型tiny.en不进行语言检测因此语言 token 为空0.0s -- 30.0s: ...当前音频段对应的时间区间与识别出的文本程序会持续循环直到用户手动停止CtrlC。命令行参数完整控制推理行为Args结构体定义在 main.rs全部参数如下表参数默认值说明--cpu自动选择强制在 CPU 上运行不指定时按cuda → metal → cpu的顺序自动选择设备见 candle-examples/src/lib.rs--model-id随模型而定覆盖模型仓库 ID例如openai/whisper-tiny不指定 revision 时默认main--revision随模型而定覆盖仓库 revision分支/PR默认值因模型而异--modeltiny.en使用的 Whisper 模型详见下方模型清单--seed299792458随机采样种子保证温度采样路径可复现--tracing关闭生成trace-timestamp.json的 Chrome trace 文件通过tracing-chrome实现--quantized关闭加载 GGUF 量化模型而非 safetensors 权重--language自动检测强制指定语言如en、zh、ja仅多语言模型可用--tasktranscribetranscribe原文转写或translate翻译成英文--timestamps关闭输出逐句时间戳源码注释注明该模式尚未完全实现--verbose关闭打印完整的DecodingResult结构信息--device默认输入设备按设备名字符串匹配具体的音频输入设备例如host.input_devices()返回的某个设备名支持的模型清单WhichModel枚举定义于 main.rs支持的模型与仓库/revision 对应关系如下摘自model_and_revisionmain.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.ggufext取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 Hzresample_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_bins80 或 128选择main.rs。语言检测仅多语言模型首次迭代时若模型为多语言且未指定--language调用multilingual::detect_languagemultilingual.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::decodemain.rs实现了一次标准的自回归解码以|startoftranscript|可选语言 token、任务 token、|notimestamps|为起始 token循环调用decoder_forward与decoder_final_linear对 logits 施加suppress_tokens把配置中的抑制 token 与 timestamps 模式下的|notimestamps|设为-inf再按温度选择贪心t0或加权随机采样t0直到遇到|endoftext|或超过max_target_positions。decode_with_fallbackmain.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接口Normalm::model::Whisper权重来自model.safetensors通过VarBuilder::from_mmaped_safetensors以内存映射方式加载dtype 为F32m::DTYPEQuantizedm::quantized_model::Whisper权重来自 GGUF 文件通过 candle-transformers 的 quantized_var_builder 加载并即时反量化。两种模型均读取同一份config.jsonConfig结构含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 cudaNVIDIA或--features metalApple Silicon构建否则默认回退 CPUcandle-examples/src/lib.rs 会打印对应提示。小结与扩展whisper-microphone是 Candle 生态中实时音频输入 ASR 推理的完整参考实现一条cargo run --example whisper-microphone --features microphone命令即可把默认麦克风变成实时语音转写器支持多语言自动检测、翻译任务、量化部署与温度回退等生产级细节。对同一套 Whisper 实现的进一步研究可阅读音频文件版示例说明candle-examples/examples/whisper/README.mdWhisper 模型定义与常量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赞分享人工智能大模型机器学习深度学习本地部署模型推理服务【免费下载链接】candleMinimalist ML framework for Rust项目地址https://gitcode.com/GitHub_Trending/ca/candle点击查看免费下载相关推荐国家中小学智慧教育平台电子课本下载批量存成 PDF 离线用免费国家中小学智慧教育平台电子课本下载批量存成 PDF 离线用免费 开学要上新课备课先找教材。tchMaterial parser 帮你在国家中小学智慧教育平网页爬虫教育whisper.cpp 实时语音识别指南使用 whisper-stream 实现麦克风流式连续转录whisper.cpp 实时语音识别指南使用 whisper stream 实现麦克风流式连续转录 导读 whisper stream 是 whisper.c人工智能语音音频本地部署推理引擎FunASR实时语音转写前端麦克风采集与实时转写完整指南FunASR实时语音转写前端麦克风采集与实时转写完整指南 FunASR是一个强大的端到端语音识别工具包提供高质量的实时语音转写功能。通过前端麦克风采集技术语音音频人工智能大模型模型推理服务本地部署上一篇Vim键盘布局终极指南可视化展示自定义键盘映射技巧下一篇Shadplay 源码拆解Bevy Material trait、AsBindGroup 着色器数据绑定与插件注册完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/2 2:38:05

基于深度学习的滚动轴承故障诊断:从CWRU数据到一维CNN实战

简介:这份资源是面向计算机相关专业毕业设计学生与项目实战学习者的深度学习滚动轴承故障诊断完整方案,基于CWRU轴承数据集展开,可用于毕设、课程设计或期末大作业。压缩包共41个文件,约34.87MB,以30个mat数据文件为核…

2026/10/2 2:38:05

中文命名实体识别实战:BERT-BiLSTM-CRF从原理到调优

简介:本资源面向中文命名实体识别(NER)方向的初学者与毕业设计、课程设计开发者,提供一套基于PyTorch实现的BERT-BiLSTM-CRF完整项目。项目将预训练BERT、双向LSTM与条件随机场CRF串联,覆盖数据加载、模型构建、训练、…

2026/10/2 2:38:05

YOLOv8行人检测实战:数据集处理与PyQt界面集成全流程

简介:面向有深度学习基础的行人检测开发者,这套YOLOv8行人检测工程包整合了标注数据集、训练权重与图形界面三个核心部分,基于YOLOv8算法在数千张街道和交通场景图像上训练,平均精度均值达90%以上,可直接用于行人识别&…

2026/10/2 2:38:05

CTF战队内部工具箱搭建指南:从目录结构到实战脚本

简介:这份资源是面向CTF竞赛选手与网络安全学习者的内部工具集合,聚焦于密码学与杂项题型的快速解题需求。包内共92个文件,以23个java源码、16个jar可执行库、13个sample样例、4个png与4个fxml界面文件为主,另含pcap流量包、多语言…

2026/10/2 2:38:05

YOLOv8行人检测系统实战:从数据处理到PyQt界面开发

简介:YOLOV8行人检测系统是一套完整的目标检测方案,面向开发者和研究者,适用于街道监控、交通流量分析、自动驾驶辅助等场景。压缩包共2000个文件、456.56MB,以txt标注与训练结果文件为主,另含Python脚本(含…

2026/10/2 2:33:05

外卡争议处理实战指南:从Chargeback到自动化合规

简介:本资源是一份面向银行从业人员、收单机构风控人员及酒店等外卡受理商户的实务培训课件,聚焦外卡(Visa/MasterCard/JCB)收单争议处理的核心规则与标准化流程。内容系统覆盖争议触发场景、查询与拒付全流程时限(如V…

2026/10/1 5:21:14

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/1 17:09:46

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/2 0:02:57

PWN入门:从栈溢出原理到ROP链实战

1. 这不是“学PWN”,是重新理解你每天敲的每一行C代码我第一次在CTF赛场上写出能控制程序流的exp时,手抖得连gdb的c命令都输错三次。那道题只有23行C代码,一个gets()调用,一个printf(),一个return——它甚至没开NX&…

2026/10/2 0:02:57

Windows下cudaMallocHost显存占用之谜:WDDM与TCC模式差异及优化方案

1. 一个反直觉的显存占用现象第一次在 Windows 上看到cudaMallocHost把显存吃掉的时候,我的反应是打开任务管理器反复确认了三遍。明明调用的是主机端锁页内存分配,按 CUDA 文档的说法,这块内存应该落在系统 RAM 里,跟 GPU 的显存…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑