• 検索結果がありません。

2015 年度 卒業論文 音声認識による AR.Drone の制御 指導教員白井英俊教授 中京大学情報理工学部機械情報工学科 学籍番号 氏名 H 今村友紀 (2016 年 1 月 )

N/A
N/A
Protected

Academic year: 2021

シェア "2015 年度 卒業論文 音声認識による AR.Drone の制御 指導教員白井英俊教授 中京大学情報理工学部機械情報工学科 学籍番号 氏名 H 今村友紀 (2016 年 1 月 )"

Copied!
25
0
0

読み込み中.... (全文を見る)

全文

(1)

2015 年度

卒業論文

音声認識による AR.Drone の制御

指導教員 白井英俊 教授

中京大学 情報理工学部 機械情報工学科

学籍番号 H412019

氏名 今村 友紀

(2016 年 1 月)

(2)

1

要 旨

題目 音声認識による AR.Drone の制御 学籍番号 H412019 氏名 今村 友紀 指導教員 白井 英俊 本研究では自分の発話で AR.Drone を操作するというのが目的である。研究背 景は最近ニュースなどで話題になったドローンを、ゼミで学んだ音声認識を用 いて操縦したいと思ったのがきっかけである。Parrot 社が発売した AR.Drone1.0 を使用した。 研究の流れとして、まず PC のキーボードで AR.Drone を制御し、動作コマン ドが確実に送られているか確認し、そして音声認識で AR.Drone を制御する。そ のうえで安全性に考慮していくという流れである。 PC での AR.Drone の制御として、Python-ardrone-master(Python-ardrone2015) という既存のプログラムを利用した。これは AR.Drone から送られてくる動画を デスクトップ上に表示し、AR.Drone の視点で操縦することが可能である。 音声認識での AR.Drone 制御では、音声認識ソフト Julius を使用した。音声 認識ソフト Julius は、さまざまな開発環境(Linux、Windows、MacOSX)で 実装することが可能であり、ソース・バイナリだけではなく、フリーの音響モ デル・言語モデルも公開されていて充実している。実験として、23 例文を用意 し認識実験を3回行った結果、98.6%という高い認識率を得ることができた。 しかし残念ながらストリーミング動画を静止画でしか表示することができない。 その原因と解決策は考えてあるので、卒業までには完成させたい。 展望として、安全性を強化するために3つのことを考えた。1 つ目は、音声認 識とキーボード操作を組み合わせる。音声認識で何か問題が生じたときキーボ ードで緊急停止できるようにして安全性を強化する。2つ目は、AR.Drone のカ メラで障害物を検知する自律システムをつくる。壁や障害物をカメラで距離を 割り出し、ぶつからないようにすれば墜落の心配は無くなるのではないかと考 えた。3つ目は、もっと性能のよいマイクを使用する。本研究で使用したマイ クは周りの音を拾って、誤認識をしてしまった。そこで、マイク付近の発話し か拾わないマイクを使用すれば誤認識を減らすことが可能ではないかと考えて いる。

(3)

i

目 次

第 1 章 はじめに ... 1 第 2 章 研究の構成要素 ... 2 2.1 AR.Drone ... 2 2.2 音声認識 ... 2 2.2.1 音声認識ソフト Julius ... 3 2.2.2 Julius の仕組み ... 3 2.2.3 Julius の使い方 ... 3 第 3 章 研究計画 ... 4 3.1 開発環境 ... 4 3.2 研究の流れ... 4 第 4 章 PC による AR.Drone の制御 ... 5 第 5 章 音声認識による AR.Drone の制御 ... 8 5.1 実験 ... 9 5.2 結果 ... 9 第 6 章 考察・展望 ... 10 参考文献 ... 11 謝辞 ... 12 付録 1 音声認識による AR.Drone 制御プログラム ... 13 付録 2 単語リスト ... 17 付録 3 文法パターンリスト ... 20 付録 4 Julius の設定ファイル ... 21 付録 5 コマンドリスト ... 22

(4)

1

第 1 章 はじめに

