センサーのデータを SignalR でホストする (1)

WinRT API と ASP.NET SignalR を組み合わせたサンプルを作成してみました。
内容は次の通りです。

(1) (Windows ストア アプリからでなく) コンソール アプリケーションから WinRT API を呼び出して、
     Windows 端末のセンサーのデータをトラッキングする。

(2) そのデータを ASP.NET SignalR でセルフホストして、プッシュ送信する

(3) ブラウザーから (2) のサービスにアクセスしてデータを受け取る

(4) コンソール アプリケーションから (2) のサービスにアクセスしてデータを受け取る

(5) (2) のサービスをタスクバーの通知領域に常駐させる

ちなみに、このようにセンサーのデータをローカルでホストしてブラウザーからも利用できるようにする仕組みは、
Kinect for Windows や Leap Motion でも実現されています。
(Kinect for Windows SDK では、1.8 でサンプルとして追加)
ASP.NET SignalR を利用すれば、任意のデータをこれらと同様にホストすることができます。

ソースコードは WinRT-SignalR-Sample (GitHub) にあります。
以下では、これらの作成手順について順番に解説していきます。

 

(1) コンソール アプリケーションから WinRT API を呼び出す

(追記: Windows 8.1 向けにデスクトップ アプリから WinRT API を呼び出す (Windows 8.1) を、
Windows 10 向けにデスクトップ アプリから WinRT API を呼び出す (Windows 10) を書きました。)

まずは Visual Studio でソリューションを作成し、コンソール アプリケーション プロジェクトを作成します。

Windows 端末のセンサー情報を利用するための準備として、WinRT API への参照を追加します。
しかし WinRT API は、初期状態では Visual Studio 2012 の参照マネージャーに現れません。

次のようにプロジェクト ファイルを編集する必要があります。
プロジェクトを右クリックして、[プロジェクトのアンロード] をクリックします。

プロジェクトのアンロード

プロジェクトを右クリックして、[編集 (ProjectName).csproj] をクリックします。

プロジェクト ファイルの編集

プロジェクト ファイル (.csproj) を直接編集できるようになるので、最初の <PropertyGroup> に次の行を追加します。

<TargetPlatformVersion>8.0</TargetPlatformVersion>

TargetPlatformVersion を追加

編集が終わったら、このファイルを閉じます。
プロジェクトを右クリックして、[プロジェクトの再読み込み] をクリックします。

すると、参照マネージャーの左側に「Windows」が現れるようになるので、その中の「Windows」を追加します。

WinRT API を追加

 

さらに、参照マネージャーの右下の [参照] から、次のパスに存在する System.Runtime.WindowsRuntime.dll を追加します。

%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

これで、参照の準備は完了です。

なお、この手順の代わりに、最初に手動で編集したときに次のものを追加してもかまいません。

<Reference Include="Windows" />
<Reference Include="System.Runtime.WindowsRuntime">
  <HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll</HintPath>
</Reference>

 

では、WinRT API を呼び出してセンサーのデータを取得するコードを記述します。
LightSensor クラスを利用して照度を、Compass クラスを利用して方位をトラッキングすることにします。

最初に

using Windows.Devices.Sensors;

を追加し、Main メソッドを実装します。


static void Main(string[] args)
{
    var lightSensor = LightSensor.GetDefault();
    lightSensor.ReportInterval = 500;
    Action<LightSensorReading> notifyLight =
        r => Console.WriteLine("Light: {0} lx", r.IlluminanceInLux);
    notifyLight(lightSensor.GetCurrentReading());
    lightSensor.ReadingChanged += (o, e) => notifyLight(e.Reading);

    var compass = Compass.GetDefault();
    Action<CompassReading> notifyCompass =
        r => Console.WriteLine("Compass: {0:N3} °", r.HeadingMagneticNorth);
    notifyCompass(compass.GetCurrentReading());
    compass.ReadingChanged += (o, e) => notifyCompass(e.Reading);

    Console.WriteLine("Press [Enter] to exit.");
    Console.ReadLine();
}


 

