追記

日々をアレコレ

-広告-


2017年04月09日 この日を編集

Windows10 IoT Core on Raspberry Pi2で日本語音声認識をする

Raspberry Pi2にインストールしたWindows10 IoT Coreで音声認識で日本語パッケージを追加できるようになったということを聞き、早速試してみた。基本的なところは、Windows 10 IoT Core の Anniversary Update で日本語音声合成しちゃいました – DevWire (2016/9/26) – DevWire 組み込み業界必読の無料ニュースレターのまとめ を参考にした。

まず、最新のRelease版Windows IoT Coreのイメージを作成する。これは、IoT Dashboardを使ってMicroSDカードにビルド15063のイメージを書き込んで、Raspberry Pi2に挿して起動すればひとまず準備完了。

次に、日本語の音声認識のエンジンを取得するためのパッケージを取得する。こちらは、Windows 10 IoT Core Packages from Official Microsoft Download Center をダウンロードして、ISOファイルにあるWindows_10_IoT_Core_ARM_Packages.msiを実行して、PCにパッケージをインストールする。インストール先はデフォルトで C:\Program Files (x86)\Windows Kits\10\MSPackages\retail\arm で、 C:\Program Files (x86)\Windows Kits\10\MSPackages\retail\arm\fre\Microsoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package.cab をUSBメモリなどにコピーしておく。PowershellでRaspberry Pi2に接続して、次のようなコマンドを実行。

# ドライブの確認。サイズなどを参考にUSBメモリのドライブレターを確認する。
> gdr
# USBメモリのドライブをE:としてコピーをする。
> copy E:\Microsoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package.cab C:\
# Cドライブに移動
> cd C:\
# パッケージを適用
> applyupdate -stage Microsoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package.cab
# パッケージを更新
> applyupdate -commit

完了したら、Raspberry Pi2を再起動すれば、日本語の音声認識や音声合成などがインストールされた状態になる。

最後に、アプリの中で音声認識の言語を選択する方法について。こちらは、簡単で SpeechRecognizer のインスタンスを生成する時に Windows.Globalization.Language を渡せばいいので次のようにする。

var recognizer = new SpeechRecognizer(new Language("ja"));

この recognizer を使って音声認識をすれば、日本語の認識をできるようになる。


2017年04月03日 この日を編集

.NET MicroFramework Toolbox

