IoT-For-Beginners 第 24 课实战:使用 Azure 语音翻译与 Translator 服务为智能定时器构建多语言支持(虚拟设备篇)
2026/9/15 11:33:30 网站建设 项目流程

IoT-For-Beginners 第 24 课实战:使用 Azure 语音翻译与 Translator 服务为智能定时器构建多语言支持(虚拟设备篇)

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

本指南基于 IoT-For-Beginners 项目第 6 部分《消费类物联网》第 4 课,讲解如何为虚拟 IoT 设备(Python 实现的 smart-timer)接入两种翻译能力:先用 Azure 认知服务语音 SDK 将用户语音直接翻译成服务器语言文本并发送到 IoT Hub,再用 Translator 服务的 REST API 将服务器端生成的回复文本翻译回用户语言后进行语音播报。读完本文,你将掌握SpeechTranslationConfig/TranslationRecognizer的语音翻译用法、Translator REST API 的调用协议(header、params、body、响应解析),以及完整的多语言端到端语音交互链路。

多语言支持的整体架构:翻译放在哪里

在第 21~23 课中,你已经构建了一个「语音识别 → LUIS 语言理解 → 文本转语音」的完整 smart-timer 应用。第 24 课解决的核心问题是:当用户说的语言与服务器(LUIS 训练语言)不一致时怎么办。与其为每种语言分别训练 LUIS 模型,更务实的方案是在两端各加一层翻译,让核心业务逻辑保持单一语言不变。官方课程文档用一张架构图说明了这个思路:

其流程是:用户用日语说话 → 语音服务识别并翻译成英语文本 → 核心逻辑(LUIS、定时器逻辑、回复生成)全部用英语运行 → 生成的英语回复文本经 Translator 服务翻译回日语 → 语音合成播报。这样只需一次开发,就能快速为应用增加新语言支持。可参考 第 4 课课程主页 了解机器翻译(MT)与神经翻译的技术背景。

本指南对应的官方文档为 virtual-device-translate-speech.md(完整可运行代码在 code/virtual-iot-device/smart-timer/app.py),课程还提供 Raspberry Pi 与 Wio Terminal 两个硬件版本:pi-translate-speech.md、wio-terminal-translate-speech.md。

准备工作:创建 Translator 资源

语音翻译与文本翻译都依赖 Azure 认知服务。语音服务在之前的课程中已创建;本课还需要一个独立的 Translator 资源。在终端中创建并获取密钥:

az cognitiveservices account create --name smart-timer-translator \ --resource-group smart-timer \ --kind TextTranslation \ --sku F0 \ --yes \ --location <location>

<location>替换为创建资源组时使用的区域。随后获取密钥:

az cognitiveservices account keys list --name smart-timer-translator \ --resource-group smart-timer \ --output table

记下其中一个 Key。完成本课与作业后,记得参照 clean-up.md 清理云资源。

用语音服务直接翻译语音

Azure 语音服务不仅能将语音转写成同语言文本,还能在识别的同时把结果翻译成多种语言(此能力仅存在于语音 SDK,语音服务的 REST API 不带翻译功能)。

步骤 1:新增翻译相关导入

在 VS Code 中打开smart-timer项目、确认虚拟环境已激活后,在既有 import 下方添加:

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

第一行导入speech命名空间(用于引用ResultReason.TranslatedSpeech),第二行导入语音翻译所需的两个核心类,第三行的requests库将在后文调用 Translator 服务时使用。仓库中完整代码的导入清单见 app.py。

步骤 2:定义用户语言与服务器语言两个变量

智能定时器将涉及两个语言:用户语言(用户实际说话所用的语言)与服务器语言(训练 LUIS 所用的语言,同时也是生成播报文案的语言)。修改原language变量并新增server_language

language = '<user language>' server_language = '<server language>'
  • <user language>替换为你将要说话的语言区域(locale),例如fr-FR(法语)或zh-HK(粤语)。
  • <server language>替换为训练 LUIS 使用的语言区域。
  • 支持的语言及区域名列表见微软文档「语音转文本的语言和语音支持」章节。

如果你不会说目标语言,可以用 Bing Translate 或 Google Translate 把例句翻译成目标语言,再用其朗读功能把译文说进麦克风。注意语音识别器会屏蔽部分本机音频输出,可能需要额外设备来播放译文——例如 LUIS 用英语训练、用户语言为法语时,可把 "set a 2 minute and 27 second timer" 翻译成法语后点Listen translation按钮播放:

步骤 3:用 SpeechTranslationConfig 与 TranslationRecognizer 替换原识别器

将原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)

这里的关键点是target_languages元组,同时传入了用户语言和服务器语言:即除了把识别结果翻译成服务器语言外,也保留一份用户语言的原文转录。必须把原始语言也放进target_languages,否则不会产生任何翻译结果。

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

