盲目の方向けのしゃべる電子辞書つくったった
これは何?
これは、盲目の方が一人で使えるように作られたしゃべる電子辞書です。
Raspberry Pi 2を内部に組み込んで制御しています。
この電子辞書は、大まかに述べると以下のような特徴を持っています。
- 複数の辞書を搭載
- 合成音声による語句の意味の説明(リアルタイムの合成)
- 音声ガイドによる、盲目の方でも操作できるシステム
- 操作しやすいハードウェア
これ以降読むのがめんどくさいという人はこの動画をみてください(笑)
いや読むよ!って人も見てくれると嬉しいです。
作ったワケは?
端的に言えば、僕の盲目の知人に使ってもらうためです。
僕には盲目の知人がいるんですが、彼がよく僕に話すのは、「四字熟語の意味を自分で調べたい」という願いです。いつもは彼の奥さんに電子辞書で意味を調べてもらっているようですが、それでは物足りない(?)んでしょうね。
とりあえず、盲目の方が一人で使用できる電子辞書のようなものが既に出回っていないか調べたんですが、僕が調べた限りではそのようなものは販売していませんでした。
「あれ?アシスト機能を持ったスマホやガラケーを使えばいいのでは?」という意見もあると思います。確かに、操作方法を頑張って覚えれば音声ガイドを頼りに熟語の意味を調べることは可能ですし、実際それらを使いこなす盲目の方もいらっしゃるようです。しかし知人曰く、手先が器用な方ではないためスマホとかは使いたく無いとのこと。
ということで、知人には「ある程度操作が簡単でかつ音声で意味を教えてくれる電子辞書」が必要でした。
私のポリシーは「ないものは作る」です。
大学で技術を身に着けた今、知人の為に特注の電子辞書を作ってあげようと思ったのがきっかけでこの作品が生まれました。
知人の為に作ったものではありますが、これがもっとブラッシュアップされれば、他の多くの盲目の方がより多くの情報へアクセスするための手助けになるのかなぁ、などとぼんやり思っています。
この電子辞書の特徴
この電子辞書の特徴は最初に述べたとおり4つあります。
- 複数の辞書を搭載
- 合成音声による語句の意味の説明(リアルタイムの合成)
- 音声ガイドによる、盲目の方でも操作できるシステム
- 操作しやすいハードウェア
複数の辞書を搭載
現在は「四字熟語辞典」と「薬辞典」を搭載しています。どちらも知人が欲しがっていた辞典です。今後辞書を追加することも可能で、辞書の追加がしやすいようなソフトウェア構造になっています。
合成音声による語句の意味の説明(リアルタイムの合成)
辞書の意味を全て音声データとしてSDカードに保持させるのは現実的ではありません(総項目数は約2万件もあります)。この装置にはテキストデータだけを保持させ、読み上げには「OpenJTalk」というオープンソースの音声合成ソフトを利用しています。音声合成ソフトウェアは他にもいろいろなものがあるのですが、漢字を正しく読めるか、聞き取りやすいか、といった点を考慮してOpenJTalkを採用しています。
また、Raspberry Piでの音声合成は時間がかかるので、マルチスレッディングにて音声合成と再生を並行して進める方式を用いました。これによって合成開始から再生開始までの遅延短縮を実現しています。
音声ガイドによる、盲目の方でも操作できるシステム
知人が一人で操作できることを目指したシステムを作りました。操作方法をど忘れしても大丈夫。逐一音声での操作ガイドが再生されるようになっています。基本的な操作は全て装置手前の左右のボタンと中央の決定ボタンで行うシンプルな構造になっています。
検索語句を入力する際は、ガラケーと同じシステムで入力を行います。音声認識は著しく精度が悪いので、入力の確実性の観点からボタン入力を採用しました。
「あ行ボタン」×2 → 「わ行ボタン」×3 → 「か行ボタン」×1 →「濁点・半濁点ボタン」→ 「あ行ボタン」×5 →「右三角」→ 「あ行ボタン」×3 → 「は行ボタン」×5 → 「あ行ボタン」×3 |
とボタンを押していきます。
ガラケー方式は、確かに初めは慣れるまで時間がかかりますが、慣れてしまえばこの方式が一番早く入力できると考えています。
「しゃべる」ボタンも重要な役割を持っており、ボタンを押すたびに、入力文字列や選択内容を音声で教えてくれます。逐一音声で確認しながらの操作が可能なので、誤選択や誤入力を防ぐことができます。
操作しやすいハードウェア
ハードウェア的な特徴として、全てのボタンを大きく作ってあります。ケータイなどの小さなボタンよりは遥かに入力しやすくなっています。
また、いくつかのボタンにはアクリル板を切り出して作ったシンボルを貼り付けてあります。これによってボタンの判別がしやすくなっています。知人は点字が読めないので独自のシンボルになっていますが、点字が読めるのであれば、点字を各ボタン上に貼り付けるのでも良いと思います。
今回は未実装ですが、スイッチによって音声のイヤホン出力とスピーカー出力を切り替えらえる機能も付ける予定でした。
使い方
この装置は、電源を入れると以下のような流れで動作します。
最初に使う辞書を選択して、検索語句を入力します。すると、検索語句にマッチした項目がリストアップされるので、その中から内容を聞きたい語句を選択。内容が音声で流れるので、それを聞きます。終わったらまた内容を聞き直すなり、リストアップされた中から別の単語の内容を聞くなり、検索し直すなりする、という感じです。
基本的な操作方法は以下の通り。
操作方法 | 内容 |
左右の三角ボタン | 項目の選択 |
中央の丸ボタン | 次の状態へ遷移 |
しゃべるボタンの 横にあるバツボタン | 前の状態へ遷移 |
しゃべるボタン | 選択項目や入力文字列の読み上げ |
検索語句の入力時のみ、左右の三角ボタンの役割が変わります。
操作方法 | 内容 |
左三角ボタン | 入力を一文字消去 |
右三角ボタン | 同じ行の文字を連続で打てるようにする(入力例参照) |
その他の機能
音量の調節機能
この装置には音量調節用のボタンがついています。
押すたびに音量が大きく/小さくなります。
電源オフ機能
Raspberry Piは単に電源コードを引っこ抜くだけでは正常に終了できません。
簡単に正常終了させるために、電源オフボタンを搭載しています。
音量ボタンの隣にある黒いスイッチがソレです。
これを押すとシャットダウン処理が始まるので、安全にシステムを終了させられます。
本当はこのボタンは音声出力のイヤホン/スピーカー切り替えに割り当てるはずだったんですが、ちょうどいいスピーカーが見つからなかったので、とりあえずシャットダウンに割り当てている感じです。
シャットダウン忘れ防止機能
Raspberry Piにとって電源ぶっこ抜きはタブーなことですが、そうはいってもシャットダウンを忘れて電源を引っこ抜いちゃうかもしれません。
そんな時でも正常に終了させるために、この装置にはRaspberry Pi用の無停電電源装置「UPS Pico」を組み込んであります。
電源コードを引っこ抜かれたことを検知したら、自動的にシャットダウン処理を行います。
技術的なこと
ハードウェア
外装に用いるパーツはMDFをレーザー加工機で加工しています。
アクリル板も同様にレーザー加工機で加工しています。
接着剤を使わなくても組み立てられるように設計してあるのが特徴で、おかげで修理時に分解・組み立てが容易に行えるようになっています。(MDFをネジで直角に固定する構造で参考にしたサイト)
レーザー加工機を用いたことで精密に穴の位置を加工することができました。
電気回路に関しては、特に難しい技術は使っていません。プルアップでスイッチを接続したくらい・・・?
ちょっと外装の設計をミスって基板の形も変わってしまい、継ぎはぎだらけの基板になってしまったところが残念。
ソフトウェア
Raspberry Pi上では、いくつかのプロセスを平行で実行しています。
- メインとなる電子辞書機能のプロセス
- 音声再生のプロセス
- 音量調整のプロセス
- シャットダウンスイッチの動作を待つプロセス
- 電源ケーブルが外れたかを検知するプロセス
さすがRaspberry Pi。Arduinoじゃこういうことはできません。
音声合成に関して、OpenJTalkを用いた場合、意味の説明などの長文を一度に合成すると非常に長い時間がかかる上に、一定以上の文字数の文章は合成しきれないという問題があります。これは作成できるwavファイルのサイズに上限が設定されている事が原因のようでした。
今回の装置ではこれを解決するために、文章を小さい単位に分割し、小さいサイズのwavファイルを生成・再生する方法を採用しました。この方式は以下のブログを参考にさせていただきました。
流れとしては、まず文章を句読点などで分割し、それらを並列処理にて同時に合成し、wavファイルを作成していきます。そして、wavファイルが作成され次第順次再生を始めていく、という感じです。
こうする事で全体の合成が完了していなくても再生を始めることができ、音声が再生され始めるまでの遅延を大幅に短縮する事ができす。また、句読点で分割することでOpenJTalkに渡される文章の文字数が限界を超えないようになり、合成エラーが起きなくなりました。
ただ、この並列化の代償として音声関連のプロセス操作が複雑になってしまいました。
音声再生中でも各種操作は可能で、何らかの入力が確認され次第今の音声再生を中止して新たな音声を再生させるようになっていますが、再生プロセスが単一ではなくなったため、単純に再生中のプロセスをkillするだけではうまくいかなくなったのです。音声が重なって再生されたり、再生が止まらなかったり、順番がめちゃくちゃになったり、いろんな問題が起こりました。
これが、メインの電子辞書プロセスと音声再生プロセスが分かれている理由です。色々と試行錯誤した結果、スピーカーとして音声再生プロセスを常駐させておき、適宜メインプロセスから音声再生や停止のリクエストを送る方法に落ち着きました。
遅延に関して、さらなる遅延の短縮のために、ガイド音声などはあらかじめ合成しておいた音声を用いるようにしました。これでいちいち合成せずに済みます。
検索語句入力時の、ボタンを押した時の文字の音声(「あ」や「か」など)もあらかじめ合成しておきましたが、どうも聞き取りやすい音声になりません。OpenJTalkは一文字の合成が苦手なようです。
こちらは聞き取りやすさの観点から、UTAUの「重音テト」という音声ライブラリで合成した音声を用いています。
制作費
買い出し時に払った総額は19346円でしたが、使ってない部品もあるので、かかった費用はだいたい19000円くらいだと思います。
MDF以外は秋葉原で買い揃えました。
いや〜、最高です。秋葉原。
おわりに
色々と苦労の絶えなかった開発でした…(笑)
まず設計に関してです。外箱の設計はイラストレーターを用いて行うのですが、どうしても空間的なことがおろそかになってしまうのか、後になって内部の基板とネジが干渉してしまい…
ネジ穴の位置を変えざるを得なくなって、基板が継ぎはぎだらけになってしまいました…
部品に関しても、買ってきたボタンの足が基板に挿さらなかった時はどうしようかと思いました。
結局ボタンの足に針金をはんだ付けして、それを基板に刺して使いましたが、ちょっと強引な手だったなと思います(笑)
基板にはんだ付けする時も、針金が取れてしまったりして大変でした。
ソフトウェア面でも、特に音声再生で苦労が絶えませんでした。ハードウェアなど全体を完成させるのには1か月もかからなかったのですが、ソフトウェアデバッグだけでその何倍もの時間がかかってしまいました。
不具合の連続で大変でしたが、なんとか動くものが作れてよかったです。
これが知人の豊かな生活の一助となれば幸いです。
この記事へのコメントはこちら