本研究は、最近ニュースなどで話題になることが多いドローンを、ゼミで学ん だ音声認識を用いて制御したいと思ったのがきっかけである。研究室にあった AR.Drone 1.0 を使用した。以下が研究計画である。 1. PC のキーボードで AR.Drone を制御 2. 音声認識で AR.Drone を制御 3. 安全性に配慮していく まず PC のキーボードで制御ということで、既存のプログラムである Python-ardrone-master(Python-ardrone 2015)を利用した。名前のとおりプ ログラム言語は Python を使用しており、基本動作を簡単に行うことができ、な お AR.Drone のカメラから動画を受信し、AR.Drone の視点で操縦することが可 能である。動作コマンドがしっかりと送られているか確認することができ、動 画ストリーミングも映すことができたので、次の音声認識で AR.Drone を制御 する。 音声認識では、フリーソフトの Julius を用いた。音声認識ソフト Julius は、 さまざまな開発環境(Linux、Windows、MacOSX)で実装することが可能で あり、ソース・バイナリだけではなく、フリーの音響モデル・言語モデルも公 開されていて充実しているという点で採用し使用した。無関係な会話を拾って 起きる誤認識を避けるために「ドローン」という単語を最初に発話しなければ 動作コマンドが送られないシステムにした。Julius だけを起動し認識率のテス トを行った。98.6%という認識率を得ることができた。しかし、ストリーミン グ動画が静止画でしか表示することができなかった。この原因と考察は第六章 で述べる。 より安全性を強化するために3つ考えた。 1. 音声認識とキーボード操作を組み合わせる 2. AR.Drone のカメラで障害物を検知する自律システムをつくる 3. もっと性能のよいマイクを使用する 本論文の構成は以下のとおりである。第2章では研究の構成要素である AR.Drone と音声認識ソフト Julius について説明する。第3章では研究計画を 述べる。第 4 章では PC による AR.Drone の操作実験について述べる。第 5 章 では音声認識ソフト Julius を用いての AR.Drone 制御、誤認識を減らすための 解決策を考え、認識実験を行ったことを述べる。第6章では考察と展望につい て述べる。

(5)

2

第 2 章 研究の構成要素

本章では基本研究の構成要素である AR.Drone と音声認識ソフト Julius につ いて説明する。 2.1 AR.Drone AR.Drone は、フランスの Parrot 社が開発した 4 つのローターを備えたクワ ッドヘリコプター(ドローン)であり、サイズは 52.5cm×51.5cm、重さは 420 gと小型軽量である。またその飛行速度は 18km/h、航続時間は約 12 分とされ ている。日本では 2010 年 9 月 16 日に発売された。Wi-Fi によりスマートフォ ンやタブレット端末と接続して操縦できる。また、前面と下部に 2 つのカメラ があり、このカメラからの動画はストリーミング配信され、操縦者は AR.Drone か ら 送 ら れ て く る 画 像 を シ ー ム レ ス に 見 る こ と が で き る た め 、 あ た か も AR.Drone に乗って操縦しているような感覚が得られる。AR.Drone は、最大 50m の距離で操作できる。AR.Drone には、ジャイロセンサー、加速度センサ ー、高度センサーが搭載されており、これらの情報を得て内蔵の ARM プロセッ サによって 4 つのローターに回転数や角度が指令され安定した飛行が可能であ る。なお、操作指示できる動作としては、離陸・着陸・前進・後退・右移動・ 左移動・右旋回・左旋回がある。 図 2.1 AR.Drone 2.2 音声認識 音声認識とは、音声を文字に変換する仕組みである。正しい文字に変換する には、音響モデルと言語モデルが充実していることが必要である。音響モデル とは音の波形データを集めたもの、言語モデルとは単語とその並び方の情報を 集めたデータである(荒木 2007)。 本研究では、単語辞書や言語モデル・音響モデルが充実している音声認識ソフ ト Julius を利用した。

(6)

