富士五湖TV

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

富士レークホテル
富士と湖と温泉の宿。静かなくつろぎとやすらぎを。

by Fujigoko.TV

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

富士五湖.TVに広告を出してみませんか?

特報、連載中の葛飾北斎の視点(凱風快晴)
NHK歴史秘話ヒストリア」(2017年4月21日放送)で検証されました

掲示板&投稿集

富士五湖いろいろ掲示板
イベント掲示板
地元掲示板
口コミ掲示板

富士五湖特派員報告
富士五湖TV報告
特派員外も五湖便り
投稿画像コーナー
富士山ベストショット
ライブカメラ画像集
ライブカメラ殿堂
FujigokoTVでつぶやく

富士山ライブカメラ

山中湖高台180度
山中湖平野(望遠)
山中湖長池
忍野富士
忍野八海
忍野高台
富士山五合目(望遠)
富士吉田中曽根(望遠)
河口湖母の白滝
河口湖富士山遥拝所
河口湖船津
河口湖逆さ富士
河口湖北岸(望遠)
河口湖大石湖畔
河口湖大石高台
河口湖勝山
鳴沢村公園(望遠)
西湖・樹海
精進湖子抱き
本栖湖千円札
富士ドクタービレッジ
富士ヶ嶺ゴルフ場
職業訓練センター(望遠)
大原学園富士宮(望遠)
富士宮市柚野
富士市茶畑(望遠)
河口湖畔
河口湖畔道の駅
山中湖畔
明見湖(広角)
国139昭和大入口
マップ交通カメラ
富士五湖YouTube


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





2023年6月13日22時41分


久保覚 (富士五湖TV代表)

Profile 全投稿表示

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

全てを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 #動画配信 

コメント

削除修正新規









 
富士山周辺特派員MENU
すべての投稿報告
広域公共情報報告(標準表示)
会員のプライベート報告
富士五湖TVから報告

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

過去のタイトル(新着順)
静岡市立蒲原東小学校にて葛飾北斎の講演会を行いました

葛飾北斎の冨嶽三十六景「尾州不二見原」の模型の量産化できた

いよいよ足和田トンネル(仮称)が、

KUKUNA  七夕

ECOプランについて

SDGsの達成に向けてKUKUNAの計画

葛飾北斎の冨嶽三十六景のひとつ「尾州不二見原」の試作模型ができた。

富士市にて葛飾北斎の講演会を行います

フラックスを作る

新緑の会NEWS発行

PC-98顛末記その2 FD1238Tのベルト交換

PC-98Noteが壊れた。

富士五湖サミット

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

陳情

2024年 勝山さくら祭り

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

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

自動餌やり機

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

漫画にかける青春録

数字であそぼ。

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

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

流石やすし県政報告Vol.20 令和6年1月発行

弾いてみた - Room 335

弾いてみた - Europa

弾いてみた - Hotel California

弾いてみた - Smoke on the Water

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

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

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

会派研修

会派研修

2023年 道の駅かつやま 感謝祭

夜の県庁

1日だけの夏服

足和田地区陳情

*****

農政産業観光委員会の研修

農政産業観光委員会

新しい仲間と、

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

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

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

吉田高校同窓会

今年から、夜の県庁が、赤く

防災センターへ、

最初の仕事

第44回 甲斐の勝山やぶさめ祭り

過去の投稿者(新着順)
久保覚 (富士五湖TV代表)

流石やすし

風のテラスKUKUNA くくな

勝山観光協会・勝山民宿組合

ビュー山中湖

Team Let's Fuji

富士河口湖小立オートキャンプ場鼻曲(はなまがり)

中川雄三

インターリゾート東屋 (天野猶治)

富士五湖情報局(富士五湖TV)

富士山五合目観光協会

元祖室

河口湖美術館

社会福祉法人欣寿会・特別養護老人ホーム芙蓉荘

しゅうすいや・SHUSUIYA

くくな 周辺観光用

ニューブリッヂキャンプ場

富士写真家連盟

忍野観光農園 富士忍野ベリーランド

ウッドストック

山中湖レークサイドボウル

河口湖・ボートハウス ハワイ

株式会社ひまわり 山中湖店

フジシロ工業(有)

山中湖ペンション ブルーリボン

しゅんちゃんち

河口湖 観光遊覧屋形船

河口湖アートクラフトフェア

温泉民宿 丸弥荘

サンプル情報


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

Copyright (C) 2001 Fujigoko.TV. All Rights Reserved.