A certain engineer "COMPLEX"

.NETで音声処理を試してみる NAudio編 第2回

Introduction


前回から大分間が開きましたが、音声処理の仕事は継続中です。
といっても、毎日の作業全部が音声処理のタスクというわけではないのですが。

音声処理のタスクのうち、複数のチャネルを持つWAVファイルを分割する機能の実装があります。
5.1chの分割を行うようですが、5.1chの.1って何?と思って調べてみたら、小数の0.1という訳ではないのね。事実上の6chということの模様。
今回はこの機能を実装してみました。

ソースは下記になります

Explanation


今回はコンソールアプリでデモを作りました。

wavファイルのパスを指定し、WaveFileReaderで読み込み、分割を行った後に、チャネル毎に分割して書き出しを行っているだけです。
wavファイルで複数のチャネルは、16bitの4チャネルの場合、先頭から順番に

ch1(2byte=16bit)
ch2(2byte)
ch3(2byte)
ch4(2byte)
ch1(2byte)
ch2(2byte)
ch3(2byte)
ch4(2byte)
..

と繰り返しで格納されています。
なので、それを順番にバッファに書き出しするだけです。
bitsPerSampleを8で除算しているのは、byteに変換しているからですね。

テスト


手元に複数チャネルの音声ファイルが無かったので、ネットから探しました。
そこで見つけたのが下記。

不幸にも5.1chがリンク切れなのですが、8chとか普通じゃお目にかかりそうもないものを見つけたので試しに分割してみました。
8_Channel_ID.wavをダウンロードして、デモアプリに渡します。
するとデモアプリと同じフォルダに1.wav,2.wav....8.wavの8つのwavファイルが生成されます。
分割されたファイルにはそれぞれ、

1.wav: 1st: Front Left
2.wav: 2nd: Front Right
3.wav: 3rd: Centre
4.wav: 6th: tone
5.wav: 4th: Back Left
6.wav: 5th: Back Right
7.wav: 7th: Auxiliary Left
8.wav: 8th: Auxiliary Right

という単語を発生する男性の声またはトーンだけが含まれています。
元々のファイルにもそれらが時間差で出力されていましたが、これらが綺麗に分離されているのがわかります。

Conclusion


複数チャネルの音声データの分割など、普通は用途がありませんが、そんな要求が来てもこれで大丈夫です。

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/NAudio3

開発メモ その92 Visual Studio 2017.3が単体テストを検出できない

Problem


題名の通り。
VS2017からVS2017.3に更新したところ発生しました。
これまでのVisual Studioでも同様の事例はありましたが、ここまできてもこのような現象が発生すると萎えます。

Solution


例のごとくStackoverflowで回答が。

Unit Tests not discovered in Visual Studio 2017
I have been struggling with VS 2017 since I installed it. Now it seems Unit Tests will only run from the command line "dotnet test."My project is ....

ただ、最終的にAnswerにはなっておらず、一部のコメント投稿者は、後述の方法で解決した模様。
私が試したのは、MSTest.TestAdapter, MSTest.TestFramework というMicrosoft製のNugetパッケージを更新する方法でした。

どちらも1.1.18になっていればOKかと。

開発メモ その91 WindowsでMiniconda2と3を共存させる

Problem


PythonのWindows用環境はAnacondaMinicondaが有名ですが、初期パッケージの数が少ないMinicondaを専ら好んで使っています。
そんなMinicondaはPython 2.7Python 3.6をインストールできるパッケージが用意されています。

これを使い分けて、Windowsの環境に共存させたいと思います。

Solution


Case of Anaconda

実は、Anacondaでの2と3の共存については記事があります。

Anacondaを用いてPython2とPython3を共存させる方法 (Windows) - 白猫学生のブログ
はじめに Pythonはずっと昔に3系列にバージョンがアップされましたが,いまだに2系列を使用している人が数多くいると思います.(自分もその一人です) 当時はライブラリ...

今回はこれを参考にさせてもらいました。

