音声操縦ロボット Caesar

2004年京都大学11月祭・京大機械研究会のブースで展示したロボットです。 オープンソースの音声認識ソフトウェアJuliusを活用して音声操縦をお手軽に実現しました。PC側のプログラムはJulian記述文法音声認識キットをそのまま流用しました。

ハードウェア

写真1:ロボット「Caesar」 写真2:構成部品(再現)

タミヤのツインモーターギアボックスで作った台車の上に自作の板金部品(いわゆるサーボブラケットとアーム)で作った胸部を乗せただけです。2本の腕でボールなどをつかんで持ち上げることができます。

間に合わせ、手抜き、急造につき詳細は割愛させていただきます

参考までに、使用した主要な部品の表を示します。

Caesar主要部品表
品目およその価格備考
タミヤ楽しい工作シリーズユニバーサルプレートセット700円程度
タミヤ楽しい工作シリーズツインモーターギアボックス700円程度
ゴムタイヤ(ホイール一体型)500円前後
キャスターまたはカグスベール400円前後
R/Cサーボ S3003 ×31900円程度×3
秋月電子H8/3069Fマイコンボードキット3850円(2007/9現在)
ユニバーサル基板400円程度
DCモータドライバIC TA7291P×2200〜400円程度×2
パソコン---
[必要な場合]USB-RS232C変換器2000〜5000円程度
PC-ロボット間接続ケーブル200〜5000円程度3本平行線、シールド線など。コネクタ部分含む。
バッテリーまたはA/Cアダプタ400円〜4000円程度

音声操縦システム

Juliusの概要

Juliusはフリーの高性能音声認識ソフトウェアです。直前の2、3語の単語をもとに次の単語を予測するような方法で、非常に多くの語彙の中から高速かつ精度良く、連続的に音声認識を行えるのが特徴です。 一方で、単語語彙とその並べ方規則(生成文法)を与えることで簡単に音声コマンド入力を行えるようにしたプログラムもあり、こちらはJulianと呼ばれています。本ロボットCaesarではこのJulianの方を用いています。

ロボットとJulianとのインターフェース

Juliusはライブラリの形でも提供されており、音声認識を行うアプリケーション作成に利用することができます。PC側で音声認識を行い、結果に応じたコマンドをロボットに送信するアプリケーションを作成すれば音声操縦が実現します。

図:机の上にロボットとマイク、下にノートPC

図のように、ノートPCにマイクとロボットを繋いだ状態で運用します。

展示ではPCとロボットとの間は有線で運用しましたが、ここを無線化すればあたかもロボットが人の言葉を認識しているかのように見えることでしょう。

注意: 以下は大学祭に間に合わせるために急造した、かなり「汚い」方法です。本格的に使う場合は、JuliusLibで普通の音声認識アプリケーションを作ってそれにロボットとの通信機能を加えるのが無難でしょう。

本ロボットの製作に当たってはPC側のプログラムとしてJulianをそのまま使いました。配布されているJulianは認識結果を標準出力に出力するので、COMポートにリダイレクトすることでマイコンに認識結果を渡すことが出来ます。

> julian -C robot.jconf > com4

Julianの出力例を下に示します。2段階で識別を行うので、その両方の結果が出力されます。端末(画面)に出力した場合1段階目のpass1_bestは見えません。直後にCR制御文字によってカーソルを行の先頭に戻して2段階目の結果で上書きするためです。リダイレクトする場合にはこれらの文字もそのまま送信されますので、識別結果を取り出す際に考慮する必要があります。

最初に作ったプログラムではコマンドが必ず2度実行されてしまい、それから調べていってわかったことでした。

pass1_best: <s> QQR右 </s>
sentence1: <s> QQR右 </s>
pass1_best: <s> QQF前 </s>
sentence1: <s> QQF前 </s>
pass1_best: <s> QQcボールつかむ </s>
sentence1: <s> QQcボールつかむ </s>
pass1_best: <s> QQpボールおいて </s>
sentence1: <s> QQpボールおいて </s>
pass1_best: <s> あー </s>
sentence1: <s> あー </s>

