M5StickC + Speaker Hat で ESP8266Audio ライブラリを使用して MP3 ファイルを再生する

前回の M5StickC + Speaker Hat で SPIFFS から読み込んだ WAV ファイルを再生する では自力で WAV ファイルを読み込んでいましたが、 ESP8266Audio というライブラリを用いることで ESP32-PICO 搭載の M5StickC でも MP3 が再生できることを教えて頂きました。 ということで、今回は事前に SPIFFS へ保存した MP3 ファイルを ESP8266Audio で読み込んで再生します。

スケッチ

以下は A ボタン(正面の「M5」ボタン)を押すと MP3 ファイルが再生されるスケッチです。

SPIFFS からファイルを読み込む AudioFileSourceSPIFFS クラス、 MP3 を再生する AudioGeneratorMP3 クラス、 I2S で出力する AudioOutputI2S クラスを使用しています。 ESP8266Audio は MP3 以外にも WAV, FLAC, MIDI, AAC などのファイル形式を読み込めるようになっており、 それぞれのファイル形式に対応した generator クラスを使用する必要があります。

generator->isRunning() で再生中か確認し、再生中でない場合にボタンが押されたら MP3 ファイルを再生しています。 一度再生が終わり generator->stop() を呼び出すとファイルが閉じられます。 そのため、2回目以降の再生時はファイルを再び開く必要があります。 source->isOpen() でファイルが開かれているかを確認し、 開かれていない場合は source->open() でファイルを開いています。

AudioFileSourceSPIFFS クラスでは再生する度にファイルを読み込むため、 ESP32-PICO のメモリ (520KB) に収まるサイズのファイルを何度も再生するのであれば、 以下のように setup() 内でファイルを読み込み AudioFileSourcePROGMEM クラスを使用した方がよいかと思います。

自力での WAV ファイル再生との比較

前回行った自力での WAV ファイル再生では 8bit, 8000Hz 限定だったこともあり、 比較すると音質はかなり改善しましたが、 再生の前後にプチプチとノイズが入るようになりました。 また、コンパイルにかかる時間もかなり長くなっています。

コンパイル時間はどうしようもないと思いますが、 再生前後のプチプチは下記参考サイトのクリックノイズ対策を行えば消せるかもしれません。

参考サイト

M5StickC + Speaker Hat で SPIFFS から読み込んだ WAV ファイルを再生する

前回の M5StickC + Speaker Hat で音声データを再生する では音声データを直接スケッチ上に書くというスマートとは言い難い方法でした。 今回は事前に SPIFFS へ保存した WAV ファイルを読み込んで再生します。

WAV ファイルの作成

まずは再生したい音声データを以下の形式の WAV ファイルへ変換します。

  • モノラル
  • サンプリング周波数8000Hz
  • Unsigned 8-bit PCM
  • メタデータなし

スピーカーが1つなのでモノラル、 M5StickC (というか ESP32) の DAC が 8 ビットなので WAV ファイルも 8 ビットです。 サンプリング周波数は 8000Hz じゃなくてもいいかもしれませんが、 一般的に使用されている 44100Hz ではうまく動作しなかったためこの値にしています。

また、今回のスケッチではメタデータを一切考慮していないため、 メタデータがあるとシリアルモニタへ “invalid wave file header” というエラーメッセージが表示されファイルが読み込まれません。

以下は FFmpeg で変換する場合のコマンド例です。 FFmpeg で変換すると「Lavf58.29.100」(数字部分はバージョンによる) というメタデータが標準で追加されるので、 オプション -fflags +bitexact を付けてこの動作を抑制します。

ffmpeg -i input.wav -ac 1 -ar 8000 -acodec pcm_u8 -fflags +bitexact output.wav

WAV ファイルを SPIFFS へ保存する

ESP32-WROOM-32 SPIFFS アップローダープラグインの使い方 | mgo-tec電子工作 に書かれている手順に従い、 Arduino ESP32 filesystem uploader を使用して事前に WAV ファイルを SPIFFS へ保存しておきます。

スケッチの書き込み

以下のスケッチを M5StickC へ書き込みます。 WAVE_FILE_NAME は SPIFFS へ保存した WAV ファイルのファイル名です。 書き込み後、Aボタン(正面の「M5」ボタン)を押すと WAV ファイルが再生されます。

参考サイト

M5StickC + Speaker Hat で音声データを再生する

M5StickC + Speaker Hat で音声や音楽を再生しようと思ったら 意外と情報が見つからなかったので再生方法をメモしておきます。

音声データの変換

まずは WAV や MP3 など再生したい音声データを 【Arduino】WAVまたはMP3ファイルを再生する - おもちゃラボ に書かれている方法で以下の形式へ変換します。

  • モノラル
  • サンプリング周波数8000Hz
  • Unsigned 8-bit PCM
  • ヘッダなし

配列化

