Programowe tłumaczenie tekstu przy użyciu interfejsu API tłumaczenia tekstu w usłudze Translator

Data utworzenia strony :

Co przygotować z wyprzedzeniem

Utwórz wcześniej konto Microsoft Azure. Procedura tworzenia jest opisana na tej stronie.

Również tym razem zarejestrujemy się w wersji darmowej, więc zmień ją w odpowiednim czasie, jeśli chcesz korzystać z wersji płatnej.

Tworzenie zasobów interfejsu API

Otwórz witrynę Microsoft Azure Portal i kliknij pozycję Nowy w menu po lewej stronie.

「新規」をクリック

Wybierz Intelligence + Analytics z rozwiniętego menu.

「Intelligence + analytics」を選択

Z rozwiniętego menu wybierz pozycję Interfejsy API usług Cognitive Services (wersja zapoznawcza).

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

Gdy pojawi się ekran tworzenia, wprowadź wybraną nazwę (będzie to nazwa wyświetlana na pulpicie nawigacyjnym) i wybierz "Bezpłatna wersja próbna" dla subskrypcji. Następnie kliknij Typ interfejsu API.

API type をクリック

Wybierz pozycję Interfejs API tłumaczenia tekstu w usłudze Translator z listy interfejsów API.

「Translator Text API」を選択

Następnie wybierz pozycję Warstwa cenowa.

Pricing tier を選択

Ponieważ korzystasz z bezpłatnej wersji, kliknij "F0 Free" i kliknij przycisk "Wybierz". Darmowa wersja może konwertować do 2 milionów znaków miesięcznie.

「F0 Free」を選択

Jeśli rejestrujesz usługę po raz pierwszy, utwórz nową grupę zasobów. Utworzone zasoby można grupować w grupy o dowolnej nazwie.

Lokalizacja to miejsce, w którym można umieścić usługę. Podczas opracowywania głównie w Japonii jest bardziej prawdopodobne, że poprawi się wydajność, jeśli zostanie zainstalowany w Japonii.

Na koniec zaznacz "Przypnij do pulpitu nawigacyjnego" i kliknij przycisk "Utwórz".

作成

Pulpit nawigacyjny zawiera utworzony wcześniej zasób, więc kliknij go, aby go otworzyć.

リソースを開く

Myślę, że Przegląd jest otwarty, więc sprawdź adres URL "Endpoint" po prawej stronie. Jest to adres URL interfejsu API, do którego należy najpierw uzyskać dostęp przez uwierzytelnianie. Rzadko się to jednak zmienia, a jest to opisane w programie, który przedstawię później, więc dobrze jest pamiętać, że jest tutaj na razie.

Endpoint

Wybierz Klucze z menu.

「Keys」を選択

Zanotuj wyświetlony klucz 1 i użyj go do uwierzytelnienia. Myślę, że posiadanie dwóch kluczy jest prawdopodobnie rezerwą. Nawiasem mówiąc, jeśli klucz z jakiegoś powodu wycieknie na zewnątrz, możesz go odtworzyć za pomocą "Regeneruj ..." powyżej.

「KEY 1」をメモ

To kończy konfigurację po stronie platformy Azure.This concludes the setup on the Azure side.

Programowy dostęp do interfejsu API w celu tłumaczenia tekstu

Teraz nadszedł czas, aby stworzyć program, aby móc przetłumaczyć tekst. Użyj programu Visual Studio 2015, aby utworzyć aplikację WPF i utworzyć ekran, który wygląda tak:

Wprowadź tekst w polu Od, a w polu Język wprowadź język, który chcesz przekonwertować na który język. A jeśli klikniesz przycisk "Konwertuj uruchom", będziesz mógł zobaczyć przetłumaczony tekst w "Miejscu docelowym" poniżej.

XAML (MainWindow.xaml)

Nie wpływa to bezpośrednio na tłumaczenie, więc dołączony jest tylko kod.

<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>

Pobierz token dostępu (MainWindow.xaml.cs)

Podstawowy przepływ tłumaczenia tekstu jest następujący:

  1. Wrzuć KEY 1 do interfejsu API, aby uzyskać token dostępu.
  2. Użyj tokenu dostępu, aby przesłać tekst do usługi tłumaczeniowej w celu uzyskania przetłumaczonego tekstu.
  3. W razie potrzeby ponownie uzyskaj token dostępu

Chodzi o to.

Najpierw zdefiniujmy metodę uzyskania tokenu dostępu i ułatw jego użycie. Jeśli przekażesz KLUCZ 1 uzyskany wcześniej jako argument, możesz uzyskać token dostępu. Można go również uzyskać przez przetwarzanie synchroniczne, ale ponieważ można użyć Async/await C# 5.0, uczyńmy go łatwo procesem asynchronicznym.

W zamian ustaw adres URL na Endpoint + "/issueToken" zgodnie z potwierdzeniem na platformie Azure i ustaw KLUCZ 1 uzyskany za pomocą "Ocp-Apim-Subscription-Key" jako klucza w nagłówku, który ma zostać wysłany.

W odpowiedzi ciąg tokenu dostępu można uzyskać w niezmienionej postaci, dlatego jest on używany jako wartość zwracana. Nawiasem mówiąc, ten token dostępu jest ważny tylko przez 10 minut.

/// <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;
    }
  }
}

Dostęp do interfejsu API do tłumaczenia tekstu (MainWindow.xaml.cs)

Jest to również metoda ułatwiająca korzystanie z niej. Argumenty umożliwiają określenie otrzymanego tokenu dostępu i tekstu do przetłumaczenia oraz języka do przekonwertowania na jaki język.

Pamiętaj, że adres URL, do którego uzyskujesz dostęp, różni się od adresu URL, pod którym uzyskano token. Tekst i język do przetłumaczenia są wysyłane jako ciąg zapytania w adresie URL, więc ucieknij z nich za pomocą "Uri.EscapeDataString" z wyprzedzeniem.

Następnie metoda GET wysyła autoryzację nagłówka ze schematem "Bearer" i tokenem w parametrze.

Ponieważ odpowiedź jest pobierana w formacie XML, XDocument służy do pobierania przetłumaczonego tekstu wewnątrz. Jeśli jednak tekst zawiera znaki ucieczki XML, być może dlatego, że używasz XML, mogą one pozostać znakiem ucieczki. Przekonwertuj go w razie potrzeby.

/// <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;
    }
  }
}

Proces wykonywania przycisków (MainWindow.xaml.cs)

Po wdrożeniu dwóch metod wszystko, co musisz zrobić, to wywołać każdą z nich. Tekst można przetłumaczyć, ustawiając KEY1 i określając wprowadzoną wartość dla każdej metody. Ponieważ jest to proces asynchroniczny, dodaj asynchroniczny do metody obsługi przycisków.

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);
}

Lista języków, które można przetłumaczyć

Możesz odwołać się do następujących stron Micorsoft: Ponieważ jest to jedna z usług w chmurze, można ją zmienić w dowolnym momencie.