実行します。
端末に手をかざしたり端末を回転したりすれば、照度や方位が変化したことがレポートされます。

SensorsHost

このようにして、Windows ストア アプリでなくても、通常の .NET のアプリで WinRT API を利用できます。

 

ちなみに、System.Runtime.WindowsRuntime.dll への参照を追加しないで実装した場合、コンパイラ エラーとなります。
コンパイラが出力するメッセージに従うと、

  • System.Runtime.dll
  • System.Runtime.InteropServices.WindowsRuntime.dll

への参照を追加することでも解決できます。

 

つづく

次: センサーのデータを SignalR でホストする (2)

作成したサンプル
WinRT-SignalR-Sample (GitHub) (今回までの分)
WinRT-SignalR-Sample (GitHub)

バージョン情報
Visual Studio 2012
.NET Framework 4.5

参照
How to call WinRT APIs in Windows 8 from C# Desktop Applications
デスクトップ アプリからのWinRT API利用

広告
カテゴリー: .NET Framework. タグ: , . 4 Comments »

Kinect for Windows の音声ライブラリ

Kinect for Windows SDK の Downloads/Docs の右側には、次の音声ライブラリへのリンクがあります。

これらは、

%ProgramFiles%\Microsoft SDKs\Speech

にインストールされます。

しかし、音声ライブラリは .NET Framework にも System.Speech 名前空間として存在します。

System.Speech 名前空間と Speech Platform SDK (Microsoft.Speech 名前空間) を比較すると、
API にほとんど相違点はありません。
Speech Platform SDK のほうでは、音声認識の文法で利用する SrgsNameValueTag クラスが internal になっているなど、
やや使いづらい点がありますが、多言語化したい場合には有効でしょう。

 

■ Kinect のマイクからの入力を音声認識に利用する

.NET では、音声入力と音声認識の概念は完全に分離されています。
音声データを Stream として抽象化して受け渡すことにより、
任意の音声入力方式と任意の音声認識エンジンを組み合わせて利用することができます。

OS の既定の音声入力デバイスを利用するには
SpeechRecognitionEngine.SetInputToDefaultAudioDevice メソッドを呼び出せばよいですが、
音声入力を表す Stream を明示的に指定するには SpeechRecognitionEngine.SetInputToAudioStream メソッドを呼び出します。

次のようなコードで、Kinect のマイクからの入力を .NET Framework の音声認識ライブラリで利用できます。
Speech Platform SDK の場合もまったく同じコードです。


// sensor は Microsoft.Kinect.KinectSensor オブジェクト。
// recognizer は System.Speech.Recognition.SpeechRecognitionEngine オブジェクト
// または Microsoft.Speech.Recognition.SpeechRecognitionEngine オブジェクト。

var stream = sensor.AudioSource.Start();
recognizer.SetInputToAudioStream(stream,
    new SpeechAudioFormatInfo(16000, AudioBitsPerSample.Sixteen, AudioChannel.Mono));
recognizer.RecognizeAsync(RecognizeMode.Multiple);


 

■ Speech Platform SDK への参照

Speech Platform SDK の Microsoft.Speech.dll は GAC に入りますが、
ランタイム バージョンが 2.0.50727 のみであるため、Visual Studio の参照マネージャーに現れないことがあります。
したがって、通常は SDK 内の Microsoft.Speech.dll のパスを直接指定すると思いますが、
次のようにプロジェクト ファイル (.csproj) を直接編集する方法もあります。


  <ItemGroup>
    <Reference Include="Microsoft.Kinect, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
    <Reference Include="Microsoft.Kinect.Toolkit, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>$(KINECT_TOOLKIT_DIR)Assemblies\Microsoft.Kinect.Toolkit.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Speech, Version=11.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />


 

バージョン情報
.NET Framework 4.5

参照
System.Speech 名前空間
Speech (Kinect for Windows SDK)
Speech Technologies
Speech Application Programming Interface (Wikipedia)

Kinect for Windows SDK のセットアップ

Kinect for Windows SDK のセットアップ

