Raspberry pi,Jetson Nanoでリアルタイム音声信号への機械学習モデルによるエフェクト(学習環境作成編)

##きっかけ
[機械学習でギターアンプをモデリングする]( https://qiita.com/coz-a/items/aeab3c52e3f12ba52a8b)に啓発され、Raspberry pi、Jetson Nanoで音声入出力機能を追加し、リアルタイム推論させてみたい。

[機械学習でギターアンプをモデリングする]( https://qiita.com/coz-a/items/aeab3c52e3f12ba52a8b)では、WindowsPC上で、Keras、Tensorflow、CUDAを利用した学習、推論を行っている。
これをRaspberry piやJetson Nanoに持ち込むにはどうしたらいいのか検討した。

##理想の状態
下記の図の通り、入力した音声信号を推論して、エフェクトのかかった音声信号を出力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/b95f2b6f-97c9-1526-a3bc-5c6dd4b6e21f.png)

##組み込み型の推論エンジンの検討
■Tensorflow C　Tensorflowの組み込み向けアプリ、C++実装などもできる
■TensorRT　TensorflowやKerasで学習したモデルをh5→Frozen Graph→uffに変換して組み込み機器で高速に推論させる仕掛け。Jetson Nanoと親和性が高い
■nnabla　ソニーの機械学習ライブラリ。Python,C++,Cで同じ学習データをシームレスに学習データがやり取りできる

Tensorflow CはLSTMに対応しているがわからなかったのと、TensorRTはファイル変換が理解できず、難解だった。
今回はパワーのあるデスクトップPCで学習データをそのままRaspberry PI、Jetson Nanoへ持ち込めることを優先とし、nnablaを選択した。

##環境構築
まず、学習する環境を整える。
Windows10　PC　8GB　RAM
NVIDIA Geforce RTX2070
Python3.7.1インストール

基本的にはhttps://nnabla.org/ja/download/の通り進める。

コマンドラインで
pip install nnablaと打つだけ

```
>nnabla_cli
2020-03-14 17:40:45,986 [nnabla][INFO]: Initializing CPU extension...
NNabla command line interface (Version:1.5.0, Build:200121063740)
usage: nnabla_cli [-h] [-m]
                  {train,infer,forward,encode_param,decode_param,profile,conv_dataset,compare_with_cpu,create_image_classification_dataset,create_object_detection_dataset,upload,create_tar,dump,nnb_template,convert,function_info,optimize,plot_series,plot_timer,draw_graph,version}
                  ...

Command line interface for NNabla(Version:1.5.0, Build:200121063740)

positional arguments:
  {train,infer,forward,encode_param,decode_param,profile,conv_dataset,compare_with_cpu,create_image_classification_dataset,create_object_detection_dataset,upload,create_tar,dump,nnb_template,convert,function_info,optimize,plot_series,plot_timer,draw_graph,version}
    train               Training with NNP.
    infer               Do inference with NNP and binary data file input.
    forward             Do evaluation with NNP and test dataset.
    encode_param        Encode plain text to parameter format.
    decode_param        Decode parameter to plain text.
    profile             Profiling performance with NNP.
    conv_dataset        Convert CSV dataset to cache.
    compare_with_cpu    Compare performance between two nntxt.
    create_image_classification_dataset
                        Create dataset from image files.
    create_object_detection_dataset
                        Create dataset from image and label files.
    upload              Upload dataset to Neural Network Console.
    create_tar          Create tar file for Neural Network Console.
    dump                Dump network with supported format.
    nnb_template        Generate NNB config file template.
    convert             File format converter.
    function_info       Output function info.
    optimize            Optimize pb model.
    plot_series         Plot *.series.txt files.
    plot_timer          Plot *.timer.txt files.
    draw_graph          Draw a graph in a NNP or nntxt file with graphviz.
    version             Print version and build number.

optional arguments:
  -h, --help            show this help message and exit
  -m, --mpi             exec with mpi.
```

上記の通りインストールできた。

##GPUを有効にする

CUDA 10.0をインストールしているので、

pip install -U nnabla_ext_cuda100

と打つだけ。

環境が用意できた。

##学習ファイルの用意
[機械学習でギターアンプをモデリングする]( https://qiita.com/coz-a/items/aeab3c52e3f12ba52a8b)では、以下のようにデータを用意する。
(train_x1.wav , train_y1.wav)
(train_x2.wav , train_y2.wav)
(train_x3.wav , train_y3.wav)
(train_x4.wav , train_y4.wav)

train_xが説明変数となるエフェクトをかける前のドライ音、
train_yが目的変数となるエフェクトをかけた後の音となる。
これを今回、無料のDAWの[cakewalk by BandLab](https://1176fire.com/2019/02/02/cakewalk-by-bandlab-howto-install/)を使って学習データペアを作成する。



今回かけるエフェクトは[Voxengo Tube Amp](https://www.voxengo.com/product/tubeamp/)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/341b243c-c4ba-67d4-b8e9-6fb9352ae943.png)
変化がわかりやすいよう、上記のはっきりしたセッティングで行う。

Cakewalk上でオーディオのエクスポートで、ドライ音とウエット音をスプリットモノで書きだす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/503f34b4-f00f-e9e1-ca24-b85c3b151655.png)
その際サンプルレートは48000、ビット数は32で保存する。

上記で保存すると、32ビット浮動小数点フォーマットで作成されるので、[Audacity]( https://www.audacityteam.org/)を使って、32ビット整数型で変換して保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/13fdfac7-5959-2c80-060a-517b15ebdc0d.png)
テストデータは下記で、上記と同様に作成する。
(val_x.wav , val_y.wav)