
IoT-For-Beginners 结业挑战用语音识别与翻译服务构建双设备通用翻译器【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本文以 IoT-For-Beginners 项目 Consumer 项目线最后一课第 4 课 multiple-language-support的结业作业 Build a universal translator 为主体完整展开该作业的目标、验收标准与参考实现路径利用前几课搭建的 smart-timer 组件让两台 IoT 设备各绑定一种语言通过语音转文本 → IoT Hub → Functions 应用 → 文本翻译 → 文本转语音的链路实现跨语言实时互译。读完后你将掌握通用翻译器的端到端架构设计、云端翻译能力Translator 资源与 Functions 封装的完整配置以及设备端Raspberry Pi / Wio Terminal / 虚拟设备的双向翻译接入代码。作业要求通用翻译器应该做什么原文档对作业的表述是通用翻译器universal translator是一种能在多种语言之间进行翻译的设备让说不同语言的人能够互相交流。作业的完整要求如下逐条继承自 assignment.md使用 2 台 IoT 设备综合应用前几课学到的语音识别、语言理解、语音合成能力来构建通用翻译器如果没有 2 台物理设备可以按照前几课的步骤配置一台虚拟 IoT 设备virtual device作为其中一台每台设备配置一种语言一台一种设备的工作流程为接收语音 → 转换为文本 → 通过IoT Hub 和一个 Functions 应用发送到另一台设备 → 翻译文本 → 播放翻译后的语音。换句话说两台设备各自成为一种语言的本地终端设备 A 的用户用语言 X 说话设备 B 的用户会听到语言 Y 的语音回应反之亦然。参考架构双向翻译与语言标注这一作业本质上是把第 4 课主文档 Support multiple languages 中智能定时器多语言化的方案从单设备推广到双设备输入侧把用户语言翻译成服务器语言供语言理解LUIS处理输出侧再把服务器语言翻译回用户语言用于语音播报。在双设备场景下这套入/出各翻译一次的原则扩展为设备侧每台设备一次入向翻译设备 A 把语言 X 的语音识别后翻译成设备 A 服务器侧使用的语言例如英语随消息发送到 IoT Hub云端Functions 应用做转译Functions 应用从设备 A 接收文本翻译成设备 B 所支持的语言再通过 IoT Hub 发回设备 B对端设备一次出向播放设备 B 收到翻译后的文本直接合成语音播放给语言 Y 的用户。原作业文档给出的三条实现提示Tip是本题的关键设计点完整继承如下发送文本时同时附带语言把语音从一台设备发到另一台时一并发送该文本所属的语言代码这样对端才知道从哪种语言翻译成自己支持的语言省去对端猜测设备先注册并登记语言可以让每台设备先通过 IoT Hub 注册并经由一个 Functions 应用把自己支持的语言存入Azure Storage作为设备的语言档案用 Functions 应用执行翻译由 Functions 应用承担翻译职责把翻译后的文本发送回目标 IoT 设备。从源码结构看仓库中并未提供该作业的双设备完整成品这是一道开放设计题但提供了完成作业所需的全部构件translate-textFunctions 函数、设备端双向翻译代码、以及三套设备平台的移植指南。下文结合仓库中的实际代码说明这些构件如何拼出作业要求的链路。云端翻译能力Translator 资源与 Functions 封装前置资源创建 Translator 资源作业依赖 Support multiple languages 中创建好的 Translator 资源TextTranslation类型、F0免费 SKU以及 speech 资源。若尚未创建可用 Azure CLI 在smart-timer资源组中创建az cognitiveservices account create --name smart-timer-translator \ --resource-group smart-timer \ --kind TextTranslation \ --sku F0 \ --yes \ --location location再取回 API 密钥az cognitiveservices account keys list --name smart-timer-translator \ --resource-group smart-timer \ --output table作业链路中通过 Functions 应用转译这一步直接复用了课程提供的translate-textHTTP 触发函数。translate-text 函数的完整实现translate-text 函数代码 是云端翻译的核心它解析请求体中的from_language、to_language、text三个字段调用 Translator REST API 后返回译文。import 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])几个值得注意的实现细节语言参数化from/to以 URL 参数传递函数本身不绑定具体语言对——这正是作业设备 A 的语言 → 设备 B 的语言这种动态语言对所必需的。设备端只需在请求体中带上源语言和目标语言同一个函数即可服务任意两台设备之间的互译位置以请求头传递Translator API 的端点 URL 不含区域信息区域通过Ocp-Apim-Subscription-Region头传递密钥则直接走Ocp-Apim-Subscription-Key头。与 speech 服务不同它不需要先向 token 颁发端点换取访问令牌响应取译文返回体是 JSON 数组代码取response.json()[0][translations][0][text]即第一条文本的第一个译文作为纯文本响应返回。该函数的 function.json 绑定声明为authLevel: function的 httpTrigger同时接受 GET/POST与 http 输出绑定$return因此设备端调用时必须携带?code函数密钥。函数所需的两个环境变量TRANSLATOR_KEY、TRANSLATOR_LOCATION配置在 local.settings.json 的Values中该文件同时保留了前几课的LUIS_KEY、LUIS_ENDPOINT_URL、LUIS_APP_ID、SPEECH_KEY、SPEECH_LOCATION{ IsEncrypted: false, Values: { FUNCTIONS_WORKER_RUNTIME: python, AzureWebJobsStorage: , LUIS_KEY: primary key, LUIS_ENDPOINT_URL: endpoint url, LUIS_APP_ID: app id, SPEECH_KEY: key, SPEECH_LOCATION: location, TRANSLATOR_KEY: key, TRANSLATOR_LOCATION: location } }本地验证时可以用 curl 发送如下 JSON 请求体例如法语转美式英语{ text: Définir une minuterie de 30 secondes, from_language: fr-FR, to_language: en-US }预期返回Set a 30-second timer。设备端双语常量与双向翻译作业中每台设备配置一种语言落到代码上就是 smart-timer 的双语常量设计一台设备同时持有两个 locale 代码——language用户所说的语言与server_language训练 LUIS 时使用的服务器语言也是设备内部拼装播报文本所用语言。Wio Terminal 平台在 config.h 中定义两个语言常量并配置翻译函数地址const char *LANGUAGE user language; const char *SERVER_LANGUAGE server language;以及翻译触发器 URL与TEXT_TO_TIMER_FUNCTION_URL同一 Functions 应用只是函数名不同const char *TRANSLATE_FUNCTION_URL http://IP_ADDRESS:7071/api/translate-text;设备端翻译逻辑集中在 text_translator.h 的TextTranslator类中用 ArduinoJson 组装{text, from_language, to_language}请求体经HTTPClientPOST 到translate-text触发器200 时取出译文失败则打印错误码String translateText(String text, String from_language, String to_language) { 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); String translated_text ; if (httpResponseCode 200) { translated_text httpClient.getString(); } // ... 非 200 时打印 Failed to translate text - error code httpClient.end(); return translated_text; }main.cpp 中只有两处调用构成完整的双向翻译闭环入向main.cpp 第 69-70 行processAudio中语音识别后把用户语言翻译成服务器语言再交给语言理解String text speechToText.convertSpeechToText(); text textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);出向main.cpp 第 54-59 行say函数在合成语音前把服务器语言文本翻译回用户语言void say(String text) { text textTranslator.translateText(text, SERVER_LANGUAGE, LANGUAGE); Serial.println(text); textToSpeech.convertTextToSpeech(text); }编译烧录后通过串口监视器即可看到完整链路日志识别出法语语音 →Translating ... from fr-FR to en-US→ 语言理解得到{seconds: 147}→ 播报文本再经Translating ... from en-US to fr-FR翻译为法语后朗读。Raspberry Pi 与虚拟设备平台Python 平台的实现见 pi 指南 与 虚拟设备指南分两种途径途径一speech SDK 的 TranslationRecognizer入向翻译。虚拟设备方案在 app.py 中用SpeechTranslationConfigTranslationRecognizer在识别的同时产出多语言译文translation_config SpeechTranslationConfig(subscriptionspeech_api_key, regionlocation, speech_recognition_languagelanguage, target_languages(language, server_language)) recognizer TranslationRecognizer(translation_configtranslation_config)两个易错点在 virtual-device-translate-speech.md 中有明确说明target_languages必须包含源语言本身否则拿不到任何译文translations字典以 locale 的语言部分如fr而不是完整 locale如fr-FR作为键。recognized回调中据此取出服务器语言译文并经 IoT Hub 发出app.py 第 30-39 行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): message Message(json.dumps({ speech: text })) device_client.send_message(message)途径二直接调用 Translator REST API出向翻译。speech 服务的 REST API 不支持翻译播报文本需要经 Translator 翻译后再生成 SSML。app.py 第 54-74 行 的translate_text函数与 Functions 版本逻辑一致只是硬编码了方向server_language → language请求头与参数为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函数在生成 SSML 前先执行该翻译并停止/恢复持续识别以避免播报声被再次拾取。Raspberry Pi 版本code/pi/smart-timer/app.py结构相同区别在于入向也走translate_text(text, language, server_language)显式翻译并在主循环中把译文以{speech: text}消息发送到 IoT Hub。把单设备构件拼成双设备翻译器有了上述构件作业要求的完整链路可以这样落地对应前文架构设备 A如 Wio Terminal 或虚拟设备language设为语言 X用户说话 → 入向翻译X → 服务器语言或按 Tip 直接翻译为目标语言→ 消息中附带语言字段发送到 IoT HubFunctions 应用smart-timer-trigger项目从 IoT Hub 收到设备 A 的消息后复用translate-text的逻辑把文本从设备 A 的语言翻译成设备 B 的语言Tip 中设备语言登记在 Azure Storage的做法可让 Functions 在转发前查询两端设备各自支持的语言避免硬编码语言对设备 Blanguage设为语言 Y收到已翻译文本直接经say/SpeechSynthesizer合成语言 Y 语音播放。一个需要注意的现实约束来自 pi 指南 的提示机器译文与你当初喂给 LUIS 的示例句可能措辞略有出入不同语言表达习惯不同若语言理解命中率下降应给 LUIS 补充更多示例、重新训练并发布模型——双设备场景下这条链路会被放大两端的译文都必须能被各自的语言理解/播报逻辑正确处理。验收标准Rubric原作业的评分表完整继承如下来自 assignment.md标准优秀Exemplary合格Adequate待改进Needs Improvement构建通用翻译器能够构建通用翻译器将一台设备检测到的语音转换为由另一台设备播放的另一种语言的语音能跑通部分组件如语音采集、翻译但未能构建端到端方案未能构建任何可用的通用翻译器组件参考资料与代码位置作业原文6-consumer/lessons/4-multiple-language-support/assignment.md主课程翻译原理、Translator 资源创建、多语言应用架构6-consumer/lessons/4-multiple-language-support/README.md三套设备平台移植指南Wio Terminal、Raspberry Pi、虚拟设备云端函数translate-text 实现、绑定配置、环境变量设备端参考实现Wio Terminal 主程序、TextTranslator 类、虚拟设备程序作业完成并验收后别忘了按 clean-up.md 清理 cloud 资源IoT Hub、Functions、speech 与 Translator 资源等避免产生不必要的费用。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考