3 2.2.1 音声認識ソフト Julius Julius とは音声認識システムの開発・研究のためのオープンソースの高性能な 汎用大語彙連続音声認識エンジンである。数万語彙の連続音声認識を一般の PC やスマートフォン上でほぼ実時間で実行できる軽量さとコンパクトさを持って いる。Julius のホームページでは、ソース・バイナリだけではなく、フリーの 音響モデル・言語モデルも公開されている。Julius の最大の特徴として、単語 辞典や言語モデル・音響モデルなどの音声認識の各モジュールを組み替えるこ とで、小語彙の音声対話システムからディクテーションまで様々な幅広い用途 に応用することが可能である。また、さまざまな開発環境(Linux、Windows、 MacOSX)で実装できることも特徴の一つである。 2.2.2 Julius の仕組み 本研究では Julius 文法認識キット v4.3 を使用した。認識すべき文のパター ンをあらかじめ記述した「認識用文法」を作成しておくことで、任意の単語や 文章を認識させることができるためである。 2.2.3 Julius の使い方 Julius を起動する前に、マイクを PC に接続して準備し、ちゃんとマイクか ら音声が入力されているか確認する。録音した音声に大きなノイズや歪が乗る と、認識精度が著しく低下する可能性があるので注意する。 単語ファイルと文法ファイルをあらかじめ作っておき、Perl を使って拡張子 dfa, term, dict ファイルを作成することができる。dfa ファイルは有限状態オー トマトンの定義ファイル、term ファイルは単語カテゴリ番号と実際のカテゴリ 名が記述されているファイル、dict ファイルは単語辞書ファイルである。

PC のプログラムと Julius を連動するにはプロセス間通信を行う必要がある。 そのため Julius を –module パラメタを指定して起動し、モジュールモード、 つまり他のプロセスと通信するモードで動かせて使用する。

(7)

4

第 3 章 研究計画

本章では音声認識ソフト Julius を使用して AR.Drone を制御するまでの研究 計画について説明する。 3.1 開発環境 OS は Linux(Ubuntu14.10)、プログラミング言語は Python(v.2.7)、音声 認識ソフトは、2.2 節で述べた Julius(文法認識キット v4.3)を使用した。 3.2 研究の流れ 以下の様に研究計画を立てた: 1. PC と AR.Drone の間の通信が確立できるか確かめる。 そのために、キーボード入力により AR.Drone を操作するプログラムを作成 する。これには Python-ardrone-master(Python-ardrone 2015)という、 AR.Drone 制御のための Python ライブラリを使用する。 2. 上記のプログラムを用いて、安全な場所で実際に飛行実験を行い、PC と AR.Drone の間の通信状態や飛行の安定性などを確かめる。 3. 音声認識ソフト Julius の性能を評価する。そのために、Julius をモジュー ルモードで動かし、ソケット通信により Julius が認識した文を表示するだ けのプログラムを作成し、Julius の認識精度や反応時間を調べる。 4. Julius を使用し、音声認識により AR.Drone を制御するプログラムを作成す る。 5. 飛行実験を行い、操作以外の要素、例えば動画ストリーミングの性能や、音 声認識の精度、また操作においてどのような問題があるのかを調査する。 6. AR.Drone は操作不能になったり、誤認識によって事故が起こったりする可 能性があるため、特に安全性を配慮した工夫を考える。 第四章から研究内容を順に述べていく。

(8)

5

第 4 章 PC による AR.Drone の制御

本章では第三章「研究計画」で述べたように、Python-ardrone-master とい う Python ライブラリを利用した。このライブラリは AR.Drone の基本動作をキ ーボードで操作することができ、AR.Drone から撮影する動画をみながら操縦す ることが可能である。

Python-ardrone-master には demo.py という python ファイルがあり、これ を起動させて AR.Drone と通信をすることで制御することが可能である。動作 コマンドは libardrone というモジュールを使っており、コマンドリストは付録 5 で述べる プログラムリスト 4.1 は AR.Drone の動作コマンドをキーボードに置き換え てあるプログラムである。キーボード操作は pygame というモジュールを使用 して実現させている。キーを押し続けると AR.Drone は移動し続け、キーを離 すと AR.Drone はホバリングをするというシステムになっている。基本動作の キーは表 4.1 のとおりである。 プログラムリスト 4.1(demo.py の一部) pygame.init() drone = libardrone.ARDrone() running = True while running:

for event in pygame.event.get(): if event.type == pygame.QUIT: running = False

