拓冰建站拓冰建站
首页 / 资讯中心 / 正文

IoT-For-Beginners 实战任务:用两台 IoT 设备构建支持多语言的通用翻译器

IoT-For-Beginners 实战任务用两台 IoT 设备构建支持多语言的通用翻译器【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本文是微软开源课程《IoT-For-Beginners》12 周、24 课第 6 专题“消费者应用”第 4 课“支持多语言”的课后实战任务指南。任务目标是将前几课学到的语音识别Speech-to-Text、语言理解LUIS、文本转语音Text-to-Speech能力串联起来使用两台 IoT 设备构建一个“通用翻译器Universal Translator”一台设备接收一种语言的语音经云端翻译后由另一台设备以另一种语言播放出来。读完本文你将掌握端到端多语言语音翻译系统的整体架构、IoT Hub Azure Functions 的消息链路设计以及虚拟设备、树莓派、Wio Terminal 三类硬件上的具体实现方法。任务概述什么是通用翻译器通用翻译器是一类可以在多种语言之间进行翻译的设备它让使用不同语言的人能够直接对话交流。本任务要求你基于前几课积累的 IoT 与 Azure AI 能力用两台 IoT 设备搭建一个最小可用的通用翻译器一台设备配置为语言 A例如英语另一台设备配置为语言 B例如法语或粤语每台设备都需要完成完整的处理链路采集语音capture speech→ 转换为文本convert to text→ 通过 IoT Hub 和 Functions 应用发送给另一台设备 → 翻译translate→ 播放翻译后的语音play the translated speech。若你手上只有一台实体设备可按前几课的步骤将其中一台设备设置为虚拟 IoT 设备Virtual IoT Device用软件模拟补齐第二台设备完整方案在 虚拟设备翻译指南 中有详细实现。这是整个课程中最后一课的任务因此在完成任务后别忘了按照 clean-up.md 清理所使用的云服务资源注意完成本任务前需要保留这些服务。原任务提示让消息带上语言信息原任务给出了一条非常关键的设计建议当从一台设备向另一台设备发送语音时一并发送它所使用的语言这样会让翻译容易得多。你甚至可以更进一步先让每台设备通过 IoT Hub 和 Functions 应用完成“注册”把自身支持的语言存入 Azure Storage之后由 Functions 应用统一负责翻译逻辑并把翻译后的文本回发给对应的 IoT 设备。这条提示实际上给出了两种可选的架构路线轻量路线消息里同时携带speech文本与语言标识接收端拿到文本和语言后直接调用翻译服务注册中心路线设备语言信息集中存储在 Azure StorageFunctions 应用作为翻译中枢根据消息内容自动判断源语言与目标语言实现“翻译逻辑不下放到设备”。在课程附带的代码实现中采用了“消息携带语言 Functions 作为翻译入口”的组合方案具体可参考 虚拟设备 app.py 与 translate-text 触发器。背景知识本任务用到的翻译技术本任务是“支持多语言”课程的收官实战因此理解课程中讲解的翻译技术有助于你正确实现任务。以下是课程 README.md 中的核心概念机器翻译Machine Translation, MT与语言对文本翻译是一个被研究了 70 多年的计算机科学问题。传统机器翻译通过词语替换在语言之间翻译并辅以大量规则数据库与统计方法即统计机器翻译来挑选最合适的短语翻译方式。不同翻译工具支持的语言对language pairs可能并不完整——例如某个翻译器支持“英语↔西班牙语”和“西班牙语↔意大利语”却不支持“英语↔意大利语”。词语替换并不能解决所有问题语序不同法语“Je mappelle Jim”直译是“I myself call Jim”、习语“ants in my pants”在德语中是“屁股里有大黄蜂”都会让直译失效。而人名、专有名词等不可翻译内容则采用音译transliteration处理。神经翻译Neural Translation神经翻译借助 AI 模型翻译整句话模型基于海量人工翻译语料网页、书籍、联合国文档等训练。相比传统 MT神经翻译模型通常更小无需庞大的短语库。现代翻译服务往往混合使用统计方法与神经翻译。需要注意的是任何语言对都不存在 1:1 的翻译不同模型因训练数据不同会产生略有差异的结果翻译也并非对称的来回翻译两次可能得到不同句子。两类可用的 AI 翻译服务课程中介绍了两个可以直接从应用调用的翻译相关服务Speech 服务语音服务前几课一直在使用它的语音识别能力内建了翻译选项——识别语音时不仅返回同语言文本还可以同时返回其他语言的翻译。需要注意这个能力只存在于 Speech SDKREST API 不提供内建翻译。Translator 服务翻译服务专门用于文本翻译的独立服务可将文本从一种语言翻译为一种或多种目标语言还支持脏话屏蔽masking profanity、以及为特定词句指定译文例如把“Raspberry Pi”保留原名而不译为“une pi aux framboises”。第一步创建 Translator 资源本任务需要翻译文本。你可以选择使用 Translator 服务的 REST API课程 README 的方式也可以复用 Speech 服务的翻译能力虚拟设备实现即采用此方式。若选择 REST API 路线按以下命令创建资源az cognitiveservices account create --name smart-timer-translator \ --resource-group smart-timer \ --kind TextTranslation \ --sku F0 \ --yes \ --location location将location替换为你创建资源组时使用的区域--sku F0为免费层Free tier适合学习用途创建后获取 API 密钥az cognitiveservices account keys list --name smart-timer-translator \ --resource-group smart-timer \ --output table复制返回结果中的任意一个密钥备用。第二步设计云端翻译链路IoT Hub Functions在“智能计时器smart-timer”项目已有的基础上实现通用翻译器需要新增一条文本翻译链路。仓库中的 Functions 应用code/functions/smart-timer-trigger包含四个 HTTP 触发器text-to-timerLUIS 语言理解、get-voices、text-to-speech文本转语音和translate-text文本翻译。translate-text 触发器把翻译服务包成 HTTP 接口对于 Wio Terminal 这类嵌入式设备直接在设备上调用 Translator REST API 较为繁琐因此课程将它封装为 Functions 中的一个 HTTP 触发器。核心代码如下translate-text/init.pyimport logging import os import requests import azure.functions as func location os.environ[TRANSLATOR_LOCATION] translator_key os.environ[TRANSLATOR_KEY] def main(req: func.HttpRequest) - func.HttpResponse: req_body req.get_json() from_language req_body[from_language] to_language req_body[to_language] text req_body[text] logging.info(fTranslating {text} from {from_language} to {to_language}) url fhttps://api.cognitive.microsofttranslator.com/translate?api-version3.0 headers { Ocp-Apim-Subscription-Key: translator_key, Ocp-Apim-Subscription-Region: location, Content-type: application/json } params { from: from_language, to: to_language } body [{ text : text }] response requests.post(url, headersheaders, paramsparams, jsonbody) return func.HttpResponse(response.json()[0][translations][0][text])关键实现细节Translator REST API 的 URL 不区分区域区域通过请求头Ocp-Apim-Subscription-Region传递API 密钥直接使用无需像 Speech 服务那样先从令牌接口换取 access tokenparams中的from/to为语言区域标识locale如fr-FR、en-USbody是数组结构因为一次调用可以翻译多段文本响应为 JSON 数组取第一项的第一个翻译结果response.json()[0][translations][0][text]即为译文。创建该触发器后需要在 local.settings.json 中补充两个环境变量TRANSLATOR_KEY: key, TRANSLATOR_LOCATION: location本地启动 Functions 应用后即可用 curl 或 Postman 以 JSON body 调用测试{ text: Définir une minuterie de 30 secondes, from_language: fr-FR, to_language: en-US }该示例将法语Définir une minuterie de 30 secondes翻译为美式英语返回Set a 30-second timer。两台设备如何通信消息 设备方法在通用翻译器架构中两台设备之间通过 IoT Hub 进行消息传递设备 A 将识别并翻译好的文本作为设备到云消息device-to-cloud message发送到 IoT HubFunctions 应用或接收端设备消费该消息文本转语音后的播放结果由云到设备cloud-to-device链路驱动。在虚拟设备实现中translate_text与say函数演示了“设备本地翻译 本地 TTS”的做法而 Wio Terminal 版本则全部经由 Functions 的 HTTP 触发器完成参见 wio-terminal 代码 中的text_translator.h与 config.h其中通过TRANSLATE_FUNCTION_URL指向translate-text触发器。第三步在设备端实现“听 → 译 → 说”方式一虚拟 IoT 设备Python虚拟设备方案使用 Speech SDK 的翻译识别器TranslationRecognizer一次性完成“识别 翻译”完整代码见 code/virtual-iot-device/smart-timer/app.py。引入翻译相关类from azure.cognitiveservices import speech from azure.cognitiveservices.speech.translation import SpeechTranslationConfig, TranslationRecognizer import requests设置用户语言与服务器语言language为用户所说语言server_language为训练 LUIS 所用的语言language user language # 例如 fr-FR法语、zh-HK粤语 server_language server language配置翻译识别器注意原始语言必须同时出现在target_languages中否则拿不到任何翻译结果translation_config SpeechTranslationConfig(subscriptionspeech_api_key, regionlocation, speech_recognition_languagelanguage, target_languages(language, server_language)) recognizer TranslationRecognizer(translation_configtranslation_config)处理识别事件并发送到 IoT Hubargs.result.translations字典的键是locale 中的语言部分如请求fr-FR时键为fr而非fr-FR因此匹配服务器语言时使用了server_language.lower().startswith(l)def recognized(args): 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)用 Translator REST API 翻译回复文本语音服务不支持“文本翻译回语音”因此对回复文本如“2 minute 27 second timer started.”改用 Translator 服务从服务器语言翻译到用户语言def translate_text(text): 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 } params { from: server_language, to: language } body [{ text : text }] response requests.post(url, headersheaders, paramsparams, jsonbody) return response.json()[0][translations][0][text]然后在say函数中先翻译再合成语音并打印原文与译文便于调试def say(text): print(Original:, text) text translate_text(text) print(Translated:, text) # 之后构造 SSML 调用 SpeechSynthesizer.speak_ssml(...)运行验证确保 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.由于不同语言表达习惯不同译文可能与训练 LUIS 时的示例不完全一致。此时应给 LUIS 补充更多示例重新训练并发布模型。方式二Wio TerminalArduino CWio Terminal 方案中设备不直接调用 Translator REST API而是通过translate-text触发器间接调用。核心步骤详见 wio-terminal-translate-speech.md在 config.h 中设置用户语言、服务器语言、翻译密钥/区域与 Functions URLconst char *LANGUAGE user language; // 例如 fr-FR const char *SERVER_LANGUAGE server language; // 例如 en-US const char *TRANSLATOR_API_KEY KEY; const char *TRANSLATOR_LOCATION LOCATION; const char *TRANSLATE_FUNCTION_URL http://IP_ADDRESS:7071/api/translate-text;新建 text_translator.h 声明TextTranslator类用DynamicJsonDocument构造 JSON body经HTTPClientPOST 到 Functions 触发器解析 HTTP 200 响应获得译文DynamicJsonDocument doc(1024); doc[text] text; doc[from_language] from_language; doc[to_language] to_language; String body; serializeJson(doc, body); HTTPClient httpClient; httpClient.begin(_client, TRANSLATE_FUNCTION_URL); int httpResponseCode httpClient.POST(body);在main.cpp中对识别到的语音和要播报的回复分别调用textTranslator.translateText(...)识别文本从用户语言译为服务器语言供 LUIS 理解回复文本从服务器语言译为用户语言供 TTS 播放。Wio Terminal 串口监视器中的完整运行日志可印证双向翻译链路法语 → 英语识别翻译 → 法语回复{RecognitionStatus:Success,DisplayText:Définir une minuterie de 2 minutes 27 secondes.,...} Translating Définir une minuterie de 2 minutes 27 secondes. from fr-FR to en-US Translated: Set a timer of 2 minutes 27 seconds. Translating 2 minute 27 second timer started. from en-US to fr-FR Translated: 2 minute 27 seconde minute a commencé. Translating Times up on your 2 minute 27 second timer. from en-US to fr-FR Translated: Chronométrant votre minuterie de 2 minutes 27 secondes.语言选择与无第二台设备时的处理设备语言配置将language/LANGUAGE设置为用户所说语言的 locale如fr-FR法语、zh-HK粤语server_language/SERVER_LANGUAGE设置为训练 LUIS 的语言。Speech 服务支持的语种与 locale 列表可在 Speech 服务的“语言和语音支持”文档中查询。只说一种语言怎么办可以使用在线翻译服务如 Bing 翻译的“听译”按钮把训练语料的句子译成目标语言并朗读给麦克风识别。需要注意的是语音识别器会忽略部分设备播放的音频可能需要额外的设备来播放翻译文本。缺少第二台实体设备按前几课步骤创建虚拟 IoT 设备作为两台设备中的一台即可完成端到端联调。评分标准Rubric标准优秀合格需改进构建通用翻译器成功构建通用翻译器将一台设备识别到的语音转换为另一台设备以不同语言播放的语音只跑通了部分组件如语音采集或翻译但未完成端到端整体方案未构建出通用翻译器的任何可用部件对照该标准建议按以下顺序自检先保证单台设备能完成“采集语音 → 转文本”再打通“发送到 IoT Hub / Functions”最后验证“另一台设备收到并播放不同语言的语音”直至端到端链路完整可用。参考实现与延伸阅读课程正文多语言支持原理、机器翻译与神经翻译对比、Translator 资源创建README.md任务原文assignment.md三种硬件的翻译接入指南Wio Terminal / 树莓派 / 虚拟设备完整示例代码Functions 应用、虚拟设备、Wio Terminal任务完成后云资源清理clean-up.md本任务让你亲手把语音识别、语言理解、文本翻译与语音合成四项 Azure AI 能力串联为真实的跨语言通信系统——这正是“通用翻译器”从科幻走向现实的基本形态。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门