使用翻译器文本 API 从程序翻译文本

页面创建日期 :

要提前准备的内容

请提前创建 Microsoft Azure 帐户。 本将解释创建说明。

此外,由于我们注册了免费版本,如果您想使用付费版本,请及时更改。

为 API 创建资源

打开 Microsoft Azure 门户屏幕,然后单击左侧菜单中的“新建”。

「新規」をクリック

从展开的菜单中选择“智能 + 分析”。

「Intelligence + analytics」を選択

此外,从展开的菜单中选择“认知服务APIS(预览)”。

「Cognitive Services APIs (プレビュー)」を選択

此时将显示“创建”屏幕,输入任何帐户名称(在仪表板中显示为名称),然后选择“免费试用”以订阅。 然后,单击 API 类型。

API type をクリック

从 API 列表中选择翻译文本 API。

「Translator Text API」を選択

然后选择“优先级”。

Pricing tier を選択

要使用免费版本,请单击“F0 免费”,然后单击“选择”按钮。 免费版本每月最多可转换 200 万个字符。

「F0 Free」を選択

如果这是您第一次注册服务,请创建新的资源组。 您可以将资源分组到具有任何名称的组中。

位置是放置服务的位置。 如果主要在日本部署,则在日本安装可能会提高性能。

最后,选中“固定到仪表板”,然后单击“创建”按钮。

作成

单击以打开仪表板,因为您刚刚创建了资源。

リソースを開く

我认为 Overview 处于打开状态,因此请检查右侧的“终结点”URL。 这是首先要通过身份验证访问的 API 的 URL。 但是,它很少更改,并且它列在稍后介绍的程序中,因此只需记住它就在这里。

Endpoint

从菜单中选择“键”。

「Keys」を選択

记下显示的“KEY 1”。使用此密钥进行身份验证。 我认为有两个密钥可能是备用的。 顺便说一下,如果密钥由于任何原因泄露到外部,则可以使用上面的“恢复...”重新创建它。

「KEY 1」をメモ

这是 Azure 端设置的结束。

以编程形式访问 API 以翻译文本

现在,您可以实际编写程序来翻译文本。 使用 Visual Studio 2015 创建 WPF 应用程序,并创建类似于以下内容的屏幕:

在“源”中输入文本,在“语言”中键入要从何种语言转换为哪些语言。 然后单击“运行转换”按钮,您将看到翻译的文本到下面的“目标”。

XAML (MainWindow.xaml)

它对翻译没有直接影响,因此请只提供代码。

<Window x:Class="AzureTranslatorTextApi.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:AzureTranslatorTextApi"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="*"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Label x:Name="label" Content="変換元" HorizontalAlignment="Left" Grid.Row="0"/>
    <TextBox x:Name="textBoxInput" Margin="4" Text="ここに変換するテキストを入力します。" Grid.Row="1" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"/>
    <Label x:Name="labelLang" Content="言語" HorizontalAlignment="Left" Grid.Row="2"/>
    <Label x:Name="labelLangFrom" Content="from" HorizontalAlignment="Left" Grid.Row="2" Margin="56,0,0,0"/>
    <TextBox x:Name="textBoxLangFrom" Margin="96,4,0,4"  HorizontalAlignment="Left" Text="ja" Grid.Row="2" Width="50"/>
    <Label x:Name="labelLangTo" Content="to" HorizontalAlignment="Left" Grid.Row="2" Margin="164,0,0,0"/>
    <TextBox x:Name="textBoxLangTo" Margin="190,4,0,4"  HorizontalAlignment="Left" Text="en" Grid.Row="2" Width="50" />
    <Button x:Name="button" Content="変換実行"  Margin="24,4" Height="24" Grid.Row="3" Click="button_Click"/>
    <Label x:Name="label_Copy" Content="変換先" HorizontalAlignment="Left" Grid.Row="4"/>
    <TextBox x:Name="textBoxOutput" Margin="4" Grid.Row="5" AcceptsReturn="True" AcceptsTab="True" VerticalScrollBarVisibility="Auto" IsReadOnly="True" Background="#FFE8E8E8" HorizontalScrollBarVisibility="Auto"/>
  </Grid>
</Window>

获取访问令牌(主窗口.xaml.cs)

作为文本翻译的基本流程

  1. 将密钥 1 扔到 API 以获取访问令牌。
  2. 使用访问令牌将文本扔到翻译服务以获取翻译的文本。
  3. 根据需要再次获取访问令牌

它成为。

