全件表示

<<2024年>>4月
1 2 3 4 5 6 7 8 9 10 11 12

過去のタイトル(新着順)
PC-98Noteが壊れた。

2024年4月14日富士山火入れ野焼きの空撮動画

金庫の仕組みを3Dプリンターで

LEDで点滅する北斎の冨嶽三十六景

自動餌やり機

気象庁発表の天気予報をHPに表示する。

漫画にかける青春録

数字であそぼ。

Suno AI, chatGPT, 最新のAIでどこまで楽曲ができるか? その2

Suno AI, chatGPT, 最新のAIでどこまで楽曲ができるか?

弾いてみた - Room 335

弾いてみた - Europa

弾いてみた - Hotel California

弾いてみた - Smoke on the Water

弾いてみた - 傷だらけの天使

過去のFacebookから転載「SONY VECTRON」

過去のFacebookから転載「T-Boardについて」

chatGPTとともにLUAで動画配信OBSでカメラシーンを切り替えるスクリプトのプログラム

蝙蝠オーグのアジトは河口湖ステラシアターだった⁉

五合目のライブカメラの復旧

ChatGPTが予言したAIの支配するシナリオ

今話題のChatGPTでAI本人と人工知能の将来を語ってみた

3Dプリンターでアポロ11号月面着陸船

公開されている3Dプリンター用のデータについて

最近のプラモデルは

パソコンでメインに使用している4K液晶が突然消えた。

3Dプリンターで宇宙戦艦ヤマトシリーズ

3Dプリンターで反射衛星砲を作成。

3DプリンターでT-Rex

3Dプリンターでシェルビー・コブラ

3Dプリンターでメルセデスベンツ SSK

富士宮市秋のまつり

河口湖は紅葉の時期を迎えました

3Dプリンターでシン・ゴジラ

iPhone14Proでスキャニング〜3D印刷

2022年火祭り交通規制

噴火かぁ

映画コンテイジョン

映画マトリックス再び

4月21日(水)22:30〜NHK歴史探偵に出演します。

富士山ライブ動画のタイムラプス 2021年3月26日、河口湖母の白滝から望む花火。

富士山で発生した火災の記録 - 20210204 Mt. Fuji fire.

富士山、樹海、河口湖、紅葉の空撮動画3本

忍野村の富士山写真コンクールの最優秀写真が合成との件

ここ数日の温かさで今年も富士山に農鳥が出現

富士山のタイムラプス

富士市茶畑カメラ前の葉をスッキリ

遅ればせながら夏用タイヤに履き替えた。

除菌と私と新型コロナ

冬を彩る河口湖花火の競演

 

2023年6月13日22時41分


削除修正新規

全てをchatGPTだけでプログラムしようとした。
プログラム言語は「LUA」というスクリプト言語で、C言語に近い。ところが、私は今までLUAを使ったことが無かった。
そこで、chatGPTと相談しながら作業を進めることにしたのである。
やりたいことは、動画配信で日中は富士山、夜間は水槽の動画を配信すること。

まず、日没と日の入りを求める関数を作るため以下のように指令した。
「動画配信ソフトのLUAを使用して日の出と日の入りを求めるget_SunrizeSunset関数を作成せよ。ただし、引数に緯度経度と求める日を使うこと」
早速プログラムコードが出てきたので、次の指令をした。
「先の関数を使用して日中の場合はTrue、夜間の場合はFalseを返すこと。」
だんだんプログラムが長くなった。
「動画配信ソフトOBSを使用して日中ならFUJI、夜間ならAQUAのシーンを選択すること」
「日の出と日没時間にマージンを持たせるように改良せよ」
幾つか齟齬があって修正を繰り返し一行もソースコードを書かずにプログラムが完成し、動画配信OBSに実装した。

ところが、ここから長かった。
実装すると日没と日の入り時間になってもシーン(カメラ)が切り替わらない。
どうやら日没と日の入り時間が間違っているようだ。
一行もコードを書かないと決めていたので言葉だけで修正を求める。
例えば、「日本時間に対応しているか?」とか「どこかに誤りはないか?」とか。

