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

资讯详情

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

IoT-For-Beginners 多语言智能计时器:在 Raspberry Pi 上用 Azure Translator REST API 实现语音翻译

IoT-For-Beginners 多语言智能计时器:在 Raspberry Pi 上用 Azure Translator REST API 实现语音翻译 IoT-For-Beginners 多语言智能计时器在 Raspberry Pi 上用 Azure Translator REST API 实现语音翻译【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本篇指南基于 IoT-For-Beginners 开源课程项目的消费者项目第 4 课讲解如何在 Raspberry Pi 上用 Python 调用 Azure Translator REST API 为语音交互应用添加双向文本翻译能力。读完后你将掌握用户语言 ↔ 服务器语言的双语架构设计、Translator REST API 的完整调用方式URL、请求头、参数、批量请求体与响应解析以及一个可直接运行的智能计时器端到端实现。为什么需要翻译双语言架构在多语言智能设备的典型架构中应用的核心逻辑语言理解 LUIS、应答文本的生成通常只基于一种服务器语言训练和构建。为了让用户用自己的母语与设备对话需要在语音识别之后、语言理解之前插入一次用户语言 → 服务器语言的翻译在设备应答时再插入一次服务器语言 → 用户语言的翻译。下图展示了 smart timer 的完整多语言数据流用户语音经麦克风采集后先做语音识别STT得到用户语言文本Translator 将其翻译为服务器语言文本经 Azure IoT Hub 与 Azure Functions 交给 LUIS 理解并生成应答文本Functions 再经 IoT Hub 把应答发回设备翻译回用户语言后合成语音TTS播放这一架构的关键前提是Speech 服务的 REST API 并不支持在识别时直接附带翻译内置翻译能力仅存在于 Speech SDK因此课程选择用独立的 Translator 服务在设备端完成文本翻译而智能计时器的其余部分保持不变。相关课程背景见 课程 README设备端完整实现见 code/pi 目录。第一步定义用户语言与服务器语言两个变量智能计时器需要同时持有两种语言language用户实际说出的语言用于语音识别与语音合成server_language训练 LUIS 模型所用的语言也是应答文本的原始生成语言。在app.py顶部做如下更新language user language server_language server language将user language替换为你将说出的语言的区域名locale例如法语是fr-FR将server language替换为训练 LUIS 所用的语言区域名。提示来自原文档如果你不会说第二种语言可以先用在线翻译工具把set a 2 minute and 27 second timer这类句子从服务器语言翻译成目标语言并播放其发音对着设备说出来即可。原文档中的示例即法语场景区域名为fr-FR。第二步配置 Translator API 密钥Speech 服务需要先向 token issuer API 换取 access token而Translator 服务不需要——它直接接受 API key。因此在speech_api_key下方新增translator_api_key keykey替换为你的 Translator 资源的 API key。该资源通过 Azure CLI 创建见 课程 READMEaz cognitiveservices account create --name smart-timer-translator \ --resource-group smart-timer \ --kind TextTranslation \ --sku F0 \ --yes \ --location location az cognitiveservices account keys list --name smart-timer-translator \ --resource-group smart-timer \ --output table第三步实现translate_text函数在say函数上方定义translate_text函数。from与to语言作为参数传入因为应用需要在两个方向上使用它——识别语音时从用户语言转到服务器语言提供语音应答时从服务器语言转回用户语言def translate_text(text, from_language, to_language):构造 URL 与请求头url fhttps://api.cognitive.microsofttranslator.com/translate?api-version3.0 headers { Ocp-Apim-Subscription-Key: translator_api_key, Ocp-Apim-Subscription-Region: location, Content-type: application/json }注意两点实现细节URL 与 location 的关系Speech 服务的 REST 端点是按区域划分的如https://{location}.stt.speech.microsoft.com/...而 Translator 的端点api.cognitive.microsofttranslator.com是全球统一的区域信息通过Ocp-Apim-Subscription-Region请求头传递鉴权方式API key 通过Ocp-Apim-Subscription-Key请求头直接传递无需像 Speech 服务那样调用issuetoken接口获取 Bearer token。构造参数与请求体params { from: from_language, to: to_language } body [{ text : text }]params指定翻译方向把from语言的文本翻译成to语言body是要翻译的文本。请求体是一个数组——因为同一次调用中可以批量翻译多个文本块。发起请求并解析响应response requests.post(url, headersheaders, paramsparams, jsonbody)响应是一个 JSON 数组其中第一项包含translations数组对应请求体中每个文本项的翻译结果[ { translations: [ { text: Set a 2 minute 27 second timer., to: en } ] } ]从数组第一项的第一条翻译中取出text属性并返回return response.json()[0][translations][0][text]第四步在主循环中翻译用户语音更新while True主循环将convert_speech_to_text识别出的文本从用户语言翻译到服务器语言后再发给 IoT Hubif len(text) 0: print(Original:, text) text translate_text(text, language, server_language) print(Translated:, text) message Message(json.dumps({ speech: text })) device_client.send_message(message)这段代码同时把原文与译文打印到控制台便于调试识别与翻译环节。第五步在say函数中翻译应答文本更新say函数把要朗读的文本从服务器语言翻译回用户语言再交给 TTSdef say(text): print(Original:, text) text translate_text(text, server_language, language) print(Translated:, text) speech get_speech(text) play_speech(speech)get_speech会用language用户语言对应的 voice 构造 SSML 并调用 TTS 端点因此翻译后的文本正好与合成语音的语言匹配。运行与预期输出确保 Functions 应用正在运行然后用用户语言自己说或用翻译工具播放音频请求一个计时器piraspberrypi:~/smart-timer $ python3 app.py Connecting Connected Using voice fr-FR-DeniseNeural Original: Définir une minuterie de 2 minutes et 27 secondes. Translated: Set a timer of 2 minutes and 27 seconds. Original: 2 minute 27 second timer started. Translated: 2 minute 27 seconde minute a commencé. Original: Times up on your 2 minute 27 second timer. Translated: Chronométrant votre minuterie de 2 minutes 27 secondes.提示来自原文档由于不同语言表达同一意思的方式不同你得到的识别/翻译文本可能与你给 LUIS 的示例略有差异。遇到这种情况应给 LUIS 增加更多示例然后重新训练并重新发布模型。源码级解析完整设备端实现课程给出的完整代码位于 code/pi/smart-timer/app.py其中与翻译直接相关的调用链如下translate_text即上文逐步构建的函数一次requests.post完成翻译返回response.json()[0][translations][0][text]convert_speech_to_textSTT 端点按区域划分{location}.stt.speech.microsoft.com通过get_access_token()获取 Bearer token并把language作为查询参数传入——这就是识别的是用户语言的落点say翻译后调用get_speech/play_speechSSML 中的xml:lang与 voice 均基于用户语言主循环按住按钮采集音频 → STT → 翻译 → 以{speech: text}的 JSON 消息发送到 IoT Hub。从源码结构看翻译被放置在设备端有两个原因一来识别出的文本必须先进入服务器语言才能被 LUIS 理解这一步在消息离开设备前完成二来应答文本在进入 TTS 前完成回译保证合成语音的语言与用户一致。同一翻译能力的三种落点设备端、云端与 SDK课程在同一个 code 目录下给出了三套实现可以对照理解翻译能力的不同放置位置树莓派本篇设备端直接用 REST API 调用 Translator密钥写在设备代码中适合资源充足、能自由出网的单板机WIO Terminal资源受限的嵌入式设备改为调用 Azure Functions 中的 translate-text 函数 作为代理。C 侧的 TextTranslator 类 将text、from_language、to_language序列化为 JSON POST 到TRANSLATE_FUNCTION_URL由 Functions 侧读取环境变量TRANSLATOR_KEY与TRANSLATOR_LOCATION完成真正的 API 调用再返回翻译文本——密钥因此不落在设备上虚拟设备识别环节改用 Speech SDK 的TranslationRecognizerSpeechTranslationConfig中设置speech_recognition_language与target_languagesSDK 在识别的同时直接返回目标语言文本识别方向不再需要 REST 翻译但 TTS 方向仍保留与树莓派版一致的 RESTtranslate_text实现见 virtual-iot-device/smart-timer/app.py。Functions 侧的环境变量配置可在 local.settings.json 中对照查看TRANSLATOR_KEY、TRANSLATOR_LOCATION。三种方案对应同一条架构主线识别与合成用 Speech 服务翻译用 Translator 服务差异只在于翻译调用放在设备端 REST、云端代理还是 SDK 内置能力。后续方向与清理完成本课后的进阶任务是用两台设备其中一台可以是虚拟设备搭建通用翻译机一台配置为一种语言另一台配置为另一种语言各自把语音转为文本经 IoT Hub 与 Functions 发给对方翻译后播放——完整要求见 assignment.md。本课是消费者项目的最后一课。课程 README 提醒完成课程与作业后应按 clean-up 指南 清理你创建的 cloud 资源Speech、Translator、IoT Hub、Functions 等以免产生不必要的费用。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表