当下人工智能可谓是风头正劲,几乎所有的大厂都有相关的技术栈。微软在 AI 领域自然也是投入了重注,并且以 Azure 认知服务的方式投入了市场:

也就是说作为开发者我们不需要学习太多 AI 的理论知识,直接使用 Azure 提供的认知服务 API 就可以在程序中实现 AI 的功能了!

本文作为介绍 Azure AI 服务系列的第一篇,将通过 demo 介绍 Azure 认识服务中 Language 分类中的文本翻译服务(Translator Text API )。

Microsoft 文本翻译 API 是一种基于云的机器翻译服务, 支持多种语言。使用者可用于构建应用程序、网站、工具或任何需要多语言支持的解决方案。该服务是通过 REST API 提供的,所以我们可以以任何语言来调用它们。本文笔者使用 C# 通过构建一个 WPF 程序来演示如何通过简单的几步就能创建一个像模像样的翻译程序:

本文的完整 demo 请从这里下载。

创建 Azure 服务

要使用 Azure 的翻译服务需要先在 Azure 上创建对应的实例,比如我们需要先创建一个 "Translator Text API" 服务实例:

在本文的 demo 程序中我们还会用到拼写检查的服务,所以还需要创建一个 "Bing Spell Check v7 API" 服务的实例:

说明:对于学习和练习来说,你可以创建免费的 Azure 账号并创建免费版的上述实例,详细信息请参考 Azure 官网。

创建 WPF 应用程序

先在 VS 中创建 WPF 程序并简单的布局。

既然是 REST API,那么我们肯定是以 url 的方式访问服务,下面分别是访问文本翻译服务和拼写检查服务的 url:

const string TEXT_TRANSLATION_API_ENDPOINT = "https://api.microsofttranslator.com/v2/Http.svc/";
const string BING_SPELL_CHECK_API_ENDPOINT = "https://api.cognitive.microsoft.com/bing/v7.0/spellcheck/";

在访问相应的服务时,我们用这两个常量再拼接上合适的参数就可以了。

需要注意的是,Azure 提供的认知服务 API 都是需要认证信息的。具体的方式就是把我们创建的服务的 key 随 API 发送的服务器端进行认证,比如把 key 添加到 http 请求的 header 中:

WebRequest.Headers.Add("Ocp-Apim-Subscription-Key", "your key");

你可以在创建的服务实例的详情界面获得对应的 key,我们在程序中通过定义的常量来保存它们:

const string TEXT_TRANSLATION_API_SUBSCRIPTION_KEY = "your translator key";
const string BING_SPELL_CHECK_API_SUBSCRIPTION_KEY = "your spell check key";

由于 demo 的代码比较长,为了能集中精力介绍 Azure AI 相关的内容,本文中只贴出相关的代码。完整的 demo 代码在这里。

获取支持的语言列表

在进行任何的文本翻译之前,我们需要搞清楚 Azure 提供的翻译服务究竟支持哪些语言!下面的请求能够返回翻译服务支持的语言列表:

string uri = TEXT_TRANSLATION_API_ENDPOINT + "GetLanguagesForTranslate?scope=text";

我们把代码封装到下面的函数中:

private string[] languageCodes;
private void GetLanguagesForTranslate()
{// 获得翻译服务支持的语言string uri = TEXT_TRANSLATION_API_ENDPOINT + "GetLanguagesForTranslate?scope=text";WebRequest WebRequest = WebRequest.Create(uri);// 在 http 请求中添加认证信息WebRequest.Headers.Add("Ocp-Apim-Subscription-Key", TEXT_TRANSLATION_API_SUBSCRIPTION_KEY);WebResponse response = null;// 把返回的 xml 信息抽取到数组中response = WebRequest.GetResponse();using (Stream stream = response.GetResponseStream()){DataContractSerializer dcs = new DataContractSerializer(typeof(List<string>));List<string> languagesForTranslate = (List<string>)dcs.ReadObject(stream);languageCodes = languagesForTranslate.ToArray();}
}

执行这个函数后,languageCodes 中的内容如下图所示:

虽然取到了可以翻译的语言列表,但是像图中的内容是无法显示给用户的,还需要把它们转换成对用户友好的名称,因此我们定义 GetLanguageNames 函数完成这个功能:

