JetsonNanoで自動作曲配信システムを作ってる途中です

こちらは[IoTLT Advent Calendar 2021](https://qiita.com/advent-calendar/2021/iotlt) 17日目の記事です。
MusicLTという音楽 x テクノロジーがテーマのLT会でお話しさせていただいた内容になります。

https://iotlt.connpass.com/event/224144/

# 背景
以前にGoogleMagentaを使った自動作曲と自動再生をし続けるスクリプトを作ったことがありました。
当時のLT資料がこちらです。

https://speakerdeck.com/kawazu/yin-le-zhong-jian-gainaifalsedebandomenbawoshi-zhuang-sitahua

(そういえばQiitaに記事化してなかったのでそのうちまとめたい)


手元にあるだけだと勿体無いと思ったので、こちらのように何回かYouTubeで配信を行なったりしています。

<iframe width="560" height="315" src="https://www.youtube.com/embed/WqphsDxOHpo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

ただ都度配信を行うには配信開始・配信終了の手間がありますし、何より配信中はPCのスピーカーが使用中となるため、むやみにオンライン会議などできなくなってしまうのです。

自分のPC以外のマシンで、ずっと配信しっぱなしにできたらいいのになあ、そうだJetson Nanoとか使えばできないかな？と思い立ったのがきっかけです。

# どうしてJetson Nano？
- もう一個ラップトップPCを買うには流石に高すぎる。Jetson Nanoなら比較的お得
- Tensorflowが動く環境なんだからMagentaもなんだか動きそう

上記のような判断で選んだのですが、「Tensorflowが動く環境なんだからMagentaもなんだか動きそう」というのは後述の通り見通しの甘い判断でして、この記事では主にこの件をいかに解決するか、がメインの話となりそうです。

# どう進める？
- Jetson Nanoのセットアップ
- Magenta環境の構築
- 配信設定を整える

の順番で進めます。

## Jetson Nanoのセットアップ
Jetson Nanoのセットアップについてもそれなりに詰まったため、いくつか備忘録を残しておきます。
セットアップを進めるのにこちらの記事を参考にさせていただきました。

https://satoshisgarage.tech/?p=18756

こちらの記事で挙げられている必要なものについて、最終的に僕は全部購入することになりました。ほんとに一からJetson Nanoを触り始める方々は、何も考えずにおススメされている周辺機器を全て買うのが良いと思います。

僕がセットアップに詰まった要因として、RaspberryPIで使用したことのある

- 電源を5V/3A microUSBのものを使おうとした
- 適当に買ってきたSDカードを使おうとした

これがいけませんでした。

5V/3A microUSB電源を繋げてみても、Jetson Nanoが起動せず。
Jetson Nanoは起動時に緑色のLEDが点灯するのですが、点灯すらない。
後からわかったのですが、Jetson Nanoには

- microUSB給電
- ACアダプタ給電

の2つの方法があり、ACアダプタ給電にはJ48という箇所にジャンパピンを刺すことで回路をショートさせる必要があります。(Jetson Nanoの仕様です)

![20200723142001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329420/af1e6ef7-be02-a2d3-9ab9-b0632d7f4c80.png)

ふと何気なくJetson Nanoの基盤を見ると・・・

![スクリーンショット 2021-12-14 8.46.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329420/f6fb07e7-56b3-fadc-5e71-be7ec0dc8ed1.png)

**ジャンパピン刺さってる！**

ACアダプタ給電モードにもかかわらずmicroUSB給電を使おうとしてたのがいけなかったみたいです。
Jetson Nano購入時からジャンパピン刺さってたみたいですので、初見購入者の方は気をつけて下さい。
ジャンパピン外してmicroUSBでもいけそうでしたが、すでに5V/4AのACアダプタを購入していたので、そちらで給電することにしました。
(5V/4Aの方が挙動が安定するそうですよ。)

電源については解決して緑色LEDも点灯しましたが、「NVidia」の大きな画面が表示された後何も動かず。
ハードの起動はうまくいってそうですが、OSの起動が怪しそう。
とのことでSDカードを疑います。

色々調べていると、Jetson Nanoは`UHS-I`という規格のSDカードじゃないと対応していないそうです。
ということで僕はこちらを購入しました。

https://www.amazon.co.jp/dp/B07SSGTYB3

フォーマットし直して再度起動するとうまく行きました！

## Mageta環境の構築

実は自動作曲のコードはGithubに上げています。

https://github.com/kawazu255/magenta_automatic_creation

Docker環境を作っているので、基本的にDockerが起動すればいけるはず・・・と思っていました。

必要なライブラリをインストールして・・・

```sh
$ sudo apt-get install python3-pip
$ pip3 install pygame
$ sudo apt-get install docker.io
$ sudo apt-get install docker-compose
```

`docker-compose build`すると・・・

```
Step 3/18 : RUN apt update && apt install -y python-pip python3-pip ---> [Warning] The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
---> Running in 2378b4820e6e
standard_init_linux.go:228: exec user process caused: exec format error
ERROR: Service 'magenta' failed to build: The command '/bin/sh -c apt update && apt install -y python-pip python3-pip' returned a non-zero code: 1
```

エラーになります。

エラー内容を見ると、イメージをビルドしたマシンと、コンテナを実行するマシンのCPUアーキテクチャが異なるために発生するエラーとのことです。

Jetson NanoのCPUアーキテクチャは`linux/arm64/v8`ですが、ビルドしようとしているDockerベースイメージが`linux/amd64`なのでエラーになっているということですね。

Mageta環境のDockerfileはこんな感じです。

```Dockerfile
# このベースイメージがダメっぽい
FROM tensorflow/magenta

WORKDIR /magenta-data

RUN apt update && apt install -y python-pip python3-pip

RUN python3 -m pip install --upgrade pip

RUN apt update

# 中略
```

`tensorflow/magenta`の公式DockerHubを見にいくと・・・

![スクリーンショット 2021-12-12 9.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329420/a854ec58-87c5-3775-ff77-a5ac5038e094.png)

確かに`linux/amd64`って書いてある。

公式のDockerイメージは`linux/amd64`しかサポートがないため、エラーを解決するためには`linux/arm64/v8`が使われているベースイメージを使いつつ、自力でMagenta環境(及びTensorflow環境)を構築するしかなさそうです。

今回の記事ではここまで。
続きが解決できましたら、記事の更新を行いたいと思います。

ちなみに・・・

## 配信設定を整える
Ubuntu用OBSがインストールできそうなので、こちらがうまくいけばYouTube配信できそうな見込みです。

https://obsproject.com/ja/download