Raspberry Piと400円のUSBマイクで作るボイスチェンジャーで子供と遊ぶ

# はじめに
* 自宅待機が続く中、お金をかけずに子供と楽しく遊べるボイスチェンジャーを作ってみた。
* 海外では[こんな感じで](https://www.raspberrypi-spy.co.uk/2017/03/amplified-voice-changer-using-a-raspberry-pi-zero/)ラズパイやArduinoを使ってハロウィン用に手作りしてる人がいる。
 * （ダース・ベイダーのかぶり物に仕込んで遊んだりしていて、めっちゃ楽しそう！）
* 小型化等の課題もあるが、今回RaspberryPi3で簡単に作れたので、一旦ここまでの成果をまとめる。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Raspberry Pi3に500円のUSBマイクつないでSoXでお手軽ボイスチェンジャー作った。<br>ピッチ変えたりエコー付けたり出来て、子供と爆笑しまくり！<br>楽しくお家で過ごせそう。<a href="https://twitter.com/hashtag/RaspberryPi?src=hash&amp;ref_src=twsrc%5Etfw">#RaspberryPi</a> <a href="https://t.co/QQ8eOOXGjU">pic.twitter.com/QQ8eOOXGjU</a></p>&mdash; Nabeshin (@desmoquattro996) <a href="https://twitter.com/desmoquattro996/status/1260243639076192257?ref_src=twsrc%5Etfw">May 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 用意するもの

* どのご家庭にもあるRaspberry PiにUSBマイクをつなぎます。
* 大抵の人は、お家にあるもので作れちゃうんじゃないでしょうか？

| 項目 | 概要 | 購入価格 |
|----|----|----|
| RaspBerry Pi | 「[RaspBerryPi3 Model B](http://akizukidenshi.com/catalog/g/gM-11425/)」とか。Zeroでも行けるはず | ¥4,800 |
| USBマイク| [小型USBマイク](http://akizukidenshi.com/catalog/g/gM-12864/) | ¥380 |
| (スピーカ) | アンプが付いてるやつ。モニタにスピーカが付いてる場合は不要。 | --- |
| その他 | ラズパイを使うために必要なもの（microSD、モニタ、キーボード、マウス） | --- |

* USBマイク
 * USBマイクであれば、多分なんでも行けるはず。
* 自分が購入したのはこれ。
 * 2018年当時はAmazonで送料込み¥223でしたが、、、
 * 2020年現在、新型コロナの影響で海外からの購入がかなり高額になっちゃってます。（しかも到着がいつになるか、全く分からない）
 * しばらくの間は、部品は国内で調達した方が安いし早い。



![IMG_2864D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/abfda6c7-06bb-593e-1258-b5e2d3cbcbdd.jpeg)


* スピーカ
 * 3.5mmのステレオミニプラグで出力できるもの。テストするだけなら最悪、イヤホンでも可。
 * 自分の場合、モニタにスピーカが付いてないため、手持ちの小型スピーカを使用した。
 * この製品は、普通にラズパイのイヤホンジャックから音声を取るのに加え、アンプ電源をUSBから取るためのケーブルが付いている。

![IMG_2865D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/a73adc2a-0688-1c5d-60ab-419e95a7d95f.jpeg)


# ラズパイにUSBマイクを接続。

![IMG_2868D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/0a2dd03b-738a-d2cf-cb77-cdd016c09cbd.jpeg)


* USBマイクを接続し、lsusbで確認。
 * 自分の環境では、一番上に「Intel Corp.」というものが追加された。
 
~~~
pi@raspberrypi:~ $ lsusb
Bus 001 Device 005: ID 8086:0808 Intel Corp. 
Bus 001 Device 007: ID 056e:00e4 Elecom Co., Ltd 
Bus 001 Device 006: ID 0853:0100 Topre Corporation HHKB Professional
Bus 001 Device 004: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $ 
~~~

# USBマイクの優先順位を変更
* USBマイクの優先順位を調べる。

~~~
pi@raspberrypi:~ $ cat /proc/asound/modules
 0 snd_bcm2835
 1 snd_usb_audio
~~~

* 優先順位が２番目なので、これをあげてやる。

~~~
pi@raspberrypi:~ $ sudo vi /etc/modprobe.d/alsa-base.conf 
options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1
~~~

* 再起動。

~~~
pi@raspberrypi:~ $ sudo reboot
~~~

* 優先順位が変わったことを確認。

~~~
pi@raspberrypi:~ $ cat /proc/asound/modules 
 0 snd_usb_audio
 1 snd_bcm2835
~~~

# USBマイクの録音ボリュームを上げる
* マイクのボリュームが小さいと音声が拾えないので、上げておく。
* **alsamixer** を起動。

~~~
pi@raspberrypi:~ $ alsamixer
~~~

* 「**F6**」でUSBマイク（USB PnP Sound Device）を選択。

![2020-05-13-094837_919x649_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/c5f4134a-40e0-22b9-ce48-e06b4572d5be.png)

* 上下キーで適当なボリュームに調整して、「**ESC**」で終了。


![2020-05-13-094746_919x649_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/d9f2fa71-cce0-7e14-0ec9-00888c263c85.png)

# SoXのインストール

~~~
pi@raspberrypi:~ $ sudo apt-get install sox 
~~~

* SoXとは（[SoX](http://sox.sourceforge.net/Docs/Features) ）
 * 「Sound eXchange, the Swiss Army knife of audio manipulation」つまり、「音声操作版のスイスアーミーナイフ」という訳で、音声を様々にイジれるツール。
 * 多くの音声フォーマットに対応している。
 * いろんなエフェクトをかけることができる。
 * 複数の音声ファイルを結合することもできる。


# デフォルトデバイスの設定
* alsamixerで表示されたように、本構成では録音デバイスと、再生デバイスが異なる。
* 一方、SoXで録音、再生を行う場合、「デフォルトデバイス」を使っていろいろやるらしい。
 * 一応、個々のコマンド実行時に非デフォルトデバイスを指定することはできる。
 * だが、後述の録音(音声加工) --> 再生(スピーカ出力)をパイプ処理でつなぐ際、デバイスを切り替える指定オプションが見当たらない。
* 頑張って調べればコマンド指定で切り替える方法が見つかるかもしれないが、最初に録音、再生のデフォルトデバイスを設定しておくと良い。

## カード番号を調べる
* 録音デバイス
 * 以下の通り、USBマイクのカード番号は0, デバイス番号も0
 
~~~
pi@raspberrypi:~ $ arecord -l
**** ハードウェアデバイス CAPTURE のリスト **** [#z28b77e4]
カード 0: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
pi@raspberrypi:~ $ 
~~~

* 再生デバイス
 * 以下の通り、再生デバイスのカード番号は1, デバイス番号は0

~~~
pi@raspberrypi:~ $ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト **** [#l222c468]
カード 1: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 7/7
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
カード 1: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: ALSA [bcm2835 ALSA], デバイス 2: bcm2835 IEC958/HDMI1 [bcm2835 IEC958/HDMI1]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
pi@raspberrypi:~ $ 
~~~

## **.asoundrc**の編集


~~~
pi@raspberrypi:~ $ cd
pi@raspberrypi:~ $ sudo vi .asoundrc 
~~~

* 上記で調べたデフォルトデバイスを設定する。
 *  playback.pcmはカード1、デバイス0  ---> "hw:1,0"
 *  capture.pcmはカード0、デバイス0   ---> "hw:0,0"

~~~Shell:.asoundrc
pcm.!default {
  type asym
   playback.pcm {
     type plug
     slave.pcm "hw:1,0"
   }
   capture.pcm {
     type plug
     slave.pcm "hw:0,0"
   }
}
~~~

* 再起動。

~~~
pi@raspberrypi:~ $ sudo reboot
~~~


# Soxの実行
## 録音する(音声加工)
rec コマンドの引数でいろいろオプションを指定すると、マイクの音声を加工した音声ファイルが作成できる。

| option | 説明 |
|---|---|
| pitch | プラスにすると高い音声、マイナスにすると低い音声になる。 |
| gain | ボリュームを上げる。（何も指定しないと音が小さいので、値は適宜調整する） |

 * 各オプションの詳細は [Linux man page](https://linux.die.net/man/1/sox) 参照。

~~~
pi@raspberrypi:~ $ rec test.wav pitch 600 gain 16

Input File     : 'default' (alsa)
Channels       : 2
Sample Rate    : 48000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

In:0.00% 00:00:04.10 [00:00:00.00] Out:190k  [      |      ] Hd:3.2 Clip:0    ^C
Aborted.
pi@raspberrypi:~ $
~~~

* 「**Ctrl + c**」で録音終了。
 * 指定したファイル名で、加工された音声データが保存される。

## 再生する
* 保存した音声ファイルを再生する。
 * 高音部分が強調され、お馴染みの**いかにもボイスチェンジャーっぽい音声が聞こえる！！**

~~~
pi@raspberrypi:~ $ play test.wav 

test.wav:

 File Size: 760k      Bit Rate: 1.54M
  Encoding: Signed PCM    
  Channels: 2 @ 16-bit   
Samplerate: 48000Hz      
Replaygain: off         
  Duration: 00:00:03.96  

In:100%  00:00:03.96 [00:00:00.00] Out:190k  [      |      ] Hd:3.2 Clip:0    
Done.
pi@raspberrypi:~ $ 
~~~


## ボイスチェンジャーにする
* 録音、再生を単発で動かす形だと人と会話できないため、イマイチ。
* そこで録音、再生をパイプ処理でつなげ、文字通りボイスチェンジャーにする。
 * これでマイクでしゃべった音声がほぼリアルタイムに加工され、スピーカから出力される。
 * （実際は若干遅れて再生される感じ）

| option | 説明 |
|---|---|
| buffer | マイク音声をスピーカに送る前にバッファリングすることで、長時間しゃべった時のバッファオーバーランを防止する。|
| echos | エコー効果を付ける。マイクとスピーカが近いとハウリングするため、なるべく離して使う。|

 * 各オプションの詳細は [Linux man page](https://linux.die.net/man/1/sox) 参照。


~~~
pi@raspberrypi:~ $ play "|rec --buffer 2048 -d pitch 600 gain 16 echos 0.8 0.88 100 0.6 150 0.5"

default: (alsa)

  Encoding: Signed PCM    
  Channels: 2 @ 16-bit   
Samplerate: 48000Hz      
Replaygain: off         
  Duration: unknown      

In:0.00% 00:00:00.64 [00:00:00.00] Out:25.4k [      |      ]        Clip:0    rec WARN alsa: under-run
In:0.00% 00:00:06.57 [00:00:00.00] Out:311k  [      |      ]        Clip:763  rec WARN alsa: under-run
In:0.00% 00:00:06.66 [00:00:00.00] Out:313k  [      |      ]        Clip:763  rec WARN alsa: under-run
In:0.00% 00:00:37.10 [00:00:00.00] Out:1.78M [      |      ]        Clip:857  

// 「Ctrl + c」しない限り、ボイスチェンジャーが動き続ける。

~~~

# パラメータをいじって変な声をみんなで楽しむ
* pitchをマイナス値にして低い音に変えたり、echosの値を変えてエコーを強くしたりすると楽しい。
* 他にもいろいろオプションがあるので、片っ端から変な声を試して家族で大いに笑いましょう！！


# オモチャに仕込む
* ちっちゃなRaspberryPi Zeroでも同じことができるようなので、冒頭で触れたようにダース・ベイダーとか、かぶりものに仕込んで遊べる。


![IMG_2869D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/ebae5517-b7da-2819-f41c-1cdc08cd1604.jpeg)

* ラズパイはBluetoothのスピーカに音声を飛ばせるので、スピーカをオモチャの中に仕込んで人間と会話しても楽しそう。
 * 調べたらダイソーに[600円で小型でめっちゃいいやつ](https://rocketnews24.com/2019/08/24/1253120/) があるじゃん！！
 * これ、ぬいぐるみに仕込んで会話したら絶対面白い！！
 * 今度ダイソー行ったら買おっと。



# 最後に
* 意外と簡単に作れます。
 * マイクとスピーカは手持ちの物を使えば良いので、テレワークで使っているものがあれば直ぐに試せます。
* 外出自粛で我慢の日々ですが、楽しいこと見つけてお互い前向きに乗り切りましょう！


# 参考
* ボイスチェンジャー
 * [Amplified Voice Changer using a Raspberry Pi Zero](https://www.raspberrypi-spy.co.uk/2017/03/amplified-voice-changer-using-a-raspberry-pi-zero/)
 * [USING A RASPBERRY PI AS A REALTIME VOICE CHANGER FOR HALLOWEEN](https://planet-geek.com/2015/10/29/hacks/using-a-raspberry-pi-as-a-realtime-voice-changer-for-halloween/)
* SoX
 * [Linux man page](https://linux.die.net/man/1/sox)
 * [SoXでデフォルトデバイスを指定する方法](https://www.raspberrypi.org/forums/viewtopic.php?t=13088)