private SortedDictionary<string, string> languageCodesAndTitles =new SortedDictionary<string, string>(Comparer<string>.Create((a, b) => string.Compare(a, b, true)));
private void GetLanguageNames()
{// 获得简体中文的语言名称string uri = TEXT_TRANSLATION_API_ENDPOINT + "GetLanguageNames?locale=zh-CHS";HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);request.Headers.Add("Ocp-Apim-Subscription-Key", TEXT_TRANSLATION_API_SUBSCRIPTION_KEY);request.ContentType = "text/xml";request.Method = "POST";DataContractSerializer dcs = new DataContractSerializer(Type.GetType("System.String[]"));using (Stream stream = request.GetRequestStream()){dcs.WriteObject(stream, languageCodes);}// 把返回的 xml 信息抽取到数组中var response = request.GetResponse();string[] languageNames;using (Stream stream = response.GetResponseStream()){languageNames = (string[])dcs.ReadObject(stream);}// 把支持的语言列表及其友好名称保存到字典数据结构中,// 随后会把它们绑定给 combo box 控件进行显示for (int i = 0; i < languageNames.Length; i++){languageCodesAndTitles.Add(languageNames[i], languageCodes[i]);}
}

这次我们拿到了用中文显示的语言名称:

初始化源和目标语言列表

当获得了支持翻译的语言列表后,就可以通过 UI 控件把它们显示出来:

private void PopulateLanguageMenus()
{int count = languageCodesAndTitles.Count;foreach (string menuItem in languageCodesAndTitles.Keys){FromLanguageComboBox.Items.Add(menuItem);ToLanguageComboBox.Items.Add(menuItem);}// 设置默认的源语言和目标语言FromLanguageComboBox.SelectedItem = "英语";ToLanguageComboBox.SelectedItem = "简体中文";
}

在我们的使用场景中,把默认的翻译文本设置为 "英语",翻译的目标语言为 "简体中文":

翻译文本

接下来介绍文本翻译的 API,其核心是下面的 url 请求:

TEXT_TRANSLATION_API_ENDPOINT + "Translate?text=" + 待翻译文本 + "&from=" + 源语言 + "&to=" + 目标语言

同样,我们把它封装成一个具有完整功能的函数:

private void TranslateButton_Click(object sender, EventArgs e)
{string textToTranslate = TextToTranslate.Text.Trim();string fromLanguage = FromLanguageComboBox.SelectedValue.ToString();string fromLanguageCode = languageCodesAndTitles[fromLanguage];string toLanguageCode = languageCodesAndTitles[ToLanguageComboBox.SelectedValue.ToString()];// 如果要翻译的文本是英语,还可以进行拼写检查if (fromLanguageCode == "en"){textToTranslate = CorrectSpelling(textToTranslate);// 把更新后的文本保存到 UI 控件上TextToTranslate.Text = textToTranslate;     }// 处理文本为空和不需要翻译的情况if (textToTranslate == "" || fromLanguageCode == toLanguageCode){TranslatedText.Text = textToTranslate;return;}// 通过 http 请求执行翻译任务string uri = string.Format(TEXT_TRANSLATION_API_ENDPOINT + "Translate?text=" +System.Web.HttpUtility.UrlEncode(textToTranslate) + "&from={0}&to={1}", fromLanguageCode, toLanguageCode);var translationWebRequest = HttpWebRequest.Create(uri);translationWebRequest.Headers.Add("Ocp-Apim-Subscription-Key", TEXT_TRANSLATION_API_SUBSCRIPTION_KEY);WebResponse response = null;response = translationWebRequest.GetResponse();// 把返回的翻译结果抽取到 UI 控件中Stream stream = response.GetResponseStream();StreamReader translatedStream = new StreamReader(stream, Encoding.GetEncoding("utf-8"));System.Xml.XmlDocument xmlResponse = new System.Xml.XmlDocument();xmlResponse.LoadXml(translatedStream.ReadToEnd());TranslatedText.Text = xmlResponse.InnerText;
}

在调用翻译文本的 API 前,需要先从 UI 控件中取得用户设置的源语言和目标语言,并且还要对放在 url 中传输的文本内容进行编码:

string uri = string.Format(TEXT_TRANSLATION_API_ENDPOINT + "Translate?text=" +System.Web.HttpUtility.UrlEncode(textToTranslate) + "&from={0}&to={1}", fromLanguageCode, toLanguageCode);

拼写检查

对于英语,我们可以通过 Bing Spell Check 服务进行翻译前的拼写检查。比如 TranslateButton_Click 函数中的:

