Kinect for Windowsで機器を作るヒント(4) ―― 日本語の音声認識をやってみる

茂出木 裕也

tag: 組み込み Interface

技術解説 2012年6月25日

●Kinect for Windows のマイク・アレイについて

 連載第1回でも簡単に紹介しましたが,Kinect for Windowsはカラー・カメラや深度センサの他にも,4つのマイクをマイク・アレイとして搭載しています.Kinect for Windowsのマイク・アレイは主に次のような特徴を持っています.
・単一のマイクに比べ,ノイズ抑制やエコー・キャンセルなどの機能をサポートする
・ビームフォーミングによる音声方向の特定,一定の方向からの音声を識別できる
・Speech Platform SDKを利用することで,音声認識に対応したアプリケーションを開発できる
 今回はこのうち,「音声認識機能」について詳しく紹介します.


●マイク・アレイを利用した音声認識機能

 Kinect for Windows では当初よりマイク・アレイを使った音声認識機能が搭載されていましたが,対応する言語は英語のみでした.今回のKinect for Windows SDK 1.5では新たに4カ国語(フランス語,イタリア語,スペイン語,日本語)に対応し,認識可能な言語範囲が拡張されています.

 

●開発環境にSpeech Platform SDKを追加する

 Kinect for Windows SDK 1.5をインストールしただけでは,音声認識対応のアプリを開発するのに必要なSpeech Platform SDKはインストールされません.音声認識に対応したアプリケーションを開発する場合は,Kinect for Windows SDK 1.5をインストールした後に,「Microsoft Speech Platform SDK Version 11」を追加でインストールします.
 まず,Developer Toolkit BrowserのSDKs(図1)に含まれているSpeech Platform SDK 11.0より該当のWebサイトにアクセスします.

図1 Developer Toolkit Browser:SDKs

 対象がx86(32bit)環境であればx86_MicrosoftSpeechPlatformSDK\MicrosoftSpeechPlatformSDK.msiを,x64(64bit)環境であればx64_MicrosoftSpeechPlatformSDK\MicrosoftSpeechPlatformSDK.msi をダウンロードし,インストールします(図2図3).

図2 Speech Platform SDKのダウンロード

図3 Speech Platform SDKのインストール

 インストールが完了すると図4のようにコントロールパネルの「プログラムと機能」のところにSpeech Platform SDKが追加されているはずです.

図4-1. 追加されたSpeech Platform SDK (x86版)

 
図4-2. 追加されたSpeech Platform SDK (x64版)

 

●日本語対応の音声言語パッケージを追加インストールする

 英語の音声言語パッケージはKinect for Windows SDK 1.5のインストール時に一緒にインストールされますが,日本語に対応させるには日本語用の音声言語パッケージを別途入手する必要があります.
 Developer Toolkit BrowserのComponents(図5)に含まれているKinect Speech Language Packsより該当のWebサイトにアクセスします.

図5 Developer Toolkit Browser:Components

 ダウンロード対象の中からKinectSpeechLanguagePack_ja-JP.exe をダウンロードし,インストールします(図6図7).

図6 言語パックのダウンロード

図7 言語パックのインストール

 インストールが完了すると図8のように日本語の言語パックが追加されているはずです.

図8 追加された言語パック

 

●サンプル・プログラムを日本語対応に変更してみる

 日本語の音声認識環境が整ったので,サンプル・プログラムのSpeech Basics(図9)を日本語で操作できるように変更してみましょう.

図9 音声認識のサンプル・プログラム Speech Basics

 まず,Kinect for Windows Developer Toolkit v1.5.0を開き,「Speech Basic-WPF」の右にあるアイコン「Install」を選択して,このサンプル・プログラムのソースコードをローカルディスクの指定した場所にコピーします.
 つぎに,サンプル・ソースコードをコピーしたフォルダを開き,ソリューションファイル(図10のSpeechBasics-WPF.sln) をダブルクリックするとVisual Studio2010が起動します.

図10 Speech Basic-WPFのサンプルソースコード

 

 なお,WPF(Windows Presentation Foundation)とは、アプリケーションのユーザーインターフェース(GUI)の実装に使われる仕組みで,XAML(Extensible Application Markup Language)と呼ばれるXMLをベースとしたマークアップ言語を使用してコードを記述します.WPFを使用すると,ユーザーインターフェースに動きを持たせたり,画像や動画などのコンテンツを簡単に扱うことができます.このSpeech Basic-WPFのサンプル・ソースコードは,C#言語とWPFで用意されています.
 続けて,ソリューション エクスプローラーからMainWindows.xaml.cs を開きます(図11).