Kinect for Windows SDK のセットアップの方法や注意点について記述します。
開発環境と非開発環境では方法が異なります。
(追記: 当初は v1.7 向けに書いていましたが、v1.8 向けに修正しました。
v1.8 は、v1 系の最終版になると思われます。
v2 系については、Kinect for Windows v2 のセットアップに書きました。)

 

■ 開発環境におけるセットアップ

開発環境には、次の SDK をインストールします。Downloads/Docs からもアクセスできます。

最低限、Kinect for Windows SDK に含まれる Kinect for Windows Runtime がインストールされていないと、
Kinect for Windows を接続しても動作しません。
また、これらの新しいバージョンをインストールすると、以前のバージョンは削除されます。

インストール後の接続確認をするには、「Developer Toolkit Browser」を利用するとよいでしょう。
これには多数のサンプルが含まれています。

環境変数については、Kinect for Windows SDK をインストールすると

  • KINECTSDK10_DIR=C:\Program Files\Microsoft SDKs\Kinect\v1.8\

が、Kinect for Windows Developer Toolkit をインストールすると

  • KINECT_TOOLKIT_DIR=C:\Program Files\Microsoft SDKs\Kinect\Developer Toolkit v1.8.0\

が追加されます。

 

Kinect for Windows SDK に含まれているアセンブリは Microsoft.Kinect.dll と Microsoft.Speech.dll で、
これらは GAC に入ります。
Visual Studio の参照マネージャーでは [アセンブリ] – [拡張] から選択できます。

参照マネージャー

 

一方、Kinect for Windows Developer Toolkit に含まれているアセンブリは GAC に入りません。
したがって、Visual Studio の参照マネージャーでは右下の [参照…] から追加することになりますが、
前述の環境変数を利用して、プロジェクト ファイル (.csproj) において例えば次のようにアセンブリのパスを指定することもできます。


  <ItemGroup> 
    <Reference Include="Microsoft.Kinect">
      <HintPath>$(KINECTSDK10_DIR)Assemblies\Microsoft.Kinect.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Kinect.Toolkit">
      <HintPath>$(KINECT_TOOLKIT_DIR)Assemblies\Microsoft.Kinect.Toolkit.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    (以下略)


この状態でビルドすれば、Kinect for Windows Developer Toolkit の DLL はローカルにコピーされます。
(Microsoft.Kinect.dll は GAC にあるためコピーされません。)

 

■ 非開発環境におけるセットアップ

本番用・配布用端末では SDK は不要で、Kinect for Windows Runtime v1.8 (約 100 MB) をインストールします。
これにより、Microsoft.Kinect.dll および Microsoft.Speech.dll が GAC に入ります。

なお、Kinect for Windows Runtime は Kinect for Windows SDK にも付属しており、次のパスに存在します。

%KINECTSDK10_DIR%Redist\KinectRuntime-v1.8-Setup.exe

 

■ Kinect for Xbox 360 の利用

Kinect for Xbox 360 と Kinect for Windows SDK の組合せは有効か、という点についてです。

この組合せは、開発環境 (Kinect for Windows SDK がインストールされた端末) で利用できます。
開発環境で利用できるといっても、Kinect for Xbox 360 に対する互換性がすべて保証されているわけではありません。

非開発環境 (Kinect Runtime のみがインストールされた端末) では利用できません。
KinectSensor.Status プロパティは通常は Connected ですが、非開発環境では DeviceNotSupported になります。

 

関連する記事

バージョン情報
Kinect for Windows, Kinect for Xbox 360
Kinect for Windows SDK 1.8
Visual Studio 2012

参照
Kinect for Windows (ハードウェア製品)
Kinect for Windows SDK v1.8
Kinect for Windows Developer Toolkit v1.8
Kinect for Windows Runtime v1.8

Downloads/Docs – Kinect for Windows Dev Center
Kinect for Windows SDK 1.8 (MSDN)
Setting Up a Kinect Sensor
Running a Kinect-enabled Application on a Non-Developer Machine
Running a Kinect-enabled Application on a Developer Machine

カテゴリー: 周辺機器. タグ: . 5 Comments »