// 如果要翻译的文本是英语,还可以进行拼写检查
if (fromLanguageCode == "en")
{textToTranslate = CorrectSpelling(textToTranslate);// 把更新后的文本保存到 UI 控件上TextToTranslate.Text = textToTranslate;
}

主要的拼写检查逻辑被封装在了 CorrectSpelling 函数中:

private string CorrectSpelling(string text)
{string uri = BING_SPELL_CHECK_API_ENDPOINT + "?mode=spell&mkt=en-US";// 创建拼写检查的请求HttpWebRequest spellCheckWebRequest = (HttpWebRequest)WebRequest.Create(uri);spellCheckWebRequest.Headers.Add("Ocp-Apim-Subscription-Key", BING_SPELL_CHECK_API_SUBSCRIPTION_KEY);spellCheckWebRequest.Method = "POST";spellCheckWebRequest.ContentType = "application/x-www-form-urlencoded"; // 这个设置是必须的!// 把文本内容放在请求的 body 中string body = "text=" + System.Web.HttpUtility.UrlEncode(text);byte[] data = Encoding.UTF8.GetBytes(body);spellCheckWebRequest.ContentLength = data.Length;using (var requestStream = spellCheckWebRequest.GetRequestStream())requestStream.Write(data, 0, data.Length);HttpWebResponse response = (HttpWebResponse)spellCheckWebRequest.GetResponse();// 从返回中取出 json 格式的拼写检查结果var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();var responseStream = response.GetResponseStream();var jsonString = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")).ReadToEnd();dynamic jsonResponse = serializer.DeserializeObject(jsonString);var flaggedTokens = jsonResponse["flaggedTokens"];// 我们定义一个规则来应用拼写检查的结果,// 比如:当拼写检查的权值大于 0.7 时就用建议的值替换掉文本中的值。var corrections = new SortedDictionary<int, string[]>(Comparer<int>.Create((a, b) => b.CompareTo(a)));for (int i = 0; i < flaggedTokens.Length; i++){var correction = flaggedTokens[i];var suggestion = correction["suggestions"][0];if (suggestion["score"] > (decimal)0.7)         corrections[(int)correction["offset"]] = new string[]   { correction["token"], suggestion["suggestion"] };}foreach (int i in corrections.Keys){var oldtext = corrections[i][0];var newtext = corrections[i][1];if (text.Substring(i, oldtext.Length).All(char.IsUpper)) newtext = newtext.ToUpper();else if (char.IsUpper(text[i])) newtext = newtext[0].ToString().ToUpper() + newtext.Substring(1);text = text.Substring(0, i) + newtext + text.Substring(i + oldtext.Length);}return text;
}

从上面的代码可以看出,拼写检查只是给出一些建议,具体怎么做还是由用户决定的。比如上面的代码中当拼写检查的权值大于 0.7 时就用建议的值替换掉文本中的值。下面我们来测试一下拼写检查的逻辑,运行程序,并输入 "helo world!" 进行翻译:

执行翻译操作,代码逻辑在检测到待翻译的语言为英语时,会先进行代码的拼写检查:

上图显示拼写检查函数 CorrectSpelling 纠正了我们的拼写错误,下面是翻译的结果:

有了代码的拼写检查,是不是感觉这个程序有点 "智能" 的味道啦!

总结

就像 azure 提供的其它服务一样,入门和上手非常的容易。我们简单的搞了几下就能够运行一个简单的文本翻译程序了。
当然这只是一个开始,希望大家和笔者一道通过本文开启 Azure AI 的一段旅程。

参考:

Microsoft Translator WPF application in C#

转载自:https://www.cnblogs.com/sparkdev/p/8847494.html

