IoT 智能定时器多语言支持实战:Virtual IoT Device 上使用 Azure 语音翻译与 Translator 服务构建双语语音助手
2026/9/15 17:34:14 网站建设 项目流程

IoT 智能定时器多语言支持实战:Virtual IoT Device 上使用 Azure 语音翻译与 Translator 服务构建双语语音助手

【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners

导读

本文是 6-consumer 第 4 课"支持多语言"(Support multiple languages)中面向虚拟 IoT 设备(Virtual IoT Device)的实战指南,讲解如何在smart-timer智能定时器项目中叠加两层翻译能力:先用 Azure 认知服务语音(Speech service)在"语音转文本"的同时把用户语音直接翻译成服务器语言(用于 LUIS 意图理解),再用 Translator 服务的 REST API 把服务器生成的回复文本翻译回用户语言,最后通过语音合成(TTS)朗读出来。读者学完后,将掌握SpeechTranslationConfig/TranslationRecognizer的翻译式语音识别用法,以及调用api.cognitive.microsofttranslator.com文本翻译 REST API 的完整流程,并能在本地虚拟设备上实现"用任意语言与 LUIS 训练语言对话"的多语言 IoT 语音应用。

多语言架构:用户语言与服务器语言的双轨设计

本课的多语言方案基于一个务实的前提:让整个应用端到端理解所有语言工作量巨大,因此引入翻译服务来加速交付。核心思路是"核心逻辑保持单语言,翻译放在输入与输出的两端":

  • 服务器语言(server language):训练 LUIS 所用的语言,也是应用内部生成回复文本所采用的语言;
  • 用户语言(user language):用户实际开口说话的语言。

用户用母语说出"设置 2 分 27 秒的定时器"后,设备端完成"语音识别 + 翻译"两步合一,将译文以speech字段发送到 IoT Hub,由函数应用(Functions)交给 LUIS 做意图理解;而 LUIS 返回的定时器提示语(如 "Times up on your 2 minute 27 second timer.")在朗读之前,会先通过 Translator 服务翻译回用户语言。整个链路可以参照架构图 translated-smart-timer.png:日语语音 → 翻译成英语处理 → 再翻译回日语播报。

用语音服务同时完成识别与翻译

语音服务不仅能将语音转成同语言的文本,还支持在识别的同时把输出翻译成其他语言。这一步完全由语音 SDK 完成,是本文档的第一个核心实战环节。完整代码位于 code/virtual-iot-device/smart-timer/app.py。

步骤一:补充导入语句

app.py现有 import 之下追加:

from azure.cognitiveservices import speech from azure.cognitiveservices.speech.translation import SpeechTranslationConfig, TranslationRecognizer import requests

前两行导入翻译式语音识别所需的配置类与识别器类,requests库则用于稍后调用 Translator 服务的 REST API。

步骤二:声明双语言变量

language = '<user language>' server_language = '<server language>'
  • <user language>替换为你将要口述的语言的区域设置(locale)名称,例如法语fr-FR、粤语zh-HK
  • <server language>替换为训练 LUIS 时所用语言的 locale 名称。

💁 如果你只会一种语言,可以先用 Bing Translate 或 Google Translate 之类的服务,把诸如 "set a 2 minute and 27 second timer" 的句子翻译成目标语言,再点击Listen translation按钮让翻译工具把译文朗读到麦克风里。注意语音识别器会忽略设备的部分音频输出,因此可能需要额外的设备来播放译文。下图展示了 Bing Translate 上的 Listen translation 按钮:

步骤三:用翻译配置替换原识别配置

将上一课中的recognizer_configrecognizer声明替换为:

translation_config = SpeechTranslationConfig(subscription=speech_api_key, region=location, speech_recognition_language=language, target_languages=(language, server_language)) recognizer = TranslationRecognizer(translation_config=translation_config)

这段配置的含义是:以language(用户语言)作为识别输入语言,同时请求翻译到languageserver_language两种目标语言;随后基于该配置创建TranslationRecognizer——一个能把语音识别结果翻译成多语言的识别器。

💁关键细节:原始语言必须出现在target_languages中,否则你不会收到任何翻译结果。

步骤四:改写 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(f'Translated text: {text}') message = Message(json.dumps({ 'speech': text })) device_client.send_message(message)

这段代码做了三件事:

  1. 事件类型判断recognized事件并非只在翻译成功时触发,也可能在"已识别但未翻译"的情况下触发,因此必须用speech.ResultReason.TranslatedSpeech做过滤;
  2. 按服务器语言提取译文args.result.translations字典的键是 locale 的语言部分而非完整设置。例如请求翻译到fr-FR时,字典里的键是fr。因此代码用server_language.lower().startswith(l.lower())来匹配,兼容frfr-FR这类差异;
  3. 发送到 IoT Hub:将译文封装为 JSON 字段speech,通过device_client.send_message(message)发送。

在仓库的完整实现 app.py 中,事件通过recognizer.recognized.connect(recognized)挂接,随后recognizer.start_continuous_recognition()启动连续识别。

步骤五:运行验证

