2018/04/30

CppUTest を試してみる

CppUTestを試してみます。CppUTestの本家はここ。
http://cpputest.github.io/

現時点の最新をダウンロードします。

$ wget https://github.com/cpputest/cpputest/releases/download/v3.8/cpputest-3.8.zip
展開して、
$ unzip cpputest-3.8.zip
$ cd cpputest-3.8/cpputest_build/
ビルドするだけです。なお、cmake版もあります。
$ ../configure
$ make
一応、CppUTest自身のテストもしておきます。
$ make tdd
以下のようなコードを書いて、
#include "CppUTest/CommandLineTestRunner.h"
#include "CppUTest/TestHarness.h"

TEST_GROUP(TestSuite){};
TEST(TestSuite, Case1)
{
  LONGS_EQUAL(3, 4);
}

int main(int argc, char *argv[])
{
  return RUN_ALL_TESTS(argc, argv);
}
ビルドします。
$ g++ -Icpputest-3.8/include test.cpp cpputest-3.8/cpputest_build/lib/libCppUTest.a
実行すると、
$ ./a.out
test.cpp:7: error: Failure in TEST(TestSuite, Case1)
        expected <3 0x3>
        but was  <4 0x4>

.
Errors (1 failures, 1 tests, 1 ran, 1 checks, 0 ignored, 0 filtered out, 3 ms)
となり、無事、エラーが検出できました。


なお、次のようにファイルの指定順序をうっかり間違うと、リンカエラーがでます。
$ g++ -Icpputest-3.8/include cpputest-3.8/cpputest_build/lib/libCppUTest.a test.cpp
理由を知りたい方は、
http://www.yunabe.jp/docs/static_library.html
をどうぞ。

2018/04/16

映像を利用した音声分離

複数の音声が混じった音から個別の音声を抜き出す音声分離の性能を映像を使って向上させる方法をgoogleが発表。

評価には、signal-to-distortion ratio (SDR)を利用。
arXivに投稿されている論文のTable 3によると、音声のみを用いた最新手法より分離性能が高い。


arXiv
https://arxiv.org/abs/1804.03619

GIGAZINE
https://gigazine.net/news/20180412-looking-to-listen-google/

Google Research Blog
https://research.googleblog.com/2018/04/looking-to-listen-audio-visual-speech.html


SDRの解説は
https://hal.inria.fr/inria-00564760/document
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.412.3918&rep=rep1&type=pdf
に記載があるが、きちんとは読んでいない。

黙読?の認識

MITが声を出さずに頭の中でしゃべった声を認識する装置を開発したとのこと。

口を動かしたつもりがないのに、実際には微弱ながらも筋肉が反応しており
それを捕らえて認識している模様。CNNベースの孤立単語認識で実現している。

深層学習のおかげで、脳内でしゃべった単語に対応する電圧(電流?)が
筋電計から取得できることさえ分かってしまえば、あとは装置を作ってデータを集めるだけ。
EEGやNIRSに比べれば装置は作りやすく、リアルタイム性も良さそう。



論文
http://dam-prod.media.mit.edu/x/2018/03/23/p43-kapur_BRjFwE6.pdf

スラド
https://science.srad.jp/story/18/04/10/0326229/

GIGAZINE
https://gigazine.net/news/20180405-mit-internal-verbalization-transcribe-computer-system/

2018/04/08

PulseAudioで音量表示

はじめに


PulseAudioを使って録音しながらリアルタイムで音量を表示します。

方法とコード


PulseAudioのSimple API [1] を使って録音し、音量を表示します。音量の計算はざっくりです。20秒間録音して終了します。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <pulse/simple.h>

std::string getbar(double v)
{
  v = 10*(v-4); // 10 and -4 are determined by heuristic
  if(v < 0){v = 0;}
  return std::string(v, '*');
}

int main(void)
{
  pa_sample_spec ss;
  ss.format = PA_SAMPLE_S16LE; // Signed, 16bits, Little endian
  ss.channels = 1;
  ss.rate = 8000; // Sampling frequency is 8kHz
  pa_simple *s = pa_simple_new(NULL, "Volume meter", PA_STREAM_RECORD, NULL, "Microphone vm",
          &ss, NULL, NULL, NULL);
  std::vector<short> buffer(800); // For 100ms
  for(int i=0; i<200; ++i) // Record for 20s
  {
    // Read audio for 100ms
    pa_simple_read(s, &buffer[0], buffer.size()*sizeof(short), nullptr);

    // Calculate power for the range of 100ms
    double power = 0;
    for(auto &v : buffer)
    {
      power += v*v;
    }
    // Output a result with a bar
    double logp = log10(power/buffer.size());
    std::cout << logp << "\t" << getbar(logp) << std::endl;
  }
  pa_simple_free(s);
  return 0;
}
このコードのファイル名をrec.cppとすると、コンパイルは、
g++ --std=c++14 -lpulse-simple rec.cpp
で行えます。g++はバージョン4.9.2を利用しています。libpulse-dev が必要ですので、コンパイルする前にapt-getやaptitudeを使ってインストールしておきましょう。

