尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于 Azure Translator 服务实现树莓派多语言智能定时器:IoT-For-Beginners 语音翻译实战指南

基于 Azure Translator 服务实现树莓派多语言智能定时器:IoT-For-Beginners 语音翻译实战指南 基于 Azure Translator 服务实现树莓派多语言智能定时器IoT-For-Beginners 语音翻译实战指南【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本篇指南是 IoT-For-Beginners 课程第 6 章Consumer 智能消费设备多语言支持一课的树莓派实战篇。由于语音服务Speech service的 REST API 不支持直接翻译本课采用 Azure Cognitive Services Translator 服务的文本翻译 REST API将语音识别Speech-to-Text产出的文本与语音合成Text-to-Speech所需的文本进行双向翻译从而让树莓派上的智能定时器能够听懂并回复用户母语。读完本文你将掌握 Translator REST API 的完整调用流程、translate_text函数的实现细节以及如何将翻译环节无缝接入既有的 IoT 语音链路语音识别 → 语言理解 → 语音反馈。为什么需要独立的 Translator 服务在前几课中你已经用 Speech 服务的 REST API 实现了语音转文字Speech-to-Text和文字转语音Text-to-Speech。但当涉及翻译时情况有所不同Speech 服务的 REST API 不支持直接翻译。虽然 Speech SDK 内置了语音翻译能力但仅通过 REST 接口调用时你无法在识别语音的同时获得另一种语言的文本。Translator 服务是独立的文本翻译服务它提供 REST API可以翻译任意文本块并支持一次调用翻译多个文本块。因此本课的设计思路是用 Translator 服务翻译两端文本——一是把语音识别产出的文本从用户语言翻译成服务器语言供 LUIS 语言理解服务处理二是把服务器生成的反馈文本从服务器语言翻译回用户语言供语音合成并朗读。这正是 README 中描述的多语言应用架构假设你构建了一个完全以英语运行的智能定时器——听懂英语、处理英语、用英语应答。要支持日语你可以把用户说的日语翻译成英语文本用英语处理再把应答翻译回日语后朗读。这种翻译中间层方案让你能在不重写 LUIS 模型的前提下快速为设备增加多语言能力。前置准备创建 Translator 资源并获取 API Key在编写代码之前需要先创建一个 Translator 认知服务资源。按本课 README 中的说明使用 Azure CLI 在smart-timer资源组中创建az cognitiveservices account create --name smart-timer-translator \ --resource-group smart-timer \ --kind TextTranslation \ --sku F0 \ --yes \ --location location其中--kind TextTranslation指定资源类型为文本翻译--sku F0使用免费层Free Tierlocation替换为创建资源组时使用的区域。然后通过以下命令列出该资源的密钥az cognitiveservices account keys list --name smart-timer-translator \ --resource-group smart-timer \ --output table复制其中一个密钥Key它将作为translator_api_key使用。提示这是本项目的最后一课。完成本课及课后作业后请按照 clean-up.md 中的指引清理不再使用的云资源建议先完成作业再清理因为作业仍需要这些服务。配置两个语言变量用户语言与服务器语言多语言智能定时器的核心在于区分两种语言用户语言user language用户实际说出的语言由language变量表示服务器语言server language用于训练 LUIS 的语言同一语言也用于生成朗读给用户的反馈文本由新增的server_language变量表示。在app.py中更新language变量并在其下方新增server_languagelanguage user language server_language server language将user language替换为你将要使用的语言的 locale 名称例如法语用fr-FR粤语用zn-HK将server language替换为训练 LUIS 时所用语言的 locale 名称。关于 Speech 服务支持的语言及其 locale 名称列表可参考微软官方Language and voice support文档中的 Speech-to-Text 一节微软文档中可查到。 如果你不会说多种语言可以使用 Bing Translate 或 Google Translate 这类服务把自己偏好的语言翻译成目标语言。这些服务还能播放翻译后文本的音频——你可以先用它们把句子例如 set a 2 minute and 27 second timer从英语翻译成法语再点击Listen translation按钮让翻译结果通过麦克风播放出来作为语音输入。添加 Translator API Key在speech_api_key的下方添加 Translator 服务的 API Keytranslator_api_key key将key替换为你 Translator 服务资源的 API Key。这一行与 Speech 服务的密钥、区域、语言等配置一起位于app.py顶部的配置区参见 code/pi/smart-timer/app.pyspeech_api_key key translator_api_key key location location language language server_language language connection_string connection_string实现 translate_text 函数调用 Translator REST API在say函数上方定义translate_text函数接收待翻译文本、源语言和目标语言三个参数def translate_text(text, from_language, to_language):函数需要支持两个方向的翻译识别语音时从用户语言翻译到服务器语言提供语音反馈时从服务器语言翻译到用户语言——所以源语言和目标语言都通过参数传入。定义 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 }这里有两个与 Speech 服务显著不同的要点原文重点强调源码中也有完整体现见 code/pi/smart-timer/app.pyURL 不区分区域Translator API 的 URL 是全局唯一的api.cognitive.microsofttranslator.com区域信息通过请求头Ocp-Apim-Subscription-Region传入而不是拼进 URL直接使用 API Key与 Speech 服务需要先从sts/v1.0/issuetoken令牌签发接口换取 Bearer Token见get_access_token函数不同Translator 服务直接用Ocp-Apim-Subscription-Key请求头携带密钥即可无需额外获取访问令牌。定义请求参数与请求体params { from: from_language, to: to_language } body [{ text : text }]params指定源语言from与目标语言toAPI 会将from语言的文本翻译为to语言body是一个 JSON 数组元素为待翻译的文本块。之所以是数组是因为一次调用可以同时翻译多个文本块每个元素中text键的值即要翻译的内容。发起 POST 请求并解析响应response requests.post(url, headersheaders, paramsparams, jsonbody)注意文本通过jsonbody以 JSON 格式发送。返回的响应是一个 JSON 数组其中包含一个元素该元素内含translations数组数组的每一项对应body中传入的一个文本块的翻译结果。典型响应结构如下[ { translations: [ { text: Set a 2 minute 27 second timer., to: en } ] } ]取出数组中第一个元素的第一个翻译项的text属性作为返回值return response.json()[0][translations][0][text]接入语音链路双向翻译完成translate_text后需要把它接入两处既有逻辑。语音识别方向用户语言 → 服务器语言更新主循环while True将convert_speech_to_text的识别结果从用户语言翻译为服务器语言再发送到 IoT Hubif len(text) 0: print(Original:, text) text translate_text(text, language, server_language) print(Translated:, text) message Message(json.dumps({ speech: text })) device_client.send_message(message)这段代码会把原始文本和翻译后的文本都打印到控制台便于调试。语音反馈方向服务器语言 → 用户语言更新say函数在生成语音前把要朗读的文本从服务器语言翻译为用户语言def say(text): print(Original:, text) text translate_text(text, server_language, language) print(Translated:, text) speech get_speech(text) play_speech(speech)say函数先打印原文再翻译、合成语音并播放。在完整源码中announce_timer与create_timer会构造诸如2 minute 27 second timer started.、Times up on your 2 minute 27 second timer.这类英文反馈文本并调用say翻译后即可用用户语言的语音朗读出来参见 code/pi/smart-timer/app.py。端到端运行验证完成以上修改后运行程序。确保云端函数应用function app正在运行然后用用户语言发起一个定时器请求——既可以自己直接说该语言也可以用翻译应用播放目标语言的语音piraspberrypi:~/smart-timer $ python3 app.py Connecting Connected Using voice fr-FR-DeniseNeural Original: Définir une minuterie de 2 minutes et 27 secondes. Translated: 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.从这个运行日志可以看到完整的双向翻译链路用户用法语说 Définir une minuterie de 2 minutes et 27 secondes.设备识别后翻译为英语 Set a timer of 2 minutes and 27 seconds. 发送到云端供 LUIS 解析服务器回传英语反馈 2 minute 27 second timer started.say将其翻译为法语朗读给用户倒计时结束时的提醒 Times up on your 2 minute 27 second timer. 同样被翻译为法语 Chronométrant votre minuterie de 2 minutes 27 secondes. 后朗读。注意Using voice fr-FR-DeniseNeural一行get_voice()函数会从语音服务拉取语音列表选择与language用户语言匹配的第一个语音用于合成参见 code/pi/smart-timer/app.py。 由于不同语言表达同一含义的方式存在差异你得到的翻译可能与提供给 LUIS 的示例略有不同。如果发生这种情况请向 LUIS 补充更多示例语句、重新训练模型并重新发布。源码佐证云端翻译函数与虚拟设备对照实现为了让整条链路更完整仓库中还提供了两份可对照的实现云端 translate-text 函数。虽然树莓派端直接调用 Translator REST API但仓库的 Azure Functions 工程中也内置了一个 HTTP 触发的translate-text函数将区域与密钥放在环境变量TRANSLATOR_LOCATION、TRANSLATOR_KEY中从请求体读取from_language、to_language和text调用同一个 REST API 并返回翻译文本参见 translate-text 函数。这印证了 Translator 服务调用模式的一致性URL、请求头、参数与响应解析结构完全相同。虚拟设备版本。如果你没有树莓派硬件可以参考 虚拟设备翻译教程 与对应的 code/virtual-iot-device/smart-timer/app.py。虚拟设备版额外展示了另一条路径识别阶段直接使用 Speech SDK 的SpeechTranslationConfig与TranslationRecognizer完成语音→多语言文本翻译而文本转语音前的翻译仍走 Translator 服务。其translate_text函数固定从server_language翻译到language与树莓派版的say方向保持一致可相互印证。小结通过本课你完成了多语言智能定时器的最后一个关键模块理解了 Speech 服务 REST API 不支持翻译、需要借助 Translator 服务的架构原因创建了TextTranslation类型的 Translator 资源并获取 API Key实现了translate_text函数掌握了 Translator v3.0 REST API 的 URL、请求头Ocp-Apim-Subscription-Key/Ocp-Apim-Subscription-Region、from/to参数、JSON 数组请求体与响应解析将双向翻译无缝接入语音识别主循环与say反馈函数使设备能够用用户母语交互。至此你的多语言智能定时器已经可以识别用户语言的语音请求、用服务器语言完成意图理解再以用户语言的语音反馈结果——完整代码见 code/pi/smart-timer/app.py。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表