尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

IoT-For-Beginners 实战:在 Raspberry Pi 上调用 Azure Speech REST API 实现语音转文本(Speech to Text)

IoT-For-Beginners 实战:在 Raspberry Pi 上调用 Azure Speech REST API 实现语音转文本(Speech to Text) IoT-For-Beginners 实战在 Raspberry Pi 上调用 Azure Speech REST API 实现语音转文本Speech to Text【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本篇技术指南源自 IoT-For-Beginners 课程体系中的第 6 大项目「消费级 IoT」第 1 课Recognize speech with an IoT device。你将学习如何把上一节录制到内存的 WAV 音频通过 Azure 认知服务 Speech Service 的 REST API 实时转换为文字最终为智能厨房计时器smart-timer奠定语音交互基础。读完本文你将掌握Speech Service 的访问令牌access token获取与 10 分钟过期机制、REST API 的鉴权与请求构造、RecognitionStatus响应解析以及如何在树莓派上以按钮触发的方式完成「按下说话 → 松开识别 → 输出文本」的完整闭环。背景为什么用按钮代替唤醒词在进入编码之前需要理解本方案的设计动机。真实消费级语音设备通常采用唤醒词wake word如 Alexa、Hey Siri持续监听并仅在唤醒后上传音频这一机制被称为 Keyword Spotting 或 Keyword Recognition。唤醒词检测依赖 TinyML 模型在设备本地运行以保护用户隐私、节省云带宽。本课为避免引入唤醒词模型的训练复杂度改用实体按钮作为触发开关按住按钮开始录音松开按钮才把音频发送到云端识别。这与课程 README 中「To avoid the complexity of training and using a wake word model, the smart timer you are building in this lesson will use a button to turn on the speech recognition」的说明一致也是 pi-audio.md 中capture_audio函数的设计前提。前置准备录音与资源创建硬件与录音链路本文假设你已完成两件事分别见对应文档麦克风与扬声器配置并用arecord -l/aplay -l确认音频设备编号见 pi-microphone.md用 PyAudio 实现按钮控制的录音程序code-record/pi/smart-timer/app.py它定义了后续复用的核心变量与函数import io import pyaudio import time import wave from grove.factory import Factory button Factory.getButton(GPIO-HIGH, 5) # Grove 按钮接在 D5 口 audio pyaudio.PyAudio() microphone_card_number 1 speaker_card_number 1 rate 48000 # 采样率 48KHz若报错可改为 44100 或 16000capture_audio()打开输入流while button.is_pressed(): frames.append(stream.read(4096))循环采集松开按钮后把 PCM 帧封装为 WAV 写入io.BytesIO缓冲区并返回。这个缓冲区正是后续 REST 请求的data载荷来源。创建 Speech Service 资源按课程 README.md 中的步骤在 Azure CLI 中创建免费F0 层语音资源并获取 API Keyaz cognitiveservices account create --name smart-timer \ --resource-group smart-timer \ --kind SpeechServices \ --sku F0 \ --yes \ --location locationaz cognitiveservices account keys list --name smart-timer \ --resource-group smart-timer \ --output table记录返回的某个 Key、资源所在的location例如eastus以及你将要说话的语言区域名称locale如en-GB、zh-CN等。第一步声明服务设置与获取访问令牌打开树莓派上的smart-timer项目完整版可对照 code-speech-to-text/pi/smart-timer/app.py。首先删除play_audio函数——智能计时器不需要复述用户说过的话。然后在文件顶部追加import requests这是 Python 发起 HTTP 请求的库并在while True循环之前声明三个服务设置speech_api_key key # 替换为你的 Speech 资源 Key location location # 替换为创建资源时的区域如 eastus language language # 替换为语言区域名如 en-GB、zh-CN接着定义获取访问令牌的函数def get_access_token(): headers { Ocp-Apim-Subscription-Key: speech_api_key } token_endpoint fhttps://{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken response requests.post(token_endpoint, headersheaders) return str(response.text)关键机制Speech Service 不直接接受 API Key 调用识别接口而是要求先用 Key 换取短期访问令牌。Ocp-Apim-Subscription-Key头携带资源 Key令牌签发端点为{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken。课程文档特别强调这些访问令牌在10 分钟后过期因此代码应定期重新请求令牌确保令牌始终新鲜。在树莓派场景中由于每次按下按钮都会调用一次get_access_token()见下文convert_speech_to_text中Authorization: Bearer get_access_token()的动态拼接令牌实际上按需刷新天然规避了过期问题。第二步构造 REST 识别请求定义识别函数convert_speech_to_text(buffer)buffer即capture_audio()返回的 WAV 字节缓冲区。函数内部先拼装 URL、请求头与查询参数def convert_speech_to_text(buffer): url fhttps://{location}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1 headers { Authorization: Bearer get_access_token(), Content-Type: faudio/wav; codecsaudio/pcm; samplerate{rate}, Accept: application/json;text/xml } params { language: language }三个要点URL识别端点{location}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1conversation表示会话式识别模型适合口语场景AuthorizationBearer前缀 刚获取的访问令牌Content-Type声明载荷为 WAV 格式的裸 PCM 数据samplerate{rate}必须与录音采样率rate变量一致——这正是上一节code-record代码中rate 48000被复用的原因。识别服务要求该值与音频真实采样率匹配否则会返回错误。第三步发送音频并解析响应继续完善convert_speech_to_text发起 POST 请求并把音频缓冲作为请求体发送response requests.post(url, headersheaders, paramsparams, databuffer) response_json response.json() if response_json[RecognitionStatus] Success: return response_json[DisplayText] else: return 响应为 JSON核心字段字段含义RecognitionStatus识别状态Success表示成功提取出文本DisplayText服务端完成大小写、标点与同音词纠错后的最终文本若RecognitionStatus非Success例如音频过短或无法识别函数返回空字符串保证主循环不会因None而崩溃。第四步接入主循环完成端到端识别在while True之前定义文本处理函数本课仅打印到控制台def process_text(text): print(text)最后把主循环中的play_audio(buffer)替换为while True: while not button.is_pressed(): time.sleep(.1) buffer capture_audio() text convert_speech_to_text(buffer) process_text(text)运行python3 app.py按住按钮说话松开后音频被发送到云端识别并打印结果piraspberrypi:~/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 中关于 RNN 模型「combine this with the previous sound, find that Hello is a valid word」的原理讲解相互印证。源码级补充REST 流程的跨平台印证与容错处理Wio Terminal 端同样的 REST 调用链同一 REST 协议在 Arduino/Wio Terminal 端有独立实现 speech_to_text.h其中getAccessToken()同样使用Ocp-Apim-Subscription-Key头访问sts/v1.0/issuetokenconvertSpeechToText()同样以Bearer令牌调用stt.speech.microsoft.com。从源码结构看两端共享完全相同的 URL 模板见 config.hconst char *TOKEN_URL https://%s.api.cognitive.microsoft.com/sts/v1.0/issuetoken; const char *SPEECH_URL https://%s.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language%s;Wio 端还显式处理了401 令牌过期的容错收到 401 时打印Access token expired, trying again with a new token重新获取令牌后递归重试——这正是「令牌 10 分钟过期」机制在实现层面的直接证据。树莓派端因每次请求都现场获取新令牌无需此分支。虚拟设备端SDK 替代方案作为对比虚拟设备无实体麦克风的电脑版本 code-speech-to-text/virtual-iot-device/smart-timer/app.py 使用官方 Python SDKazure.cognitiveservices.speech通过SpeechConfig(subscription..., region...)与SpeechRecognizer完成连续识别并以事件回调recognizer.recognized.connect(recognized)接收结果。它省去了手动管理令牌与构造 URL 的步骤说明 REST 直连只是接入 Speech Service 的方式之一——本文的 REST 方案更适合资源受限、需要逐字节掌控请求细节的嵌入式场景。运行前提与限制说明本方案依赖微软 Azure 认知服务 Speech ServiceF0 免费层需要有效的订阅与网络连接文中key、location、language均为占位符必须替换为真实值。树莓派需要预先安装 PyAudio 依赖并完成 pi-microphone.md 的声卡配置若运行capture_audio时报OSError: [Errno -9997] Invalid sample rate请将rate调低为44100或16000见 pi-audio.md。录音时建议贴近麦克风、语速平稳避免过长的静音段导致RecognitionStatus失败而返回空文本。至此你的树莓派已完成「语音 → 文本」的能力闭环。下一课将在此基础上把识别出的文本交给语言理解服务LUIS让计时器真正听懂「set a 12 minute timer」这类指令。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表