その都度、黙々と文句を言わずコードを修正して返してくるchatGPT。
途中で「天体の運行がどう」とか「LUAは数学演算が苦手」だとか「さらに精密な計算をしてみる」とか言い訳が始まってプログラムリストはどんどん長くなる。
そこで「おおまかな時間が分かればよい」と指令すると「私には分からないので他の言語のライブラリの使用を勧められた」
この間約半日ほど経過していた。私はただchatGPTのコードをコピペして結果を報告するだけだった。途中面白いのは「以下の値がどうなっているか教えて」とか必死にデバッグに励んでいたことだった。

そして、とうとうchatGPTでは正解にたどり着けなかった。
仕方が無いのでgoogleで検索すると日の入り日没を求める関数がすぐに見つかった。
私にとって初見のLUAだったが何度も修正リストを見ていたので言語の記述方法は理解できたこともあり、見つけた関数の部分だけchatGPTのプログラムと置き換えたらちゃんと動作した。

結果的にだがchatGPTは太陽系の運行から日の出日没を求めようとして失敗したが、googleで見つけた関数は緯度経度を考慮した地球から太陽の位置を求めていた。
私的には精密な日の出日没が欲しかったわけではなく「カメラの切り替えをしたいだけなのでだいたいな時間」が分かればよかったわけだ。
しかし、時間を求めること以外のプログラムはchatGPTのままで動作した。例えば動画配信ソフトでのカメラの切り替えとか日中とかの判断する部分。

つまり、単純に欲しい関数の使用を伝えそれらを組み合わせて全体を構築する部分の運用は意図通りの関数を作成してくれた。
もちろん、目的を達成するために関数という部品をどのように分解して伝えるのかという部分は人間が考えるのだが、その辺も理解して仕様通りの関数を作成してくれた。
この全体のシステムをどのように分解していくのが後工程を楽にするかはシステム設計の基礎が無ければならない。
chatGPTへの指令次第では長大なプログラムリストになり、ミスや修正が難しくなる。
ようするに今回は「日の出日没」の時間を得る関数の入れ替えで簡単に修正できた。

私の反省点として関数を作成する都度、実行結果の予想と結果を報告すれば良かったと思う。
関数の指令を与えながら次第に全体が出来上がるまでコピペのみですませようと少し過信しすぎた。それほどこちらに考える間を与えずプログラムリストを吐き出してくるのにはまってしまった。

というわけで出来上がった動画配信の様子は現在、 https://www.youtube.com/watch?v=mWm6luQ1d7M で見ることができる。
日の出30分前から富士山画像へ、日没後20分後から水槽カメラへと切り替わる。

以降、LUAで動画配信OBSでカメラシーンを切り替えるスクリプトのプログラムリスト。
obs = require('obslua')
os = require('os')

scene_now = ""
scene_WEB251 = "WEB251" -- 富士山カメラ
scene_WEB252 = "WEB252" -- 水槽カメラ
latitude = 35.68039639541995 -- 緯度経度は東京駅にしてある
longitude = 139.76788440520536
sunrise_margin = -30 -- 分単位で指定(2時間前=-120)
sunset_margin = 30 -- 分単位で指定(2時間後=120)

-- sunrise / sunset calculation
function rscalc(latitude, longitude, when)
local pi = math.pi
local doublepi = pi * 2
local rads = pi / 180.0

local TZ = function(when)
local ts = os.time(when)
local utcdate, localdate = os.date('!*t', ts), os.date('*t', ts)
localdate.isdst = false

local diff = os.time(localdate) - os.time(utcdate)
return math.floor(diff / 3600)
end

local range = function(x)
local a = x / doublepi
local b = doublepi * (a - math.floor(a))
return b < 0 and (doublepi + b) or b
end

when = when or os.date('*t')

