TOP > Talking Watch サンプル(新)

Talking Watch サンプル:Python版

概要

このチュートリアルでは、「今何時?」と音声入力したときに、現在時刻を音声で返答するサンプルを作成します。 (cpp版(Qt版)はこちら )

ライブコーディングビデオ

サンプル用ROSパッケージの作成

ROSパッケージの作成

本チュートリアルでは、インストール時に起動した rospeex_samples にて提供されている talking_watch_browser を再現するコードを書いていきます。
始める前に本サンプルプロジェクト用に新しいROSパッケージを作成します。次のコマンドによってワークスペース内に rospeex_if に依存した talking_watch という名前のROSパッケージを作成します。

$ cd ~/%YOUR_CATKIN_WORKSPACE_HOME%/src
$ catkin_create_pkg talking_watch rospeex_if

roscd の前に新しく作ったROSパッケージをビルドします。

$ cd ~/%YOUR_CATKIN_WORKSPACE_HOME%
$ catkin_make_isolated

ディレクトリの作成

次に scripts / launch という新しいディレクトリを talking_watch パッケージの中に作ります。

$ source ~/%YOUR_CATKIN_WORKSPACE_HOME%/devel_isolated/setup.bash
$ roscd talking_watch
$ mkdir scripts launch

ソースコード

scripts ディレクトリ内に talking_watch.py というファイルを作成してエディタで開き、以下のソースコードを記述してください。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
import datetime
import re

# Import other libraries
from rospeex_if import ROSpeexInterface

class Demo(object):
    def __init__(self):
        self._interface = None

    def sr_response(self, message):
        # check speech recognition response text
        time = re.compile('(?P<time>何時)').search(message)

        if time:
            # create tts text
            d = datetime.datetime.today()
            text = u'%d時%d分です。'%(d.hour, d.minute)

            # rospeex reply
            self._interface.say(text, 'ja', 'nict')

    def run(self):
        # initialize ros node
        rospy.init_node('ss_sr_demo', anonymous=True)

        # initialize rospeex
        self._interface = ROSpeexInterface()
        self._interface.init()
        self._interface.register_sr_response(self.sr_response)
        self._interface.set_spi_config(language='ja', engine='nict')
        rospy.spin()

if __name__ == '__main__':
    try:
        node = Demo()
        node.run()
    except rospy.ROSInterruptException:
        pass

作成したソースコードを実行可能な状態に変更します。

$ roscd talking_watch
$ chmod +x scripts/talking_watch.py

ソースコードの解説

import rospy
import datetime
import re

# Import other libraries
from rospeex_if import ROSpeexInterface

必要なライブラリをインポートします。ROSpeexInterfaceがrospeexを制御するためのクライアントライブラリになります。

        # initialize ros node
        rospy.init_node('ss_sr_demo', anonymous=True)
ROSノードを初期化します。
        # initialize rospeex
        self._interface = ROSpeexInterface()
        self._interface.init()

rospeexインタフェースを初期化します。

        self._interface.register_sr_response(self.sr_response)

音声認識完了時に呼び出されるコーバック関数を登録します。

        self._interface.set_spi_config(language='ja', engine='nict')

波形モニタから入力される音声情報をどのように処理するかを設定します。 本サンプルコードでは、発話言語を日本語(ja)、音声認識エンジンをNICTとしています。

    def sr_response(self, message):
        # check speech recognition response text
        time = re.compile('(?P<time>何時)').search(message)

        if time:
            # create tts text
            d = datetime.datetime.today()
            text = u'%d時%d分です。'%(d.hour, d.minute)

            # rospeex reply
            self._interface.say(text, 'ja', 'nict')

音声認識結果を受け取り、”何時” が発話内容に含まれていた場合、rospeexインタフェースを用いて現在時刻を発話します。

launchファイル

launch ディレクトリ内に talking_watch.launch というファイルを作成してエディタで開き、以下のソースコードを記述してください。

<launch>
  <include file="$(find rospeex_launch)/launch/rospeex_browser.launch" />
  <node name="talking_watch" pkg="talking_watch" type="talking_watch.py" output="screen" />
</launch>

launchファイルの解説

   <include file="$(find rospeex_launch)/launch/rospeex_browser.launch" />

includeタグ により、rospeexで用いる音声認識、音声合成に必要な全てのノードを起動します。

  <node name="talking_watch" pkg="talking_watch" type="talking_watch.py" output="screen" />

nodeタグ により、作成した talking_watch.py を起動します。

プログラムの起動

  1. 端末を開き、サンプルを起動します。

        $ source ~/%YOUR_CATKIN_WORKSPACE_HOME%/devel_isolated/setup.bash
        $ roslaunch talking_watch talking_watch.launch
        
  2. Google ChromeまたはMozilla Firefoxで ブラウザ版波形モニタサイト にアクセスします。本サンプルではMozilla Firefoxを使用します。
  3. 以下のようなマイクを共有するかを問い合わせるダイアログが表示されるので、[Microphone to share] を [default] に設定し、[Share Selected Device]ボタンを押下します。
  4. 以下のコマンドを実行し、rospeexを起動しているマシンのIPアドレスを調べてください。

        $ LANG=C /sbin/ifconfig | grep 'inet addr' | grep -v 127.0.0.1 | awk '{print $2;}' | cut -d: -f2
        
  5. ブラウザ版波形モニタとrospeexを接続するために、[rospeex machine IP] にrospeexが起動しているマシンのIPアドレスを設定してください。ブラウザが起動しているマシンとrospeexが起動しているマシンが同じ場合、[rospeex machine IP] には 127.0.0.1 を入力してください。
  6. アイコンが「Connected」状態に変化すれば接続完了です。

操作

マイクに「今何時?」と言ってください。正常に認識された場合、「○○時○○分です。」と答えます。ブラウザに結果が出力されます。