Raspberry Pi 音声入力＆音声出力をMATLABからデプロイ

# はじめに

今回は、Raspberry Piに音声を入力し、ピッチを遅らせた音声を出力する例題について試しました。基本的には下記、MathWorks社の例題の通りに動かしただけですが、いくつかつまづきポイントがありましたのでこの記事でまとめておきたいと思います。

https://jp.mathworks.com/help/supportpkg/raspberrypiio/ref/audio-pitch-shift-playback.html

# ポイントまとめ

### Raspberry Pi 4でも動作しました

例題を開くと「Raspberry Pi Model 3B or 3B+推奨」と記載がありました。

> Required Hardware
> Raspberry Pi hardware (Model 3B or 3B+ recommended)

そのためRaspberry Pi 4でも動作するか、若干心配な状態から例題を動かし始めましたが、**無事にRaspberry Pi 4 Model Bでも動作を確認**することができました。勿論、全ての人で同じように動作できるかは勿論わかりませんが、少なくとも自分の環境では問題なく動作させることができました。

ただし、例題に記載の通りに進めると"Step 2: Change the Audio Output Mode to Headphone Jack"で若干つまりますのでワークアラウンドを記載しておきます。例題には、以下の要領でRaspberry Pi側のAudio設定をするようにと記載してあります。音声を確実にイヤホンジャックから出力するための設定なのですが：

> 2. In the Software Configuration Tool Window, select Advanced Options and press Enter, then select Audio and press Enter.

Software Configuration Toolを開き、Advanced Optionsを開いてもAudio設定が選択肢に出てきませんでした。
結論として、**1 System Optionsから開くことで、S2 Audioという選択肢を見つけることができました**。ここでHeadphonesを選択することで、ちゃんとイヤホンから音声を聞くことができました。

### Step 3は1行毎に実行させない

次に、Step 3に進むと、CaptureオブジェクトとPlaybackオブジェクトを作る方法について記載があります。しかし、このコードは**コマンドウィンドウでは実行できません**でした。

```matlab
captureObj = audiocapture(rpi,'plughw:1,0','SampleRate', 48000, 'SamplesPerFrame', 4800);
playbackObj = audioplayer(rpi,'plughw:0,1', 'SampleRate', 48000);
```

上のコードを実行すると、以下のようなエラーが出ます。

```
audiocapture and audioplayer are supported only for code generation
```

最初はこのエラーの意味もよくわからなかったのですが、CaptureオブジェクトとPlaybackオブジェクトの作成はCコード生成のための関数内でのみ使用可能なようです。そのため、Step 3とStep 4はコードだけ確認をし、Step 5から動作させるようにしました。

### オーディオデバイス情報の取得

ただし、Step 5ではいきなりデプロイを行いますので、スクリプトにミスがないかは確認が必要です。私は最初、書いてある例題をそのまま書き写してデプロイをしたせいで一度失敗しています。
Step 5にある`raspi_pitchshiftdeployment()`を見ると、中でオーディオデバイスの設定をしています。ここの、plughw:1,0の部分を正しいデバイス番号に設定してあげる必要があります。

```matlab
captureObj = audiocapture(rpi,'plughw:1,0','SampleRate', 48000, 'SamplesPerFrame', 4800);
playbackObj = audioplayer(rpi,'plughw:0,1', 'SampleRate', 48000);
```

デバイス番号の調べ方については以下のページにまとまっています。ただし、**デバイス番号の確認のためにSimulink Support Package for Raspberry Pi Hardwareが必要**だったので入れ直しました。

https://jp.mathworks.com/help/supportpkg/raspberrypi/ref/listaudiodevices.html

簡単に解説をすると、以下の要領でオーディオデバイスのリストを取得すると、devices変数の中に情報がまとまって返ってきます。

```matlab
devices = listAudioDevices(rpi,'capture')
```

この中のDevice列の値を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/05b7ddc3-f9a9-7269-5e90-3a28745079a6.png)

自分は2,0を音声出力用、3,0を音声入力用にしていたので、以下のようにコードを書きなおしました。

```matlab
captureObj = audiocapture(rpi,'plughw:3,0','SampleRate', 48000, 'SamplesPerFrame', 4800);
playbackObj = audioplayer(rpi,'plughw:2,0', 'SampleRate', 48000);
```


##### Simulink Support Package for Raspberry Pi Hardwareインストール時のこぼれ話

オーディオデバイスのリストを取得しようとすると、Simulink Support Package for Raspberry Pi Hardwareのインストール用リンクがコマンドラインに表示されましたので、それをクリックしてインストールを済ませました。

```matlab
devices = listAudioDevices(rpi,'capture')
```

インストールを済ませると、デバイスのセットアップ画面が出てきましたが、**今回はセットアップをしませんでした**。理由は、MATLAB Support Package for Raspberry Pi Hardwareのセットアップと同じ内容に見えたからです。少なくとも、Raspberry Pi のOSイメージファイルは同じ名前でしたので、同じセットアップをしてもしょうがないかなと考え、もし動かなかったら後からセットアップしようと思って放置していました。結果として、Simulink Support Package for Raspberry Pi Hardwareでのセットアップをしなくても問題なく動作させることができました。

### Step 5の通りにデプロイすれば完了

あとはStep 5に従ってデプロイするだけです。デプロイ後の動かし方は、以下の記事でも書きましたのでよろしければ参考にしてください。

https://qiita.com/aoimidori/items/d4cf7388593bcc3d80ec#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%E3%81%A9%E3%81%93%E3%81%AB%E3%81%82%E3%82%8B%E3%81%AE%E3%81%8B

ちなみに、何度かデプロイを試したのですが、なぜかRaspberry Pi側のelfファイルがアップデートされないことがありました。原因がよくわからないのですが、一度Raspberry Pi側のelfファイルを削除してからデプロイをし直すことによって解決することができました。

# おわりに

Raspberry Pi連携の記事も3回目になりましたが、いざ始めてみると楽しくて仕方がありません。カメラモジュールやその他の外部デバイスもつい購入してしまったので、また時間を見つけて連携を試してみたいと思います。