図11 ソリューション エクスプローラー

 

 

 サンプルでは,"Forward"や"Back"という英語を認識して亀を動かす内容になっていますが,この部分を"まえ"や"うしろ"といった日本語の音声を認識して動かすようにソースコードを変更してみます.
 MainWindows.xaml.cs内のGetKinectRecognizerで,"en-US"の部分を"ja-JP"に変更し音声認識に日本語を指定します(リスト1

リスト1 GetKinectRecognizer で,音声認識に日本語を指定する.赤字部分を削除(コメントアウト),青字部分を追加.

private static RecognizerInfo GetKinectRecognizer()
{
  foreach (RecognizerInfo recognizer in SpeechRecognitionEngine.InstalledRecognizers())
  {
    string value;
    recognizer.AdditionalInfo.TryGetValue("Kinect", out value);
    //if ("True".Equals(value, StringComparison.OrdinalIgnoreCase) && "en-US".Equals(recognizer.Culture.Name, StringComparison.OrdinalIgnoreCase))
    if ("True".Equals(value, StringComparison.OrdinalIgnoreCase) && "ja-JP".Equals(recognizer.Culture.Name, StringComparison.OrdinalIgnoreCase))
    {
      return recognizer;
    }
  }
  
  return null;
}

 

  サンプルでは,音声認識用の辞書ファイル(SpeechGrammar.xml)に定義された単語を読み込むように作られています.

 ここでは、辞書ファイルの内容を変更する方法と,辞書ファイルを読まずにソースコード内に直接日本語の音声認識用の単語を追加する方法の2つを紹介します.

  

●方法1  辞書ファイルの内容を変更する

 MainWindows.xaml.cs のWindowLoaded内で,「Encoding.ASCII」の部分を「Encoding.UTF8」に変更し,辞書ファイルから日本語の文字列を取得できるようにします(リスト2).

リスト2 WindowLoaded内の変更.赤字部分を削除(コメントアウト),青字部分を追加.

  // Create a grammar from grammar definition XML file.
  //using (var memoryStream = new MemoryStream(Encoding.ASCII.GetBytes(Properties.Resources.SpeechGrammar)))
  using (var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(Properties.Resources.SpeechGrammar)))
  {
   var g = new Grammar(memoryStream);
   speechEngine.LoadGrammar(g);
  }

 MainWindows.xaml.cs のSpeechRecognized 内に記述されているcase文の定義も,それぞれリスト3のように変更します.