ロボットへのコマンドとなる単語にラベルを付けておき、このラベルをマイコン側が認識して動作します。プログラム上では、直前の11文字が"ce1: <s> QQ"であった場合に次の1文字に応じて動作を行うようにしました。

音声コマンドのデータ

Julianで音声認識を行うには、専用のデータファイルをJulianキット付属のmkdfa.plで処理して作る必要があります。そのためには構文規則と語彙辞書を作成します。

文法

ロボット側のプログラムを簡単にするため、構文らしい構文はありません。すべてのコマンドを単語として登録し、単語1つだけで文を構成するものとします。

S : NS_B COMMAND NS_E

語彙辞書

語彙辞書の一部を下記に示します。単語と音素の並びの対応が書かれています。音素の並びは実際に認識する音声を表すもので、qが促音の「っ」を表す以外はヘボン式ローマ字表記にほぼ一致します。

% COMMAND
QQF進め           s u s u m e
QQF前進           z e N sh i N
QQF前             m a e
QQFもっと前       m o q t o m a e
QQfもうちょっと前 m o ch o q t o m a e

(中略)

QQlちょっと左   ch o q t o h i d a r i
QQl少しだけ左   s u k o sh i d a k e h i d a r i
QQSストップ     s u t o q p u
QQS止まれ       t o m a r e
QQSちがう       t i g a u
QQcボールつかむ b o: r u ts u k a m u
QQcボールをひろって    b o: r u o h i r o q t e
QQcつかむ       ts u k a m u

(中略)

QQAもっと     m o q t o
QQaもうすこし m o: s u k o sh i
QQZ拍手       o t e o h a i sh a k u
QQD土下座     d o g e z a

(後略)

単語先頭のQQに続く1文字がコマンドの種類を表します。その後に続く日本語は画面で認識結果を確認するためだけにあります。同じ動作に複数の単語を割り当て、どれでも「わかってくれる」ようにしました。

ポイント

工夫した点として、前回と同じ動作を繰り返すコマンドを作りました。 ロボットが直前の動作を記憶しており、「もっと」と言われれば同じ動作をもう一度行い、「もうすこし」と言われれば前回と同じ方向に少しだけ動きます。 これを用いると、下記の例のようにいかにも賢そうな動作をさせることができます。

  1. 「前へ」→ロボットが15cm程前進する。まだボールまで20cmほど距離がある。
  2. 「もっと」→ロボットが15cm程前進する。ボールまでの距離が5cmほどになる。
  3. 「もうすこし」→ロボットが5cm程前進する。ボールを掴める位置になる。

Julianでは、入力音声がどのような文であるかを、与えられた文法で考えられる範囲内でどれの可能性が最も高いかを基に識別を行います。あまり文らしくない場合に棄却する機能はありません。そのため関係のない雑音も必ずいずれかのコマンドとして識別されてしまいます。そこでCaesarでは、ノイズとして入りそうな音に近い単語を辞書の中に一緒に入れて対応しています。上記の例の「あー」「うー」などがそうです。

なお、最後の2単語は隠し機能のようなものです。

展示の様子と考察

このロボットの元々の狙いは、いかに少ない手間で凄そうに見えるものを作るかということでした。狙い通り行ったようで、お客さんの反応もなかなか良いものでした。

大学の研究と勘違いされかけたケースもありました。Caesarは、研究成果を使わせていただいているだけです。

キット付属の音韻モデルでは子供の発音に対応するのは辛かったようでした。 また、大人でも人によってはまったく言うことを聞いてくれませんでした。

Julianの識別方式は、(母音の場合)口の開き具合や舌の位置など声道の形に起因する音の変化を用いているので、声の高さにはほとんど影響されません。そのため、イントネーションの違いには極めて強くなっています。 その反面、口をあまり開けずにボソボソと喋るといったような発音の癖には割と敏感なようです。同様に、子供のように声道の形が大きく異なるとお手上げです。 音韻データを個人に対応できるように変えれば識別率は良くなるでしょう。

京大機械研究会の活動日誌にも簡単な報告があります。

山口 辰久