ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于 Azure Speech REST API 的 Raspberry Pi 语音转文本实现(IoT-For-Beginners smart-timer)

基于 Azure Speech REST API 的 Raspberry Pi 语音转文本实现(IoT-For-Beginners smart-timer) 基于 Azure Speech REST API 的 Raspberry Pi 语音转文本实现IoT-For-Beginners smart-timer【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本指南来自 IoT-For-Beginners 项目第 6 部分「消费者设备」第 1 课语音识别的 Raspberry Pi 分支讲解如何在树莓派上把录音按钮捕获到的语音通过 Azure 认知服务语音服务 REST API 实时转换为文本。读完本文你将掌握访问令牌获取、REST 调用、RecognitionStatus/DisplayText响应解析并得到一个可运行的「智能定时器」语音输入原型。工作原理先换令牌再调 REST APIpi-speech-to-text.md采用的方案不是官方 Python SDK而是纯 HTTP REST 调用先用 API Key 从令牌签发端点换取短期访问令牌再携带该令牌把 WAV 音频 POST 到识别端点。访问令牌有效期只有 10 分钟因此代码每次识别前都应重新换取保证令牌始终新鲜。整个过程对应三个关键端点与两个阶段换令牌POST https://{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken请求头携带Ocp-Apim-Subscription-Key识别POST https://{location}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1请求头携带Authorization: Bearer token与音频格式声明请求体为 WAV 二进制数据。前置条件硬件与录音环境本课建立在前两小节之上pi-microphone.md麦克风/扬声器配置与pi-audio.md按键控制录音。需要确认硬件麦克风USB 麦克风、USB 声卡3.5mm 麦克风或 [ReSpeaker 2-Mics Pi HAT]注意蓝牙麦克风在 Pi 上兼容性差Grove 按键若使用 ReSpeaker HAT 则免接HAT 自带按键在 D17扬声器。系统配置用arecord -l查麦克风卡号用aplay -l查扬声器卡号card 0: Headphones为板载 3.5mm 接口并在/usr/share/alsa/alsa.conf中把defaults.pcm.card改成目标扬声器卡号。依赖安装sudo apt update sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins --yes pip3 install pyaudio录音代码app.py用 PyAudio 打开pyaudio.paInt16、单声道、rate48000如报Invalid sample rate改 44100 或 16000、frames_per_buffer4096的输入流while button.is_pressed()循环把 4096 字节块写入frames松键后用wave模块封装为内存 WAVio.BytesIO并返回。可参照 code-record/pi/smart-timer/app.py。实现步骤把录音变成文本以 code-speech-to-text/pi/smart-timer/app.py 为最终形态逐步改造smart-timer项目中的app.py1. 准备请求库与配置删除上一节用于回放的play_audio函数智能定时器不需要复读用户的话并在文件顶部加入import requests在while True循环之前声明语音服务配置speech_api_key key location location language languagekey语音服务资源的 API Key创建资源后由az cognitiveservices account keys list获取location创建资源时选择的区域例如eastus它决定令牌端点和识别端点的域名language语音区域设置locale如en-GB对应英语zn-HK对应粤语。完整列表见微软官方「Language and voice support」文档。2. 获取访问令牌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)该函数把 API Key 放进Ocp-Apim-Subscription-Key请求头POST 到令牌签发端点返回的响应体即访问令牌字符串。令牌有效期 10 分钟若识别返回 401令牌过期需重新调用本函数换新令牌再重试——这一点在 Wio Terminal 的 C 实现中体现得更明显见 wio-terminal-speech-to-text.md 的 401 分支处理。3. 声明识别函数并组装请求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}与配置一致conversation表示会话式识别场景Authorization使用Bearer前缀 令牌每次调用都现场换取保证不过期Content-Type声明音频为 WAV/PCM并携带samplerate{rate}该值与录音时 PyAudio 的采样率必须一致源码里rate是全局变量来自pi-audio.md的 48000/44100/16000Accept声明接受 JSON 或 XMLparams的language告诉服务音频属于哪种语言。4. 发送音频并解析结果response requests.post(url, headersheaders, paramsparams, databuffer) response_json response.json() if response_json[RecognitionStatus] Success: return response_json[DisplayText] else: return databuffer直接上传上一节capture_audio()返回的 WAV 内存缓冲。响应 JSON 中RecognitionStatus识别状态Success表示成功提取出语音DisplayText识别出的文本DisplayText对文本进行显示优化例如去掉标点、数字格式化等。5. 处理文本并改写主循环def process_text(text): print(text) while True: while not button.is_pressed(): time.sleep(.1) buffer capture_audio() text convert_speech_to_text(buffer) process_text(text)原循环中的play_audio(buffer)被替换为「识别 打印」。process_text目前只打印到控制台在后续课程中会扩展为解析语音命令并设置定时器。6. 运行验证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而非仅凭发音。常见问题排查OSError: [Errno -9997] Invalid sample rate录音采样率不被硬件支持将rate改为 44100 或 16000ALSA 提示Unknown PCM cards.pcm.front等来自 Pi 上未连接的音频设备配置可忽略识别返回 401访问令牌过期应重新调用get_access_token()后重试识别结果为空检查language是否与说话语言匹配、samplerate是否与录音一致、是否返回RecognitionStatus非Success此时函数返回空字符串。与另外两条实现路径的对照同一课还提供了另外两份对照实现便于理解 REST 与 SDK 的差异虚拟设备virtual-device-speech-to-text.md在 PC 上使用官方 Python SDKazure-cognitiveservices-speech通过SpeechConfigSpeechRecognizer连续监听recognized回调输出文本无需手动换令牌Wio Terminalwio-terminal-speech-to-text.md与 Pi 同样走 REST 路径但需在config.h内嵌两个 HTTPS 根证书令牌端点证书与识别端点证书、用WiFiClientSecure建立 TLS 连接并通过自定义FlashStream继承 ArduinoStream把存放在 Flash 中的录音分块流式上传避免内存溢出。FlashStream通过available()向HTTPClient报告可发送字节数、read()逐字节取数超过HTTP_TCP_BUFFER_SIZE即重新填充缓冲。Pi 与 Wio 都使用同一套 REST API 语义Bearer 令牌、Content-Type采样率声明、DisplayText字段区别仅在传输层的实现细节这为理解语音服务的云端协议提供了很好的跨平台参照。小结至此树莓派上的「按下说话、松键识别、控制台出文本」的语音转文本程序已可运行。你已掌握 Azure 语音服务的令牌机制、REST 调用格式、WAV/PCM 音频格式声明与响应解析这些知识将直接支撑后续课程中「把识别文本转换为智能定时器命令」的实现。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表