elif event.type == pygame.KEYUP: drone.hover()

elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: drone.reset()

running = False

elif event.key == pygame.K_RETURN: drone.takeoff()

elif event.key == pygame.K_SPACE: drone.land()

elif event.key == pygame.K_BACKSPACE: drone.reset()

(9)

6

elif event.key == pygame.K_w: drone.move_forward() elif event.key == pygame.K_s: drone.move_backward() elif event.key == pygame.K_a: drone.move_left()

elif event.key == pygame.K_d: drone.move_right()

elif event.key == pygame.K_UP: drone.move_up()

elif event.key == pygame.K_DOWN: drone.move_down()

elif event.key == pygame.K_LEFT: drone.turn_left()

elif event.key == pygame.K_RIGHT: drone.turn_right()

elif event.key == pygame.K_1: drone.speed = 0.1

elif event.key == pygame.K_2: drone.speed = 0.2

elif event.key == pygame.K_3: drone.speed = 0.3

elif event.key == pygame.K_4: drone.speed = 0.4

elif event.key == pygame.K_5: drone.speed = 0.5

elif event.key == pygame.K_6: drone.speed = 0.6

elif event.key == pygame.K_7: drone.speed = 0.7

elif event.key == pygame.K_8: drone.speed = 0.8

elif event.key == pygame.K_9: drone.speed = 0.9

elif event.key == pygame.K_0: drone.speed = 1.0

(10)

7

キーボードで AR.Drone を制御した実験の結果を述べる。

表 4.1 の通りに AR.Drone を操縦することができた。そしてデスクトップに ストリーミング動画を映し出し、左上にはバッテリーの残量を表示することも できた。FPS(frames per second)が 46.51 とあるように、非常になめらかな 動画を映しだせた(図 4.1)。この映像を見ながら操縦することであたかもドロ ーンに乗って操縦しているかのような感覚を得た。バッテリーが 0%になったら ゆっくりと着陸したので、安全面もしっかりしたシステムであるといえる。 実際に操縦してみて、誤作動もなく安定した飛行をすることができた。これ を踏まえて、音声認識で AR.Drone を制御した。 表 4.1 AR.Drone のキーボードによる動作一覧 Return---takeoff Space---land

Back Space---reset (from emergency) A / D---left / right

W / S---forward / back 1,2,…,0---speed

Up / Down---altitude

Left / Right---turn left / right

(11)

8

第 5 章 音声認識で制御

本章では AR.Drone を音声認識ソフト Julius で制御する。そのために使用し た USB マイクを図 5.1 に示す。

図 5.1 SANWA SUPPLY の MM-MCUSB16

図 5.2 は AR.Drone と通信したときにデスクトップに表示される画面である。 左の画面は発話された単語、右の画面は動画ストリーミングが表示される。し かし、動画ではなくコマンドが送られた時だけ更新される静止画でしか表示さ れないという問題が起こった。予想される原因と考察は、第六章で述べる。 図 5.2 AR.Drone と通信時のデスクトップ画面 無関係な発話を自動的に変換してしまって誤認識が発生するといった問題も 起こった。そこで安全対策として、先頭に「ドローン」という単語がこないと 動かないようにした(例えば「ドローン」+「飛べ」、「ドローン」+「右」な ど)。認識実験は 5.1 節で述べる。

(12)

9 5.1 Julius の音声認識実験 Julius だけを起動し、簡単な例文を 23 例文用意し、ランダムに発話していく というのを 3 回行った。発話は本論文の著者である今村が行い、騒音の少ない 場所で行った。 1 回目は、23 例文中 22 例文認識することができた(誤認識が 1 文)。しかし、 2 回目と 3 回目は 23 例文中全文が認識された。結果として 98.6%の精度が得ら れた。発話から文字に変換するまでの時間は、それ程気になる遅れはなかった。 この結果から、AR.Drone を安全に操縦できると判断した。 5.2 音声認識による AR.Drone の操作実験 安全な施設で音声認識を用いて AR.Drone の操作実験を行った。借りている 施設であったため、万が一にでも壁にぶつからないよう、離陸・着陸・右旋回・ 左旋回以外のコマンドは起動しないようにし、離陸→右旋回→左旋回→着陸と いう順にコマンドを送った。マイクと AR.Drone の距離を約5m離した状態で 行ったら、誤認識なく操縦することができた。しかし、AR.Drone との距離が近 ければ近いほどプロペラ音で発話を上手く読み込むことができなくなり、安全 性の課題が残った。もっと安全性について考える必要がある。

