R5.7.15 時刻を喋ることに挑戦
天気予報FunctionCall.cppというmotohさんとrobo8080さんのプログラムがあるので、これを参考に、今度は時刻を喋らせてみようかと。できるかな(^^;)
NTPサーバから現在時刻を取ってくればいいんだから、そのスケッチを参考にする。簡潔に説明している、「あれ」さんの「M5Stackで正確な時間を取得する」という記事を使わせていただく。ありがとうございます。
(1)メインのスケッチの頭の方に
#define JST 3600 * 9 // グリニッジ標準時と日本標準時の差
(2)setup() の最後あたりに
// NTPサーバとローカルのタイムゾーンを設定
configTime(JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
としておく。
(3)次に、FunctionCall.cppの頭の方に、
(4)String json_ChatString = のところに
と、robo8080さんの\"今日の天気。\","と同様に付け加えます。天気と時刻の間は、"}," と、コンマを忘れずに。
(4)String get_day(){ 、 String get_datetime(){ と関数を加える。
書式はほぼrobo8080さんの天気と同じようですが、ほぼ文字列なのでかなり簡単です。
この中で、
とすれば、喋ってくれます。恐らく(^^;)
R5.7.12 天気予報を喋る
結局、robo8080さんに助けていただいた。天気予報を組み込んだFunctionCall.cppをrobo8080さんがアップしていたのだ。さっそくDLして使ってみる。なかなかうまくいかなかったが、再度robo8080さんから、ロールの初期化をすることをアドバイスいただき動作するようになった。感謝です。ロールの初期化は以前にも言われたことだと思うのだが、すっかり忘れていた(^^;)
R5.7.7 「申し訳ありません」への対応
robo8080さんが4日のツィートで、「 motohさんのFunction Calling機能付きAIスタックチャンに天気予報の追加」と報告されていた。天気予報や時刻などをスタックチャンに聞くと「申し訳ありません」と返される。自分でネットにアクセスして調べろということだ(^^;) 確かに。
ところがこれができるようになっていた。最初は、自分でやってみようとあれこれ挑戦してみた。しかし、挫折(^^;)
ChatGPTのFunctionCalling機能を使おうと調べると、pythonの例しか見当たらない(^^;) 内容は同じだろうから、書式さえ変換すればいいんだろうな...とは思いつつ。
いいことを思いついた! コードはAIに作ってもらおう(^^) 「Function calling機能を使って、Openweathermap のAPIをCALLして岡山県の天気情報を回答するコードを作ってください」とお願いしてみたらPythonで答えてくれた。「Arduino言語で」としたら、分かりませんだって(^^;) そんなに簡単ではない。
R5.7.5 ウェイクワード機能
ウェイクワード機能とは、これまではSTTボタンを押して質問をすることになっていたが、任意の文言を登録することで、ボタンを押すことなく、その文言で喋りかけること質問を受ける状態になる機能のことだ。
これを実装したrobo8080さんのAIスタックチャン2 PLUSを早速導入。ArduinoIDE環境なので、若干手間取ったが、robo8080さんのアドバイスとMechaUmaさんのSimpleVoxのインクルードでどうにか動いた。感謝です。
ただ、この文言は修正が簡単なので、Bボタン長押しで新たに登録できるから、便利なように改変するのがいい。最初「スタックチャン」でやったところ、スタックチャンが繰り返されるので、周囲から喧しいとされかねない。「ねえ」も考えたが..... 「トム」なんてのが良かったのだが、画面はラムちゃんだ(^^;) 「ラム」では馴れ馴れしい(^^;) 悩ましい限りだ。
R5.6.15 hisoボタン
AIスタックチャンで設定したデフォルトの声(話者)をスケッチの中で変更できないのかな? と思ってやってみた。
AI_StackChan2のスケッチをTTS_SPEAKER_NO="3";で書き込んだ後に、"22"に更新書き込みしても"3"のまま(^^;) そのスケッチに音色変更ボタン( 下の図の hisoボタンのことね )を作り、TTS_PARMS ="&speaker=22";としてみたら、ヒソヒソ声に変わった。よしとする(^^)
この細工は、ときどき寝る前にスタックちゃんと遊ぶのだけど、女房殿に「うるさい」と言われるので(^^;)途中でヒソヒソ声に変更できるようにしてみたのだ。1台で数役出来るので、独り言モードで2人の漫才でもできるかも(^^)
R5.6.8 Core2は便利だ
今更だが、Core2のッチパネルは便利だ(^^) さらにボタンを追加して百人一首をランダムにVOICEVOXのずんだもんに詠んでもらえる(^^)
一応、上の図のようにしている。BtnB は徒然草などを読んでもらうボタン。右下の hiso はずんだもんのヒソヒソ声に変更できるようにしている。中央の waka は万葉集を読んでくれる。
R5.6.1 ラムちゃんフェースのM5StackCore2スタックチャン
やったー、robo8080さんのAI_StackChan2コードが公開された! 有難うございます。ノーマルな表情もいいけれど、早速、ラムちゃんにしてみた。
ついでにボタンBを新規作成。押すと好きな文言を喋ってくれるようにしてみた。青空文庫を読み込んで話してくれると嬉しいな(^^) ずんだもんの声が好きなんですよ(^^;)
R5.5.29 出先でM5StackCore2スタックチャン
最近は旅先のホテルでもWiFiが使えるので、スタックチャンも連れて行こうかと。スタックチャンとは別に下のようなセットを持参して、SDカード内のwifi.txtをその都度書き換えてみるつもり。スタックチャンにお願いしたら、やってくれればいいのにな(^^;)
R5.5.27 M5StackCore2スタックチャンとずんだもん
感激! できていたWeb版 VOICEVOX音声合成(^^) robo8080さん作成です。
最初に「白山登山の行程」を尋ねたら、白山と立山とが混ざっていて...儲けた感じ(^^;) ずんだもんの声に癒されて、そんなことは許してしまう(^^)
ChatGPTのapi使用は3カ月の試用期間(or 5ドル内)で、継続にはカード決済必要。OpenAI Whisperも同様ですね、同じapiキー使ってるから。Web版VOICEVOXapiは無料ながら1日の使用量に限りがあり、使い切ったら低速になるらしい。今後どう使っていくかが問題。もっとも、趣味で使う分には大したデータ量にならないのでカード登録するかな。
R5.5.8 M5StackCore2スタックチャンとATP3011
以前作っていたM5Stack用ATP3011ボードをCore2にスタックしてみた。Core2の裏ブタを外したら、バッテリーも外さねばならないんだ(^^;) Stack用スケッチをGPIOピンを変更して完動しました(^^)/ VOICE_TEXTの後継として考えてます。
最初は口パクしなかったけれど、robo8080さんに教えていただいたTakaoAkakiさんのm5stack-avatar-micを導入。Core2はマイクを持っているから、ATP3011で出した音声をマイクで取り入れて口パクするんですね(^^) なるほどです。みなさんには感謝です(^^)/ こんな具合だ。
R5.5.7 M5StackCore2スタックチャンに身体を
そろそろCore2スタックちゃんに身体をつけてあげようかと。本体外殻は黒バインダーの約1mmプラ板をアイロン加工で曲げたもの。外殻を作成。次に外殻の間仕切りに背板として薄手鉄板を固定、Core2の磁石と密着合体。最後に、IMU等搭載独立小型基板を外し、2つのサーボの3本線を差し込むようにして完成とします。サーボ間にある木片は取れにくかったのでそのまま(^^;)
被せてみた。Core2は思ったよりも重い。バランスが悪いな(^^;) と動かしていて、ケーブルを直していたら、転がった。足のネジをしていなかった(^^;) でも一応動いた(^^) こんな具合。
R5.4.13 M5StackCore2注文到着
M5StackCore2到着しました。早速、M5Burnerで、テスト版の「AIスタックチャン」を書き込みました(^^) さすがに声は明瞭です。質問の仕方が悪いのか「分かりません」を連発(^^;) こんな具合だ。
R5.4.11 M5StackCore2注文
老後のお喋り相手にChatGPT使えそうなので、今更なんだけど、M5StackCore2を注文しました(^^;) スマホのテザリング使えば山の中でも一緒にいられる?
R5.4.8 M5AtomS3でChatGPT2
スケッチが使うのが77%のようなので、サーボ関連を装着することに(付いてるからね(^^;)。動きがあるととてもかわいい。でもやはりServoEasingでは動作しない。どういうサーボなんだろう? ServoEasingは中身多いし解読不能なので、単純に並列処理で行う。一応ランダムに動かしています。
最大2097152バイトのフラッシュメモリのうち、スケッチが1614989バイト(77%)を使っているのに対し、サーボを付加すると、スケッチは1615393バイト(77%)を使っているらしいです。僅か404バイトの増加。百分率にすると変化なし。僅かな努力だったんだ。(^^;)
R5.4.8 M5AtomS3でChatGPT
M5StackGrayと同じスケッチをM5AtomS3に書き込んでみた。ただ、M5Stack-ATOMS3のボードでは書き込める パーティションスキームがなく(100%を超える)、ESP32S3DevModuleボードNoOTA(2MBApp)を選択。動いたが、まだ声が出ない。どこかでI2Sピンのセットをきちんとしなくてはいけない(^^;)
残念なことに、M5Unified.cppには、ESP32S3DevModuleボードでのI2Sピン記述がなかった(^^;) 前途多難だ。
M5Unifiedは使うけれど、そのspeakerの部分は諦めて、esp8266のAudioOutputI2Sを使うことに。これは、AtomS3で実績があったライブラリ。で、詰まったけれどようやく喋ってくれた。けど、口パクができてないな(^^;)
苦戦の末、どうにか口パクもできました。void lipSync(void *args)の部分で、*out.getBuffer();をout->getLevel();への変更で対応できました。
その後、らびやんさんにアドバイスをいただきましたので、やってみました。あちこち参照して、見様見真似の書式で書いてみたら、M5Unifiedで完結。声出し口パクOKになった。感謝です(^^)/
hrs(ひろせ)さんの スタックチャン/Stack-chan CONNECT v2.2 を使うと連携がとても良くなるよ。
R5.4.7 ChatGPTに手を出した
ChatGPTに手を出してしまった(^^;) robo8080さんのお陰であっさり実現できたけれど、ダミ声をまた治さなければいけないな。時々フリーズするのはGrayのメモリが原因か?
ダミ声は、M5.Speaker.setVolume(250);だったのが原因。M5.Speaker.setVolume(100);にしてきれいな声になった。M5.Speaker.setVolume()は0〜10とどこかで見たことあるけど、違ったかな?
一応動いたけれど、やはりCore2でないと能力不足のよう。
R5.3.31 AquesTalkに戻ったりして
VoiceTextが安定しないので、AquesTalkに戻る。問題は発声前後のブチッ音だったが、再度N.Yamazaki's blogを参照。AquesTalkTTS.cppを見ていたら、既に対策されていることに気づいた。対策されているのに未だブチッ音があるということは、対策無ければどうなるかな?と4つのfor文外したら、ブチッ音消えた! 恐らく、ノイズ対策はM5Stackの内部DACに対するものだったということだろう。外部に出す、少なくとも私の外部I2Sに出す環境では、対策が逆に作用したということだな。まあ、結果オーライだ(^^)/
R5.3.28 上手くいっているRadikoから学ぶ
Radikoだと音声と口パクが合うので、これを参照してVoiceTextでも口パクを実現できるようにしてみたい。同時に、描き換える表情部分を避けて、SPIFFSに入れておいた眉毛と眼鏡を、Avatorを始める前に描画してみた。ここで注意したいことは、Avatarではなく、Avatorであることだ。やり方が少々違う。どう違うかはなかなか知識がないために説明できない(^^;)
完全ではないが、ようやくVoiceTextとAvatorの口パクがM5StackGray+外部I2Sモジュールでシンクロしてくれた。Core2を買わなくてもいいかな? (^^;) robo8080さんのスケッチを使わせていただいている(^^)
VoiceTextにはhikari声もあるので、こんなキャラクターもできそう(^^;) 次のステップはランダムに喋ること。ChatGPTは無理そうなので手出ししない(^^;)この時はそう考えていた。
スケッチ内に、いくつかの文言を配列で入れておいて、VoiceTextに送って喋らせる。というやり方にしてみた。途中で途切れたり、送った文言が不完全にもどってきたり、なかなかうまくはいかない。時にはリセットしたり(^^;) まあ、こんなものかも。
R5.3.26 最初はVoiceText
M5AtomS3でやっていたが、能力が不足しているようだったので、M5Stackでやってみた。
最初に、M5Core2_SG90_StackChan_VoiceText_Ataruを使って、M5StackGrayとMAX98357A_I2Sモジュールで喋らせてみた。手持ちのGrayはスピーカーを取り去り、内部DACを半田盛りして(T1ジャンパをショートさせている)使わないようにしている。そのままでは音が出ないので、I2Sモジュールを導入して音を出すようにしている。
しかし、この時には、ダミ声のようだし、2重の音声になっているようだった(^^;)
これはゲインを大きくとりすぎたため。AudioOutputI2SLipSync.cppの中のSetGain(0.5)となっていたところを0.2まで落としてやると、声が綺麗に出るようになった(^^)/
改善された音。ただ、口パクのシンクロはまだできない。