首先,让我们定义一个方法来获取访问令牌,使其更易于使用。 现在,您可以通过将刚刚获取的 KEY 1 传递给参数来获取访问令牌。 同步过程也可以检索,但从 C# 5.0 开始,可以使用异步/await,因此让我们轻松异步。

将 URL 设置为 Azure 确认的终结点 +“/问题工具”,并将 KEY 1 设置为要发送的标头的密钥,并将“Ocp-Apim-订阅密钥”设置为键。

作为响应,您可以按原样获取访问令牌字符串,并将其作为返回值。 顺便说一下,此访问令牌仅在 10 分钟内有效。

/// <summary>
/// 非同期でアクセストークンを取得します。
/// </summary>
/// <param name="subscriptionKey">認証に必要なキー文字列。</param>
/// <returns>取得したアクセストークン。</returns>
private async Task<string> GetAccessTokenAsync(string subscriptionKey)
{
  using (var client = new HttpClient())
  using (var request = new HttpRequestMessage())
  {
    request.Method = HttpMethod.Post;
    request.RequestUri = new Uri("https://api.cognitive.microsoft.com/sts/v1.0/issueToken");
    request.Content = new StringContent(string.Empty);
    request.Headers.TryAddWithoutValidation("Ocp-Apim-Subscription-Key", subscriptionKey);
    using (var response = await client.SendAsync(request))
    {
      response.EnsureSuccessStatusCode();
      var token = await response.Content.ReadAsStringAsync();

      Trace.WriteLine($"token={token}");

      return token;
    }
  }
}

访问 API 进行文本翻译(主窗口.xaml.cs)

这也是一个方法,易于使用。 允许您指定从哪个语言转换为哪些语言,以及为参数获取的访问令牌和要翻译的文本。

请注意,您访问的 URL 与获取令牌的 URL 不同。 由于要翻译的文本和语言将作为 URL 的查询字符串发送,因此请提前使用 Uri.EscapeDataString 转义它。

然后,使用 GET 方法将架构“Bearer”和参数的令牌设置为标头授权并发送。

由于响应以 XML 格式检索,因此 XDocument 用于检索翻译后的文本。 但是,如果文本包含 XML 转义字符,可能是因为它使用 XML,但它可能保持转义状态。 根据需要进行转换。

/// <summary>
/// テキストを翻訳します。
/// </summary>
/// <param name="token">API のアクセスに必要なトークン。</param>
/// <param name="text">翻訳するテキスト、</param>
/// <param name="fromLang">翻訳元の言語。</param>
/// <param name="toLang">翻訳先の言語。</param>
/// <returns>翻訳されたテキスト。</returns>
private async Task<string> TranslateText(string token, string text, string fromLang, string toLang)
{
  using (var client = new HttpClient())
  using (var request = new HttpRequestMessage())
  {
    // URL につけて送信するのでエンコードする
    var escapeText = Uri.EscapeDataString(text);
    Trace.WriteLine($"escapeText={escapeText}");

    var uriStr = "http://api.microsofttranslator.com/V2/Http.svc/Translate?"
      + $"text={escapeText}&from={fromLang}&to={toLang}";

    request.Method = HttpMethod.Get;
    request.RequestUri = new Uri(uriStr);
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
    using (var response = await client.SendAsync(request))
    {
      response.EnsureSuccessStatusCode();
      var resultText = await response.Content.ReadAsStringAsync();

      // <string>XXXXXX</string> 形式で取得されるので XDocument で操作する
      XDocument xdoc = XDocument.Parse(resultText);

      Trace.WriteLine($"xdoc={xdoc.ToString()}");

      // XML エスケープ対象文字が正しく変換されない場合があるので
      // 必要があれば対処すること
      return xdoc.Descendants().First().Value;
    }
  }
}

按钮执行处理 (MainWindow.xaml.cs)

实现两个方法后,只需调用每个方法即可。 您可以通过为每个方法指定 KEY1 和输入的值来翻译文本。 由于它是异步的,因此请为按钮处理方法添加异步。

private async void button_Click(object sender, RoutedEventArgs e)
{
  // ここに認証キー(KEY1)を入力してください
  string subscriptionKey = "XXXXXXXXX";

  // アクセストークンを取得します。有効時間は10分程度です。(おそらく)
  var token = await GetAccessTokenAsync(subscriptionKey);

  // テキストを翻訳し表示します
  textBoxOutput.Text = await TranslateText(token, textBoxInput.Text, textBoxLangFrom.Text, textBoxLangTo.Text);
}

可翻译语言列表

请参阅以下米科索夫页面: 因为它是云服务之一,它可能会不时更改。