m5unified」タグアーカイブ

M5Unified_StackChanを参考にした際のメモ

MP3_with_ESP8266Audio.inoを参考に音声出力をしていたが音がとんだり画面にノイズ?が入ったりとしていた。ツイッターで呟いたらタカヲさん(@mongonta555)から参考情報を教えてもらった。

こちらで音が出るようになった。リンク先レポジトリのメモ書きを残す。なお、M5Unified_StackChanにはあるが試していないものもある。

対象音声フォーマット

readmeにはwavとなっているけどmp3用

バッファ処理

MP3_with_ESP8266Audioにはなかったbuffer処理が入っている。下のあたり

音声ファイルのサンプリングレート

readmeには”wavファイルのサンプリング周波数は16khzか24khzにしてください。”とある。ffmpegで16khzか24khzに変換したかったが、26khzが生成されて直し方がわからなかったので26khzを受け入れて試験。サンプリングレートじゃなくてビットレートが26kbpsだった。

スピーカーのコンフィグ指定

下のようにいくつか指定が入っている。

sample_rate は出来上がったファイルに合わせてみた。

task_priorityは同じコアでの処理優先順位。数時大きい数が優先順位高くたしか23が最大値。m5avaterの中で2が使われているはずなので使っているライブラリの範囲では3にしとけば最優先のはず。

dma_buf_count /dma_buf_len はよくわかっていない。

task_pinned_core は処理をさせるCPUコアの指定(PRO_APP_NUMデフォルトで、もう一個がPRO_APP_NUM)。M5Unified_StackChanではPRO_CPU_NUMを使っていたがデフォルトでも音質違いが分からなかったのでデフォルトに戻してある。

  auto spk_cfg = M5.Speaker.config();
  spk_cfg.sample_rate = 26000;
  spk_cfg.task_priority = 23;
  spk_cfg.dma_buf_count = 20;
  spk_cfg.dma_buf_len = 128;
  //spk_cfg.task_pinned_core = PRO_CPU_NUM;
  M5.Speaker.config(spk_cfg);

ファイルクローズ処理

mp3.stop()の中でもoutやfileのクローズが呼ばれているのでソフトウェア的にはfileやoutのクローズ処理はいらないはず。ただし、どこかのサイト(メモってなかったら出典探せなくなった)で下みたいな書き方の方がスピーカーの最初の音が小さくなるみたいなことが書かれていたのでそちらに合わせた。ちなみに、スピーカーの最初の音とはスピーカーに電源が入る時のボッみたいな音。その違いが分からなかったが、こだわるところでもないので合わせておく。

補足

比較をしていないけどもともと使っていたのが160kbpsの3分というファイルだったのでそいつの影響が大きい気がしなくもない。

MP3_with_ESP8266Audio.inoのメモ

M5UnifiedのExampleに音声再生があったのでそれで試す。

File->Example->M5Unified->Advanced->Speaker_SD_wav_fileを選択。

自宅用通知マシン作成(2)

と、行こうとしたけど色々初めてなのでメモ残しながら確認していく。描画関係はおいておいて音声出力周りのみ予定。

試しながら書いているので丸っと書き換わるかも

M5Unified

最近のM5Stackは機種間をまたいでソースをある程度共有できるM5Unifiedを使う。M5Unifidには

みたいに各階層(カテゴリ?)毎にそれぞれコンフィグがあって細かい設定を仕込めるみたい。

ダウンロードしたソースのM5Unified\src\utility\M5Unified.hppやM5Unified\src\utilityあたりに中身がいる。ドキュメントは探していないここにあった。ぱっとみ、cppのコメントパッと見た中だと日本語もある。

/// Increasing the sample_rate will improve the sound quality instead of increasing the CPU load.
    spk_cfg.sample_rate = 96000;

音質とCPU負荷は引き換えと。手持ちのM5Stack Basicのスピーカーの音質だとどうせ頑張るところじゃないと思うので下げてよいかも。

SDカード

M5Unifiedへの移植ポイントにSD.begin()の追加ってのがあるけど前はなかったのかな?よくわからん。

bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint=”/sd”, uint8_t max_files=5, bool format_if_empty=false);

+    while (false == SD.begin(GPIO_NUM_4, SPI, 25000000))
+    {
+      delay(500);
+    }

とりあえず上のイメージでよいらしい。最後のクロックレートはSDカードの一番遅い規格だと思うのでものによってはもっとあげられるのかな。GPIO_NUM_4はESP32のPIN指定からきていると思うけど追っていない。

音声

AudioOutput(本体)、AudioFileSourceHOGE(読み込み元)、AudioGeneratorHUGA(音声化)の3点セットが基本みたい。

AudioFileSourceID3は音声ファイルのプロパティ的な奴を扱える。

AudioOutputM5Speakerはトリプルバッファリングをよろしくやってくれながら(よくわかっていない)、M5Unifidのスピーカーに音声を渡してくれている。ChatGPT API搭載AIスタックチャンのレポジトリでは別ファイルに切り出されていた。(おおよそ一緒ぐらいのふんわりした確認)何か困ったらこっちにも情報あるかも。

AudioOutputM5Speakerが依存しているのはAudioOutput.hとM5Unified.hとみたい。

で開き

で継続

で終了。

おおよそ最小ぐらいの動作ソース

イタリックになっているところは別ファイルに切り出してすっきりさせたらよさそう。

こいつをベースにサンプル等をみたら何とかなりそう。

isRunningの周辺ここに大体まとまっていた。

ボリューム

ボリューム設定は以下。特定のバーチャルチャンネルに個別設定もできる(バーチャルチャンネルはわかっていない。文字から察するになにか仮想的な音声チャンネルを使う機能があるのだろう)

    M5.Speaker.setVolume(volume);
    M5.Speaker.setChannelVolume(m5spk_virtual_channel, volume);

コア指定?

ChatGPT API搭載AIスタックチャンのレポジトリでスピーカー再生タスクを割り当てるCPUコアを以下のように割り当てている。

こちらを見ると無線関係を使っているときにはCore0(PRO_CPU_NUM)を無線関連でかなり使うので、比較的空いているCore1(APP_CPU_NUM)を指定しているのかな?

AudioGeneratorMP3#close

cppの内部でoutputとfile閉じて、running(起動確認フラグ)をfalseにしている。こちら一つでまとめてクローズする思想な気がする。

この実装を信じるとisRunningとcloseで処理できる。