◆PROCESSING 逆引きリファレンス
カテゴリー:ゲーム作成
PROCESSINGで音声認識を行うには(Windows編)
【概要】
最近のスマホはよく出来ていて、人間の話し言葉を理解して、音声で受け答えしてくれます。
このような機能としてはAppleのSiriが有名ですね。
以前の記事「PROCESSINGで音声合成を行うには(Windows編)」では音声合成により、PROCESSING(Java)に喋らせる方法を紹介しました。
今回はその逆で、人間の話言葉をPROCESSING(Java)に認識させる方法について紹介したいと思います。
コンピュータに人間の話し言葉を認識(音声認識)させるには、GoogleやMicrosoftが有料で公開しているオンラインサービスを利用するのがトレンドです。
これらの技術は各メーカーがしのぎを削って開発競争をしている分野であるため、どんどん進化しています。認識速度と精度を求めるなら、素直に各メーカーのオンラインサービスを利用するのが良いと思われます。
一方で
- オンラインでのサービスが利用できない(ぜひオフラインで利用したい)
- 無料が良い
- PROCESSING(Java)から手軽に試してみたい
といった場合、これらのオンラインサービスはちょっとミスマッチなところがあります。
そんなニーズを満たすために、Windowsに標準搭載されているSystem.Speech機能を利用して、PROCESSING(Java)から音声認識を行えるライブラリーを用意しました。
ただしオフラインでの音声認識は、各社のオンラインサービスと比べて
- 認識精度が悪い
- 動作が遅い
といった欠点があります。
認識精度や動作スピードが気にならないよという方は、以下の利用条件を熟読の上、利用規約を守れる方のみ利用することが可能です。
動作環境は以下のようになります。
- Windows10 以降のOS上から利用する事
- 利用環境にJRE1.8以降がインストールされている事
OSは最新のWindows10を利用してください。
本ライブラリはJavaプログラムからも利用可能ですが、PROCESSINGからのみ利用するのであれば、JREのインストールは不要です。
今回のライブラリーは64bit版のみの提供となります。
また本ライブラリーを利用する場合は、PROCESSING(JRE/JDK)は必ず64bit版を利用してください(重要)。開発環境にIDEを使われる方は、EclipseやIntelliJ IDEAなどのbit数も合わせてくださいね。
一部でも x86 と x64 が混在していると動作しないので、注意が必要です。
ライブラリの入手と利用条件について
下記からダウンロードしていただけるプログラムとドキュメント(以下、本APと呼称)の著作権はMSLABOにあります。
本APのMSLABO作成部分は、クリエイティブ・コモンズ 表示 – 継承 4.0 国際 ライセンスに従い提供されています。
また本APが利用しているJNA、PROCESSINGなどの各モジュールについては、各ソフトウェアのライセンス規約に従うものとします。
利用にあたっては、必ず自己責任でお願い致します。
本APの不具合については極力善処を行う予定ですが、これを保証するものではありません。
また本APに関する情報はすべてMSLABOのHPから一方的に公開するものとし、原則として、個別の問い合わせや要望は受け付けません。
上記事項に同意頂ける方のみ、下記よりダウンロードする事が可能です。
WindowsのSystem.Speech機能をPROCESSINGから使うためのライブラリです。Javaアプリケーションから利用することも可能です。64bit版のみの提供となりますので、32bit環境では動作しません。
MSLABO 作『WinSpeech』はクリエイティブ・コモンズ 表示 – 継承 4.0 国際 ライセンスで提供されています。
ダウンロードすると「WinSpeech_20200301.zip」というファイルが出来上がります。
以下はダウンロードファイルの構成です。
インストールについて
PROCESSINGの場合
まずPROCESSINGの標準エディタから「新規プロジェクト」を作成し、空で良いので一度保存します。
なお保存前に「ファイル→設定」で、スケッチブックの場所に「わかりやすいパス」が指定されている事を確認してください。
上記例なら、スケッチを保存すると「C:\processing-3.5.4\src」に「sketch_200321a」などのフォルダが作成され、空のプログラムソースファイルができあがります。
この時点で、一度標準エディタを閉じておきます。
続いて、作成されたスケッチフォルダ(C:\processing-3.5.4\src\sketch_200321a)配下に、ダウンロードしたファイルを解凍した中にある code フォルダーを、フォルダーごと複写してください。
複写できたら、「sketch_200321a.pde」をダブルクリックして、標準エディタを起動します。
WinSpeechを利用する際は、プログラムの先頭に以下の import 文を追記してください。
import SpeechPkg.*;
Javaの場合
お好きなエディタでプロジェクトを作成し、 codeフォルダの中にある jar ファイルと dll を、プロジェクトに取り込んでください。
以下は VisualStudioCodeでJavaのプロジェクトを作成し、libフォルダー配下にjarとdllを置いて、クラスパスを通した例です。
.classpassに WinSpeech.jarのパスを追記してあります。場所は適当(私の環境)ですので、あなたの環境に合わせて変更してくださいね。
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> <classpathentry kind="src" path="src"/> <classpathentry kind="output" path="bin"/> <classpathentry kind="lib" path="C:\\VSCDJava\\Sample\\JavaTest\\lib\\WinSpeech.jar"/> </classpath> |
ライブラリの動作原理について
PROCESSINGから呼び出すJavaライブラリー(Jarファイル)と、WindowsのSystem.Speech機能を使うためのC#マネージドDLLから構成されています。
(画像URL:illust-AC 様:ぷーちゃんさん)
こんな感じです。
DllExportというライブラリーを利用する事で、なんとJavaからJNA経由で直接マネージドコードを呼び出しています!。
詳しくは「JavaからC#のDLLを呼び出す」で記事にしていますので、興味がある方は参考としてください。
使い方
ダウンロードしたファイルを解凍すると出来上がる doc フォルダ配下に、リファレンス(index.html)があります。
また下記サンプルプログラムも参考としてください。
【関連記事】
サンプルプログラム
シンプルな音声解析例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/** * PROCESSING 3 音声認識Sample * @auther MSLABO * @version 1.0 2020/03 */ import SpeechPkg.*; WinSpeech ws; void setup(){ //インスタンスを生成する ws = new WinSpeech(sketchPath("code")); //解析エンジンをOpenする ws.OpenEngine(); //非同期解析開始 ws.StartAsyncRecognized( WinSpeech.SINGLE ); } void draw(){ //解析結果を読み取る String retVal = ws.GetSpeechRecognized(); if( !retVal.equals("") ){ //なにか解析できたら終了 println("解析終了:[" + retVal + "]" ); ws.CloseEngine(); exit(); } } |
シンプルな音声解析例です。上記例では、解析を非同期で1回だけ行っています。
<出力サンプル>
音声で操作する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
/** * PROCESSING 3 音声認識Sample2 * @auther MSLABO * @version 1.0 2020/03 */ import SpeechPkg.*; WinSpeech ws; int recog; int timeCount; void setup(){ size(300,300); //インスタンスを生成する ws = new WinSpeech(sketchPath("code")); //解析エンジンを文法モードでOpenする ws.OpenEngine( WinSpeech.GRAMMAR ); //非同期解析開始 ws.StartAsyncRecognized( WinSpeech.MULTIPLE ); } void draw(){ background(255); //円と四角を描く drawEllpse( color(200) ); drawRect( color(200) ); //解析結果を読み取る String retVal = ws.GetSpeechRecognized(); if( !retVal.equals("") && timeCount < 1 ){ if( retVal.equals("左")){ recog = LEFT; timeCount = 10; } else if( retVal.equals("右") ){ recog = RIGHT; timeCount = 10; } else if( retVal.equals("終わり") ){ ws.CloseEngine(); exit(); } println( retVal ); } if( timeCount > 0 ){ //期待する音声が認識されたら、しばらく図形の色を変える if( recog == LEFT ){ drawEllpse( color(255,50,50) ); } else if( recog == RIGHT ){ drawRect( color(255,255,50) ); } timeCount--; } } //円を描く void drawEllpse( color c ){ fill(c); ellipse( 80, 150, 100 , 100 ); } //四角形を描く void drawRect( color c ){ fill(c); rect( 180, 100, 100, 100 ); } |
実行すると、画面に円と四角が描かれます。
「左」と発音すると円に、「右」と発音すると四角形に色が付きます。
この例のように限られた言葉を認識させれば良いケースでは、自由会話解析よりも辞書解析の方が精度が高くなります。
辞書ファイルはWinSpeechのコンストラクタで指定したDLLのパス(例ではsketchパスのcodeフォルダー)と同じフォルダーにあるものとみなして処理されます。
リファレンスにも記載しましたが、辞書ファイルはShift-JISで記述してください。
以下は上記サンプルの文法ファイルの中身です。
1 2 3 4 |
#文法ファイル例 左 右 終わり |
<出力サンプル>
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。