Imaginary Code

from kougaku-navi.net

VOICEROID 月読アイをProessingでしゃべらせる

「月読アイ」をご存じでしょうか.VOICEROIDという音声読み上げソフトのキャラクタバリエーションの1つです.テキストを入力するだけで簡単に脱力系のょぅι゙ょ声を作れるため,動画のナレーションのみならず,インタラクティブなアート作品などでも使われています.最近の例だと,日本科学未来館で展示されている「アナグラのうた〜消えた博士と残された装置〜」でも使われていました*1

さて,本来の使い方としては,テキストを入力→WAVファイルで保存→それを自分のプログラムで再生という感じなんですが,やはりプログラムで動的に生成されたテキストをインタラクティブに再生させたいですよね.

というわけで,Processingで月読アイをしゃべらせるコードを書きました.

/* VOICEROIDをProcessingでしゃべらせるコード(月読アイ専用)*/
import org.eclipse.swt.internal.win32.*;

void setup() {
  size(400,300);  
}

void draw() { 
  String voice = "こんにちは 工学ナビです";  // しゃべらせるデータ
  voiceroid_talk(voice);
  delay( voice.length() * 220 );              // しゃべり終わるまで適当に待つ
}

void voiceroid_talk(String voice_text) {

  // ウィンドウ名からハンドルを取得
  int hWnd = OS.FindWindow(null, new TCHAR(OS.CP_INSTALLED, "VOICEROID - アイ",true));
  OS.SetForegroundWindow(hWnd);

  // VOICEROIDのウィンドウを隠したいなら
  // OS.SetWindowPos(hWnd,0,-1000,0,0,0,0);

   ArrayList list = new ArrayList();
  list.add(String.valueOf( OS.GetWindow(hWnd, OS.GW_CHILD) ));
  
  // テキスト領域(クラス名:TkChild)のハンドルを取得
  while (list.size() > 0) {
    int i = Integer.parseInt( list.get(list.size()-1).toString() );
    list.remove(list.size()-1);
    TCHAR buf = new TCHAR(OS.CP_INSTALLED, 256);
    OS.GetClassName(i, buf, 256);
    if (buf.toString(0, buf.strlen()).equals("TkChild")) {
      hWnd = i;
      break;
    }
    int c = OS.GetWindow(i, OS.GW_CHILD);
    if (c == 0) {
      int n = OS.GetWindow(i, OS.GW_HWNDNEXT);
      if (n == 0) {
        continue;
      } else {
        list.add(String.valueOf(n));
      }
    } else {
      int n = OS.GetWindow(i, OS.GW_HWNDNEXT);
      if (n != 0) list.add(String.valueOf(n));
      list.add(String.valueOf(c));
    }
  }

  // キーコード送信  
  for (int i=0; i<voice_text.length(); i++) {
    OS.SendMessage(hWnd, OS.WM_CHAR, voice_text.charAt(i), 0);
  }
  
  // 再生実行(F5キー送信)
  OS.SendMessage(hWnd, OS.WM_KEYDOWN, OS.VK_F5, 0);
  
  // BackSpaceキー送信
  for (int i=0; i<voice_text.length(); i++) {
    OS.SendMessage(hWnd, OS.WM_KEYDOWN, OS.VK_BACK, 0);
  }
} 

このプログラムでは,SWT(The Standard Widget Toolkit)というJavaのライブラリを使っています.導入は簡単です.SWTの公式サイトに行って,Windows版のStable版(swt-3.7.1-win32-win32-x86.zip)をダウンロードします.



このファイルを解凍したら,中に入っているswt.jarを,Processingのスケッチ上にドラッグ&ドロップしてください*2.スケッチを書いたら,月読アイを起動してから,実行してください.

ちなみに「VOICEROID+吉田くん」では「F5キーで再生」ができないのでダメでした.また,再生ボタンに対して押下メッセージを送信する方法も試しましたが,アイ,吉田君いずれの場合もダメでした(やり方が悪いのかもしれませんが).「棒読みちゃん」というソフトと,それで月読アイをしゃべらせるプラグイン(AITalk)を使い,それと連携する方法もありますが,Processingだけでできるならそっちがいいかなという気がします.

ではでは.

VOICEROID 月読アイ

VOICEROID 月読アイ

*1:http://www.ai-j.jp/archives/2401

*2:スケッチにJARをドラッグ&ドロップするやり方では,スケッチフォルダ内にdataというフォルダが自動的に作られ,そこにJARファイルがコピーされます.Processingで普段使うライブラリとしてインストールしたければ,Processing\libraries\swt\libraryというフォルダの中にJARファイルを入れてください.