【iOS】Microsoft Translator APIを使ってテキスト翻訳を試してみた【Objective-C】

2017年6月9日

Microsoft Translator APIを使って日本語→英語や英語→日本語などのテキスト翻訳を試してみました。Microsoft Translator APIは翻訳したいテキストをリクエストするだけなのでデバイス(PC、サーバー、モバイル、タブレット)を問わず、どんなWebサイトやアプリにも組み込むことができそうです。

1.Microsoft Azureにログインする

Microsoft Azureアカウントをお持ちの場合、http://portal.azure.com でサインインしてください。

Microsoft Azureアカウントをお持ちの場合、https://azure.microsoft.com/ja-jp/で無料アカウントを作成してください。

2.Microsoft Translatorのサブスクリプションを追加する

http://portal.azure.comにサインインした後、「+」を押してMARKETPLACEを表示します。

「Marketplaceの検索」に「Translator Text API」と入力し検索をかけます。

今回はテキスト翻訳なので「Translator Text API」を選択します。

Translator Text API」を選択すると英文の説明がでてきます。「作成」を押してください。

CognitiveServicesTextTranslationに移動するので、必要項目を入力し「作成」を押しサブスクリプションを作成してください。

3.サブスクリプションから認証キーを取得する。

[すべてのリソース]にアクセスし、先ほど作成したサブスクリプション(名前に入力したサービス名orアプリ名)があるので選択します。

選択したサブスクリプションの詳細が見れるので、[リソース管理]→[キー]を選択してください。APIで使うためのキー1とキー2があります。キーは認証に使用されるので厳重に保管してください。

4.認証キーからAPIへのアクセストークンを取得してみる

まず先ほど取得したキー使いアクセストークンが正常に取得できるか試してみましょう。

トークンの取得方法についてのドキュメントにはcurlを使用した2種類のアクセストークンの取得方法が記載されています。お好みの方で大丈夫です。

curl –data “" 'https://api.cognitive.microsoft.com/sts/v1.0/issueToken?Subscription-Key=[キー1orキー2]’

ターミナルを開きcurlコマンドを入力し、アクセストークンが取得できるか確認します。正常に取得できれば1~3まではクリアです。

5.Microsoft Translator APIを使用しテキスト翻訳してみる。

Microsoft Translator APIリファレンス

まず、Microsoft Translator APIを使用しテキスト翻訳する大まかな流れを説明します。

  1. 認証キーを使い10分間有効なアクセストークンを取得する
  2. アクセストークンを使い[翻訳したいテキスト]と[翻訳後の言語]を指定してリクエストする

以上です。

翻訳前の言語は自動で検出もされるみたいですが、特定言語から特定言語への翻訳であれば翻訳前の言語も指定しておいた方がいいでしょう。

では、プログラムに移ります。今回はHTTP通信のデファクトスタンダードライブラリのAFNetWorkingを使用して説明してきます。まずはアクセストークンを取得しましょう。

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

NSString *url = [NSString stringWithFormat:@"https://api.cognitive.microsoft.com/sts/v1.0/issueToken?Subscription-Key=%@",「キー1orキー2」];

NSDictionary *parameters = @{}

[manager POST:url
      parameters:parameters
        progress:^(NSProgress *uploadProgress) {
        }
         success:^(NSURLSessionDataTask *task, id responseObject) {
             NSString *token = [[NSString alloc] initWithData:responseObject
                                                                      encoding:NSUTF8StringEncoding];
NSLog(@"token:%@",token)

         }
         failure:^(NSURLSessionDataTask *task, NSError *error) {
         }];

キー1でもキー2でもアクセストークンは取得できるみたいです。違いはわかりません←オイ
キー1を再発行するときにキー2にして置くとかそんな感じかな?と思っています。
注意点としてはresponseSenializerをちゃんと登録しておかないとステータスコード200でfailureになる不思議な現象になります。

次にアクセストークンを使用して翻訳していきます。

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
[manager.requestSerializer setValue:[@"Bearer “ stringByAppendingString:「先ほど取得したtoken」] forHTTPHeaderField:@"Authorization"];

NSString *url = [NSString stringWithFormat:@"https://api.microsofttranslator.com/V2/Http.svc/Translate"];

NSDictionary *parameters = @{@"from": @"en",
                                              @"to": @"ja",
                                              @"text": @"This"};

[manager POST:url
      parameters:parameters
        progress:^(NSProgress *uploadProgress) {
        }
         success:^(NSURLSessionDataTask *task, id responseObject) {
                  NSXMLParser *xmlParser = responseObject;
                  xmlParser.delegate = self;
                  [xmlParser parse];
         }
         failure:^(NSURLSessionDataTask *task, NSError *error) {
         }];

– (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
     NSLog(@"string:%@",string); // これ となっていれば成功です。
}

今回はサンプルなので
翻訳したい言葉→This
翻訳前の言語→英語(en)
翻訳後の言語→日本語(ja)
としています。

responseSerializerは[AFXMLParserResponseSerializer serializer]を設定しておきます。
レスポンスはNSXMLParser形式で取得できるのでデリゲートをセットしてパースして翻訳後の言語を取
り出して使いましょう。

以上でMicrosoft Translator APIを使用したテキスト翻訳の説明は終わりです。

実際やってみて思ったこととしては、NSXMLParserはデリゲートを使用しないとパースできず使いにくかったので他の方法がないか試してみましたが、レスポンスを[AFHTTPResponseSerializer serializer]にしてNSDataを受け取りNSStringに変換、HTMLParserを使用してパースすることでブロック内で処理する方法のがいいかもしれません。

言語コード

Language Code English Name
af Afrikaans
ar Arabic
bs-Latn Bosnian (Latin)
bg Bulgarian
ca Catalan
zh-CHS Chinese Simplified
zh-CHT Chinese Traditional
hr Croatian
cs Czech
da Danish
nl Dutch
en English
et Estonian
fi Finnish
fr French
de German
el Greek
ht Haitian Creole
he Hebrew
hi Hindi
mww Hmong Daw
hu Hungarian
id Indonesian
it Italian
ja Japanese
sw Kiswahili
tlh Klingon
tlh-Qaak Klingon (pIqaD)
ko Korean
lv Latvian
lt Lithuanian
ms Malay
mt Maltese
no Norwegian
fa Persian
pl Polish
pt Portuguese
otq Querétaro Otomi
ro Romanian
ru Russian
sr-Cyrl Serbian (Cyrillic)
sr-Latn Serbian (Latin)
sk Slovak
sl Slovenian
es Spanish
sv Swedish
th Thai
tr Turkish
uk Ukrainian
ur Urdu
vi Vietnamese
cy Welsh
yua Yucatec Maya