ゲームのメッセージ欄に表示されたメッセージの読み上げシステム

Page content

4 月頃から、英語のレベルを上げるため参考書を買って勉強をしている。

その参考書を使った最低限の基礎英語の復習は終ったので、次のステップに進むことにした。

基礎が終った後の学習方法には何が良いのか色々と調べてみたが、 色々な意見があるが最終的には「持続できるものが良い」というのが結論のようだ。

まぁ、「持続すること」が英語学習で最も難しいことは、 私自身が何度も挫折した経験があるので認識している。

そもそも、先日まで復習していた参考書もかなり眠い目をこすりながらやっていて、 このまま参考書を進めていっても、間違いなくまた挫折することは明らかだった。

じゃぁ、何が一番持続できるか?と考えた時、自分にはゲームが良いだろう。 という結論になった。

海外ゲームによる英語学習

ゲームのジャンルは、いわゆるノベルゲームあるいはアドベンチャーゲーム。 有名どころで STEINS;GATE と言えば通じるだろうか? これなら文章量がハンパないので、勉強量という意味では問題ないだろう。 「ゲームでの英語学習は効率が悪い」という意見があるが、 「持続すること」が一番重要なので、「効率の悪さ」はこの際無視することにした。

ともかく今は、英語の文章を英語のまま解釈できるようになるため、 英語の文章をひたすら入力していくのが最も重要な期間で、 その期間を挫折せずにやりすごすためにも、「持続すること」が一番重要と考えている。

「習うより慣れよ」、脊髄反射できるまでの試練だ。

そもそも、本当に効率の良い英語学習方法が存在するのであれば 文科省もバカじゃないんだからその方法を採用しているはず。 そして、その学習方法に本当に効果があれば、 日本人の大多数が英語が出来ないまま放置されているはずがない。 しかし、現実問題として私を含め日本人の大多数が英語が出来ないままである。

つまり「日本国内における英語学習方法の違いによる効率の差」は、 ほとんど誤差レベルなんだと思う。

もちろん、「英語しか話せない人の中で生活すること」と、 「日本国内で独学で英語を学習する」のとでは、英語の習得効率に明らかな違いはあるだろう。 しかし、「日本国内で独学で英語を学習する方法」は、 どのような学習方法であっても、どれも大差ないレベルなんだと思う。

海外ゲームによる英語学習における問題

ということで、先週辺りから海外のゲームをプレイしているんだが、一つ問題がある。

その問題とは「reading の経験値しか得られない」ということだ。

日本のゲームの海外移植版をやるのがとっかかり易いと考えてたが、 そのゲームの TEXT は英語だが音声は日本語のままだった。 てっきり海外移植版なら音声も英語になっているものだと思っていたが、完全に想定外だった。

それならば、海外制作のオリジナルゲームなら音声も英語だろう、と思って探したが、 そもそも海外制作のノベルゲームやアドベンチャーゲームというジャンルはほとんど無かった。 あっても、音声がないという状況だ。 もちろん、他のジャンルのゲームなら英語音声のものはある。 しかしそのようなゲームは、TEXT の量的問題や、 そもそも英語とか関係なくゲームが進んでいって、 ほとんど単にゲームをプレイしているだけになってしまう、という問題がある。

ちなみに、海外ドラマや映画を学習手段として試したことがあるが、 アレはスピードが速すぎて、 自分のレベルではとてもではないけどハードルが高過ぎるという結論になっている。

自分のペースで進められる、というのが、 ノベルゲームやアドベンチャーゲームの良いところだ。

もちろん、内容が面白く持続できるということが前提だが。

なお、今回海外のゲームを探してみて初めて気が付いたことだが、 海外でアドベンチャーゲームというと、日本のアドベンチャーゲームとは全く違って、 アクションゲームがアドベンチャーゲームに分類されていた。

まぁ「adventure」 は「冒険」なんだから、当然といえば当然だろうが。

だいぶ前置きが長くなったが、 そんな訳で、多くの時間を費やして「reading の経験値しか得られない」のは勿体無いので、 「どうにかしてゲームに音声を付けよう」と思い、今回のツール制作に至った。

ゲームに音声を付ける手段

ここで想定するゲームは、 メッセージを表示する領域があり、クリックすることでメッセージが更新されて、 ストーリーが進んでいくものだ。

このメッセージを取り出し、機械音声でしゃべらせる。

もう少し技術的にいうと次になる。

  • スクリーンショットでゲーム画面をキャプチャ
  • キャプチャしたゲーム画面からメッセージ領域を判定し
  • メッセージ領域内のメッセージ画像を抽出し
  • 抽出したメッセージ画像を OCR にかけて TEXT に変換し
  • 変換した TEXT を Text To Speech で音声化する
  • 上記を GUI でコントロール