(13)

10

第 6 章 考察・展望

本章では、考察・展望について述べる。 ストリーミング配信が静止画になってしまった原因として、無限ループで音 声の受信を行っているので、それが妨げになっているのではないかと考えられ る。これの解決案として、音声の受信とストリーミング配信の受信を並列に行 えば、スムーズな動画を映すことが可能になるのではないかと考える。 そして、より安全性を強化するために以下のようなことを考えた。 1. 音声認識とキーボードを組み合わせる。 音声認識で何か問題が起こったときは、何かキーボードを押せば安全にホバ リングまたは着陸するといったシステムにすれば、操縦ミスによる危険性を 避けることが可能ではないかと考える。 2. 障害物を検知する AR.Drone に内蔵されているカメラによって、壁があると検知し、ある程度 の距離になると自動的にその場でホバリングし、障害物があれば自動的に避 けるというシステムにする。 3. マイクを変える 図 5.1 のマイクだと、近くの余計な雑音も拾ってしまう可能性がある。そこ で、マイク付近の発話しか拾わないマイクを使用すれば誤認識が減ると考え る。 展望として、障害物を自動的に避けるような自律システムを取り入れ、もし 音声認識にエラーや問題が起こった場合にはキーボードでも並列に制御できる ようにする。よって、安全性に優れた操縦を行うことができる。

(14)

11

参考文献

Julius(2015)ホームページ http://julius.osdn.jp/ (2015 年 10 月参照) 荒木雅弘. (2007). 『フリーソフトでつくる音声認識システム』.森北出版. Python-ardrone (2015) https://github.com/venthur/python-ardrone (2015 年 10 月参照)

(15)

12

謝辞

本研究を行うにあたり、一生懸命ご指導をして頂いた白井教授に深く感謝いた します。

(16)

13

付録1 音声認識による AR.Drone 制御プログラム

「arTest.py」 #!/usr/bin/env python # -*- coding: utf-8 -*- import socket, re import serial import libardrone import pygame def show(line): for x in line: print x," ", print def catchSent(clientsock): flag=False answer=[] while True: recv_data = clientsock.recv(512) if re.search('<RECOGOUT>',recv_data): flag=True elif (flag==True): tmp = re.findall('WORD=".+"',recv_data) for one in tmp: answer.append(one.split('"')[1]) if re.search('/RECOGOUT>',recv_data): return(answer) def analyze(sent,drone): status = True

(17)

14 if ("ドローン" in sent):

print sent

if ("飛べ" in sent) or("行け" in sent): print "Fly" drone.takeoff() #離陸 elif ("降りろ" in sent): drone.land() #着陸 elif ("進め" in sent): drone.move_forward() #前進 elif ("さがれ" in sent): drone.move_backward() #後退 elif ("右" in sent): drone.move_right() #右折 elif ("左" in sent): drone.move_left() #左折 elif ("上昇" in sent): drone.move_up() #上昇 elif ("下降" in sent): drone.move_down() #下降 elif ("右旋回" in sent): drone.turn_left() #右旋回 elif ("左旋回" in sent): drone.turn_right() #左旋回 elif ("とまれ" in sent): drone.reset() #停止(緊急事態) status = False else: drone.hover() #ホバリング else: pass return status def main():

(18)

15 host = 'localhost'

port = 10500

clientsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) clientsock.connect((host, port)) # com = serial.Serial('/dev/ttyAMA0',57600,timeout=10) drone = libardrone.ARDrone() pygame.init() W, H = 320, 240 screen = pygame.display.set_mode((W, H)) clock = pygame.time.Clock() running = True while running: sent = catchSent(clientsock) show(sent[1:-1]) running = analyze(sent,drone) try: surface = pygame.image.fromstring(drone.image, (W, H), 'RGB') # battery status hud_color = (255, 0, 0) if drone.navdata.get('drone_state', dict()).get('emergency_mask', 1) else (10, 10, 255)

