音声チャットボットの完成

前記事で、応答生成サーバを作りました。これを、Flutterで作った「おうむ返しアプリ」から呼び出して、対話ができる「音声チャットボットアプリ」を完成させます。

httpリクエスト

最初は、応答生成サーバに発話テキストを送って応答テキストを取得する機能を定義します。

コードは以下の通り。

Future<void> _request(String e) async {
    String url = "http://<Your host>:8081/t2t";   // <Your host>はホスト名もしくはIPアドレス
    Map<String, String> headers = {"Content-Type": "application/json"};
    String body = json.encode({
      'inputs': e,
    });

    try {
      http.Response resp =
          await http.post(Uri.parse(url), headers: headers, body: body);
      if (resp.statusCode != 200) {
        setState(() {
          int statusCode = resp.statusCode;
          botWords = '''Failed to post $statusCode''';
        });
      }
      setState(() {
        var rand = math.Random();
        var i = rand.nextInt(3);
        var decoded = json.decode(resp.body);
        botWords = utf8.decode(decoded[i].runes.toList());
      });
    } catch (e) {
      setState(() {
        botWords = "インターネットに接続されていないようです";
      });
    }
  }

前記事で開発した応答生成サーバでモデルパラメータなどを固定しているので、アプリからは{'inputs':'発話テキスト'}のJSON形式でPUTリクエストを送るだけです。

レスポンスでは、3つの候補テキストが返ってきますので、候補テキストからランダムに1つを取得してborWord変数にセットしています。

できるだけクライアントアプリ側での処理を少なくする方が、コードの可読性が良くなるかなとも思いこの様な構成にしましたが、いくつかのパラメータはクライアントアプリから渡してあげた方がよかったかもしれません。

おうむ返しアプリから、チャットボットアプリへ

それでは、以前に作ったおうむ返しアプリをチャットボットアプリに改良していきます。

lastWordsが発話テキスト、botWords が応答テキストでした。おうむ返しの時には、_stop()内で、

botWords = lastWords

と、していましたが、以下の様に変更します。

  Future<void> _stop() async {
    await speech.stop();
    //await audioPlugin.play('assets/pochi.mp3', isLocal: true);

    setState(() {
      isUserSpeaking = false;
    });

    if (lastWords != "") {
      await _request(lastWords);       //  ※ 変更点
      await synthesizeText(botWords);
    } else {
      await synthesizeText('ちょっと聞き取りにくかったです。');
    }
  }

ツギハギで作っているので、あまり綺麗ではないですが、それでも、これで音声チャットボット機能の完成です。