Skip to main content

放大招 - Azure文档翻译服务和自定义翻译服务介绍

分类:  Azure认知服务 标签:  #Azure #人工智能 #语言理解(LUIS) #Translator 发布于: 2023-06-10 21:27:48

我们前面介绍了文本翻译的API, 文本翻译API的应用范围仅仅是一些比较短的文字翻译,或者是对话的翻译,这些应用场景可以应用在某些对话翻译软件或者词典或者这一类的应用上面,但是加入你有大量的文本或者文件需要翻译,仅仅只使用文本翻译的话,还是需要做很多工作,例如你需要把所有的文档读入内存,然后断句,然后再向API发送,然后返回翻译等等,但是现在微软提供了文档翻译的服务,这个就大大减少了工作量,您要做的仅仅是将文档的位置提交给API, 然后由API 异步对文档进行翻译,你要做的只是根据返回的job id, 定时去查询翻译的进度,当翻译完成了之后,取回翻译的结果就好了,这对于专业的翻译公司是帮助非常大的。甚至于为了更加准确的提高专业领域的翻译结果,您还可以使用微软提供的自定义翻译的功能。

自定义翻译服务

文本翻译以及文档翻译基本的原理是基于微软研发的神经机器翻译计数(NMT), 目前微软的神经机器翻译技术非常成熟,翻译质量也非常高,但是对于很多的专业领域,微软提供的通用模型力不从心,这就需要用户提供必要的数据,对于神经机器翻译模型进行重新训练,以适应用户自己专业领域的需求,关于自定义翻译您可以参考:https://docs.microsoft.com/zh-cn/azure/cognitive-services/translator/custom-translator/quickstart-build-deploy-custom-model, 虽然神经机器翻译理论和实现都非常复杂,但是微软提供的工具确实非常容易使用,您只要参考微软的文档,按照微软一步一步的去做,就非常容易训练出自己专业领域的模型,训练模型好之后,仅仅需要将模型发布为终结点,即可以将该终结点应用于您的日常工作和日常业务中,非常便利。

关于自定义翻译业务请参考文档:https://docs.microsoft.com/zh-cn/azure/cognitive-services/translator/custom-translator/overview

文档翻译

文档翻译主要的功能如下:

功能说明
翻译大型文件异步翻译整个文档,同时保留原始的文档和结构
翻译大量文件可以同时异步翻译多个文件
保留源文件源文件会被保留下来
应用自定义翻译可以使用自定义训练出来的模型
应用自定义词汇表可以自定义词汇来翻译专业的文档

支持的格式

支持的文档格式

文件类型文件扩展名说明
Adobe PDF.pdfAdobe Acrobat 可移植文档格式
HTML.html超文本标记语言。
本地化交换文件格式.xlf 、xliff并行文档格式,是翻译记忆系统的导出格式。 使用的语言在该文件中定义。
Microsoft Excel.xlsx用于数据分析和文档的电子表格文件。
Microsoft Outlook.msg在 Microsoft Outlook 中创建或保存的电子邮件。
Microsoft PowerPoint.pptx用于以幻灯片格式显示内容的演示文稿文件。
Microsoft Word.docx文本文档文件。
制表符分隔值/TAB.tsv/.tab电子表格程序使用的且以制表符分隔的原始数据文件。
文本.txt无格式的文本文档。

创建测试应用

创建一个Azure Storage资源,并在blob中创建三个容器:

  • 源文件容器, 用于存放需要翻译的文件。
  • 目标文件容器,用于存放翻译结果文件。
  • 词汇列表容器, 如果有自定义的词汇列表放在这里。

基本原理的介绍

我们前面已经学习过了,实际上是向API发送数据, 也即在代码中创建一个http client, 然后使用该客户端向API post数据,返回返回结果,对于文档翻译,因为是异步的,所以提交必要的信息之后,会返回一个ID, 然后根据ID来查看翻译进度。

提交翻译

提交翻译的工作,主要是通过post来提交,需要提交的数据也是必须使用json格式来提交。这里其中的header的变量和文本翻译是一致的,您可以参考文本翻译文档的说明,另外关于提交翻译的格式,您可以参考如下:

{
    "inputs": [
        {
            "source": {
                "sourceUrl": https://my.blob.core.windows.net/source-en?sv=2019-12-12&st=2021-03-05T17%3A45%3A25Z&se=2021-03-13T17%3A45%3A00Z&sr=c&sp=rl&sig=SDRPMjE4nfrH3csmKLILkT%2Fv3e0Q6SWpssuuQl1NmfM%3D
            },
            "targets": [
                {
                    "targetUrl": https://my.blob.core.windows.net/target-fr?sv=2019-12-12&st=2021-03-05T17%3A49%3A02Z&se=2021-03-13T17%3A49%3A00Z&sr=c&sp=wdl&sig=Sq%2BYdNbhgbq4hLT0o1UUOsTnQJFU590sWYo4BOhhQhs%3D,
                    "language": "fr"
                }
            ]
        }
    ]
}

这个实例时翻译整个blob容器中的文档,您还可以指定某个文档,如下:

