IoT-For-Beginners 多语言支持实战:在虚拟 IoT 设备上用 Azure 语音翻译与 Translator 服务实现多语言智能定时器 IoT-For-Beginners 多语言支持实战在虚拟 IoT 设备上用 Azure 语音翻译与 Translator 服务实现多语言智能定时器【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本指南基于 IoT-For-Beginners 课程第 24 课「Support multiple languages」中的虚拟设备实践章节讲解如何把上一课仅支持单语的智能定时器升级为支持多语言交互先用 Azure 语音服务Speech service把用户语音直接翻译成服务器语言文本并发送到 IoT Hub再用 Translator 服务把服务器生成的应答文本翻译回用户语言并合成语音播放。读完本文你将掌握SpeechTranslationConfig/TranslationRecognizer的多语种语音翻译用法以及 Microsoft Translator REST APIv3.0的完整调用流程可直接在 虚拟设备完整源码 中落地验证。背景为什么智能定时器需要两级翻译在前面三课中你已经实现了语音转文本Speech to text、语言理解LUIS和文本转语音Text to speech但整套流水线都只围绕一种语言通常是英语工作识别英语语音 → LUIS 理解英语 → 用英语 SSML 播报应答。要让定时器听懂并回应法语、粤语等其他语言最务实的做法并非为每种语言重新训练 LUIS 模型而是利用翻译能力把用户侧语言与服务器侧语言解耦上行方向用户说一种语言语音服务在识别的同时直接把结果翻译成服务器语言用于 LUIS 的英语应用核心逻辑保持不变下行方向服务器用英语生成应答文本如 Times up on your 2 minute 27 second timer.再通过 Translator 服务翻译回用户语言最后用对应语言的声音合成播放。课程 README.md 中的架构图直观展示了日语输入 → 英语处理 → 日语应答的翻译流程这种方案的价值在于应用核心LUIS 理解、定时逻辑、IoT Hub 消息始终用服务器语言运行通过翻译层快速为任意语言提供支持后续再逐步演进为端到端母语支持。其代价是不同语言表达同一含义的方式不同机器翻译结果可能与 LUIS 训练示例不完全一致这点在 测试与调优 一节会专门讨论。前期准备从单语识别代码升级本节实践以第 3 课Spoken feedback结束时的smart-timer项目为起点。在 VS Code 中打开该项目并确保虚拟环境已激活终端提示符应显示(.venv)。上一课虚拟设备的识别部分使用SpeechConfig与SpeechRecognizer源码可参考 3-spoken-feedback 的虚拟设备代码recognizer_config SpeechConfig(subscriptionspeech_api_key, regionlocation, speech_recognition_languagelanguage) recognizer SpeechRecognizer(speech_configrecognizer_config)本课的核心改造正是把这段单语识别配置替换为多语种翻译识别。第一步用语音服务翻译用户语音语音服务不仅能将语音转写成同语言文本还能把识别输出直接翻译成其他语言。注意翻译能力仅存在于 Speech SDK 中REST API 并不内置翻译README.md 对此有明确说明。1. 新增导入在app.py现有导入下方追加from azure.cognitiveservices import speech from azure.cognitiveservices.speech.translation import SpeechTranslationConfig, TranslationRecognizer import requestsSpeechTranslationConfig与TranslationRecognizer用于语音翻译requests库则在稍后调用 Translator REST API 时使用。完整源码的导入部分见 app.py。2. 定义用户语言与服务器语言智能定时器现在需要两个语言变量language表示用户实际说话的语言也是最终应答播报的语言server_language表示训练 LUIS 所用语言即服务器内部处理语言language user language server_language server language将user language替换为用户语言的语言标记locale例如法语fr-FR、粤语zh-HK将server language替换为训练 LUIS 时所用语言的 locale。⚠️ 原文档给出的粤语示例写作zn-HK这是笔误正确的语言标记为zh-HK。支持语言的完整列表及其 locale 名称可查阅微软语音服务的语言与声音支持文档Speech-to-text 一节。3. 用 SpeechTranslationConfig 替换 SpeechConfig将上一课的recognizer_config和recognizer声明整体替换为translation_config SpeechTranslationConfig(subscriptionspeech_api_key, regionlocation, speech_recognition_languagelanguage, target_languages(language, server_language)) recognizer TranslationRecognizer(translation_configtranslation_config)这段代码创建了一个翻译配置以用户语言language作为识别语言同时要求输出用户语言与服务器语言两种翻译随后用该配置创建TranslationRecognizer——一种可以把语音识别结果翻译成多种语言的识别器。 关键细节target_languages必须包含原始语言即speech_recognition_language否则不会产生任何翻译结果。这是因为返回的translations字典始终同时包含原文与译文条目原文语言也需要一个键位来存放。4. 改写 recognized 事件处理器将recognized函数整体内容替换为if args.result.reason speech.ResultReason.TranslatedSpeech: language_match next(l for l in args.result.translations if server_language.lower().startswith(l.lower())) text args.result.translations[language_match] if (len(text) 0): print(fTranslated text: {text}) message Message(json.dumps({ speech: text })) device_client.send_message(message)逻辑要点recognized事件并非只在翻译成功时触发它也可能在语音被识别但未翻译时触发因此先用args.result.reason speech.ResultReason.TranslatedSpeech判断本次事件确实是语音被翻译args.result.translations是一个字典通过next(...)找到与服务器语言匹配的条目。注意字典的键是locale 的语言部分而非完整 locale——例如请求翻译到fr-FR时字典键是fr而不是fr-FR所以匹配逻辑使用server_language.lower().startswith(l.lower())这种前缀匹配取到非空译文后打印并封装为Message通过device_client.send_message(message)发送到 IoT Hub供 Functions 应用里的text-to-timer函数做 LUIS 意图解析该函数实现见 text-to-timer/init.py它按number与time unit实体计算总秒数。5. 运行测试确保 Functions 应用正在运行然后用用户语言说出定时请求自己说该语言或用翻译 App 播放译文。预期输出(.venv) ➜ smart-timer python app.py Connecting Connected Translated text: Set a timer of 2 minutes and 27 seconds.至此上行链路用户语言 → 服务器语言文本 → IoT Hub已经打通。注意本课完整代码中recognizer.recognized.connect(recognized)与recognizer.start_continuous_recognition()的接线方式与上一课完全一致见 app.py。第二步用 Translator 服务把应答文本翻译回用户语言语音服务只支持语音 → 多语言文本不支持把文本翻译回语音。因此下行链路需要借助独立的 Translator 服务——它提供文本翻译的 REST API并且除翻译外还支持脏话过滤、术语自定义等扩展能力见 README.md。若你尚未创建 Translator 资源可参照 README.md 的创建命令az cognitiveservices account create --name smart-timer-translator --resource-group smart-timer --kind TextTranslation --sku F0 --yes --location location随后用az cognitiveservices account keys list取回密钥。1. 添加 Translator API 密钥在speech_api_key下方新增translator_api_key key将key替换为 Translator 资源的 API 密钥。2. 定义 translate_text 函数在say函数上方定义translate_text(text)把文本从服务器语言翻译到用户语言。完整实现见 app.py分三部分讲解。定义 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 }两个关键点该 API 的 URL 不区分区域区域信息通过请求头Ocp-Apim-Subscription-Region传递与语音服务不同Translator 直接使用 API 密钥Ocp-Apim-Subscription-Key无需先从 token 签发 API 换取访问令牌——对比 text-to-speech 函数 中语音 TTS 需要get_access_token()调sts/v1.0/issuetoken的做法可见两者鉴权机制差异。定义查询参数与请求体params { from: server_language, to: language } body [{ text : text }]params声明源语言from与目标语言to本次调用把服务器语言翻译为用户语言body是数组因为单次调用可以翻译多段文本每段是一个{text: ...}对象。发起请求并解析响应response requests.post(url, headersheaders, paramsparams, jsonbody) return response.json()[0][translations][0][text]返回的响应是一个 JSON 数组其中每个元素对应body中的一段文本内部translations数组存放各目标语言译文。单段文本、单一目标语言时的典型响应[ { translations: [ { text: Chronométrant votre minuterie de 2 minutes 27 secondes., to: fr } ] } ]因此response.json()[0][translations][0][text]取的就是第一段文本的第一条译文的text字段。作为对照仓库中 Functions 应用的 translate-text 函数 使用完全相同的 URL、请求头、参数与响应解析逻辑只是把from_language/to_language从 HTTP 请求体动态读取——可见这套 REST 调用模式在该课程里被设备端与云端一致复用。3. 改造 say 函数在生成 SSML 之前先翻译待播报文本并打印原文与译文便于调试print(Original:, text) text translate_text(text) print(Translated:, text)改造后的say函数流程完整实现见 app.py打印原文调用translate_text得到用户语言译文构造 SSMLspeak与voice标签的xml:lang使用用户语言language声音名first_voice.short_name通过get_voices_async()按用户语言 locale 匹配得到见 app.py先recognizer.stop_continuous_recognition()暂停识别避免设备播报声音被自己的麦克风再次识别成指令speech_synthesizer.speak_ssml(ssml)播放完成后立即start_continuous_recognition()恢复监听。第三步端到端运行与测试确保 Functions 应用运行用用户语言请求一个定时器。完整运行输出(.venv) ➜ smart-timer python app.py Connecting Connected Translated text: 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.其中上行Translated text来自语音服务的翻译识别下行Original/Translated两行来自say函数内的 Translator 调用。需要指出的是法语译文2 minute 27 seconde minute a commencé与母语者的自然表达仍有差距这正是机器翻译的典型表现——不影响理解但不够地道。测试与调优语义差异处理不同语言表达同一含义的方式往往不同例如法语中我叫 Jim直译是Je mappelle Jim——字面为我称呼我自己为 Jim语序和用词都不同于英语因此翻译结果很可能与 LUIS 训练时提供的示例不完全一致。若定时器无法从翻译后的文本中解析出正确的时间建议把实际出现的翻译句式作为新示例补充进 LUIS重新训练模型重新发布到Staging槽位对应 text-to-timer 函数 中get_slot_prediction请求的发布槽。多语言设备实操提示如果你不会第二种语言可以用 Bing Translate 或 Google Translate 把句子翻译成目标语言再借助听译文功能把译文播放给麦克风。注意语音识别器可能会忽略设备自身播放的部分声音必要时需用另一台设备播放译文从本课到万能翻译器作业本课是 6-consumer 项目的最后一课。完成实践后作业说明 要求你基于本课学到的语音识别、LUIS、语音合成与翻译能力用两台 IoT 设备搭建一个万能翻译器每台设备各配置一种语言一台设备把语音转成文本发送给对方对方设备翻译后用目标语言语音播放。作业提示指出设备间传递语音文本时应同时携带语言信息以简化翻译也可先用 IoT Hub 与 Functions 应用注册设备并把语言存入 Azure Storage。由于这是本项目的最后一课完成作业后应参照 clean-up.md 清理云资源请先完成作业再清理作业运行期间需要这些服务。小结本文完整复现了虚拟 IoT 设备的多语言改造路径用SpeechTranslationConfigTranslationRecognizer把用户语音实时翻译为服务器语言并发送到 IoT Hub用 Translator REST API v3.0 把服务器应答文本翻译回用户语言最终以用户语言合成语音播报。两个方向的关键实现证据分别位于 虚拟设备完整源码语音翻译 文本翻译 SSML 合成与 translate-text 云函数云端侧相同 REST 调用的镜像实现。掌握了这套识别语言 A → 处理语言 B → 播报语言 A的翻译架构你便可以为任意 IoT 应用快速叠加多语言能力。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考