Case of Miniconda

やることは変わりません。
私は、Python2をデフォルトにしました。3をデフォルトにしてはいませんが、多分大丈夫?
まず環境変数ですが、

  • Miniconda2のインストール先
    • C:\Program Files\Miniconda2
  • Miniconda3のインストール先
    • C:\Program Files\Miniconda3

とします。
ユーザーの環境変数 (システムの環境変数ではない!!)PATHが、下記の順序で追加されているようにします。

  • C:\Program Files\Miniconda2
  • C:\Program Files\Miniconda2\Scripts
  • C:\Program Files\Miniconda2\Library\bin
  • C:\Program Files\Miniconda3
  • C:\Program Files\Miniconda3\Scripts
  • C:\Program Files\Miniconda3\Library\bin

最後に、コマンドプロンプトを立ち上げ、Miniconda3のインストールパスに移動します。
必要に応じて管理者権限は付与してください。
そして下記のコマンドを叩きます。

Try


コマンドプロンプトを立ち上げ直します。
そして、正しく共存できているかを確認します。

無事に共存できました!!

開発メモ その90 Visual Studio Code on WindowsでCMakeを使うとエラーになる

Problem


最新のCMake 3.9.2が悪いのか、Visual Studio CodeでCMakeを使おうとするとエラーになります。
WindowsのVisual Studio CodeでCmakeを使うという記事はたくさんあります。

VSCodeでC++デバッグ(Windows) - Qiita
# 概要Visual Studio Codeを使ってVC++のデバッグ+ビルドを行う方法CMakeの使い方等はこの記事には載せませんので注意してください。また、記事に対するもっと良い方法...

が、それでも上手くいかない。
Lixnuでは既に自分でも試しており楽勝のはずだったのですが...

具体的には、

Started new CMake Server instance with PID 13456
Build program for generator Ninja is not found. Skipping...
Build program for generator Unix Makefiles is not found. Skipping...
None of preferred generators available on the system.

というエラーが出力されております。

Solution


CMake toolsのIssueにヒントがありました。

CMake server: Unable to determine CMake Generator to use · Issue #132 · vector-of-bool/vscode-cmake-tools
After upgrading my cmake install to 3.7.2, enabling the cmake server option in the vs code settings, and restarting vs code, I get the message: "Unable ...

エラー出力にもありますが、Ninjaが存在しない、って言っているのでそれをインストールします。

What is Ninja?

Ninjaはスピードに特化した小型のビルドツールとのこと。
私はよくわからないので、詳しいことはググってください。

ninja-build/ninja
ninja - a small build system with a focus on speed

とりあえず、Githubのリリースから最新のバイナリをダウンロードして適当なフォルダに配置します。

Setup

続いて、Visual Studio Codeの設定に、下記のような内容を記述します。

設定後、Visual Studio Codeを再起動し、いつものようにCake: Quick Start的な感じで始めることが出来るようになっているはずです。

開発メモ その89 dlibの顔検出性能をCUDA ON/OFFで比較

Problem


前回はdlibをCUDAを有効にしたバイナリ、無効にしたバイナリを生成しました。

具体的に、CUDAを有効にしている状態で、どれだけ性能差が出るのかを比較したいと思います。

Preparation


まずは、実験に使う画像を用意します。
今回は下記を用意しました。


元画像: https://upload.wikimedia.org/wikipedia/commons/b/b7/G7_summit_at_Shimakan.jpg

4368x2912の大きなサイズです。

次に計測を行うソースです。
examples\face_detection_ex.cppという顔検出のサンプルがあります。

これに対して、上述の画像を認識させると

こうなります。

Try


このソースを下記のように改造します。

要するに、入力した画像ファイルを100回認識させ、その処理に要した合計時間と平均時間を算出するようにしただけです。
下記がその結果です。

Left align Total(ms) Average(ms)
w/o CUDA 1007778.0000 10077.7800
w/ CUDA 997522.0000 9975.2200

正直微妙です。約10%しか差がありません。