Azure AI 服务之文本翻译相关推荐

  1. 机器学习服务文本翻译能力升级,中文直译模型让译文表达更地道!

    HMS Core机器学习服务文本翻译能力提供多种语言和多种应用场景的翻译服务,比如,在出国旅游的场景中,用户可以借助应用的语音翻译播报功能在打车.酒店入住等场景中无障碍沟通,也可以通过拍照翻译功能读懂 ...

  2. 【微软 Azure 认知服务】零基础搭建微软 Azure AI 认知服务实验分享

    Azure人工智能认知服务实验 Azure认知服务(语音合成产品系列)是微软云服务里面的明星产品,基于行业领先的Hifi-net语音模型打造,可以提供高质量神经网络版声音,发音更准确.韵律更自然.高保 ...

  3. 腾讯AI开放平台使用尝试:代理后的文本翻译API使用方式

    这篇文章介绍一下如何结合代理服务器使用腾讯AI开放平台提供的文本翻译API. 目录 事前准备 请求参数 返回格式 示例代码 使用示例 常见问题 结果确认 总结 参考内容 事前准备 实现需要申请申请账号 ...

  4. HMS Core 机器学习服务6.4.0版本更新啦,文本翻译功能增加10种小语种语言类型

    近日,HMS Core机器学习服务(ML Kit)文本翻译功能在6.4.0版本更新中增加了10种小语种语言类型,分别是马其他语.马其顿.冰岛.乌尔都语.波斯尼亚语.乌克兰语.加泰罗尼亚语.斯洛文尼亚语 ...

  5. 用Azure认知服务开发一个语音翻译机,学英文很爽快

    最近CSDN开展了<0元试用微软 Azure人工智能认知服务,精美礼品大放送>,当前目前活动还在继续,热心的我已经第一时间报名参与,只不过今天才有时间实际的试用. 目前活动要求博文形式分享 ...

  6. 基于 Azure 的认知服务将文本合成语音

    基于 Azure 的认知服务将文本合成语音 Intro 前几天发了一个 .NET 20 周年祝福视频,语音是通过 Azure 的认知服务合成的, 下面就来介绍一下如何将使用 Azure 的认识服务实现 ...

  7. 想让AI在企业落地?微软最新Azure AI不容错过!

    Microsoft Connect(); 2018 如期举行,大会上发布的众多顶尖技术,瞬间引爆了全球! AI的高速发展,正在掀起新一波的创新浪潮.对于很多企业来说,AI创造的巨大价值,是不容错过的风 ...

  8. 天蓝色在ps中的色值_天蓝色AI服务在游戏世界中的作用

    天蓝色在ps中的色值 Welcome Back Readers, 欢迎读者, 介绍 (Introduction) I am Dhruv Trehan, Microsoft Student Partne ...

  9. Azure AI的又一里程碑,Neural TTS新模型呈现真人般情感饱满的AI语音

    在人与人之间的对话中,即使是同样的字句,也会因为所处情景和情感的不同而表现出丰富的抑扬顿挫,而这种动态性恰恰是各种AI合成语音的"软肋".相比于人类讲话时丰富多变的语气,AI语音的 ...

最新文章

  1. Fedora 20 安装搜狗拼音输入法
  2. swift5自定义构造函数和自定义变量报required init?(coder: NSCoder) { fatalError(“init(coder:) has not bee错问题
  3. 字符变量赋值规则_Java的常量、变量、数据类型(基础篇二)
  4. 【差分隐私的指数机制该怎么理解?】差分隐私系统学习记录(三)
  5. 最长回文子串java_5. 最长回文子串
  6. 【elasticsearch】 es 路由错误 不到 也可能 查询到的分析
  7. SPSS问卷数据处理步骤
  8. 毕向东java ppt下载_毕向东Java基础ppt课件
  9. cad转图片格式后不清晰怎么办?三步即可解决
  10. WIN10家庭版+ANSYS/AUTODYN安装学习
  11. 怎么把录音导入库乐队_怎么往库乐队里导入音乐
  12. hdu 3625 Examining the Rooms
  13. 第十二届全国大学生信息安全竞赛-RE部分WP(目前前两题,待更)
  14. winform进度条的实现
  15. 深入springboot怎么启动tomcat
  16. 100个冷笑话,越往后越冷(郁闷时专用……)
  17. OE系统终结,其缔造者 Dark-Alex 宣布退出PSP破解领域
  18. springdatajpa 中get××方法与find××方法的区别
  19. 电源适配器FCC认证
  20. 一站式解决方案 :OFD电子证照生成

热门文章

  1. “善弈者通盘无妙手”:网易的To B棋局
  2. 优盘不能弹出的解决办法
  3. C#关闭、启动、重启IIS
  4. 随记1 MySQL之特殊字符(表情)的存储以及读取乱码问题
  5. [云炬学英语]每日一句2020.8.30
  6. python海龟编辑器中询问并获得输入咱弄出来的积木_海龟Python编辑器下载|海龟编辑器下载 0.8.0_咕噜下载...
  7. 致远OA-A8协同管理软件无需登录getshell漏洞
  8. Bigtable: A Distributed Storage System for Structured Data_中文翻译
  9. 时间序列网络RNN,LSTM入门
  10. 信息学奥赛一本通:1311:【例2.5】求逆序对