ラズパイでメディアプログラミング（オーディオ関係の準備編）

# はじめに
　ラズパイで pyaudio+scipy+numpy 使ってリアルタイム・サウンド処理をしようと思ったら、意外にも手間がかかったので記事にまとめてみました。なお、この記事は準備編であり、ラズパイに python 3.7.6 をインストールし、その環境下にて numpy と scipy および pyaudio をインストールして使用できるようにするところまでです。

　本文書で整備した環境を用いて、ラズパイでリアルタイムにてピッチシフトするソフトを python で記述していきますが、別記事にて紹介します。


# NOOBS 3.3.0
　今回は NOOBS 3.3.0 を新規にインストールし、その直後からの手順を記しておきます。

# 必要なライブラリ等のインストール
　pyaudio 関係で必要となるので、以下のライブラリ等をインストールします：

```
sudo apt-get install portaudio19-dev python-pyaudio libatlas-base-dev
```

　scipy で _ctypes 関連のエラーが出るのを回避するため、以下のライブラリをインストールします（後ほどインストールする pyenv にて python 3.7.6 をインストールする前に apt-get install しておく必要があります）：

```
sudo apt-get install libffi-dev
```

　pyenv のインストールのため、以下のライブラリをインストールします：

```
sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev
```

# pyenv のインストール
　以下のコマンドを実行して、pyenv をインストールします：

```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

　そのままでは pyenv の実行ができないので、~/.profile に以下の内容を追加し、環境変数の設定および pyenv の初期化処理を行います。エディタは何でも良いのですが、デフォルトでインストールされている nano エディタを使う場合は、nano ~/.profile とします。

``` ~/.profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

nano エディタの場合、上記の内容を入力し、Ctrl-O を押すとファイルに書き込むか聞かれます。ファイル名を確認し、エンターキー押して書き込んで下さい。その後、Ctrl-X で nano エディタを終了します。

〜/.profie に上記内容を書き込んだら、

```
source ~/.profile
```

として、今書き込んだ内容（環境変数の設定）を反映させます。上手く反映できているか否かは、

```
pyenv --version
```

として、バージョン情報が表示されれば OK です。

　なお、source ~/.profile の実行はこの一回だけで十分です（次回以降はラズパイを立ち上げてログインする時に自動的に実行されます）。

# python 3.7.6 のインストール
　pyenv を使い、python 3.7.6 をインストールするのですが、python のビルド時のオプションが重要になってくるので、その設定を行います。具体的には PYTHON_CONFIGURE_OPTS という環境変数に以下の内容を設定すれば良いのですが、失敗した場合などを考え、念のため一度ファイルに書き込むようにします。ここでは、以下の内容を setup.sh というファイルに書き込むこととします：

``` setup.sh
export PYTHON_CONFIGURE_OPTS="--enable-ipv6\
--enable-unicode=ucs4\
--enable-shared\
--with-dbmliborder=bdb:gdbm\
--with-system-expat\
--with-system-ffi\
--with-fpectl"
```

ファイルに書き込めたら、

```
source setup.sh
```

として、環境変数を更新しておきます。正しく環境変数の更新ができているかどうかを確認するため、

```
echo $PYTHON_CONFIGURE_OPTS
```

として、setup.sh で記述した内容が 1 行にまとまって表示されていれば OK です。

このまま以下の手順を進めていく場合は、上記作業は 1 度行えば十分です。しかし、もしここで作業を終了し、続きは明日また行うー等といった場合は電源再投入後、source setup.sh から再度行って下さい（電源を切ると設定した環境変数の情報も消えてしまうためです）。


# 実験用ディレクトリの作成
　pyenv を用いて、あるディレクトリ以下だけ python 3.7.6 な環境にします。ここでは、test というディレクトリを作成し、その中だけ python 3.7.6 な環境にします。

```
mkdir test
cd test
```

# Python 3.7.6 のインストール
　実験用の test ディレクトリにて、python を実行すると、python 3.7.6 が実行されるようにします。まずは、pyenv を用いて 3.7.6 をインストールし、その後、このディレクトリ内において使用する python の設定を行います。

　python 3.7.6 のインストールは以下のコマンドで行います（少し時間がかかります）：

```
pyenv install 3.7.6
```

無事インストールができたら、

```
pyenv versions
```

として、3.7.6 という表示が出れば成功です。

# 実験用ディレクトリの Python を 3.7.6 にする
　ラズパイに（というか、今回インストールした Raspbian に）標準でインストールされている python は 2.7.16 です。Python にはバージョンが 2 のものと 3 のものがあり、実験用ディレクトリでは ver. 3.7.6 を、それ以外の場所では 2.7.16 （システム標準のバージョンのまま）を使用するようにします。

　要は test ディレクトリでは 3.7.6 を使用するように設定するわけですが、これは

```
pyenv local 3.7.6
```

というコマンドを実行すれば完了です。

　試しに test ディレクトリにて python -V としてみると、3.7.6 という文字列が表示されると思います（表示されていない場合は設定に失敗しています）。試しに、他のディレクトリ、例えばホームディレクトリ等に移動し、python -V とすると 2.7.16 と表示されると思います。

# pip のアップグレード
　pip というのは、この後に使用する、各種のモジュールをインストールするために用いる python のパッケージマネージャです。pyenv で Python をインストールすると、pip も古いものに戻ってしまう場合があるため、念のため以下のコマンドを実行し、pip を最新の状況にしておきます。そのために、対のコマンドを実行します：

```
pip install --upgrade pip
```

# numpy, scipy, pyaudio のインストール
　いよいよ各種モジュールのインストールの準備ができました！…と言いたいところですが、あと一つだけインストールしなければならないモジュールがありますので、それをインストールしておきます。この手順以降は pip を用いてモジュールのインストールを行っていきます：

```
pip install pybind11
```

無事インストールが終了したら、

```
pip install numpy
pip install scipy
pip install pyaudio
```

として、この記事の目標である、それぞれのパッケージのインストールを行います。無事成功したら、テストとして、python を起動し、

```
import numpy
import scipy
import pyaudio
```

とし、それぞれのモジュールが問題なくインポートできていることを確認して下さい。

# おわりに
　本文書では、インストールしようとするとちょっと面倒なことになる、numpy や scipy のインストール方法を示しました。ついでに pyaudio のインストール方法も示し、ラズパイにてリアルタイムサウンド処理が開発できる環境を整えました。

　次は、この環境を用いてラズパイでリアルタイムピッチシフタを作ってみたいと思います。リアルタイムに音程を変化させるソフトウェアですので、音楽などを入力すると音程がずれて再生され、なんだかとっても音痴な音楽になったりします。乞うご期待、です。