投稿者「nagano」のアーカイブ
心理指標とFitbitデータの関連
ここでは、アンケート調査で取得された心理指標と、Fitibitから得られた行動指標の関係を調べてみましょう。
リアクション
下記のページから,感想,苦労した点などをお知らせください.
心理サイエンス応用演習1リアクション
TPSを作ってみる(2) 2023
TPSゲームを作ってみる2
今日は先週に続いて、TPSでゲームっぽいものを作り込んでみましょう。
1.敵キャラに個性をつける、2.プロップ(小物)を設定する、3.爆弾をセット
の順番で参ります。課題がたまる時期なので、とりあえず動画を見て、できそうなところまでやっていただければOKです。もちろん、Unityを身に着けたいのであれば、全部やったほうがベターですが。でも夏休みにゆっくり、じっくりやるのでも良い気がします。必要なスクリプト等は下記リンクから入手してください。
リアクションの記入
課題が終わった方は、下記リンクより、授業配信日を含め3日以内にリアクションを登録してください。ファイル等を送っていただく必要はありません。
心理サイエンス基礎演習2リアクション
1週間ぶんのHRを取得する
計測したデータはすべてクラウド上に上がっているので、1週間ぶんのデータを取得することも可能です。おおまかな手順は下記の動画をご覧ください。
下記スクリプトは、指定した日付から遡って3日ぶんのHRを取得するスクリプトです。
#getWeekHR.py
import sys
import fitbit
import gather_keys_oauth2 as Oauth2
from datetime import datetime, date, timedelta
print('Hello FitbitAPP4')
USER_ID = ""; CLIENT_SECRET = ""
def requestFitbit(DATE):
rval=""
global auth2_client,USER_ID
fitbit_stats = auth2_client.intraday_time_series('activities/heart', DATE, detail_level='1min')
HRstats = fitbit_stats['activities-heart-intraday']['dataset']
OUTPUT_FILE = USER_ID+"_HR.csv"
csv_file = open(OUTPUT_FILE, 'a')
csv_file.write(DATE+",")
for num1 in range(24):
for num2 in range(60):
key='{:02}'.format(num1)+':{:02}'.format(num2)+':00'
hr=""
for var in range(0, len(HRstats)):
if str(HRstats[var]['time']) == key:
hr=str(HRstats[var]['value'])
break
csv_file.write(hr)
csv_file.write(",")
csv_file.write("\n")
csv_file.close()
return rval
##################################################
def writeindex():
global USER_ID
OUTPUT_FILE = USER_ID+"_HR.csv"
csv_file = open(OUTPUT_FILE, 'a')
csv_file.write(",")
for num1 in range(24):
for num2 in range(60):
key='{:02}'.format(num1)+':{:02}'.format(num2)+':00'
csv_file.write(key)
csv_file.write(",")
csv_file.write("\n")
csv_file.close()
##################################################
"""Get tokens"""
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
"""Authorization"""
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
"""request"""
writeindex()
today=date(2023, 6, 26)
for var in range(0, 3):
stamp=datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
print("target: " + stamp)
requestFitbit(stamp)
無事に実行されると、「ID_HR.csv」のようなファイル名のデータが作成されます。エクセルで開くと、下記のような構造になっています。60(分)✕24(時間)=1440個のデータが3日ぶん格納されていることがわかります。
一週間ぶんのHRを取得して、平均HRのグラフをエクセルで書いてみましょう。
取得したFitbitデータをグラフ化する
出力されたHRに関するデータ「HR_2023-06-26.csv」をPythonでグラフ化してみましょう。大まかな手順は下記の動画をご覧ください。
ChatGPTに、データのグラフ化を行うPythonスクリプト作成を依頼します。
00:00:00,74
00:01:00,64
00:02:00,63
00:03:00,65
00:04:00,65
00:05:00,62
00:06:00,65
00:07:00,63
00:08:00,66
00:09:00,65
00:10:00,65
00:11:00,67
00:12:00,66
00:13:00,66
00:14:00,69
00:15:00,72
00:16:00,73
00:17:00,69
00:18:00,67
上記のデータはHH:MM:SS形式で指定された各時刻の心拍数です。このデータの名前は、「HR_2023-06-26.csv」です。このデータを読み込んで、グラフ化するPythonスクリプトを書いてください。
データを扱うスクリプトを作成するときは、上記のように、サンプルを与えてやるとそれに合わせたスクリプトを作成してくれます。上記プロンプトをお黒と、ChatGPTが下記のようなスクリプトを作成してくれます。
import pandas as pd
import matplotlib.pyplot as plt
# データを読み込む
data = pd.read_csv('HR_2023-06-26.csv', header=None, names=['Time', 'HeartRate'])
# 時刻データを正しいフォーマットに変換
data['Time'] = pd.to_datetime(data['Time'], format='%H:%M:%S')
# グラフを描画
plt.plot(data['Time'], data['HeartRate'])
plt.xlabel('Time')
plt.ylabel('Heart Rate')
plt.title('Heart Rate Variation')
plt.xticks(rotation=45)
plt.show()
このスクリプトは、pandasとmatplotlibというライブラリを使っているようなので、ライブラリのインストール方法も聞きましょう。
上記のスクリプト実行に必要なライブラリのインストール方法を教えてください.
返答は下記のとおりです。
pip install pandas matplotlib
では、上記で作成されたPythonスクリプトを、plotHR.pyという名前で保存し、実行してみましょう。すると、下記のようなグラフが作成されるはずです。
このようにして、日本語で指示(プロンプト)を与えることで、各種の目的に応じたPythonスクリプトを作成可能です。ChatGPTが記述したスクリプトの意味がわからない場合は、それを「ここの処理どういう意味?」と質問することで、より深く学習可能です。
計測したデータをPythonで取得する
ここでは、Fitbitで計測されたデータをPythonで取得する方法を解説します。作業のおおまかな手順は下記の動画をご覧ください。
Anacondaのインストール
Python実行環境であるAnacondaのインストールを行う。とりあえずAnaconda3をダウンロードして道なりにインストール。Environmentから仮想環境「Fitbit」を作成し、「OpenTerminal」でターミナルを表示する。Pythonコマンドで動作を確認する。Ctrl+Zで対話モードを終了できる。インストールは、こちらのサイトが参考になる。
Fitbitの開発者向けサイトでアプリケーションを登録する
PythonからFitbitAPIを使うにはアプリの登録が必要となる。FitbitDevelopperサイトにログインして、Manage>RegisterAppの順で進み、アプリケーションを登録する。設定は以下の画像の通りにする。URL関係は全て「http://kodamalab.sakura.ne.jp/wordpress/?p=46853」、RedirectURLは、「http://127.0.0.1:8080/」とする。ページ内で作成された「OAuth 2.0 Client ID」と「Client Secret」をPythonスクリプト中で使用することになる。
(Devサイトでのアプリ作成方法)
Fitbit API Python Clientのインストール
GitHub – orcasgit/python-fitbit: Fitbit API Python Client Implementationからcodeボタンを押し、Zipファイルをダウンロードし、中身をCドライブ直下に配置する(こちらのサイトが参考になる)。さらに、下記コマンドで追加パッケージをインストールする。
pip install -r requirements/base.txt
pip install cherrypy
Pythonスクリプトでクラウド上のファイルを取得
c:\python-fitbitフォルダに下記スクリプトをfitbit01.pyという名前で保存し、実行する。Anaconda Promptから下記コマンドを打ち込む
python fitbit01.py
#fitbit01.py
import sys
import fitbit
import gather_keys_oauth2 as Oauth2
print('Hello FitbitAPP3')
USER_ID = "ほげ"
CLIENT_SECRET = "ほげ"
DATE = "2021-06-03" # 取得したい日付
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
#print(ACCESS_TOKEN) print('\n')
#print(REFRESH_TOKEN)print('\n')
"""Authorization"""
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
"""Getting data"""
#print('Getting data\n')
#fitbit_stats = auth2_client.intraday_time_series('activities/heart', DATE, detail_level='1min')
##################################################
fitbit_stats = auth2_client.intraday_time_series('activities/heart', DATE, detail_level='1min')
stats = fitbit_stats['activities-heart-intraday']['dataset']
OUTPUT_FILE = "HR_%s.csv" % DATE
csv_file = open(OUTPUT_FILE, 'w')
for var in range(0, len(stats)):
csv_file.write(stats[var]['time'])
csv_file.write(",")
csv_file.write(str(stats[var]['value']))
csv_file.write("\n")
csv_file.close()
##################################################
fitbit_stats = auth2_client.intraday_time_series('activities/steps', DATE, detail_level='1min')
stats = fitbit_stats['activities-steps-intraday']['dataset']
OUTPUT_FILE = "STEP%s.csv" % DATE
csv_file = open(OUTPUT_FILE, 'w')
for var in range(0, len(stats)):
csv_file.write(stats[var]['time'])
csv_file.write(",")
csv_file.write(str(stats[var]['value']))
csv_file.write("\n")
csv_file.close()
##################################################
fitbit_stats = auth2_client.intraday_time_series('activities/calories', DATE, detail_level='1min')
stats = fitbit_stats['activities-calories-intraday']['dataset']
OUTPUT_FILE = "CALO%s.csv" % DATE
csv_file = open(OUTPUT_FILE, 'w')
for var in range(0, len(stats)):
csv_file.write(stats[var]['time'])
csv_file.write(",")
csv_file.write(str(stats[var]['value']))
csv_file.write("\n")
csv_file.close()
トラブルシューティング
・RedirectURLが、http://127.0.0.1:8080/で正しく動作しない場合
ポート8080をなにかのプログラムが使っている可能性がある。その場合は、RedirectURLを、「http://127.0.0.1:8088/」とし、python-fitbitフォルダ中のgather_keys_oauth2.pyの該当部分を「8088」に変更してスクリプトを実施する。
・Pythonのスクリプトは何で作ればいいの?
プログラミング用のテキストエディタ、Notepad++がおすすめです。
リアクション
下記のページから,感想,苦労した点などをお知らせください.
心理サイエンス応用演習1リアクション
キャラクタの配置 2023
前回授業へのコメント
前回は光源の使い方を応用して,ホラーゲームのような環境を作成してみました。無料のアセットでも、質感が高いものがあることに驚かれた方も多いと思います。PCを買うのであればどのようなものが良いのか?との質問も複数いただきました。下記の動画で簡単に解説をしていますので、参考にしてください。
キャラクタを読み込んで見る
ホラーっぽい背景に「お化けを配置したらもっと怖いだろう」という意見もあろうと思います。そこで、今回はキャラクタの読み込み、表示方法を紹介します。ここでは,Mixamoからモーション付きのキャラクを読み込み,シーン上に配置する方法を学びます。キャラクタの取り扱いができるようになると,様々な心理学的な実験に利用できるようになるので,利用法の幅が広がると思います。
リアクションの記入
課題が終わった方は、下記リンクより、授業配信日を含め3日以内にリアクションを登録してください。ファイル等を送っていただく必要はありません。リアクションは出欠記録を兼ねており、その内容は成績評価の対象となることに留意してください。
心理サイエンス基礎演習1リアクション
TPSを作ってみる(1)2023
TPSゲームを作ってみる
キャラクタを扱えるようになると、やっぱり自由に動かしてみたくなりますよね。キャラクタの表現方法は、基本的に1人称視点(FPS)と3人称視点(TPS)しかないと思いますが、体を動かしている感があるのはTPSかなと思います。今回と次回では、TPSゲームの作成を通して、キャラクタの使い方を学びましょう。完成すると、こんな感じのものができる予定です。今日の解説動画では、下記のアセットを使用しています。予めダウンロードしておくとスムーズに進められると思います。
・Standard Asset
・AllskyFree
・PBR Materials – Wood & Metal
・Industrial Models
・Low Poly Props Pack 2023年現在利用不可のようです・Road Props PackおよびSimple Street Propsで置き換えてください
リアクションの記入
課題が終わった方は、下記リンクより、授業配信日を含め3日以内にリアクションを登録してください。ファイル等を送っていただく必要はありません。
心理サイエンス基礎演習2リアクション
2要因参加者内計画の分散分析
Pythonで音声合成してみる
今日はPythonから合成音声を操作します。
Anacondaのインストール
Python実行環境であるAnacondaのインストールを行う。とりあえずAnaconda3をダウンロードして道なりにインストール。終了すると、Anaconda PromptからPythonが実行できるようになる。インストールは、こちらのサイトが参考になる。インストールできたら、startメニューからAnaconda Promptを起動。Pythonコマンドで動作確認。Ctrl+Zで対話モード終了。
Anacondaで環境「INK」を作成する
Anacondaがインストールできたら、EnvironmentからINKを作成し、Open terminalを実行してください。
作業フォルダを作成する
「Windows+E」を押して、ファイルエクスプローラを出したら、Cドライブに入って、Cドライブ直下に「INK」フォルダを作成しましょう。作成したら、ターミナルから「CD c:\INK」と入力して、c:\INKに移動しましょう。「python –version」と入力して、Pythonのバージョンが表示されればOKです。
Coeiroinkを呼ぶためにライブラリをインストールする
下記のコマンドを順に打ち込んで、requests、pydub、pyaudioの3つのライブラリをインストールします。ライブラリはネットワークインストールされるので、インターネット接続が必須です。
pip install requests
pip install pydub
pip install pyaudio
Pythonから合成音声を鳴らしてみる
いよいよ鳴らしてみましょう。下記のプログラムをc:\inkフォルダに「ink01.py」という名前で保存し、ターミナルから「python ink01.py」と打ち込み、実行してみましょう。合成音声を鳴らすには、Coeiroinkを起動しておく必要があります。スクリプトの編集はnotepad++がオススメです。
import json
import requests
from pydub import AudioSegment, playback
# パラメータ
text = "こんにちは、つくよみちゃんです。よろしくお願いします。"
speaker_id = 0 # スピーカーID (0:つくよみちゃん)
# 音声合成のクエリの作成
response = requests.post(
"http://localhost:50031/audio_query",
params={
'text': text,
'speaker': speaker_id,
'core_version': '0.0.0'
})
query = response.json()
# 音声合成のwavの生成
response = requests.post(
'http://localhost:50031/synthesis',
params={
'speaker': speaker_id,
'core_version': "0.0.0",
'enable_interrogative_upspeak': 'true'
},
data=json.dumps(query))
# wavの音声を再生
playback.play(AudioSegment(response.content,
sample_width=2, frame_rate=44100, channels=1))
話者を変えるには、上記ソースコード中の「speaker_id 」を話者に応じた値に変更しましょう。各話者のspeaker_id は、coeiroinkのインストールフォルダの、speakerinfoフォルダの、各話者のフォルダ中にあるmetas.jsonに記載されています。
OpenAI APIを使う
APIのページにアクセスし、GoogleIDでログインする。API keysのページから、「+create new secret key」を押します。キーの名前を入力し、エンターを押すと、シークレットキーが発行されます。シークレットキーをメモしてください。シークレットキーは、誰にも知らせないようにしてください。また、Organization>Settingのページから、「Organization ID」をコピーしておきましょう。
ChatGPTとPythonで会話する
ChatGPTを使うには、OpenAIのライブラリが必要です。コマンドラインから「pip install openai==0.27.4」と入力し、ライブラリをインストールしましょう。下記のプログラムをGPT1.pyという名前で、INKフォルダに保存し、「python GPT1.py」で実行してみましょう。apikeyは上記でメモしたキーを使いましょう。
import openai
openai.organization = ""
openai.api_key = ""
# =============================================================
# チャットボット関数
# =============================================================
def Ask_ChatGPT(message):
# 応答設定
completion = openai.ChatCompletion.create(
model = "gpt-3.5-turbo", # モデルを選択
messages = [{
"role":"user",
"content":message, # メッセージ
}],
max_tokens = 1024, # 生成する文章の最大単語数
n = 1, # いくつの返答を生成するか
stop = None, # 指定した単語が出現した場合、文章生成を打ち切る
temperature = 0.5, # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
)
# 応答
response = completion.choices[0].message.content
# 応答内容出力
return response
# =============================================================
# チャットボット実行
# =============================================================
# 質問内容
message = "日本人の若者の特徴を教えてください"
# ChatGPT起動
res = Ask_ChatGPT(message)
# 出力
print(res)
上記プログラムは、適切に実行されると、しばらく待った後に下記のような結果が表示されるはずです。質問を変えて、実行してみましょう。
チャットをする
下記のコードを「GPT2.py」という生で保存しましょう。このコードを実行することで、OpenAIのAPIとチャットができるようになります。
import openai
openai.organization = "org-ほげ"
openai.api_key = "sk-ほげ"
def main():
amount_tokens = 0
chat = []
setting = input("ChatGPTに設定を加えますか? y/n\n")
if setting == "y" or setting == "Y":
content = input("内容を入力してください。\n")
chat.append({"role": "system", "content": content})
print("チャットをはじめます。q または quit で終了します。")
print("-"*50)
while True:
user = input("<あなた>\n")
if user == "q" or user == "quit":
print(f"トークン数は{amount_tokens}でした。")
break
else:
chat.append({"role": "user", "content": user})
print("<ChatGPT>")
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",messages=chat
)
msg = response["choices"][0]["message"]["content"].lstrip()
amount_tokens += response["usage"]["total_tokens"]
print(msg)
chat.append({"role": "assistant", "content": msg})
if __name__ == "__main__":
main()
プログラムが起動すると、起動するとAIのキャラ設定を聞かれるので、yを押して、「20歳の女性として話してください」などの設定を記入してください。正しく動作すると、会話できるようになります。APIページのUSAGEから、残り金額を確認しながら会話してください。
CoeiroInkで会話内容を音声化してもらう
下記コードは、ChatGPTからの回答を音声化するものです。Coeiroinkが起動した状態で実行してください。ちなみに、Windows11の場合は「Windowsキー+H」で音声認識入力が可能です。音声会話を楽しんでみてください。
import openai
import json
import requests
from pydub import AudioSegment, playback
openai.organization = "ほげ"
openai.api_key = "ほげ"
speaker_id = 0 # スピーカーID (0:つくよみちゃん)
def main():
amount_tokens = 0
chat = []
setting = input("ChatGPTに設定を加えますか? y/n\n")
if setting == "y" or setting == "Y":
content = input("内容を入力してください。\n")
chat.append({"role": "system", "content": content})
print("チャットをはじめます。q または quit で終了します。")
print("-"*50)
while True:
user = input("<あなた>\n")
if user == "q" or user == "quit":
print(f"トークン数は{amount_tokens}でした。")
break
else:
chat.append({"role": "user", "content": user})
print("<ChatGPT>")
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",messages=chat
)
msg = response["choices"][0]["message"]["content"].lstrip()
amount_tokens += response["usage"]["total_tokens"]
print(msg)
playsound(msg)
chat.append({"role": "assistant", "content": msg})
def playsound(text):
# 音声合成のクエリの作成
response = requests.post(
"http://localhost:50031/audio_query",
params={
'text': text,
'speaker': speaker_id,
'core_version': '0.0.0'
})
query = response.json()
# 音声合成のwavの生成
response = requests.post(
'http://localhost:50031/synthesis',
params={
'speaker': speaker_id,
'core_version': "0.0.0",
'enable_interrogative_upspeak': 'true'
},
data=json.dumps(query))
# wavの音声を再生
playback.play(AudioSegment(response.content,
sample_width=2, frame_rate=44100, channels=1))
if __name__ == "__main__":
main()
会話用修正プログラムその1
import openai
import json
import requests
from pydub import AudioSegment, playback
openai.organization = "org-ほげ"
openai.api_key = "sk-ほげ"
speaker_id = 0 #つくよみちゃんれいせい
speaker_id = 90 #リリンちゃん
def main():
amount_tokens = 0
chat = []
option="敬語は使わず、馬鹿っぽい話し方をしてください。回答は50文字くらいで行ってください。ネガティブで攻撃的な性格です。「えーそんなんあったかなぁ」、「だめじゃん、もうやめればいいのに」、「いいかげんにしろよ」といった口調で話してください。一人称は「アタシ」でお願いします。";
print("チャットをはじめます。q または quit で終了します。")
print("-"*50)
while True:
user = input("<あなた>\n")
user2=user+option
if user == "q" or user == "quit":
print(f"トークン数は{amount_tokens}でした。")
break
else:
chat.append({"role": "user", "content": user2})
print("<ChatGPT>")
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",messages=chat
)
msg = response["choices"][0]["message"]["content"].lstrip()
amount_tokens += response["usage"]["total_tokens"]
print(msg)
playsound(msg)
chat.append({"role": "assistant", "content": msg})
def playsound(text):
# 音声合成のクエリの作成
response = requests.post(
"http://localhost:50031/audio_query",
params={
'text': text,
'speaker': speaker_id,
'core_version': '0.0.0'
})
query = response.json()
# 音声合成のwavの生成
response = requests.post(
'http://localhost:50031/synthesis',
params={
'speaker': speaker_id,
'core_version': "0.0.0",
'enable_interrogative_upspeak': 'true'
},
data=json.dumps(query))
# wavの音声を再生
playback.play(AudioSegment(response.content,
sample_width=2, frame_rate=44100, channels=1))
if __name__ == "__main__":
main()
GPT4oを使った会話プログラムです。GPT5.pyという名前で保存してください。
#GPT5.py
import openai
import json
import requests
from pydub import AudioSegment, playback
openai.organization = "org-ほげ"
openai.api_key = "sk-ほげ"
speaker_id = 0 # 0:つくよみちゃんれいせい
def main():
amount_tokens = 0
chat = []
systemsetting="20歳の女子大学生として話してください。ポジティブな正確で、親しみやすい話し方をします。「◯◯かな」、「◯◯かも」、「そうだね」、「本当だね!」などのような話し方をします。";
chat.append({"role": "system", "content": systemsetting})
option="";
print("チャットをはじめます。q または quit で終了します。")
print("-"*50)
while True:
user = input("<あなた>\n")
user2=user+option
if user == "q" or user == "quit":
print(f"トークン数は{amount_tokens}でした。")
break
else:
chat.append({"role": "user", "content": user2})
print("<ChatGPT>")
response = openai.ChatCompletion.create(
model="gpt-4o",messages=chat
)
msg = response["choices"][0]["message"]["content"].lstrip()
amount_tokens += response["usage"]["total_tokens"]
print(msg)
playsound(msg)
chat.append({"role": "assistant", "content": msg})
def playsound(text):
# 音声合成のクエリの作成
response = requests.post(
#"http://localhost:50031/audio_query",
"https://fc49-150-249-222-29.ngrok-free.app/audio_query",
params={
'text': text,
'speaker': speaker_id,
'core_version': '0.0.0'
})
query = response.json()
# 音声合成のwavの生成
response = requests.post(
#'http://localhost:50031/synthesis',
"https://fc49-150-249-222-29.ngrok-free.app/synthesis",
params={
'speaker': speaker_id,
'core_version': "0.0.0",
'enable_interrogative_upspeak': 'true'
},
data=json.dumps(query))
# wavの音声を再生
playback.play(AudioSegment(response.content,
sample_width=2, frame_rate=44100, channels=1))
if __name__ == "__main__":
main()