ロボットSotaにTCP/IP通信で受信したテキストを話してもらう

| 3 min read
Author: kotaro-miura kotaro-miuraの画像

はじめに

#

前回の記事の冒頭でも触れたのですが、弊社デジタル戦略支援事業部から出展したAI博覧会にて、ブースにあるディスプレイで流すPowerPointのスライドショーの内容をロボットに話してもらいました。
その準備の中でコミュニケーションロボットSotaにTCP/IP通信でメッセージを受信する設定をしたので、設定方法等をまとめさせていただきたいと思います。

コミュニケーションロボットSotaとは

#

今回のイベントで話してもらったロボットというのはヴイストン株式会社様から販売されているコミュニケーションロボットのSota(デベロッパー版)という製品です。
この製品では、Sotaが話したり動いたりする動作をユーザがプログラミングできます。
プログラミングには専用のSDK環境「VstoneMagic」が提供されており、以下でも実装例を出しているように、用意されたブロックを並べるビジュアルプログラミングができます。
また、TCP/IP通信でメッセージの送受信ができるため、今回はその機能を使ってプログラムを作成しました。

プログラム内容

#

今回実装したプログラムを以下に示します。

このプログラムを起動すると、SotaはTCP/IPサーバを起動し接続待ち状態になります。
そして他のTCPクライアントからメッセージを受信したときに、そのメッセージをスピーカから話してくれます。

TCP受信
(赤字番号は筆者による追記)

使用するブロックについて

#

上記プログラムで使用しているブロックについて説明します。上記画像に付記した番号と対応しております。

Sota上でTCP/IPサーバの初期化を行います。 通信に利用するポート番号やタイムアウト時間をこのブロックで設定できます。
TCP/IPサーバ受信ブロックはこのブロックの開始・終了の間に入れる必要があります。

このブロックの開始・終了の間にある処理を無限にループ実行します。

TCP/IP通信でSotaに送られたメッセージを受信します。
このブロックには受信文字列に関する条件分岐を設定でき、ブロックに設定した文字列と完全一致する分岐に進むことができます。
今回の設定内容はデフォルトのままなのですが、受信した文字列がpacketであれば上の分岐に進みます。異なる場合は下のelseの分岐に進みます。

今回のユースケースにおいてpacketという文字列が送られて来ないことが分かっていたので、すべてのメッセージを下のelseの分岐で処理する想定です。

発話

#

このブロックに設定した文字列をSotaがスピーカから話してくれます。腕や頭も自動で動いてくれるので可愛いです。
TCP/IP通信で受信したメッセージを話すには、このブロックの設定項目のsay_wordsGlobalVariable.recvStringを設定します。

以下に設定手順を示します。

  1. 発話ブロックをダブルクリックします。
  2. 「<発話>のプロパティ」画面で以下赤枠に示した場所をクリックします
    発話設定開く
  3. 「<say_words>の設定画面」で、「変数選択」を選択し、プルダウンから値をGlobalVariable.recvStringに設定し「OK」を押します。
    発話saywords

応用(文字列の部分一致による分岐)

#

TCP/IPサーバ受信ブロックでは受信メッセージに対する特定の文字列の 完全一致 に基づく条件分岐しかできないですが、
ここでは少し応用して、受信したメッセージ対する特定の文字列の 部分一致 による条件分岐をしてみます。

以下のプログラムでは、受信したメッセージに:(コロン)が含まれる場合は②-1の発話ブロックを、含まれない場合には②-2の発話ブロックを実行します。
2つの発話ブロックは音声のイントネーションやピッチを変えていて、②-1は②-2よりも元気よく話す設定をしています。

部分一致プログラム
(赤字番号は筆者による追記)

ここで番号を付与したブロック以外は最初に紹介したプログラムとまったく設定が同じです。

ifブロックの設定

#

部分一致の判定をするためにifブロックを利用するのでその設定を説明します。

ifブロックをダブルクリックして表示される「<ifブロック>のプロパティ」画面の「条件分岐の設定」タブの画像を以下に添付します。

if設定

画面右側の「その他」で条件を設定できます。判定される条件の形式は<left><condition><right>となっており、上記の場合は

GlobalVariable.recvString.indexOf(":")!=-1

という条件式になります。

ここでindexOfというメソッドを呼び出していますが、
Sotaのプログラムは内部的にはJavaに変換されるため、JavaのStringが持つメソッドを利用可能です

上記ではJavaのString#indexOfによる判定ということで、受信したメッセージに:が含まれていれば左辺は-1以外の数となり、②-1の発話ブロックが実行されます。

今回のようにJavaのメソッド呼び出しも利用した条件を設定する際は、下記画像のように「<left>の設定」画面で「自由入力」を選択してJavaの式を入力します。

if条件左

同様に「<right>の設定画面」でも下記のように入力します。

if条件右

以上のようにしてTCP/IP通信でも文字列の部分一致による条件分岐を実装できました。

さいごに

#

今回は、コミュニケーションロボットSotaを用いて、TCP/IP通信でメッセージを受信する設定をしました。
GUI上でブロックを並べるだけでプログラミングができるので作っていて面白かったです。
内部で利用している言語がJavaなので、より複雑なこともできることが分かりました。

参考情報

#

Youtube-【Arduino関連】VS-RC202とSotaを連携 ~VS-RC202とSotaでTCP/IP通信~

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。