前回、ChatGPT APIを用いたSlack botを作成したので、このbotに、いつも使っている音楽ストリーミングサービスのSpotifyの機能を追加してみました。
追加した機能は、botに話し掛けて好きな音楽をかけれる機能です。
今回もGoogle colabを使用してpythonでコードを書いています。
作成手順は、⒈ Spotify APIの設定及び必要な情報の取得、⒉Spotifyでプレイリストを検索して再生するコードを書く、⒊ChatGPT APIを用いたSlack botに⒉を追加する、です。
⒈Spotify APIの設定及び必要な情報の取得
まず、Spotify APIのDashboard にアクセスして、有料プランのアカウントでログインします。
ログインしたら、CREATE AN APPを押してアプリ名など、必要事項を入力します。
アプリを作成して以下のような黒いページが開いたら、Client IDとClient Secretを取得してメモしておきます。
取得したらページ上のメニューからEDIT SETTINGSを開いてRedirect URIsを設定します。Redirect URIsは、アクセス出来るURLであれば、何でも良いです。私は自分のワードプレスにしています。こちらも後ほど使うので、メモしておきます。
以上で、Spotify APIの設定及び必要な情報の取得は完了です。
⒉Spotifyでプレイリストを検索して再生するコードを書く
まず、下記をインストールします。
!pip install spotipy
次に、認識を行うコードを以下のように書いて、先程集めた情報を入れます。
情報を入れたら一度全てのセルを実行します。
# Spotifyの認証
import spotipy
from spotipy.oauth2 import SpotifyOAuth
# Spotify APIのクライアントIDとシークレットを設定
client_id = ''
client_secret = ''
redirect_uri = ''
# 必要なスコープを指定
scope = 'user-read-recently-played playlist-read-private playlist-read-collaborative app-remote-control user-read-playback-state user-library-read user-modify-playback-state'
# 認証情報を取得するためのオブジェクトを作成
sp_oauth = SpotifyOAuth(client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope=scope)
# ユーザーに認証を求めるために認証ページのURLを表示
auth_url = sp_oauth.get_authorize_url()
# ユーザーが認証後、自動的にアクセストークンを取得
token_info = sp_oauth.get_cached_token()
if not token_info:
print(auth_url)
response = input("Enter the URL you were redirected to: ")
code = sp_oauth.parse_response_code(response)
token_info = sp_oauth.get_access_token(code)
# アクセストークンを取得し、認証オブジェクトを作成
token = token_info['access_token']
sp = spotipy.Spotify(auth=token) # sp変数を定義
実行すると認証用のURLとアクセストークンを入れるフォームが生成されます。認証用のURLを開いて、「同意する」を押します。
同意するとリダイレクト用のページが開きますので、そのページのURLをコピーして、リダイレクト用アドレス?code=のcode=以降の部分を取得します。
こちらがアクセストークンになるので、先程生成されたフォームに入力します。
最後に下記のコードを実行します。この際、Spotifyが起動中でないとデバイスのエラーになりますので、注意して下さい。
# ジャンルを指定してプレイリストを検索
genre = input("Enter a genre: ")
results = sp.search(q=genre, type='playlist')
items = results['playlists']['items']
# 最初のプレイリストを選択
playlist_uri = items[0]['uri']
playlist_name = items[0]['name']
# プレイリストのトラックリストを取得
playlist_tracks = sp.playlist_tracks(playlist_uri, fields='items(track(name,id,uri))')
# 最初のトラックのURIを取得
track_uri = playlist_tracks['items'][0]['track']['uri']
# 現在のユーザーのデバイスを取得
devices = sp.devices()
device_id = devices['devices'][0]['id']
# 取得したデバイスで再生を開始する
sp.start_playback(device_id=device_id, context_uri=playlist_uri, offset={"uri": track_uri})
実行後、出力されるフォームに好きな音楽のジャンルを入力します。
Spotifyから入力したジャンルのプレイリストが再生されたら、Spotifyでプレイリストを検索して再生するコードを書くは完了です。
⒊ChatGPT APIを用いたSlack botに⒉を追加する
⒉と別にノートブックを作成して、前回、作成したSlack botに⒉で作成した機能を追加します。
まずインストールです。
Spotify、Slack、Openaiをインストールします。
!pip install spotipy
!pip install slack-bolt
!pip install --upgrade pip
!pip install setuptools wheel
!pip install openai
次に先程のSpotifyの認証のコードを書きます。
# Spotifyの認証
import spotipy
from spotipy.oauth2 import SpotifyOAuth
# Spotify APIのクライアントIDとシークレットを設定
client_id = ''
client_secret = ''
redirect_uri = ''
# 必要なスコープを指定
scope = 'user-read-recently-played playlist-read-private playlist-read-collaborative app-remote-control user-read-playback-state user-library-read user-modify-playback-state'
# 認証情報を取得するためのオブジェクトを作成
sp_oauth = SpotifyOAuth(client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope=scope)
# ユーザーに認証を求めるために認証ページのURLを表示
auth_url = sp_oauth.get_authorize_url()
# ユーザーが認証後、自動的にアクセストークンを取得
token_info = sp_oauth.get_cached_token()
if not token_info:
print(auth_url)
response = input("Enter the URL you were redirected to: ")
code = sp_oauth.parse_response_code(response)
token_info = sp_oauth.get_access_token(code)
# アクセストークンを取得し、認証オブジェクトを作成
token = token_info['access_token']
sp = spotipy.Spotify(auth=token) # sp変数を定義
SlackとChatGPTに必要なインポートと情報の入力を行います。
import openai
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import os
os.environ["SLACK_BOT_TOKEN"] = ""
os.environ["SLACK_SIGNING_SECRET"] = ""
os.environ["SLACK_APP_TOKEN"] = ""
openai_api_key = ""
app = App(
token=os.environ.get("SLACK_BOT_TOKEN"),
signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)
openai.api_key = openai_api_key
最後にSpotifyを搭載したChatGPT APIを用いたSlack botを下記のように書けば、完成です。def handle_message(event, say):の関数内に機能を追加していけば、自由にSlack botに機能を追加出来ます。
assist1 = ""
@app.event("message")
def handle_message(event, say):
global assist1
text = event["text"]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "好きな設定を書く。"},
{"role": "assistant", "content": assist1},
{"role": "user", "content": text},
]
)
assist1 = response["choices"][0]["message"]["content"] # assist1を更新
say(assist1)
if "聞きたい" in text:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "以下を音楽のジャンル、アーティスト名、ムードのどれか一つだけを一単語で表す。アーティスト名が含まれる場合には、アーティスト名だけ一単語で返す。"},
{"role": "user", "content": text},
]
)
assist2 = response["choices"][0]["message"]["content"]
# ジャンルを指定してプレイリストを検索
genre = assist2
results = sp.search(q=genre, type='playlist')
items = results['playlists']['items']
# 最初のプレイリストを選択
playlist_uri = items[0]['uri']
playlist_name = items[0]['name']
# プレイリストのトラックリストを取得
playlist_tracks = sp.playlist_tracks(playlist_uri, fields='items(track(name,id,uri))')
# 最初のトラックのURIを取得
track_uri = playlist_tracks['items'][0]['track']['uri']
# 現在のユーザーのデバイスを取得
devices = sp.devices()
device_id = devices['devices'][0]['id']
# 取得したデバイスで再生を開始する
sp.start_playback(device_id=device_id, context_uri=playlist_uri, offset={"uri": track_uri})
if __name__ == "__main__":
handler = SocketModeHandler(app,app_token=os.environ.get("SLACK_APP_TOKEN"))
handler.start()
完成したので、全てのセルを実行します。
実行したら、⒉で行ったようにアクセストークンで、Spotifyの認証を行います。
後は、Spotifyを起動してから、作った botのいるSlackのチャンネルで「〜聞きたい」と言ってみてください。
聴いていた音楽が切り替わったら、成功です!
※こちらでは「聞きたい」をトリガーにChatGPTでメッセージを処理して、Spotifyで音楽を再生していますが、普通に条件分岐させた方が便利です。
最後に
今回は大好きなSpotifyをSlack botに追加できて嬉しかったです。
botと話しながら、好きな音楽を聴けるのは、とても楽しいので、おすすめです。
また何か作ってみます。