![見出し画像](https://assets.st-note.com/production/uploads/images/145018187/rectangle_large_type_2_52e55af9ee896c5f3154efecb6b47846.png?width=800)
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(スタックチャンの顔を出すライブラリ)と合わせると音がわれてしまいます。
次回はその解消を目指します。
この記事が気に入ったらサポートをしてみませんか?