[スイッチサイエンス][(https://switch-science.com/) さんでの買い物で送料を無料にするための調整に WiiChuckアダプタ を買った。これを netduino plusから使おうとArduino向けに公開されてるコードを参考にしながら作ってみたけどうまく動かなかった。けど、.NET Micro Framework Toolbox なんていうものを発見。こちらは、いろんなハードウェアの.NET MF向けのライブラリになってるらしく、Wiiヌンチャクも当然ながら対応済み。とりあえず、これで動いているので次に進むよ。


2017年03月28日 この日を編集

STM32F429 Discoveryで.NET Microframeworkを動かす

スイッチサイエンスさんでDiscovery kit with STM32F429ZI MCUが販売されるようになった。これまでよく売られていたSTM32F407 Discoveryと違って、STMicroelectronicsが.NET MicroFrameworkに対応するファームウェア を公開しているボードで、DigiKeyとかでしか日本では変えなかったもの。送料とかの問題でそこに手を出すのは面倒だなーって思っていたところで、今回のスイッチサイエンスさんでの販売なので、早速購入して環境構築したのでメモ。

まずは、ファームの更新から。

  1. STM32F429 Discovery向けの.NET MFファーム をダウンロード。
  2. STM32 ST-LINK utility をインストール。
  3. STM32F429 Disoveryのmini USB側で接続して、ST-LINK utilityを起動して、Target > Connectを選択。
  4. さらに、Target > Program & Verifyを選択。
  5. File Pathにダウンロードしたファームのzipを解凍した中から「NETMF_Binary_Image\Tinybooter.hex」を選択して Startボタンを押す。

ひとまずはここでファームの更新を完了する。

次に、開発環境を用意する必要があるんだけど、ここで注意が必要。ここで書き込んだファームって、.NET MFのバージョンが4.3.0.0でちょっと古い。具体的に言うと、.NET MF SDK 4.3(RTM) というバージョンのSDKをインストールする必要がある。最新が .NET MF SDK v4.3 (QFE2-RTM) で、4.3.1.0になるので、すでにそちらをインストールしてる場合は、バージョンが違うのでデプロイに失敗する。さらに、この.NET MF SDK 4.3(RTM)をインストールするには、Visual Studio2012がインストールされてる必要があるので、次の2つをインストールする。

すでに新しいバージョンの.NET MF SDKをインストールしてる場合は、インストールパスを変えておくほうがよさげ。

次に、STM32F429 DiscoveryのminiUSBで接続したまま、microUSBでもPCに接続する。その上で、MFDeployを起動して次の手順を実施。

  1. Deviceのコンボボックスで「USB」を選択する。すると、よこに「STM32F429I_DISCOVERY_a7e70ea2」と表示されるのを確認。
  2. Image FileのBrowseボタンを選択して、ダウンロードしたファームウェアの次の2つのファイルを選択。

    • NETMF_Binary_Image\ER_CONFIG.hex
    • NETMF_Binary_Image\ER_FLASH.hex
  3. Deployボタンを押す。

これで、Visual Studio 2012 Expressから「.NET MicroFramwork」から開発ができるようになる。

新しい2013以降のVisual Studioで開発できるかは未確認。


2017年03月22日 この日を編集

Arduino IDE for Visual Studio

Arduinoの純正開発環境であるArduino IDEはお手軽な分だけ機能が若干弱い。IntelliSenseに慣れきったダメダメな僕としては、いちいちリファレンスを調べながら開発するのが面倒だなーとか思っていたりする。けど、最近になって、Arduino IDE for Visual Studio なんていう素敵なVisual Studioの拡張機能があることを知ったので使ってみた。インストールは簡単で、Visual Studioのメニュー「ツール > 拡張機能と更新プログラム」から、「Online」を選択してから「Arduino」などで検索すると出てくるので、インストールすればOK。ただし、標準で入ってくる対応ボードが現在のところ、Genuino101とかESP8266系のものだけなので、それ以外を使う場合はさらに設定が必要。


2017年03月07日 この日を編集

SRGSを使った音声認識の定義をする

音声コマンドでBトレインショーティーを走らせる では、SRGS文法を使って制約を作り、特定の言葉に対する非同期な音声認識するという方法で音声コマンドを実現させている。OSだったり、利用環境だったりで利用できる認識できる言語が決まっているようで、僕が使っている環境だと日本語のWindowsデスクトップやモバイルだと日本語だけが、Raspberry Pi向けのWindows IoT Coreだと英語のみが認識可能っぽい。その辺に気をつけながらまずは、SRGS文法を使った制約を定義したファイルは次のように定義するといいらしい。

<?xml version="1.0" encoding="utf-8" ?>
<grammar
  xmlns="http://www.w3.org/2001/06/grammar"
  version="1.0"
  xml:lang="ja-JP"
  root="commands"
  tag-format="semantics/1.0">
  <rule id="commands">
    <one-of>
      <item>
        <one-of>
          <item>進め</item>
          <item>行け</item>
        </one-of>
        <tag> out.cmd="Forward"; </tag>
      </item>
      <item>
        戻れ <tag> out.cmd="Backward"; </tag>
      </item>
      <item>
        止まれ <tag> out.cmd="Stop"; </tag>
      </item>
    </one-of>
  </rule>
</grammar>
  1. <grammar> タグの中の lang属性は利用する言語に応じて変えること。今回の場合は日本語なので「ja-JP」を指定。
  2. <grammar> タグの中の root属性は認識を開始する制約について指定する。今回は単純なコマンドに使うので、一つだけしか定義してないけど、「玄関/廊下/洗面所/台所」「の」「ライト/換気扇」「を」「点ける/消す」みたいな感じで、複雑なパターンを定義することもできるらしい。 。
  3. <rule> タグを使ってコマンドを定義。

    1. 上の例では、前進、後退、停止の3パターンのコマンドを発行するために、それぞれが該当する要素を<item>タグを3つ定義し、<one-of> タグでまとめることで、いずれかを認識させている。
    2. それぞれの <item> には <tag> で認識した場合に発生するイベントで受け取るためのデータを定義している。今回の場合、cmd要素に、ForwardBackwordStopがデータして渡される。
    3. さらに、前進の要素については、さらに <one-of> タグを使って、「進め」と「行け」を両方同じコマンドとして認識するように定義。

この定義ファイルを \Grammar\Command.xml に保存した場合、音声認識を開始するには次のようなコードを実行すればよい。

var recognizer = new SpeechRecognizer();
recoginizer.ContinuousRecognitionSession.ResultGenerated += (session, args) =>
{
    // 制約を満たした認識をすると、args.Result.SemanticInterpretation.Propertiesは"cmd"をキーとして持つ
    if (!args.Result.SemanticInterpretation.Properties.ContainsKey("cmd")) return;

    // 最初に認識したコマンドを取得
    var command = args.Result.SemanticInterpretation.Properties["cmd"][0];

   // commandに応じた処理を書いていく
};

var grammerFile = await Package.Current.InstalledLocation.GetFileAsync("Grammar\Command.xml");

var grammarConstraint = new SpeechRecognitionGrammarFileConstraint(grammerFile);

recognizer.Constraints.Add(grammarConstraint);

var result = await recognizer.CompileConstraintsAsync();

var isStarted= result.Status == SpeechRecognitionResultStatus.Success;

if (isStarted)
{
    // 非同期な音声認識を開始
    await _recognizer.ContinuousRecognitionSession.StartAsync();
}

本当はもう少しエラー処理やらなんやら書いておく必要があるけど、そのへんはまた別途。


-広告-

追記