{
    "inputs": [
        {
            "storageType": "File",
            "source": {
                "sourceUrl": https://my.blob.core.windows.net/source-en/source-english.docx?sv=2019-12-12&st=2021-01-26T18%3A30%3A20Z&se=2021-02-05T18%3A30%3A00Z&sr=c&sp=rl&sig=d7PZKyQsIeE6xb%2B1M4Yb56I%2FEEKoNIF65D%2Fs0IFsYcE%3D
            },
            "targets": [
                {
                    "targetUrl": https://my.blob.core.windows.net/target/try/Target-Spanish.docx?sv=2019-12-12&st=2021-01-26T18%3A31%3A11Z&se=2021-02-05T18%3A31%3A00Z&sr=c&sp=wl&sig=AgddSzXLXwHKpGHr7wALt2DGQJHCzNFF%2F3L94JHAWZM%3D,
                    "language": "es"
                },
                {
                    "targetUrl": https://my.blob.core.windows.net/target/try/Target-German.docx?sv=2019-12-12&st=2021-01-26T18%3A31%3A11Z&se=2021-02-05T18%3A31%3A00Z&sr=c&sp=wl&sig=AgddSzXLXwHKpGHr7wALt2DGQJHCzNFF%2F3L94JHAWZM%3D,
                    "language": "de"
                }
            ]
        }
    ]
}

发送请求之后,会返回一个ID, 然后根据该ID查询就可以了,一般我们完全可以使用postman来操作,当然您可以使用代码来操作,部分的实例代码如下:

    using System;
    using System.Net.Http;
    using System.Threading.Tasks;
    using System.Text;
    

    class Program
    {

        static readonly string route = "/batches";

        private static readonly string endpoint = "https://<NAME-OF-YOUR-RESOURCE>.cognitiveservices.azure.com/translator/text/batch/v1.0-preview.1";

        private static readonly string subscriptionKey = "<YOUR-SUBSCRIPTION-KEY>";

        static readonly string json = ("{\"inputs\": [{\"source\": {\"sourceUrl\": \"https://YOUR-SOURCE-URL-WITH-READ-LIST-ACCESS-SAS",\"storageSource\": \"AzureBlob\",\"language\": \"en\",\"filter\":{\"prefix\": \"Demo_1/\"} }, \"targets\": [{\"targetUrl\": \"https://YOUR-TARGET-URL-WITH-WRITE-LIST-ACCESS-SAS\",\"storageSource\": \"AzureBlob\",\"category\": \"general\",\"language\": \"es\"}]}]}");
        
        static async Task Main(string[] args)
        {
            using HttpClient client = new HttpClient();
            using HttpRequestMessage request = new HttpRequestMessage();
            {
            
                StringContent content = new StringContent(json, Encoding.UTF8, "application/json");

                request.Method = HttpMethod.Post;
                request.RequestUri = new Uri(endpoint + route);
                request.Headers.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
                request.Content = content;
                
                HttpResponseMessage  response = await client.SendAsync(request);
                string result = response.Content.ReadAsStringAsync().Result;
                if (response.IsSuccessStatusCode)
                {
                    Console.WriteLine($"Status code: {response.StatusCode}");
                    Console.WriteLine();
                    Console.WriteLine($"Response Headers:"); 
                    Console.WriteLine(response.Headers);
                }
                else
                    Console.Write("Error");

            }

        }

    }
}

然后通过代码来获取作业的状态:

   
using System;
using System.Net.Http;
using System.Threading.Tasks;


class Program
{


    private static readonly string endpoint = "https://<NAME-OF-YOUR-RESOURCE>.cognitiveservices.azure.com/translator/text/batch/v1.0-preview.1";

    static readonly string route = "/batches/{id}";

    private static readonly string subscriptionKey = "<YOUR-SUBSCRIPTION-KEY>";

    static async Task Main(string[] args)
    {

        HttpClient client = new HttpClient();
            using HttpRequestMessage request = new HttpRequestMessage();
            {
                request.Method = HttpMethod.Get;
                request.RequestUri = new Uri(endpoint + route);
                request.Headers.Add("Ocp-Apim-Subscription-Key", subscriptionKey);


                HttpResponseMessage response = await client.SendAsync(request);
                string result = response.Content.ReadAsStringAsync().Result;

                Console.WriteLine($"Status code: {response.StatusCode}");
                Console.WriteLine($"Response Headers: {response.Headers}");
                Console.WriteLine();
                Console.WriteLine(result);
            }
}

您可以通过API来获得文档的状态

   
using System;
using System.Net.Http;
using System.Threading.Tasks;


class Program
{


    private static readonly string endpoint = "https://<NAME-OF-YOUR-RESOURCE>.cognitiveservices.azure.com/translator/text/batch/v1.0-preview.1";

    static readonly string route = "/{id}/document/{documentId}";

    private static readonly string subscriptionKey = "<YOUR-SUBSCRIPTION-KEY>";

    static async Task Main(string[] args)
    {

        HttpClient client = new HttpClient();
            using HttpRequestMessage request = new HttpRequestMessage();
            {
                request.Method = HttpMethod.Get;
                request.RequestUri = new Uri(endpoint + route);
                request.Headers.Add("Ocp-Apim-Subscription-Key", subscriptionKey);


                HttpResponseMessage response = await client.SendAsync(request);
                string result = response.Content.ReadAsStringAsync().Result;

                Console.WriteLine($"Status code: {response.StatusCode}");
                Console.WriteLine($"Response Headers: {response.Headers}");
                Console.WriteLine();
                Console.WriteLine(result);
            }
}

如上述所示,文档翻译的功能还是非常容易使用的,企业或者客户可以结合文档翻译和自定义翻译极大的提高翻译质量,更好的服务自己的客户,有其他问题请和我联系。