虚拟 IoT 设备语音采集零配置方案:用 Azure Speech SDK 在 Windows/macOS/Linux 上直接录音(IoT-For-Beginners 智能定时器项目)
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本篇指南聚焦 IoT-For-Beginners 课程第 21 课《用 IoT 设备识别语音》中的虚拟 IoT 设备分支。与需要接线、装驱动、写底层代码的 Raspberry Pi 和 Wio Terminal 分支不同,虚拟设备分支利用 Azure 认知服务语音 SDK(Python 版)内置的跨平台音频采集能力,在 Windows、macOS 和 Linux 上无需任何额外配置即可从电脑麦克风录音。读完本文,你将理解该"零配置"结论背后的原理,掌握 SpeechConfig / SpeechRecognizer 的完整调用链,并能直接运行仓库中提供的示例代码完成语音转文字。
课程背景:智能厨房定时器中的"虚拟设备"角色
在 6-consumer/lessons/1-speech-recognition/README.md 中,这一课的任务是构建一个支持语音控制的智能厨房定时器,可同时设置多个定时器。课程为三种硬件形态分别提供了"配置麦克风""采集音频""语音转文字"三份步骤文档:
- Arduino(Wio Terminal):wio-terminal-microphone.md → wio-terminal-audio.md → wio-terminal-speech-to-text.md
- 单板计算机(Raspberry Pi):pi-microphone.md → pi-audio.md → pi-speech-to-text.md
- 单板计算机(虚拟设备):virtual-device-microphone.md → virtual-device-audio.md(本文主体)→ virtual-device-speech-to-text.md
"虚拟 IoT 设备"即直接用你的个人电脑充当 IoT 设备:代码跑在本地 Python 环境里,麦克风与扬声器使用电脑自带硬件。本文对应的英文原文档 virtual-device-audio.md 给出了全文最核心的结论,而这篇技术文章的任务就是把这一句话结论讲透,并补齐可运行的代码与原理。
核心结论:Python 语音库自带跨平台录音能力
虚拟设备分支的"采集音频"步骤正文只有一句话:
本课后续用于将语音转换为文本的 Python 库,在 Windows、macOS 和 Linux 上内置了音频采集功能。你在这里不需要做任何事情。
这句话的官方出处即 virtual-device-audio.md(本仓库同时维护了 丹麦语译文 等数十种语言的翻译副本,内容一致)。
它意味着:虚拟设备分支不需要像 Raspberry Pi 分支那样安装 PortAudio/PyAudio、修改 ALSA 配置,也不需要像 Wio Terminal 分支那样编写 DMA 底层驱动。只要满足以下前提,"采集音频"这一步天然完成:
电脑具备可用的麦克风:按 virtual-device-microphone.md 所述,虚拟 IoT 硬件会使用连接到电脑的麦克风和扬声器。如果电脑没有内置麦克风/扬声器,需要自行外接,例如:
- USB 麦克风;
- USB 扬声器;
- 通过 HDMI 连接显示器内置的扬声器;
- 蓝牙耳机。
外接设备按其厂商说明安装配置即可,代码层面无感知。
已安装语音 SDK:即
azure-cognitiveservices-speechPython 包。它负责把宿主操作系统(Windows 的音频栈、macOS 的 CoreAudio、Linux 的 ALSA/PulseAudio)的默认录音设备统一抽象出来,SDK 内部完成音频采集与缓存,无需应用代码参与。
从"采集音频"到"识别语音":一行代码背后的完整链路
虚拟设备分支真正的代码工作发生在"语音转文字"步骤,而采集能力就内嵌在识别器里。参考 code-speech-to-text/virtual-iot-device/smart-timer/app.py 的完整实现:
import time from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer speech_api_key = '<key>' location = '<location>' language = '<language>' recognizer_config = SpeechConfig(subscription=speech_api_key, region=location, speech_recognition_language=language) recognizer = SpeechRecognizer(speech_config=recognizer_config) def process_text(text): print(text) def recognized(args): process_text(args.result.text) recognizer.recognized.connect(recognized) recognizer.start_continuous_recognition() while True: time.sleep(1)对照 virtual-device-speech-to-text.md 的逐步说明,这段代码的链路是:
- 配置:
SpeechConfig(subscription=speech_api_key, region=location, speech_recognition_language=language)绑定语音资源的 API 密钥、区域(与创建资源时的区域一致)和识别语言。<key>和<location>来自az cognitiveservices account create --name smart-timer --kind SpeechServices --sku F0创建免费层资源后的密钥查询命令(详见课程 README)。 - 语言参数:
<language>使用区域设置(locale)名称,例如英语用en-GB,粤语用zh-HK,可参考课程文档中列出的"语音转文字支持语言列表"选择对应值。 - 创建识别器:
SpeechRecognizer(speech_config=recognizer_config)在后台线程运行,持续监听默认麦克风,采集到的音频自动发送到语音服务。 - 事件回调:
recognizer.recognized.connect(recognized)注册回调函数。SDK 会连续监听,通过检测音频电平判断一段语音的起止——当音频电平回落(例如一句话说完)时,自动把这一段的语音送去转换,并将结果文本通过args.result.text交给回调输出。 - 启动与保活:
recognizer.start_continuous_recognition()显式启动识别;由于识别在后台线程运行,主程序用while True: time.sleep(1)无限循环保持进程存活。
运行效果(在smart-timer虚拟环境中执行python3 app.py后对着麦克风说话):
(.venv) ➜ smart-timer python3 app.py Hello world. Welcome to IoT for beginners.可以尝试说一些同音异义词,例如 "I want to buy two bananas and an apple too",观察识别器根据上下文输出正确的 to / two / too。这印证了课程 README 中关于语音模型具备上下文理解能力的论述。
与真实硬件分支的对比:为什么虚拟设备可以"什么都不做"
把三条分支的"采集音频"环节放在一起看,虚拟设备分支的"零配置"才显得更有价值:
| 维度 | 虚拟设备(PC) | Raspberry Pi | Wio Terminal |
|---|---|---|---|
| 采集方式 | Speech SDK 内置 | PyAudio(依赖 PortAudio + ALSA 驱动) | ADC + DMAC 硬件直接内存访问 |
| 需要安装 | 仅azure-cognitiveservices-speech | libportaudio*系统包 +pyaudio | 无(固件级,PlatformIO 编译) |
| 音频落地 | SDK 内部缓冲、按语音分段上传 | 内存缓冲 → WAV → 回放验证 | 192KB RAM 不够,写入 4MB 片内 Flash |
| 触发方式 | 连续识别 + 电平分段 | 按钮按下开始、松开结束 | Wio Terminal C 键触发,固定 4 秒 |
Raspberry Pi 分支(见 pi-audio.md 与 code-record/pi/smart-timer/app.py)需要先sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins,再手工指定microphone_card_number、speaker_card_number和采样率rate(48KHz,出错时降为 44100 或 16000),并用wave模块把采集帧封装成 WAV 缓冲区。
Wio Terminal 分支(见 wio-terminal-audio.md)则要处理更底层的细节:用 SFUD 库操作 4MB Flash(flash_writer.h),按 Flash 擦除粒度对齐写入;用 DMA 描述符把 ADC 采样以 16KHz 固定节奏写入双缓冲_adc_buf_0/_adc_buf_1(mic.h),并在中断处理里把 12 位 ADC 值转换为 16 位有符号 PCM 后拼上 44 字节 WAV 头。这正是课程 README 强调的:微控制器内存极小(Wio Terminal 仅 192KB),无法像 PC 一样把整段音频放在内存里,必须边采边落盘。
虚拟设备分支之所以能省略所有这些工作,本质上是把音频采集职责委托给了宿主操作系统:PC 的内存、磁盘与音频栈足够强大,SDK 直接读取系统默认录音设备即可,这也是该文档"你不需要做任何事情"的底层原因。
实践要点与后续步骤
- 先建好语音资源:按课程 README 的
az cognitiveservices account create/az cognitiveservices account keys list命令创建smart-timer资源组与SpeechServices(SKU F0 免费层)资源,拿到 API Key 与区域名。 - 确认麦克风可用:在系统设置中验证默认录音设备,外接设备参考 virtual-device-microphone.md。
- 安装依赖并运行:创建虚拟环境后执行
pip install azure-cognitiveservices-speech(如遇找不到发行版,先pip install --upgrade pip),填入app.py中的密钥、区域与语言,即可体验零配置录音 + 语音转文字。 - 继续本课后续:完成语音识别后,可在后续课程中为定时器加入口语反馈(音频输出)、多语言支持等能力,相关代码骨架同样位于
6-consumer/lessons/各子目录的code-*文件夹中,可作为继续阅读与运行验证的入口。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考