LoginSignup
31
29

More than 5 years have passed since last update.

ドコモの「しゃべってコンシェル」や Appleの「Siri」のようなサービスが誰でも作れる!?今度はドコモが提供する「知識Q&A」APIを試してみた!

Posted at

概要

前回の記事では「雑談対話」APIの利用方法を紹介しました。
同じタイミングで「知識Q&A」APIの利用申請をしたのですが、
特に連絡もないまま気づいたときには利用できるようになっていたのでご紹介します。
ちなみに「知識Q&A」APIは質問文をテキストで受け付け、回答を返却するAPIです。
サイトには「質問は話しかけるような自然な文章を入力できます。回答はズバリの回答候補を返却します。」という説明がありますが、ズバリな回答が返ってくることは中々ないので、辛抱強く聞いてあげてくださいw

このAPIに加え今回はAVSpeechSynthesizer, AVSpeechUtteranceを使用したテキストの読み上げ機能を追加することでよりSiriっぽくしたいと思います。

今回作ったアプリのイメージ

アプリのスクリーンショットです。

screenshot.png

導入手順

ライブラリの導入については前回の記事を参照してください。

追加の手順として音声の読み上げ機能を使用するためにAVFoundation.frameworkをターゲットに追加します。

APIの使い方

ここも前回と同様にAFNetworkingを利用しますが、今回はPOSTではなくGETでリクエストします。

https://api.apigw.smt.docomo.ne.jp/knowledgeQA/v1/ask/?APIKEY=xxxxxxxx

qパラメータに「○○は誰」「○○は何ですか」といった、自然な文章をテキストで入力してください。
リクエスト時は、リクエストURLをUTF-8でエンコードする必要がありますが、AFNetworkingを使用している場合は自動でエンコードしてくれます。

{
  "q":"明日の東京の天気は何ですか?",
}

AFNetworkingでの実装例です。

static const NSString * API_KEY = @“xxxxxxx;

- (void)fetchQARequest:(NSString *)question completionHandler:(void (^)(NSDictionary *result, NSError *error)) completionHandler
{
    AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];

    // パラメータの設定
    NSDictionary* param = @{@"q" : question};
    [manager GET:[NSString stringWithFormat:
                   @"https://api.apigw.smt.docomo.ne.jp/knowledgeQA/v1/ask/?APIKEY=%@", API_KEY]
        parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSLog(@"response: %@", responseObject);

        if (completionHandler) {
            completionHandler(responseObject, nil);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"Error: %@", error);

        if (completionHandler) {
            completionHandler(nil, error);
        }
    }];
}

リクエストが成功すると下記のようなjson形式のレスポンスが返却されます。

{
 {"code":"S020010","message":{"textForDisplay":"インターネットで調べたところ、もしかすると晴時々曇です。","textForSpeech":"インターネットで調べたところ、もしかするとハレトキドキクモリです。"},"answers":[{"rank":"1","answerText":"晴時々曇","linkText":"リアルタイム検索|dメニュー","linkUrl":"http://realtime.search.smt.docomo.ne.jp/knfnt.html?IE=UTF-8&id_list=414032698269638656&kw=%E6%98%8E%E6%97%A5%20%E6%9D%B1%E4%BA%AC%20%E5%A4%A9%E6%B0%97"},{"rank":"2","answerText":"西高東低","linkText":"リアルタイム検索|dメニュー","linkUrl":"http://realtime.search.smt.docomo.ne.jp/knfnt.html?IE=UTF-8&id_list=414379070420299777&kw=%E6%98%8E%E6%97%A5%20%E6%9D%B1%E4%BA%AC%20%E5%A4%A9%E6%B0%97"},{"rank":"3","answerText":"晴","linkText":"リアルタイム検索|dメニュー","linkUrl":"http://realtime.search.smt.docomo.ne.jp/knfnt.html?IE=UTF-8&id_list=414304487646322688&kw=%E6%98%8E%E6%97%A5%20%E6%9D%B1%E4%BA%AC%20%E5%A4%A9%E6%B0%97"},{"rank":"4","answerText":"曇","linkText":"リアルタイム検索|dメニュー","linkUrl":"http://realtime.search.smt.docomo.ne.jp/knfnt.html?IE=UTF-8&id_list=414304487646322688&kw=%E6%98%8E%E6%97%A5%20%E6%9D%B1%E4%BA%AC%20%E5%A4%A9%E6%B0%97"},{"rank":"5","answerText":"雲","linkText":"リアルタイム検索|dメニュー","linkUrl":"http://realtime.search.smt.docomo.ne.jp/knfnt.html?IE=UTF-8&id_list=414058749746110464&kw=%E6%98%8E%E6%97%A5%20%E6%9D%B1%E4%BA%AC%20%E5%A4%A9%E6%B0%97"}]}
}

テキストの読み上げ方法

テキストの読み上げは非常に簡単です。
テキストの読み上げを行いたいソースコードにAVFoundation/AVFoundation.h をインポートします。
あとは下記のようにAVSpeechSynthesizer, AVSpeechUtteranceを使用して実装してください。

// AVSpeechSynthesizerの初期化
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
// 読み上げるテキストの設定
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:message];
// 読み上げる言語の設定
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"ja-JP"];
// 声の高さを設定(0.5〜2.0)
utterance.pitchMultiplier = 1.0;
// 読み上げ開始
[synthesizer speakUtterance:utterance];

最後に

テキストを読み上げるようにすることでよりSiriっぽくなったのではないかと思います。
いろいろ可能性を感じる機能なので、ぜひトライしておもしろいアプリ作りの参考にされてみてはと思います。

今回作成したサンプルのソースコードもアップしておきます。

31
29
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
29