【iOS】Microsoft Translator APIを使ってテキスト翻訳を試してみた【Objective-C】
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のサブスクリプションを追加する

「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を使用しテキスト翻訳する大まかな流れを説明します。
- 認証キーを使い10分間有効なアクセストークンを取得する
 - アクセストークンを使い[翻訳したいテキスト]と[翻訳後の言語]を指定してリクエストする
 
以上です。
翻訳前の言語は自動で検出もされるみたいですが、特定言語から特定言語への翻訳であれば翻訳前の言語も指定しておいた方がいいでしょう。
では、プログラムに移ります。今回は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は[AFXMLParserResponseSerializerserializer]を設定しておきます。
レスポンスはNSXMLParser形式で取得できるのでデリゲートをセットしてパースして翻訳後の言語を取り出して使いましょう。
以上でMicrosoft Translator APIを使用したテキスト翻訳の説明は終わりです。
実際やってみて思ったこととしては、NSXMLParserはデリゲートを使用しないとパースできず使いにくかったので他の方法がないか試してみましたが、レスポンスを[AFHTTPResponseSerializerserializer]にして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 | 

