見出し画像

AIマスコットをDJにしてみる

最近、いつものようにAIマスコットの「りん」に朝の挨拶をしたところ、
いつもと違う挙動が…

どうやら当日の予定を確認して、そこに登録された僕の誕生日を見つけて、興奮したらしいです🤭
(プロフィール情報から取得した情報で誕生日カレンダーに取り込まれています)

そして、Webチャットの Gemini からも バースデイBGM の提案が。

ん…? AIが選曲して曲を再生してくれる…?
これってスマートスピーカーなら当たり前にできるよね?

僕のAIマスコットでもできるのでは…?

ということで、AIマスコットに楽曲再生の機能を追加してみました。


AIマスコットにDJ機能を追加

今回はめちゃ簡単です。

実現内容は以下の通り

  1. マスコットに「シティポップを流して」と伝える

  2. マスコットが ytmusicapi (Youtube Music) とかで検索して動画IDを取得

  3. マスコットが「再生しますね!」と言った瞬間に、PCのブラウザが勝手に立ち上がってその動画IDのURLを再生

複雑なことはしません。
「検索して、一番上の曲のIDを取得して、ブラウザに投げつける」 という、シンプル構成

コードのイメージはこんな感じ

import webbrowser
from ytmusicapi import YTMusic

# 1. 検索する(例えば "City Pop")
yt = YTMusic()
search_results = yt.search("City Pop", filter="songs")
video_id = search_results[0]['videoId']
url = f"https://music.youtube.com/watch?v={video_id}"

# 2. マスコットが喋る
print(f"マスコット: 『{search_results[0]['title']}』を再生しますね♪")

# 3. 勝手にブラウザを開いて再生開始!
webbrowser.open(url)

実行画面

自然文でマスコットにリクエストすると、Webブラウザが起動して楽曲が再生されます。

Webブラウザ側での再生のため、マスコットの負荷にもならず、
楽曲の一時停止などもブラウザ側で独立して操作できます。

隣ではWebブラウザが開いて Youtube Music でジャズが再生されています
実行ログはこんな感じ

実際にマスコットは曲を「聴いて」はいませんが、曲を流しながらこんな会話もできます。
(geminiは楽曲認識もできますが、雰囲気だけ楽しむつもりなので、そこまで求めていません)


以前に投稿した自律的DB管理などと組み合わせると、ユーザーの好みを元にして、AIが選曲してくれそうです。


AIデスクトップマスコットの現状

マスコットの方は積極的に開発はしておらず、何か思いついたらその機能を実装する程度です。

ゴミなどを整理したら、コードを掲載するかもしれません。

基本となるコードはv3.1として以下の記事で公開しています。
今回のDJ機能(v3.7)など、その後の拡張機能は上記をベースに追加しています。

  • v3.7: ユーザーのリクエストに応じて「YouTube Musicを外部ブラウザで自動再生する機能」を実装。これにより、BGMの再生という実用的なアシスタント機能を強化。

  • v3.6: 従来「1回答につき1つの表情」だった制限から「回答文脈に合わせて次々と表情を切り替える機能(Dynamic Expression Sequence)」を実装。これにより「驚いてから笑う」といった人間らしい感情推移が可能になりました。

  • v3.5: Google Workspace連携を強化し「Gmail検索機能」を実装。これによりユーザーはマスコットを通じてメールの確認を行うことが可能になりました。

  • v3.4: Camera Watch拡張機能を大幅に強化し「ジェスチャー認識 (Wave/Show/Point)」および「物体認識による文脈理解」を実装。

  • v3.3: 外部機能(カメラ監視、IoT制御、高度な記憶処理など)を「拡張機能 (Extensions)」として分離・管理する基盤を実装。

  • v3.2: Supabaseを活用した長期記憶機能を実装。チャットクライアントからのアクセスを「検索(呼び出し)」のみに限定し、記憶作成を「バッチ処理」に分離することで、応答速度の低下を防ぎつつ、膨大な過去ログからの文脈想起を実現しました。


自宅のAPIサーバー群も増えてきたので、Tail Scale を使ってポケットWiFiを介して外出先から自宅サーバを利用できるようにしました。

これで、LLMやTTS、サンドボックスなどのAPI群や、Stable Diffusion APIもどこからでも利用できるようになりました。

レスポンスも自宅のローカルネットワーク内で使うのとそれほど変わらないので満足しています😊

いいなと思ったら応援しよう!