リスト3 SpeechRecognized内の変更.赤字部分を削除(コメントアウト),青字部分を追加.

  private void SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
  {
*** 中略 ***
    if (e.Result.Confidence >= ConfidenceThreshold)
    {
      switch (e.Result.Semantics.Value.ToString())
      {
        // case "FORWARD":
        case "すすむ":
*** 中略 ***
          break;
        //case "BACKWARD":
        case "さがる":
*** 中略 ***
          break;
        //case "LEFT":
        case "ひだりをむく":
*** 中略 ***
          break;
        //case "RIGHT":
        case "みぎをむく":
*** 中略 ***
          break;
      }
    }

 

 MainWindows.xaml.cs の変更は以上で完了です.
 次に,ソリューション エクスプローラ からSpeechGrammar.xmlファイルを開きます.

 リスト4のようにxml:lang="en-US"の部分をxml:lang="ja-JP"に書き換え,<tag></tag>と<item></item>の部分に日本語の単語を定義します.

 <補足>Grammarファイルとは音声認識で使用する文法を記述するもので,Speech Recognition Grammar Specification で文法が定義されています.
  Speech Recognition Grammar Specification Version 1.0
  (http://www.w3.org/TR/speech-grammar/

 

リスト4 SpeechRecognized内の変更.青字部分を変更.

<grammar version="1.0" xml:lang="ja-JP" root="rootRule" tag-format="semantics/1.0-literals" xmlns="http://www.w3.org/2001/06/grammar">
 <rule id="rootRule">
  <one-of>
   <item>
    <tag>すすむ</tag>
    <one-of>
     <item> まえ </item>
    </one-of>
   </item>
   <item>
    <tag>さがる</tag>
    <one-of>
     <item>うしろ</item>
    </one-of>
   </item>
   <item>
    <tag>みぎをむく</tag>
    <one-of>
     <item> みぎ </item>
    </one-of>
   </item>
   <item>
    <tag>ひだりをむく</tag>
    <one-of>
     <item> ひだり </item>
    </one-of>
   </item>
  </one-of>
 </rule>
</grammar>
 

 以上が、辞書ファイルの内容を変更して日本語音声認識に対応する方法です.

 

●方法2  ソースコード内に日本語の音声認識用の単語を追加する

 ここから先は,辞書ファイルを読まずにソースコード内に直接日本語の音声認識用の単語を追加する方法を紹介します.ソリューションエクスプローラーからMainWindows.xaml.cs を開き,WindowLoaded内のリスト5の部分を修正します. 

リスト5 WindowLoaded内の変更.(1)//+Add Start から //+Add End までを追加.(2)//-Del Start から //-Del End までを削除(コメントアウト). 

private void WindowLoaded(object sender, RoutedEventArgs e)
{
*** 中略 ***
    /****************************************************************
    *
    * Use this code to create grammar programmatically rather than from
    * a grammar file.
    *
    * var directions = new Choices();
    * directions.Add(new SemanticResultValue("forward", "FORWARD"));
    * directions.Add(new SemanticResultValue("forwards", "FORWARD"));
    * directions.Add(new SemanticResultValue("straight", "FORWARD"));
    * directions.Add(new SemanticResultValue("backward", "BACKWARD"));
    * directions.Add(new SemanticResultValue("backwards", "BACKWARD"));
    * directions.Add(new SemanticResultValue("back", "BACKWARD"));
    * directions.Add(new SemanticResultValue("turn left", "LEFT"));
    * directions.Add(new SemanticResultValue("turn right", "RIGHT"));
    *
    * var gb = new GrammarBuilder { Culture = ri.Culture };
    * gb.Append(directions);
    *
    * var g = new Grammar(gb);
    *
    ****************************************************************/
    //+Add Start
    var directions = new Choices();
    directions.Add(new SemanticResultValue("まえ", "FORWARD"));
    directions.Add(new SemanticResultValue("うしろ", "BACKWARD"));
    directions.Add(new SemanticResultValue("ひだり", "LEFT"));
    directions.Add(new SemanticResultValue("みぎ", "RIGHT"));
    
    var gb = new GrammarBuilder { Culture = ri.Culture };
    gb.Append(directions);
    
    var g = new Grammar(gb);
    speechEngine.LoadGrammar(g);
    //+Add End

    //-Del Start
    /*
    // Create a grammar from grammar definition XML file.
    using (var memoryStream = new MemoryStream(Encoding.ASCII.GetBytes(Properties.Resources.SpeechGrammar)))
    {
      var g = new Grammar(memoryStream);
      speechEngine.LoadGrammar(g);
    }
    */
    //-Del End

 以上が,ソースコード内に直接日本語の音声認識用の単語を追加する方法です.

 

●実際に試してみる

 方法1または方法2の通りソースコードを変更したら,ビルドして動作を確認します."まえ"や"うしろ"と発音して亀が動くことを確認してみましょう(図12).

 

図12 日本語音声認識で亀を動かす

 次回は,Kinect for Windows runtime の説明を中心に,開発したアプリケーションを配布する際の手順や注意事項を紹介します.

 
●Kinectコンテスト2012のエントリー締め切りが延長!

 Kinect for Windows コンテスト2012のエントリー締め切りが延長されました.記事を読んでKinectに興味を持たれた方,ぜひ奮ってご参加ください.見たこともないようなアプリケーションのご応募をお待ちしています.

目的Kinect for Windowsを活用したサービスやアプリケーションの普及を目指したアイデアの募集
エントリー締切2012年8月24日(金) ※日程が変わりました
コンテスト開催日2012年9月14日(金) ※日程が変わりました
参加資格コンテスト当日に応募アイデアをプレゼンテーション(必須)または展示(任意)できること
賞金グランプリ100万円
公式ページhttp://k4wa.com   ※公式サイトをリニューアルし,詳しい応募要項などを掲載しています     
  


もでき・ゆうや
東京エレクトロン デバイス(株) 

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日