見出し画像

AIスタックチャンメモ(3)

世間では『Claude3.5が出た』とかで話題ですが、私のスタックチャン作成はなかなか進みません。

そこでふと、
「GPT4oよりすごいってんだからコードを書く能力も優秀じゃね?」
と思い、今回はClaude3.5さんに頼ってみることにしました。

前回までの課題

AIスタックチャンの最終目標はAIモデルに話しかけた答えを音声合成で返すことなので、音声再生ができないといけません。

前回は、SDカード内のファイルを使って音は鳴ったんだけど、ちゃんと再生できず『気持ちの悪いスロー再生』のようになってしまいました。

Claudeさんに相談した結果

早速、私がM5Stack Core2 for AWSを使ていることと、それで音声を再生したいことを伝えたところ、Claudeさんが書いたコードは
「M5Core2」のライブラリを使うものでしたので、

「今はM5Unifiedが推奨されていますが、どうでしょう。」
と言ったら、ちゃんと修正してきました。

実はClaudeさんはWeb検索できませんので、2024年までの学習データでM5Stackの情報が学習データに入ってるってことですね。すげーやん。

その後、M5Unifiedに変更したコードを書きましたが、GPTさんの時のようにエラーが出ます。

このままエラー地獄に突入かと思われましたが、ここで
「オーディオバッファがどうのこうの・・・」
という話が出てきて、そのご少しのデバグの後、音が鳴りました!!!

今日のコード

というわけで、今後いろいろなことに参照できる音声ファイル(wavファイル)の再生コード。

最初はmp3のファイルを再生していましたが、最終的に使うファイルはwavだと思うので、wavにしました(Claudeさんに頼めばどちらにも対応してくれます)

※SDカードのルートに置いた「aisatsu.wav」というファイルを再生します。

#include <M5Unified.h>
#include <AudioFileSourceSD.h>
#include <AudioGeneratorWAV.h>
#include <AudioOutputI2S.h>
#include <AudioFileSourceBuffer.h>

AudioFileSourceSD *file;
AudioFileSourceBuffer *buff;
AudioGeneratorWAV *wav;  // WAVデコーダーに変更
AudioOutputI2S *out;

void StatusCallback(void *cbData, int code, const char *string) {
  const char *ptr = reinterpret_cast<const char *>(cbData);
  Serial.printf("Status %s: %d %s\n", ptr, code, string);
}

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);

  M5.Speaker.begin();

  Serial.println("Initializing SD card...");
  if (!SD.begin(GPIO_NUM_4, SPI, 25000000)) {
    Serial.println("SD card initialization failed!");
    return;
  }
  Serial.println("SD card initialized successfully");

  file = new AudioFileSourceSD("/aisatsu.wav");  // WAVファイルに変更
  buff = new AudioFileSourceBuffer(file, 10240);

  if (!buff->isOpen()) {
    Serial.println("Failed to open file");
    delete buff;
    delete file;
    return;
  }
  Serial.println("File opened successfully");

  out = new AudioOutputI2S();
  out->SetPinout(12, 0, 2);
  out->SetOutputModeMono(true);
  out->SetGain(1.0);

  wav = new AudioGeneratorWAV();  // WAVデコーダーに変更
  wav->RegisterStatusCB(StatusCallback, (void*)"wav");
  
  if (!wav->begin(buff, out)) {
    Serial.println("wav->begin failed");
    delete wav;
    delete buff;
    delete file;
    delete out;
    return;
  }
  Serial.println("WAV playback started");

  M5.Speaker.setVolume(100);
  M5.Speaker.tone(440, 1000);
  delay(1000);
}

void loop() {
  M5.update();
  if (wav->isRunning()) {
    if (!wav->loop()) {
      wav->stop();
      Serial.println("WAV playback stopped");
    } else {
      Serial.print("WAV is playing... ");
      Serial.print("Pos: ");
      Serial.print(buff->getPos());
      Serial.print(" / ");
      Serial.println(buff->getSize());
    }
  } else {
    Serial.println("WAV not running");
    delay(1000);
  }
}

上手く再生できましたが、これをM5Avatar(スタックチャンの顔を出すライブラリ)と合わせると音がわれてしまいます。

次回はその解消を目指します。

この記事が気に入ったらサポートをしてみませんか?