确保函数应用(Functions)正在运行,然后以用户语言请求一个定时器——可以自己开口说,或用翻译应用播放译文:

(.venv) ➜ smart-timer python app.py Connecting Connected Translated text: Set a timer of 2 minutes and 27 seconds.

当用户用法语说出请求时,控制台打印的却是英语译文,说明语音服务已在识别阶段完成翻译,LUIS 得以用服务器语言继续处理。

用 Translator 服务把回复文本翻译回用户语言

语音服务不支持"把文本翻译回语音",因此反向链路需要借助Translator 服务的 REST API 来翻译回复文本。这一步对应本文档的第二个核心实战环节,在 app.py 中有完整实现,函数应用侧的等价版本可见 translate-text/init.py。

步骤一:配置翻译器 API Key

speech_api_key下方添加:

translator_api_key = '<key>'

<key>替换为你的 Translator 服务资源的 API Key(如何创建资源与获取 Key,参见 README.md 中的az cognitiveservices account createaz cognitiveservices account keys list命令,资源类型为TextTranslation,SKU 为 F0)。

步骤二:定义 translate_text 函数

say函数上方定义translate_text(text),负责把文本从服务器语言翻译成用户语言。函数内部依次完成四步:

1. 定义 URL 与请求头:

url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0' headers = { 'Ocp-Apim-Subscription-Key': translator_api_key, 'Ocp-Apim-Subscription-Region': location, 'Content-type': 'application/json' }

与语音服务不同,Translator 的 URL不区分区域,区域信息通过Ocp-Apim-Subscription-Region请求头传入;API Key 直接使用,无需像 TTS 那样先向令牌颁发接口(sts/v1.0/issuetoken)换取访问令牌——这一对比在函数应用的 text-to-speech/init.py 中可以清楚看到。

2. 定义查询参数与请求体:

params = { 'from': server_language, 'to': language } body = [{ 'text' : text }]

params指定翻译方向:从服务器语言(from)到用户语言(to);body为待翻译文本数组——设计为数组是因为一次调用可以翻译多个文本块

3. 发起 POST 请求:

response = requests.post(url, headers=headers, params=params, json=body)

返回的响应是一个 JSON 数组,每个元素对应body中的一个条目,其translations字段包含该条目在所有目标语言下的译文:

[ { "translations": [ { "text": "Chronométrant votre minuterie de 2 minutes 27 secondes.", "to": "fr" } ] } ]

4. 提取译文:

return response.json()[0]['translations'][0]['text']

即取数组第一个条目的第一条翻译的text属性。

步骤三:在 say 函数中接入翻译

在生成 SSML 之前翻译待朗读文本:

print('Original:', text) text = translate_text(text) print('Translated:', text)

这两条print会把原文与译文同时输出到控制台,便于排查翻译是否符合预期。在完整实现中,翻译后的text会被拼入 SSML(<speak><voice>标签,语音名来自get_voices_async()按 locale 匹配到的语音),随后speech_synthesizer.speak_ssml(ssml)播报;为免播报被麦克风误识别,播报前会stop_continuous_recognition(),播报后恢复识别。

步骤四:运行验证

保持函数应用运行,再次以用户语言请求定时器:

(.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.

可见:上行链路(识别阶段翻译)输出英语供 LUIS 处理,下行链路(回复播报)输出用户语言的法语语音,双向闭环打通。

多语言翻译的注意事项

  1. 翻译与 LUIS 训练样本可能不一致:不同语言表达同一含义的方式不同,译文可能与你在 LUIS 中提供的示例略有出入。若出现这种情况,应在 LUIS 中补充更多示例、重新训练并重新发布模型,而不是修改代码中的翻译逻辑。
  2. 机器翻译的固有局限:不同语言对同一句话的措辞习惯不同,翻译结果未必符合期望的表达;且翻译并不总是对称的——A 语译 B 语再译回 A 语,得到的句子可能略有差异。这是机器翻译(含统计机器翻译与神经翻译混合方案)的普遍现象,也是本课架构中"核心逻辑保持单一语言"这一设计的原因。
  3. 原语言必须列入 target_languages:否则TranslationRecognizer不产生任何翻译,recognized回调中将无法匹配到译文。
  4. 翻译字典的键是语言部分:请求fr-FR得到的键是fr,匹配时应采用"前缀匹配"策略(即startswith写法),而不要直接比较完整 locale。

小结

本文档完成了smart-timer多语言化的设备端全部编码工作:输入侧利用SpeechTranslationConfigTranslationRecognizer在识别语音的同时翻译到服务器语言,直接对接 LUIS 管道;输出侧利用 Translator 服务的 REST API(api-version=3.0,Key 与 Region 通过请求头传递)把回复文本翻译回用户语言后再合成语音。完整可运行代码见 code/virtual-iot-device/smart-timer/app.py,云侧函数应用(含translate-texttext-to-speechtext-to-timerget-voices四个触发器)位于 code/functions/smart-timer-trigger。作为该项目的收尾一课,完成本文后别忘了按 clean-up.md 清理云资源;若想进一步挑战,可参考 assignment.md 使用两台设备构建"通用翻译器"。

【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询