Blog


AndroidでCognitiveServiceBingSpeechAPIをつかって音声ファイルから音声認識

AndroidのSpeechRecognizer(音声認識)では同時に録音をすることができない、CognitiveServiceSpeechAPIが使い方がわからないなどの問題があったのでREST APIを叩いてみました。

以下のクラスを使うと録音した音声ファイルから音声認識を行うことができます。

RESTのパラメータについてはここらへんを見ていただければ

JSONデシリアライズにGSONを利用しています。

CognitiveServiceのBingSpeechAPIキーも取得してね

 

使い方はこんな感じ

 




環境構築

PHPStrom

JetBrains社のPHPStormで行います。

https://www.jetbrains.com/phpstorm/

からダウンロードしてインストールしてください。

LAMP環境

LAMP環境を構築しておく

Ubuntuであれば下記のコマンドでインストールできる

インストール時では/var/www以下がデフォルトのサーバールートになってしまうのでユーザーフォルダ以下の適当なディレクトリを許可する

DocumentRootをユーザーフォルダ/localhostとする

localhost/にindex.phpを生成

localhostにアクセスしてhelloと表示されればOK

Composer

composerはphpのパッケージ管理プログラムです。

 




LibreOfficeでセルの値が正規表現とマッチするか判定する

唐突にデータシートから正規表現で値をマッチさせたかったんですけどExcelを使った場合標準では用意されていなくて、VBScriptなどをかかなければならないらしいとおもって検索していたらLibreOfficeでは正規表現のマッチングができるそうです。

SEARCH関数は正規表現をサポートしていて、正規表現にマッチするならその位置、マッチしないなら数値ではないエラーを返します。

そこでISNUMBERでマッチされたかどうか判定するとこのような式になります。

 




バックグラウンドタスクでソケットをリッスンする – SocketActivityTrigger

SocketActivityTrigger

UWPのBackgroundTaskは、さまざまなトリガーによってプロセスの開始を可能にします。

その中でもSocketActivityTriggerというものを使うと、システムが受信したソケットに反応してUWPのバックグラウンドタスクを開始することができます。

2種類の方法

SocketActivityTriggerを利用したバックグラウンドソケット通信には2種類存在します。

  • フォアグランドでConnectしたソケットをバックグラウンドへ渡す
  • フォアグラウンドでリッスンしているリスナーをバックグラウンドへ渡す

前者の場合、かずきさんのブログ公式のサンプルに載っているのでそちらを参考にしてください。

 

今回のサンプルは後者の場合です。フォアグラウンドでソケットリッスンを開始し、バックグラウンドタスクへソケットリスナーを渡し、バックグラウンドでコネクションを確立します。

ソケットが閉じてもOSが再起動してもリッスンを再開します。

サンプル

サンプルはここに置いているので参考にしてください。

https://github.com/garicchi/uwp-background-socket

ポイント

SocketActivityTriggerにはポイントがいくつかあります。

まず普通にBackgroundTaskBuilderでタスクを生成しますが、TriggerにはSocketActivityTriggerを渡します。

その後、StreamSocketListenerでソケット待ち受けをしますが、バインドする前にEnableTransferOwnershipメソッドを呼んで、バックグラウンドにリスナーを渡す許可をしなければいけません。

ここでSocketActivityConnectedStandbyAction列挙体を入れる必要があります。公式サンプルではWakeになってますがDoNotWakeにしてください。(じゃないと動かない)

バインド完了したら以下の2文でソケットリスナーをバックグラウンドに渡します。

私のサンプルではバインド直後にいれていますが、OnSuspending時にやってもいいと思います。

バックグラウンドタスクではTriggerDetailのReasonプロパティを使用して、どのソケットイベントがきているかを判断します。

まず、ソケットリッスン状態でアクセプトできるソケットが来た場合、ConnectionAcceptedになります。

Acceptは自動で行われるのでここが呼び出された時点でアクセプトされています。

その後、StreamSocketListenerでアクセプトされたソケットを取得する必要がありますがイベントでしか取得できないので、イベントがちゃんと発火されるまで2秒ぐらいまちます。

コネクションを張れたら、このバックグラウンドタスクに再度受信したソケットの権限を渡します。

こうすることでアクセプトされたソケットに来る信号も、このタスクで取得できるようになります。

ソケットにデータが書き込まれたときはSocketActivityになります。

ここは普通にDataReaderでデータを1バイト読み取ります。

ソケットはsocketInformationのStreamSocketから取得します。

ソケットが閉じられたときは再度Listenをします。

ここが不思議なところなのですが、ソケットが閉じられたときだけじゃなく、OSが起動した時、SocketClosedが2回呼び出されます。

つまりSocketClosedが呼びされたタイミングでListenを開始すればOSが再起動してもListenを継続できます。

しかし2回呼び出されるのは厄介なので今リッスンしてるソケットの数で判断しています。

動作例

AndroidのアプリであるSimpleSocketTesterからソケットを送ってみています。

この手法は公式のサンプルにもないので少々難しいですね。質問は@garicchiにて受け付けています。




VSCodeでnodejsのデバッグをするときに「PATH上でランタイムnodeを見つけることができませんでした」と表示された場合

launch.jsonのruntimeExecutableキーの値にnodeへのパスを入れます。

これでデバッグが可能

 

http://stackoverflow.com/questions/31075763/vscode-0-3-cant-find-runtime-node-on-path