TranslatorAPIを使ってみた

スポンサーリンク

今年の初めごろからCognitive Serviceの一部になりましたが今更になってようやくTranslatorAPIを利用してみたので記載していきます。

Azure Fucntionsで作成しているLine Botの一部として実装したのですがHttpClientを利用したサンプルが少ないのでいろいろ調べました。

※この記事は2017年4月16日時点の情報になります。

下記のコードはAzureFunctions + C#で作成したので必要であれば一部読み替えてください。

TranslatorAPIを利用するときは認証Tokenを取得する必要があります。

まずはTokenを取得する実装を行います。このソースの中に出てくるConfigurationManager.AppSettings[“AuthToken:embed:cite]はTranslatorAPIのKEYになります。TranslatorAPIのKey取得方法についてはこちらを参考にしてください。

/// <summary>
/// TranslateApiにアクセスするためのAccessTokenを取得する
/// </summary>
/// <returns>string</returns>
static async Task<string> GetAccessToken()
{    
    // AccessToken取得
    Uri ServiceUrl = new Uri("https://api.cognitive.microsoft.com/sts/v1.0/issueToken");
    string OcpApimSubscriptionKeyHeader = "Ocp-Apim-Subscription-Key";
    TimeSpan TokenCacheDuration = new TimeSpan(0, 5, 0);
    string storedTokenValue = string.Empty;
    DateTime storedTokenTime = DateTime.MinValue;

    if ((DateTime.Now - storedTokenTime) < TokenCacheDuration)
    {
        return storedTokenValue;
    }

    using (var client = new HttpClient())
    {
        var request = new HttpRequestMessage();
        request.Method = HttpMethod.Post;
        request.RequestUri = ServiceUrl;
        request.Content = new StringContent(string.Empty);
        request.Headers.TryAddWithoutValidation(OcpApimSubscriptionKeyHeader, ConfigurationManager.AppSettings["AuthToken:embed:cite]);
        client.Timeout = TimeSpan.FromSeconds(2);

        var response = await client.SendAsync(request);
        response.EnsureSuccessStatusCode();
        var token = await response.Content.ReadAsStringAsync();
        storedTokenTime = DateTime.Now;
        storedTokenValue = "Bearer " + token;
    }

    return storedTokenValue;
}

下記のソースは英語から日本語に翻訳するさんぷるそーすになります。

翻訳するテキストと翻訳する言語の設定をURLパラメータとして設定します。

先に取得したトークンはHTTPヘッダーに設定します。あとはGETリクエストすればいいだけです。ここでは英語から日本語に変換しています。URLパラメータのFromとToに言語を指定するば多種多様な翻訳が可能です。

取得したレスポンスはXML形式で返されるのでXDocumentでパースします。Functionsの場合はSystem.Xml.linqはデフォルトで参照していないのでnugetする必要がありますがここでは割愛します。

/// <summary>
/// 翻訳APIにリクエストする
/// </summary>
/// <returns>string</returns>
static async Task<string> GetTranslateWord(string transWord,TraceWriter log)
{
    string translated = string.Empty;
    string from = "en";
    string to = "ja";
    string uri = $"http://api.microsofttranslator.com/v2/Http.svc/Translate?text={WebUtility.UrlEncode(transWord)}&from={from}&to={to}";
    string AccessToken = await GetAccessToken();
    log.Info(uri);

    var res = new HttpResponseMessage();
    using (var getTranslateWord = new HttpClient())
    {
        // AccessTokenをヘッダーに追加
        getTranslateWord.DefaultRequestHeaders.Add("Authorization", AccessToken);

        // GETリクエスト
        res = await getTranslateWord.GetAsync(uri);
        translated = await res.Content.ReadAsStringAsync();

        log.Info(translated);
    }

    // <string>XXXXXX</string> 形式で取得されるので XDocumentでパース
    XDocument xdoc = XDocument.Parse(translated);

    // 翻訳された文字を返却
    return xdoc.Descendants().First().Value;
}

で、やってみた結果から言うと精度は低いです。

LineBotの試作版で試してみました。一目瞭然だと思いますが結構微妙な翻訳です。

Google翻訳のように利用頻度が高く学習された翻訳と比べるまでもないとは思いますが、今後の機械学習による翻訳精度の向上に期待したいと思います。

コメント