逻辑要点:

  1. 事件原因判断recognized事件也可能在「识别了但未翻译」等其他场景触发,因此必须用speech.ResultReason.TranslatedSpeech过滤,只有确认发生了翻译才继续。
  2. 从翻译字典取文本args.result.translations是字典,其键是区域设置的语言部分而非完整区域名——例如请求翻译为fr-FR时,字典的键是fr。因此用server_language.lower().startswith(l.lower())做前缀匹配,找到对应服务器语言的条目。
  3. 发送到 IoT Hub:将翻译后的文本封装为{ 'speech': text }的 JSON 消息,经device_client.send_message发给 IoT Hub,由 Functions 应用完成意图理解。

步骤 5:运行验证语音翻译

确保 Functions 应用正在运行,用用户语言说出定时器指令(本人说或借助翻译应用),预期输出:

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

Translated text即为语音服务把用户语言的语音直接翻译成服务器语言的文本。

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

语音服务不支持把文本翻译后再合成语音(文本到语音只接受单一语言文本),因此回复方向需要 Translator 服务出手——它提供 REST API,可把服务器语言文本翻译成用户语言后再交给 TTS 播报。

步骤 1:添加 Translator API Key

speech_api_key下方新增:

translator_api_key = '<key>'

<key>替换为刚才az cognitiveservices account keys list获取的密钥。

步骤 2:定义 translate_text 函数

say函数上方定义:

def translate_text(text):

该函数负责把文本从服务器语言翻译到用户语言。函数内依次完成以下四件事。

定义 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 的 API 地址是全球统一的、不随区域变化,区域信息通过Ocp-Apim-Subscription-Region请求头传入;同时 API Key 直接用于认证,与语音服务不同,无需先从令牌签发接口换取访问令牌

定义查询参数与请求体:

params = { 'from': server_language, 'to': language } body = [{ 'text' : text }]
  • params指定翻译方向:from为服务器语言,to为用户语言。
  • body是被翻译文本构成的数组——之所以用数组,是因为一次调用可翻译多个文本块,每个块对应响应中的一个元素。

发送 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" } ] } ]

取回首个翻译的 text 字段:

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

完整函数实现见 app.py。

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

say函数生成 SSML 之前插入翻译逻辑:

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

同时把原始文本和翻译后的文本都打印到控制台,便于调试。翻译后的文本将进入后续的 SSML 语音合成流程(<voice xml:lang='...' name='...'>),由SpeechSynthesizer.speak_ssml播报。

步骤 4:运行验证端到端翻译

运行程序,用用户语言请求一个定时器,预期输出形如:

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

第一行来自语音翻译(用户语音 → 服务器语言),后续的Original/Translated对来自文本翻译(服务器语言 → 用户语言)。

由于不同语言表达同一意思的方式不同,翻译结果可能与 LUIS 训练时的示例措辞有出入。若出现这种情况,应向 LUIS 补充更多示例、重新训练并重新发布模型。

源码对照:虚拟设备完整实现与服务端镜像

仓库中的 code/virtual-iot-device/smart-timer/app.py 就是本指南的完整落地代码,它把上述逻辑与第 21~23 课的既有能力整合在一起:

  • 第 23–28 行:SpeechTranslationConfig+TranslationRecognizer持续识别并翻译语音;
  • 第 30–39 行:recognized回调将翻译文本发送到 IoT Hub;
  • 第 45–52 行:SpeechSynthesizer动态选取与language匹配的语音(get_voices_async+ 按 locale 匹配short_name);
  • 第 54–74 行:translate_text完成 Translator REST 调用;
  • 第 76–89 行:say先翻译、再构造 SSML、并在播报前后暂停/恢复连续语音识别stop_continuous_recognition/start_continuous_recognition),避免设备把自己的播报当作用户语音;
  • 第 111–121 行:通过on_method_request_received处理 Functions 下发的set-timer直接方法。

服务端一侧,Functions 应用中也有一个对应的文本翻译实现 translate-text/init.py:它从TRANSLATOR_LOCATIONTRANSLATOR_KEY环境变量读取凭据,接收from_languageto_languagetext三个字段,调用同一 Translator REST API 后直接返回翻译文本——与设备端translate_text的请求头、参数和响应解析完全一致,可作为理解该 REST 协议的最小示例。

延伸任务:构建通用翻译器

完成本课后,assignment.md 提出了一个综合挑战:用两台IoT 设备构建「通用翻译器」——每台设备各配置一种语言,将本机拾取的语音转成文本后,经 IoT Hub 与 Functions 应用发送给对方设备,翻译成对方语言并播报。若只有一台设备,可用虚拟设备充当第二台。课程建议:设备间发送语音时附带其语言标识,可先用 IoT Hub 注册设备并把支持的语言存入 Azure Storage,再由 Functions 完成翻译、把译文回传给设备。这套练习正好把本指南的语音翻译与文本翻译串联成完整的双向会话链路。

至此,你的多语言智能定时器已经可以「听懂」用户语言,并把服务器的回复用用户语言说出来了——多语言支持就这样在两层翻译的辅助下快速落地。

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

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

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

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

立即咨询