local y2k = { year = 2000, month = 1, day = 1 }
local y2kdays = os.time(when) - os.time(y2k)
y2kdays = math.ceil(y2kdays / 86400)

local meanlongitude = range(280.461 * rads + 0.9856474 * rads * y2kdays)
local meananomaly = range(357.528 * rads + 0.9856003 * rads * y2kdays)
local lambda = range(meanlongitude + 1.915 * rads * math.sin(meananomaly) + rads / 50 * math.sin(2 * meananomaly))

local obliq = 23.439 * rads - y2kdays * rads / 2500000

local alpha = math.atan2(math.cos(obliq) * math.sin(lambda), math.cos(lambda))
local declination = math.asin(math.sin(obliq) * math.sin(lambda))

local LL = meanlongitude - alpha
if meanlongitude < pi then
LL = LL + doublepi
end

local dfo = pi / 216.45

if latitude < 0 then
dfo = -dfo
end

local fo = math.min(math.tan(declination + dfo) * math.tan(latitude * rads), 1)
local ha = 12 * math.asin(fo) / pi + 6

local timezone = TZ(when)
local equation = 12 + timezone + 24 * (1 - LL / doublepi) - longitude / 15

local sunrise, sunset = equation - ha, equation + ha

if sunrise > 24 then
sunrise = sunrise - 24
end

if sunset > 24 then
sunset = sunset - 24
end

return math.floor(sunrise * 60), math.ceil(sunset * 60)
end


--本日の日中かどうか審議する
function is_daytime(latitude, longitude, sunrise_margin, sunset_margin)
local date = os.date("*t")
local sunrise, sunset = rscalc(latitude, longitude, date)
-- obs.script_log(obs.LOG_INFO, "Sunrize(min): " .. sunrise)
-- obs.script_log(obs.LOG_INFO, "Sunset(min): " .. sunset)

sunrise = sunrise + sunrise_margin
sunset = sunset + sunset_margin
local zero_oclock = os.time({year = date.year, month = date.month, day = date.day, hour = 0})

-- 与えられた日の日の出と日の入りの時間(秒)を計算
local sunrise_sec = zero_oclock + sunrise * 60
local sunset_sec = zero_oclock + sunset * 60
local now_sec = os.time(date)

--[[ Debug Section START
local t = os.date("*t", sunrise_sec)
local time_str = string.format("%04d-%02d-%02d %02d:%02d:%02d", t.year, t.month, t.day, t.hour, t.min, t.sec)
obs.script_log(obs.LOG_INFO, "Current time: " .. time_str)
local t = os.date("*t", sunset_sec)
local time_str = string.format("%04d-%02d-%02d %02d:%02d:%02d", t.year, t.month, t.day, t.hour, t.min, t.sec)
obs.script_log(obs.LOG_INFO, "Current time: " .. time_str)
]]

if sunrise_sec <= now_sec and now_sec <= sunset_sec then
return true
else
return false
end
end

--シーンの切り替え
function switch_scene(scene_name)
local scenes = obs.obs_frontend_get_scenes()

for _, scene in ipairs(scenes) do
local scenes_list = obs.obs_source_get_name(scene)
if scenes_list == scene_name then
if scenes_now ~= scene_name then
scenes_now = scene_name
obs.obs_frontend_set_current_scene(scene)

local t = os.date("*t")
local chg_str = string.format("%02d-%02d %02d:%02d -- %s", t.month, t.day, t.hour, t.min, scene_name)
obs.script_log(obs.LOG_INFO, "Switched scene: " .. chg_str)

end
break
end
end
end

--日中ならWEB251、夜ならWEB252
function check_time()
if is_daytime(latitude, longitude, sunrise_margin, sunset_margin) then
switch_scene(scene_WEB251)
else
switch_scene(scene_WEB252)
end
end

--
function script_description()
return "Script to switch scenes at specified times."
end

--
function script_load(settings)
obs.timer_add(check_time, 60 * 1000)
end
#chatGPT #プログラム #OBS #動画配信