תרגום תכנותי של טקסט באמצעות ה-API של טקסט המתרגם

תאריך יצירת דף :

מה להכין מראש

צור חשבון Microsoft Azure מראש. הליך היצירה מתואר בדף זה.

כמו כן, הפעם נירשם עם הגרסה החינמית, אז אנא שנה אותה בזמן אם ברצונך להשתמש בגרסה בתשלום.

יצירת משאבי API

פתח את פורטל Azure של Microsoft ולחץ על חדש בתפריט הימני.

「新規」をクリック

בחר בינה + ניתוח מהתפריט המורחב.

「Intelligence + analytics」を選択

מהתפריט המורחב, בחר ממשקי API של שירותים קוגניטיביים (תצוגה מקדימה).

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

כאשר מסך היצירה מופיע, הזן שם לבחירתך (זה יהיה שם התצוגה בלוח המחוונים) ובחר "ניסיון חינם" עבור המנוי. לאחר מכן לחץ על סוג API.

API type をクリック

בחר API של טקסט מתרגם מרשימת ממשקי ה- API.

「Translator Text API」を選択

לאחר מכן בחר שכבת תמחור.

Pricing tier を選択

מכיוון שאתה משתמש בגרסה החינמית, לחץ על "F0 חינם" ולחץ על כפתור "בחר". הגרסה החינמית יכולה להמיר עד 2 מיליון תווים בחודש.

「F0 Free」を選択

אם אתה רושם שירות בפעם הראשונה, צור קבוצת משאבים חדשה. באפשרותך לקבץ את המשאבים שאתה יוצר לקבוצות של כל שם.

מיקום הוא מקום לשים שירות. כאשר מתפתחים בעיקר ביפן, סביר יותר שהוא ישפר את הביצועים אם הוא מותקן ביפן.

לבסוף, בדוק "הצמד ללוח המחוונים" ולחץ על כפתור "צור".

作成

לוח המחוונים כולל את המשאב שיצרת קודם לכן, לכן לחץ עליו כדי לפתוח אותו.

リソースを開く

אני חושב שהסקירה הכללית פתוחה, אז בדוק את כתובת האתר עבור "נקודת קצה" בצד ימין. זוהי כתובת ה- URL של ה- API שיש לגשת אליה על ידי אימות תחילה. עם זאת, זה לעתים רחוקות משתנה, וזה מתואר בתוכנית כי אני אציג מאוחר יותר, אז זה טוב לזכור כי הוא כאן לעתים קרובות.

Endpoint

בחר מקשים מהתפריט.

「Keys」を選択

רשום הערה של מקש 1 שמופיע והשתמש בו כדי לאמת. אני חושב שיש שני מפתחות זה כנראה עתודה. אגב, אם המפתח דולף החוצה מסיבה כלשהי, אתה יכול לשחזר אותו עם "Regenerate..." לעיל.

「KEY 1」をメモ

פעולה זו מסיימת את ההגדרה בצד Azure.

גישה תכנותית ל- API כדי לתרגם טקסט

עכשיו הגיע הזמן באמת ליצור תוכנית כדי שתוכל לתרגם את הטקסט. השתמש ב- Visual Studio 2015 כדי ליצור יישום WPF וליצור מסך שנראה כך:

הזן טקסט ב- From ובשפה, הזן באיזו שפה ברצונך להמיר לאיזו שפה. ואם תלחץ על כפתור "המר הפעלה", תוכל לראות את הטקסט המתורגם ב"יעד "להלן.

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>

קבל אסימון גישה (MainWindow.xaml.cs)

הזרימה הבסיסית לתרגום טקסט היא כדלקמן:

  1. זרוק את מקש 1 לתוך ה- API כדי לקבל אסימון גישה.
  2. השתמש באסימון הגישה כדי לזרוק את הטקסט לשירות התרגום כדי לקבל את הטקסט המתורגם.
  3. קבל שוב את אסימון הגישה במידת הצורך

זה מגיע.

ראשית, בואו נגדיר שיטה כדי לקבל אסימון גישה ולהפוך אותו קל לשימוש. אם תעביר את מקש 1 שהתקבל קודם לכן כארגומנט, תוכל לקבל את אסימון הגישה. ניתן להשיג אותו גם על ידי עיבוד סינכרוני, אך מכיוון שניתן להשתמש ב- C# 5.0 async/await, בואו נהפוך אותו לתהליך אסינכרוני בקלות.

כנקודה, הגדר את כתובת ה- URL ל- Endpoint + "/issueToken" כפי שאושר ב- Azure, והגדר את KEY 1 שהושג עם "Ocp-Apim-Subscription-Key" כמפתח בכותרת שיש לשלוח.

כתגובה, ניתן לקבל את המחרוזת של אסימון הגישה כפי שהיא, ולכן היא משמשת כערך ההחזרה. אגב, אסימון גישה זה תקף רק למשך 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 לתרגום טקסט (MainWindow.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 וציון הערך שהוזן עבור כל שיטה. מכיוון שמדובר בתהליך אסינכרוני, אנא הוסף async לשיטת הטיפול בכפתורים.

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

רשימת שפות הניתנות לתרגום

ייתכן שתרצה לעיין בדפי Micorsoft הבאים: מכיוון שמדובר באחד משירותי הענן, ניתן לשנות אותו בכל עת.