2014年10月15日水曜日

.Netで音声認識(ディクテーション)

準備

System.Speech.Recognition.SpeechRecognitionEngine を使用します。

MSDNの説明

インスタンスの初期化時に、String型で音声認識エンジンの名前を引数に入れると、その音声認識エンジンで初期化、

System.Globalization.CultureInfoクラスを入れると、指定した言語のみの認識モードで認識します。

どっちも指定したい場合は、System.Speech.Recognition.RecognizerInfoクラスの変数を作り、引数に入れます。

(何も指定しない場合、Windowsの音声認識エンジンで、サポートしている言語全部認識します)

その後、SetInputToDefaultAudioDevice関数を呼びます。

そして、LoadGrammar関数にDictationGrammarクラスの変数を引数に呼び出します。

時間がかかる場合もあるかもしれませんので、Task.Runなどで並列でやっちゃいましょう!

例(C#,VB,F#)

SpeechRecognitionEngine SpeechRecEngine = new SpeechRecognitionEngine()
Task.Run(() => {
SpeechRecEngine.SetInputToDefaultAudioDevice();
SpeechRecEngine.LoadGrammar(new DictationGrammar());
});

簡単でしょ?

Dim SpeechRecEngine As New SpeechRecognitionEngine()
Task.Run(Sub()
SpeechRecEngine.SetInputToDefaultAudioDeice()
SpeechRecEngine.LoadGrammar(New DictationGrammar())
End Sub)

一応F#も

let SpeechRecEngine : SpeechRecognitionEngine = new SpeechRecohnitionEngine()
async{
SpeechRecEngine.SetInputToDefaultAudioDevice();
SpeechRecEngine.LoadGrammar(new DictationGrammar());
}

async{}が便利


認識開始・終了


認識開始には、Recognize関数(非同期版はRecognizeAsync)、


非同期上での強制終了は、RecognizeAsyncCancel関数、


非同期上での認識操作の完了後に認識モードを開場するときはRecognizeAsyncStop関数を使います。




イベントたち


問題など報告系



  • AudioLevelUpdated - オーディオ入力のレベルの報告

  • AudioSignalProblemOccurred - オーディオ信号の問題の報告

非同期認識系



  • RecognizeCompleted - 非同期操作の終了

  • RecognizerUpdateReached - 非同期操作の一時停止

  • SpeechDetected - 音声として識別できる入力が見つかった!

最低でも、RecognizeCompletedを使うことでしょう


 


<余談>


簡単でいいですね♪


これが、mono上でマルチプラットフォームで使えるといいですね~


UnityやCocosSharpも用い、声で操作するゲームなど、夢が広がリング!


(Mono TouchでSiriとかAndroidの音声エンジンとか扱えるのかな?)

2014年9月24日水曜日

「Roslyn」C# 6.0とVB 12.0の新機能

C# 6.0のみにリリース


自動プロパティ初期化

 public string text { get; set; } = "初期値";
のように書ける。VBには存在。

静的名前環境のusing

using System.Console;
WriteLine("Consoleを省略可能!");
setCursorPos(10,10);
のように書ける。これもVBには存在。

catchのでキャッチした例外によって条件分岐

try{ .. } catch ( MyException ex ) if ( ex.Count = 5 ) ...
ッて感じでかける。 これも、VBには存在。

式木のメンバー化

public double Dist => Sqrt(x * x + y * y);
なぜ、VBにはリリース予定にならないんだ!

VB 12.0のみにリリース

インデックス化されたメンバーの初期化

Dim someObject As JObject = New JObject With { $x = 10, $y = 8}
逆にC#は対応していない

Select(Switch)文が更に進化

Typecase Select Case o : Case s As String : …

Guarded cases Select Case i : Case Is > 0 When i Mod 2 = 0

どんな感じになるか楽しみ。

Partial Module / Interface

ModuleはC#にないので、VBのみ。
Partial InterfaceはC#には存在。

<newline>

VBの最も大きい短所と言ってもいい、改行が改善!
Dim s As String = "ABC" + Enviroment.NewLine + "DEF"
Dim s As String = "ABC" + VbCrLf + "DEF"
と書いていたのが、
Dim s As String = "ABC<newline>DEF"
と書けるように!

#year-month-day#という文字列からDateへ変換

Dim date = #2020-1-14#
と書くと、Dateに!

複数行コメント

使う人はよく使う?実装されるらしい。どうなるのかな?

TypeOf ~ IsNot ~

題名の通り。Not(TypeOf ~ Is ~)もできるが。もっとわかり易くなる。

NullableのTryCast

Dim l = TryCast(i , Long?)
とできるように。え?出来なかったの?と思ってしまった。

+-,-=,/=,*=....

歓喜
この調子で、++や--も・・・

Implicitly Implement

Class C Implicitly Implements I
ッて感じ

NameOf

Dim s As String = NameOf(Console.WriteLine)
ッて感じ。"WriteLine"か"System.Console.WriteLine"になるのか?

Strict Module

VBにはstatic class的なものがな~い!ということで実装なのかな?

CIntが早くなる

エイゴヨメマセン

#progma

夢が広がりング!

If関数でNothingの代入

題名の通り。
IF(true, some, Nothing)
C#でやると、
true ? some : null



C#/VBで両方にリリース


プライマリコンストラクタ

class someclass( int x ) {
public int X { get; set; } = x;
}
Class SomeClass( x As Integer ) 
Public Property X As Integer  = x
Get ... End Set
End Property
End Class
みたいな?

Getオンリーのプロパティの初期化

上記の様な感じ

Dictionaryの初期化

できなかったっけ?

Declaration expressions

int.TryParse( "3210", out var i );
Integer.TryParse( "3210", ByVal Dim i )
ッて感じにかける。VBの書き方知らないので怪しい。

try/catch内のawait

Microsoftの技術力は恐ろしい。

2進数でかく

0b000010ってなかんじ

区切り文字

21_324_12832_231ッて感じに書けるようになるのかな?制約とかはわからない。

初期化時にイベントの追加

Window win = new Window("Window") { Actived += (sender, e) => {} };
Dim win As New Window("Window") With { AddHandler Actived, Sub(sender, e) ...}
って感じかな?VBの書き方はやっぱり知らないので怪しい。

Nullでもおk

customer?.Orders?[5]?.$price
という事が可能になる。


他にも4つありますが、全然情報ないので割愛します。

ほかのサイトでは、複数の型を戻り値にできるとかありましたが、CodeProjectのページには書かれていませんでした。しかし、とても…楽しみです。

CodePlexのページ : https://roslyn.codeplex.com/

2014年8月26日火曜日

.Net Framework 4.5.2の新機能

未だに日本語のまとまった記事がないので「けしからん!」と思いまとめてみた。

原文:

1.ASP.Netの新しいメソッド

上2つの新しいメソッドが追加されました。PreSendRequestHeadersPreSendRequestContentに比べ、信頼性が高いとか何とか。


HostingEnvironment.QueueBackgroundWorkItemメソッドが追加。
小さなバック グラウンド作業項目をスケジュールできるようになって、ASP.NET これらのアイテムを追跡し、IIS が突然すべてのバック グラウンド作業項目が完了するまでにワーカー プロセスを終了ことを防げる。しかしこのメソッドは、ASP.NET マネージ アプリケーション ドメインの外部呼び出すことはできないみたい。
HttpResponse.HeadersWrittenHttpResponseBase.HeadersWrittenプロパティが追加。
応答ヘッダーが書き込まれたかどうかを示すブール値を返す。

2.Windows Formsは何度でも生き返る。

次のコントロールがDPIスケーリングに対応。矢印アイコンなどが適切な大きさに拡大される。
 これは、オプトイン機能で、有効にするためには、アプリケーション構成 (app.config) ファイルで、 EnableWindowsFormsHighDpiAutoResizing要素をtrueに設定する必要あり。

<appSettings>
   <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>
 
こんな感じ。

3.Wolkflowの新しい機能

EnlistPromotableSinglePhaseメソッドを使用して (IPromotableSinglePhaseNotificationインターフェイス実装) リソース マネージャーは、新しいTransaction.PromoteAndEnlistDurableメソッドを使用することができる。が、以下の条件がある。
これは、同じアプリケーション ドメイン内で行うことができ、昇格を実行する MSDTC と対話する任意の余分なアンマネージ コードを必要としない。昇格可能参加リストによって実装されているIPromotableSinglePhaseNotification PromoteメソッドをSystem.Transactionsから呼び出しがある場合にのみ、新しいメソッドを呼び出せる。

4.開発者にはあまり影響しないかもしれない強化

プロファイリングの改善

デバッグの改善

5.イベント トレース変更

.NET Framework 4.5.2 大きな表面積のアウト プロセス、Windows のイベント トレースは ETW ベースのアクティビティのトレースを使用できます。これにより、個々 の要求およびクロス スレッド活動のコストを正確に追跡する軽量のツールを提供する高度なパワー マネージメント (APM) ベンダー。これらイベントは、ETW コント ローラー; それらを有効にする場合にのみしたがって、変更以前に作成した ETW コードまたは ETW を無効にすると実行されるコードには影響しません。

 ☆まとめ

英語は下手なので、誤った翻訳している可能性が大です。(Bingに頼(ry )
4.5.1に比べ変更点は少なく、騒がれにくい.Net 4.5.2ちゃんですが、ランタイムのインストールぐらいはしてあげてくださいなッて感じです。
Developer Packを入れてあげると、.Net 4.5.2の開発ができるようになります。
 リリースに伴い、.Net 4.5.1のサポート期限も 4.0 と同じ、2016年1月12日となりました!ご注意ください!

2014年8月22日金曜日

What’s new F#?–F# 3.1.2の新機能!

水曜日ぐらいに、F#3.1.2が公開されました。F# Team Blogに紹介されていたのをテキトーに日本語化&整理します。

1.Windows Phoneを含むポータブルライブラリ(アプリケーションではない)のサポート

  • Profile 78 (.NET Framework 4.5, Windows 8, Windows Phone Silverlight 8)
  • Profile 259 (.NET Framework 4.5, Silverlight 5, Windows 8, Windows Phone 8.1)
がサポートされました。
  • Profile 47 (.NET Framework 4.5, Silverlight 5, Windows 8)
  • Profile 7 (.NET Framework 4.5, Windows 8)
はもともとサポートされています。

2.FSIにおけるノンロックアセンブリ参照

参照を追加するとコンパイルできなかったdllもコンパイルできるようになります。この設定は、miscのプロパティからシャドウコピーアセンブリからせてい変更できます。(あまり理解していないですm(_ _)m)
 ↓bleifs tiftさんのコメントからわかりやすい解説を頂きました
fsiにdll参照を追加(#lで読み込ませる)してしまうと、そのdllをfsiが掴んでしまって、ビルドが出来なくなってしまっていました。

3.Azureプロジェクト・Webプロジェクトでパブリック公開することのサポート

もともと、メニューの項目はあったが、正常に作動していなかった模様。

4.F#スクリプトでの「*nix」と「#!」の相性の改善

#!が、Unixに合うようにもなったとか。まず、#!を使ったことがない自分であった。

5.高次元のスライスのサポート

F#では、Array等の多次元データ型をスライスすることが出来、開発者がGetSliceとSetSliceメソッドのオーバーロードを実装することにより、[..3]とか[4..5]などを使って、配列の中から値を取ることができるらしい。
以前のリリースでは、4つまでの制限だったが、制限がなくなった。

6.アクティブパターンケース識別子にスペースを入れることができるように

そのまま
という、適応な感じでまとめました。さて、F#この先どうなるのでしょうかね。

2014年7月5日土曜日

CoreTweetでストリームに流れてくるミュートの情報

 str = TwitterCore.Streaming.StartStream(Streaming.StreamingType.User, _
                                           New Streaming.StreamingParameters( _
                                                CType(Function(replies) "all",  _
                                               Expressions.Expression(Of Func(Of String, Object)))))
        Await Task.Run(Sub()
                           For Each message As Streaming.StreamingMessage In str
                               If TypeOf message Is Streaming.StatusMessage Then
                                   Dim sm As Streaming.StatusMessage = TryCast(message, Streaming.StatusMessage)
                                   If Not sm.Status.IsMuting Then
        'タイムラインに追加させるコード
       End If
                               ElseIf TypeOf message Is Streaming.EventMessage Then
                                   Dim ev = TryCast(message, Streaming.EventMessage)
                                   Debug.WriteLine(String.Format("{0}:{1}->{2}", ev.[Event], ev.Source.ScreenName, ev.Target.ScreenName))
                               End If
                           Next
                       End Sub)
上のようなコードを書いてみましたが、ミュートにしていないツイートもタイムラインに追加されなかったのです。 何故だろう…と思って、タイムラインに追加するコードの前のIfから、Notをとっても、全く追加されませんでした。よって、ストリームから流れるIsMutingはbool?なので、Nothingになっていましたorz こんなことで、1時間も時間を奪われないように(笑)

2014年6月26日木曜日

Xp → Vista → 7 → 8/8.1で変わったウィンドウの描画方法

Windows Vista では、デスクトップの描画が、「DWM」(Desktop Window Manager)に変わった。
WIndows 7では、新しいグラフィックAPI「Direct2D」「DirectWrite」により、画面表示が高速化・文字が綺麗になった。
Windows 8/8.1では、タブレット機向けの、ModernUIが実装された。
この通り、ココ最近のWindowsでは、描画のAPI等が急激に変化した。では、どのように変わったのか、見てみる…
Xp → Vistaの変化は、「DWM」が大きい。「DWM」により、より高度なアニメーションをすることができ、GPUを使い、高速化できるようになった。その成果が、「Windows Aero」である。また、テキスト表示や2D図形、線を表示するために、新しくグラフィックスサブシステム「WPF」(Windows Presentation Foundation)が導入された。しかし、WPFは高度な機能を有していたため、単純なロジックを作るのに、プログラミングが難しかった。
そのため、Vista → 7の変化は、新しいグラフィックAPI「Direct2D」「DirectWrite」が導入された。「Direct2D」は、2Dグラフィックを描画するためのAPIで、「DirectWrite」は文字を描画するためのAPIだ。どちらも、GPUの恩恵を受けることができ、高速化できる。そのため、WIndows7に標準搭載されている、「電卓」「ペイント」「ワードパッド」「Internet Explorer 9」では、高速化・GUIの美化がされている。また、「Firefox」でも、これらのAPIのおかげで高速化されている。(Chrome?そんなの知らん)
7 → 8/8.1の変化は、主に、高速化である。前述の2つのAPIが、高速化された。「Direct2D」では、「TIR」(Target Independent Rasterization)が導入され、より、ハードウェアの恩恵を受けれるようになった。「DirectWrite」では、1.5倍~3.3倍まで、パフォーマンスが向上したという。その御蔭で、ModernUIで高速な画面描画ができるようになった。
以上のように、描画方法が、ここ8年で、劇的に変化した。今のプログラミングでは、WInAPI呼び出して、GDI/GDI+で描画するのではなく、WPF/DirectWrite/Direct2D等の新しいAPIを使うのが良いだろう。それが出来なければ、QtやGtkなどのライブラリに頼り、OpenGLで描画するのも良いだろう。