マイクがリモートにある場合は、リモート側でPulseAudioのサーバの設定を行い、

PULSE_SERVER=192.168.1.2 ./a.out
のようにして実行します。ここでは、リモートマシンのIPアドレスが192.168.1.2であるとしています。 リモートマシンの設定は前の記事を参照ください。

結果


実行すると録音が始まり、コンソールに音量がバーで表示されます。
5.09851 **********
4.93314 *********
4.76426 *******
4.96767 *********
6.26456 **********************
6.17523 *********************
5.34311 *************
6.9875 *****************************
4.98664 *********
7.23169 ********************************
5.60815 ****************
6.16099 *********************
5.55161 ***************
5.16174 ***********
5.62978 ****************
5.19768 ***********
5.73633 *****************
5.85854 ******************
6.54446 *************************
5.53201 ***************
5.42636 **************
5.40482 **************
5.77586 *****************
4.9568 *********
4.82601 ********
7.56319 ***********************************
8.19005 *****************************************

参考


[1] https://freedesktop.org/software/pulseaudio/doxygen/simple.html

2018/04/07

PulseAudioを使った音の転送

はじめに


ネットワーク経由で音の再生・録音をしてみます。OSはLinuxです。遠いところに置いた省電力のデバイスから簡単に音を出せます。無線でつなげば、どこでも音楽が聴けるようになりますね。

構成


ここでは、音の再生・録音の操作をする計算機をクライアント、実際にスピーカやマイクがつながっている計算機をサーバとします。

クライアントは、VirualBox内で稼動しているDebian 8.1です。
サーバは、Raspberry Pi 3 Model Bです。こちらのOSはDebian 8.0です。

音の転送には、PulseAudio 5.0を用います。ALSAのひとつ上の層で動くサウンドサーバです。音をファイルから再生する場合は、

[クライアント]→[サーバ]→[スピーカ]→音
というふうにデータが流れ、録音する場合は、
音→[マイク]→[サーバ]→[クライアント]
のように流れます。

サーバの設定


まず、設定ファイルをコピーします。
cp /etc/pulse/default.pa ~/.config/pulse/
この中から、コメントアウトされているmodule-native-protocol-tcpの項目を見つけてきて、コメントをはずし、次のようにオプションを追記します。
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.0/24
auth-ip-acl=の右側はアクセスを許可するクライアントのIPアドレスです。複数指定する場合は、;で区切ります。マスクも使えます。

設定を反映するために、PulseAudioを再起動します。

$ pulseaudio --kill
$ pulseaudio --start
これで、サーバ側の準備は終わりました。

クライアントから操作


動作テストに使うwavファイルを適当に入手します。例えば、
$ wget https://freewavesamples.com/files/1980s-Casio-Piano-C5.wav

毎回サーバを指定


環境変数PULSE_SERVERを指定するだけで、サーバのスピーカから音を出力することができます。 サーバ(Raspberry Pi)のアドレスが192.168.1.2であれば、
PULSE_SERVER=192.168.1.2 aplay 1980s-Casio-Piano-C5.wav
とすると、サーバにつなげたスピーカから音が出ます。

同じように、録音もできます。

PULSE_SERVER=192.168.1.2 arecord test.wav

デフォルトサーバの指定


環境変数を毎回指定するのが手間な場合は、
export PULSE_SERVER=192.168.1.2
とします。または、client.confを設定します。具体的には、
cp /etc/pulse/client.conf ~/.config/pulse/
のように、クライアント用の設定ファイルをコピーし、コメントアウトされているdefault-serverを
default-server = 192.168.1.2
のように有効化します。

なお、これらの設定をするとクライアントにしている計算機でPulseAudioのサーバを起動できなくなります。例えば、

$ pulseaudio --start
N: [pulseaudio] main.c: ユーザーが設定したサーバー 192.168.1.2 は start/autospawn を拒否しています。
というエラーが出るようになります。

参考


[1] http://nishio.hateblo.jp/entry/20111215/1323962652
[2] https://wiki.archlinux.jp/index.php/PulseAudio/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB
[3] https://qiita.com/tukiyo3/items/d39c90f91d782001e7d7
[4] http://d.hatena.ne.jp/kakurasan/20081212/p2

2018/04/01

量子機械学習

半年前の記事ですが、Quantum machine learning についてのレビュー記事があったので、メモ。

https://www.nature.com/articles/nature23474
(doi:10.1038/nature23474)

普通の機械学習の量子版が色々と考えられているようです。例えば、
- Quantum principal component analysis (PCAの量子版)
- Quantum support vector machines (SVMの量子版)
- Deep quantum learning (深層学習の量子版)
- Quantum reinforcement learning (強化学習の量子版)
があるようです。