bat = drone.navdata.get(0, dict()).get('battery', 0) f = pygame.font.Font(None, 20)

hud = f.render('Battery: %i%%' % bat, True, hud_color) screen.blit(surface, (0, 0)) screen.blit(hud, (10, 10)) except: pass pygame.display.flip() clock.tick(50) pygame.display.set_caption("FPS: %.2f" % clock.get_fps())

(19)

16

print "Shutting down...", drone.halt()

print "Ok."

if __name__ == '__main__': main()

(20)

17

付録2 単語リスト

「ARDrone.voca」 %SONOTA えー e: えーと e: t o えーっと e: q t o えーっとー e: q t o: あー a: あーと a: t o あーっと a: q t o んー N N んーと N N t o んーっと N N q t o あのー a n o: そのー s o n o: と t o っと q t o うーん u: N うーんと u: N t o %NOISE NS sp %B silB silB %E silE silE %HOUKOU 上昇 j o u sh o u 上昇 j o: sh o u 上昇 j o: sh o: 上昇 j o u sh o:

(21)

18 上昇 a q p u 下降 k a k o u 下降 k a k o: 下降 d a u N 右旋回 m i g i s e N k a i 左旋回 h i d a r i s e N k a i %UGOKI 進め s u s u m e 進め s u s u m u 進め h a q sh i N 進め z e N sh i N 行け i k e 行け i k u 行け g o: とまれ t o m a r e とまれ t o m a r u とまれ s u t o q p u とまれ t e i sh i とまれ t e: sh i さがれ s a g a r e さがれ s a g a r u さがれ b a q k u さがれ m o d o r e さがれ m o d o r u さがれ k o u t a i さがれ k o: u t a i 飛べ t o b e 飛べ t o b u 飛べ r i r i k u 降りろ o r i r o 降りろ o r i r u 降りろ ch a k u r i k u 降りろ ch a k u ch i 右折 u s e ts u 左折 s a s e ts u

(22)

19 %NAMAE

ドローン d o r o N ドローン d o r o: N

(23)

20

付録3 文法パターンリスト

「ARDrone.grammer」

S : B NAMAE E

S : B NAMAE NOISE HOUKOU E S : B NAMAE NOISE UGOKI E

S : B NAMAE NOISE SONOTA NOISE UGOKI E S : B NAMAE NOISE SONOTA NOISE HOUKOU E

(24)

21

付録4Julius の設定ファイル

「ARDrone.jconf」 -gram ARDrone -C ../../hmm_ptm.jconf -input mic -rejectshort 800 -lv 1800

(25)

22

付録 5 コマンドリスト

takeoff 離陸 land 着陸 hover ホバリング move_left 左移動 move_right 右移動 move_up 上昇 move_down 下降 move_forward 前進 move_backward 後退 turn_left 左旋回 turn_right 右旋回 set_speed AR.Drone の移動スピードを変える halt 停止

図 4.1  AR.Drone から送られてくるストリーミング動画
図 5.1  SANWA    SUPPLY の MM-MCUSB16

参照

関連したドキュメント

会 員 工修 福井 高専助教授 環境都市工学 科 会員 工博 金沢大学教授 工学部土木建設工学科 会員Ph .D.金 沢大学教授 工学部土木建設 工学科 会員

氏名 学位の種類 学位記番号 学位授与の日付 学位授与の要件 学位授与の題目

学位授与番号 学位授与年月日 氏名 学位論文題目. 医博甲第1367号

学位授与番号 学位授与年月日 氏名

氏名 小越康宏 生年月日 本籍 学位の種類 学位記番号 学位授与の日付 学位授与の要件 学位授与の題目..

理工学部・情報理工学部・生命科学部・薬学部 AO 英語基準入学試験【4 月入学】 国際関係学部・グローバル教養学部・情報理工学部 AO

It seems that the word “personality” includes both the universality of care and each care worker ’s originality with certain balance, and also shows there are unique relations

ハンブルク大学の Harunaga Isaacson 教授も,ポスドク研究員としてオックスフォード