メッセージ画像の抽出は OpenCV、 OCR は Tesseract OCR、 Text To Speech は Windows10 標準の SAPI.SpVoice を利用する。

クラウドサービスの API を使えば、これらを全て行なってくれるものもありそうだが、 今回は上記の技術を組み合わせで自前で作成する。

まぁ、自分で作ること自体も面白そうだし。

なお、お手軽に作るため、開発言語は Python とする。

プログラミング言語として、個人的にはあまり Python は好きではないんだけど、 手軽でさまざまなライブラリが揃っていて情報量も豊富、という意味では、 今は Python に敵う言語はないんじゃないかと思う。

なんだかんだ言っても、プログラミング言語はツールにすぎないので、 目的の物を簡単に作れるのが一番良い。 特に趣味で作るケースでは。

業務で使う場合は、 「チョット待て、他の言語はちゃんと検討したのか?」と言っておく。

自分で開発している LuneScript も、 lua VM 上で動作する大規模アプリを開発するには向いているけど、 使えるライブラリは皆無(Lua 用ライブラリは使えるけど、まともに使うには module 宣言が必要) なので、残念ながらこういう用途には向いていない。

ちなみに、 cygwin 版 python で作業しようと思ったが、 pip がどうにもこうにも期待通りに動作しなかったので、 普通の windows 版 python にした。

以降では、各技術について補足する。

スクリーンショット

スクリーンショット用に次をインストールする。

$ pip install pywin32
$ pip install Pillow
$ pip install pyscreenshot

pywin32 は、 win32gui で特定の Window の領域を取得するために必要。

具体的には次のような感じ。

def getImageOf( window_title ):
    rect = win32gui.GetWindowRect( win32gui.FindWindow(None,  window_title ) )
    return ImageGrab.grab().crop( rect )

OpenCV

次の処理を OpenCV で行なう。

  • ゲーム画面からメッセージ領域を判定
  • メッセージ領域内のメッセージ画像を抽出

ちなみに OpenCV のインストールは次で出来る。

$ pip install opencv-python

OCR (Tesseract OCR)

次の処理を Tesseract OCR で行なう。

  • 抽出したメッセージ画像を OCR にかけて TEXT に変換

Tesseract OCR は、次の URL からバイナリをダウンロードしてインストールし、

https://github.com/UB-Mannheim/tesseract/wiki

さらに python から利用するためのパッケージをインストールする。

$ pip3 install pyocr

Windows10 Text To Speech (SAPI.SpVoice)

次の処理を SAPI.SpVoice で行なう。

  • 変換した TEXT を Text To Speech で音声化する

<https://github.com/mhammond/pywin32/releases> から、 python のバージョンに合う win32com モジュールのインストーラをダウンロードし、 インストールする。

SAPI.Speech の制御方法は、次の URL を参考に。

<https://www.daniweb.com/programming/software-development/code/217062/text-to-speech-using-com-python>

この SAPI.SpVoice の音声は、 一昔前の合成音声に比べればだいぶマシに聞こえるが、やはり違和感を感じる。

英語が出来ない自分が、英語の音声に違和感の文句を云うのもどうかと思うが、 やはりイマドキの最新の Text To Speech 技術と比べると、品質が落ちる。

そこで、Text To Speech の部分はクラウドサービスを使って違和感の緩和を検討する。 これについては後日取り上げる。

GUI

GUI は tkinter を利用する。

用途は次の通り。

  • ゲームの Window 指定
  • OCR のトリガ
  • OCR 後のメッセージ表示 & 編集
  • 音声再生制御 (再生スピード,音量)

ログ

折角なので、学習の履歴を残す。

履歴は、日付、OCR 結果、全文字数 で、JSON 形式で残す。

欠点

このシステムの一番の欠点は、読み上げられる音声に全く感情が入らないってことだろう。 ゲームのト書部分なら無感情でも問題ないが、 セリフが無感情で読み上げられるのは、いささか味気ない。 まぁ、そこは割り切るしかないが。 今は、クリアに音声が聞こえる事の方が重要だろう。 感情がどうこういうのは、 実力が付いてから海外ドラマや映画を見るようにすれば良い話だ。

最後に

専門知識がなくても、フリーの技術を組合せるだけで、 これだけのものが作れるようになったというのはスゴい時代になったものだ。

ちなみにソースは <https://github.com/ifritJP/game-message-tts.git> にある。 興味があれば。