プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

音声認識を作る時に周りに人がいてしゃべるのが恥ずかしいのでどうにかしようと思った話

UWPでの話です

アプリに音声認識機能を入れたいんですがそのテストに困ることありませんか?

オフィスの静かなところでマイクに向かってぶつぶついって白い目で見られたり、そもそも英語のネイティブな発音できなくて困ったり、という私に向けた内容です

答え

喋りたくないならしゃべってもらえばいいじゃない

準備

まずはPCでしゃべらせた内容をマイクに入れないといけないのでその設定

f:id:puni-o:20171228132006j:plain

ステレオミキサーをデフォルトの録音デバイスにします(ステレオミキサーが無いとかそういうのはググってどうにかしましょう)

私の環境の場合、スピーカーのレベルとステレオミキサーのレベルをどちらも100%にしないと入力が小さすぎました(入力が無いと困ったら一度レベルを確認してみるといいかもしれません)

あとはUWPでしゃべらせることもしゃべった内容を認識させることもできるので二つを合わせてしまえばいいだけです

github.com

こちらにサンプルがあるのでコピペして出来上がり


Speech to SpeechRecognize

おk

注意

UWPのSpeechRecognizerはアプリのフォーカスが外れると止まってしまいます

多分フォーカス外れても動かし続けることは今の時点では無理だと思います(できるなら教えてください、何でもはできません)

本当はGoogle先生にでもしゃべってもらうつもりだったんですがそれができなくて自分自身でしゃべるようにしました。

ってこんなんじゃ使えないよ!!!

追記

Edge先生にしゃべってもらい続けてそれを聞き取ることにしました


Speech to SpeechRecognize 2

ASP.NETのWeb APIの戻りを圧縮して返す

.NET FrameworkASP.NETの話です(Coreは知らない)

Web APIででっかいjson返すようなときにgzipで圧縮してほしい、ってことを定期的に調べているので自分用に書いておきます

自動でやってくれない・・・よね?

準備

Visual Studio 2017で「ASP.NET Web アプリケーション (.NET Framework)」のテンプレート使って新しいプロジェクト作ります。(Web APIのチェック忘れずに)

ValuesControllerができていると思うのでちょっとだけ修正

public IEnumerable<string> Get()
{
    return new string[] { "value",
        "value", "value", "value",
// ・・・
// たくさん返す
// 
        "value", "value", "value",
    };
}

4K以上(?)の戻りでないと圧縮してくれないようなのでたくさん返すようにします

とりあえずこれでIISに発行して上記APIをEdgeで呼んでみます

f:id:puni-o:20171215170552j:plain

Accept-Encoding:gzip,deflateとなってますが応答は圧縮されてません

圧縮するようにする

Nugetから下の二つをげと

PM> Install-Package Microsoft.AspNet.WebApi.Extensions.Compression.Server

PM> Install-Package System.Net.Http.Extensions.Compression.Client

Global.asax.csに一行追加

protected void Application_Start()
{
    GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));

んでやり直し

f:id:puni-o:20171215170834j:plain

ちゃんとgzipで圧縮して返してくれました

WPFでアプリ画面をキャプチャーしてJpegで保存する(exif付き)

なにでググったらよかったのか分からなかったので自分で書きます(主にexifのところが)

ソース

github.com

とりあえず動くものを置きました。自由に使ってください

以下はその説明みたいな感じ

UIElementを画像にする

WPFなのでSystem.Drawingは使いません(たまに使うけど)

var width = (int)CaptureTarget.ActualWidth;
var height = (int)CaptureTarget.ActualHeight;

// UIElement to RenderTargetBitmap
var renderTargetBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
var visual = new DrawingVisual();
using (var context = visual.RenderOpen())
{
    var brush = new VisualBrush(CaptureTarget);
    context.DrawRectangle(brush, null, new Rect(0, 0, width, height));
}
renderTargetBitmap.Render(visual);

RenderTargetBitmapDrawingVisualでうまいこと作りましょう

exifを付ける

BitmapMetadataってのを作ってその中にいろいろ入れちゃいます

var encoder = new JpegBitmapEncoder();

// Add exif data
var metadata = new BitmapMetadata("jpg");
metadata.ApplicationName = Assembly.GetExecutingAssembly().GetName().Name;
metadata.Comment = Assembly.GetExecutingAssembly().GetName().Version.ToString();
metadata.DateTaken = DateTime.UtcNow.ToString(DateTimeFormatInfo.InvariantInfo);
//Custom metadata
//metadata.SetQuery("", "");

encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap, null, metadata, null));

一般的なのはプロパティとしてすでに生えているのでそこに代入

今回はアプリ名・コメント(バージョン)・作成日時を入れてみました

プロパティが無い奴はSetQueryメソッドで追加できるっぽいです

あとは保存して完成

f:id:puni-o:20171215112818j:plain

できました