その後C言語の配列に変換する必要がありますが、 Windows 環境では xxd コマンドがないため バイナリファイルをC言語のデータ配列に変換する:放課後マイコンクラブ:SSブログ の「PROGMEM作蔵さん」を使用して変換しました。

スケッチへ貼り付けて書き込み

配列ができたら以下のスケッチの SOUND_DATA 部分に貼り付け、M5StickC へ書き込みます。 Aボタン(正面の「M5」ボタン)を押すと音声データが再生されます。

playMusic 関数は公式の サンプルスケッチ のものですが、 そのままでは音声が正常に再生されなかったため ledcWriteTone から ledcWrite へ変更しています。 (公式のサンプルスケッチが間違ってるとは思わなかったのでここでハマった。)

今回は短い音声の再生だったためスケッチにそのまま配列として書きましたが、 音声データ部分だけで500行を超えましたし、 配列への変換も面倒なのでファイルから読み込むようにしたいですね。 SPIFFS を使えば実現できそう。

参考サイト

RedHat5.7からCentOS5.7へ移行する

RHEL 5.7 の物理サーバをクローンして仮想化する際、ライセンス的に問題がありそうなので CentOS 5.7 へ移行した話。

公式ドキュメント

Migration an existing system from RHEL5 to CentOS 5

実際の作業

基本的に上記公式ドキュメントのコマンド通り。 パッケージのダウンロード元サーバが変更になっているのと、OS のバージョン、CPU アーキテクチャが違うので手直ししている。CPU アーキテクチャは uname -a で確認できる。

$ curl -O http://vault.centos.org/5.7/os/x86_64/CentOS/centos-release-5-7.el5.centos.x86_64.rpm
$ curl -O http://vault.centos.org/5.7/os/x86_64/CentOS/centos-release-notes-5.7-0.x86_64.rpm
$ curl -O http://vault.centos.org/5.7/os/x86_64/CentOS/redhat-logos-4.9.99-11.el5.centos.noarch.rpm
$ su
# cp /etc/redhat-release /etc/redhat-release-saved
# rpm -e --nodeps redhat-release-notes redhat-release yum-rhn-plugin redhat-logos
# rpm -ivh centos-release-5-7.el5.centos.x86_64.rpm centos-release-notes-5.7-0.x86_64.rpm redhat-logos-4.9.99-11.el5.centos.noarch.rpm
# yum update
Loaded plugins: product-id, security, subscription-manager
Updating Red Hat repositories.
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/
removing mirrorlist with no valid mirrors: /var/cache/yum/base/mirrorlist.txt
Error: Cannot retrieve repository metadata (repomd.xml) for repository: base. Please verify its path and try again

yum update でエラーが出るので /etc/yum.repos.d/CentOS-Base.repo を編集。

  • mirrorlistをコメントアウト
  • #baseurl=http://mirror.centos.org/centos/$releasever/ を baseurl=http://vault.centos.org/5.7/ へ変更

再度 yum update したら完了。

コマンドライン(CLI)でFortiGateを設定する

概要

FortiGateはブラウザーでアクセスすることでWeb上からGUIで設定できる。 しかし、諸事情によりコマンドラインから設定することになったので、設定方法をメモしておく。

ログインする

sshで接続することでコマンドラインから設定ができる。

$ ssh admin@192.168.0.1

ヘルプを表示する

「?」を入力すると現在使えるコマンドが表示される。

# ? ←「?」を入力しても表示されない
config      config object
get         get dynamic and system information
show        show configuration
diagnose    diagnose facility
execute     execute static commands
exit        exit CLI

コマンドの入力途中に「?」を入力するとコマンドが補完される。 例えば、sh?と入力するとshowに補完される。

また、引数が必要なコマンドを入力した後に「?」を入力すると引数の候補が表示される。

バージョンを確認する

# get system status

設定を確認する

# show

デフォルト値を含むすべての設定を確認する

数メガバイトある設定が出力される為、かなり時間がかかるので注意。

# show full-configuration

moreを使用しない

コンソールへ設定を出力してバックアップを取りたいような場合は、 下記のコマンドでmoreを表示しないようにすることができる。

  • moreを使用しないように変更

    # config system console
    # set output standard
    # end
    
  • moreを使用するように戻す

    # config system console
    # set output more
    # end
    

設定を変更する

上記「設定を確認する」や「デフォルト値を含むすべての設定を確認する」で 表示されたものを見れば分かるが、設定はディレクトリのように階層化されている。 また、表示されたものがほぼそのまま設定用のコマンドになっている。

基本的に、

  1. コマンド「config ○○○」で設定を行いたい階層に移動
  2. コマンド「set △△△ ×××」で値を設定
  3. コマンド「end」で設定を完了

という流れで設定する。上記「moreを使用しない」を参照。

設定を保存する

設定は自動的に保存される。 Cisco製品のように「write memory」などで明示的に保存する必要はない。

設定を終了し切断する

# exit