「TVML技術と自動番組制作」 メディアサイエンス専攻大学院特別講義 林正樹 (Masaki Hayashi) Tokyo University of Technology June, July, 2019 メディアサイエンス専攻大学院特別講義 「TVML技術と自動番組制作」 林正樹 (Masaki Hayashi) Department of Game Design Uppsala University, Campus Gotland
Course Home page http://hayashimasaki.net/TUT
Masaki HAYASHI(林正樹), PhD. Self introduction Masaki HAYASHI(林正樹), PhD. Associate Professor (Docent) Department of Game Design, Faculty of Arts, Uppsala University, Campus Gotland 1986 - 2006 NHK Science and Technology Research Laboratories (20 years) 2006 - 2011 Game and IT companies 2012 - Uppsala University (100%) Astrodesign, Inc. (20%) Engineering Researcher on Content
TVML ワークショップ 4
チュートリアル TVML Playerを起動して、実際にTVMLを入力して、再生して試す、チュートリアルです コースHPのhayashimasaki.net/TUTの「TVML Player Version 1.5 for Windows Download」をクリックしてzipファイルをダウンロードし、解凍して好きなところに置きます(例:デスクトップ) TVMLPlayer1.5フォルダのTVMLPlayer.exeをダブルクリックしてTVML Playerを起動します。
TVMLの概要
TVMLとは? TVMLの台本:例 character: openmodel( model=modelA, filename=Characters/maiko/maiko) character: casting( name=A, model=modelA ) character: setvoice(name=A, voicetype=VoiceSommelier:Voice07) character: visible( name=A, switch=on ) TV program Making Language の略 テレビ番組を1本のテキストに記述できるテキストベースの言語 TVMLプレイヤーで即座に再生することが出来る ワープロなどでTVMLで台本を書くだけで、自分だけのテレビ番組を作れる TVMLプレイヤーには、番組作りに必要な要素が備わっている
TVMLプレイヤー 再生スクリーン 853 x 480 = YouTubeのサイズ 再生スクリーンサイズは固定(16:9) 全画面表示もない 再生スクリーンサイズは固定(16:9) 全画面表示もない (ただし、TVMLエンジン自体は可変サイズなのでTVML SDKを使ってコーディングすれば可能) 再生スクリーン 853 x 480 = YouTubeのサイズ 音量 再生 停止 早送り(TVML1行ごとにスキップ。巻戻しは無い) ファイル選択(TVML台本を指定する)
台本の編集と再生 TVML台本は通常のテキストエディターで編集する。 台本ファイルはUTF8なので、多言語エディターがよい(例:notepad++) TVMLScripts以下にサンプルスクリプトがある 台本を保存したら再生ボタンを押す。再選択する必要はない。
TVMLの例 camera: closeup ( target=Bob ) CGキャラクタBobにカメラをクローズアップし「こんにちは」と言わせる camera: closeup ( target=Bob ) character: talk ( name=Bob, text = ”こんにちは” ) ・TVML はイベント駆動 ・上から順に実行 ・プログラミング言語ではない
TVMLのイベント書式 character: talk ( name = Bob, text = "Hello" ) イベントタイプ コマンド パラメータ character camera set prop light movie super drawing sound cgenv コマンド実行に必要な情報を記述 ・イベントの無いコマンドのみの「ダイレクトコマンド」がいくつかある 例: wait ( time=3.0 ) setcaption ( border=on )
TVML言語仕様 http://tvmllab.com/tvmlspec TVML言語仕様Version 3.1 英語版 http://tvmllab.com/tvmlspec/eng 12
TVMLの諸規則 camera: move( name = CamA, x=5.0, vangle=60.0 ) パラメータは順不同 パラメータを省略するとデフォルト値が採用される 必須パラメータは必ず指定する コメントアウトは、// または /* */ が使える 改行で区切られた一行がひとつのイベントに対応する(途中で改行を入れてはいけない)
TVMLの座標系 左手系です y y z x x 同じ x y z y z z こう考えた方が分かりやすい zが手前向き、xが左 x
TVMLの回転系 左回り(反時計回り)です y 正の方向 x z
チュートリアル
カメラ 以下を入力してください camera:position(name=CamA, x=0.0, y=1.0, z=2.0, ry=180) camera:switch(name=CamA) x z キャラは基本z軸の方を向いている カメラを180度回転させてキャラを捉えている 上面図
キャラクタ 以下を入力してください character: openmodel( model=MAIKO , filename="Characters/maiko/maiko") character: casting( name=A, model=MAIKO ) character: setvoice(name=A , voicetype=VoiceSommelier:Voice08) character:position(name=A, x=0, y=0, z=0, scale=1)
照明 以下を入力してください light:ambient(name=LA, r=1.0, g=1.0, b=1.0) light:point(name=LP, x=0, y=1, z=1) light:flat(name=LF, vx=-1, vy=-1, vz=-1) light:spot(name=LS, x=0.2, y=1, z=0.2 ,vx=-1, vy=-1, vz=-1)
セット 以下を入力してください set:openmodel( name=Set , filename="Setprops/spaceship/spaceship")
waitコマンド 以下を入力してください wait(time=2.0) camera:position(name=CamA, x=0.0, y=1.0, z=5.0, ry=180) camera:position(name=CamA, x=0.0, y=1.0, z=2.0, ry=180)
課題1 カメラを連続的に動かしてみよう 複数カメラを設置して切り替えよう
しゃべり 以下を入力してください character: talk( name=A, text="マイコです" ) 字幕指定 , caption="maikoです")
声を変える 以下を入力してください character: setvoice(name=A , voicetype="AquesTalk2:aq_rb2") 英語 character: setvoice(name=A, voicetype="FLite:Voice01" , pitch=0.85, volume=1.2) character: talk( name=A, text="any english text" )
課題2 長いセリフをしゃべらせてみよう 複数キャラを出して会話をさせてみよう
プロップ 以下を入力してください prop: openmodel(name=sofa , filename=Setprops/sofa/sofa) prop: position( name=sofa, x=1.3, y=1.0, z=0, scale=1)
課題3 プロップのソファーをマイコが座りそうな位 置へ移動する マイコをうまいこと座らせるには?
キャラクタを動かす: 立つ、座る 以下を入力してください character: sit( name=A) wait(time=1.0) キャラクタを動かす: 立つ、座る 以下を入力してください character: sit( name=A) wait(time=1.0) character: stand( name=A)
コマンド同時実行 以下を入力してください charactet: bow(name=A) charactet: bow(name=B) 同時におじぎ charactet: bow(name=A, wait=no)
コマンド同時実行 以下を入力してください character:bow( name=A, wait=no) character:talk( name=A, text="こんにちは" )
待機コマンド (waitアンダーバーコマンド) character: talk( name=A, text=“それじゃあまた次回ね、バイバーーーイ", wait=no) wait( time=1.6 ) character: action(name=A, action=handwave) character: wait_talk ( name=A )
キャラクタを動かす: 対象物を見る 以下を入力してください character: look(name=A, target=camera ) キャラクタを動かす: 対象物を見る 以下を入力してください character: look(name=A, target=camera ) character: look(name=B, target=camera ) character: look(name=A, target=B ) character: look(name=B, target=A )
キャラクタを動かす: 歩き 以下を入力してください character: walk( name=A, x=1.0, z=1.0) 歩数指定 キャラクタを動かす: 歩き 以下を入力してください character: walk( name=A, x=1.0, z=1.0) 歩数指定 character: walk( name=A, step=10)
キャラクタを動かす: アクションを再生する キャラクタを動かす: アクションを再生する 以下を入力してください character: action(name=A, action=brilliant) character: action(name=A, action=jump) character: action(name=A, action=next) character: action(name=A, action=swing) character: action(name=A, action=hop) character: action(name=A, action=shock) character: action(name=A, action=bye) 注: maikoとstewardのみです
TV演出に必要なその他の機能
プロップ(イメージプレート) 以下を入力してください prop: openimageplate(name=Pic , filename="./datafiles/dogset.png", hsize=1.024, vsize=0.682) prop: position( name=Pic, x=-1.0, y=1.0, z=-1.0, scale=1.5)
ムービー 以下を入力してください movie:open(name=MOVIEDATA_0, filename=./datafiles/dali.ogv) prop:openmovieplate(name=MOVIEPLATE_0 , moviename=MOVIEDATA_0, hsize=2.0, vsize=1.5 ) prop:position(name=MOVIEPLATE_0, x=0, y=1.5, z=-1.0, scale=1 ) movie:play(name=MOVIEDATA_0, wait=no) prop:visible(name=MOVIEPLATE_0, switch=on) wait(time=20) prop:visible( name= MOVIEPLATE_0, switch=off )
ドローイング 以下を入力してください drawing: openbase ( name=BASE, x=20%, y=20%, layer=99, color=000000 ) drawing: settext ( name=TEXT1, parent=BASE , text="<font r='1.0' g='1.0' b='1.0' size='30%'> <border r='1.0' g='0.0' b='0.0' width='2'>アートですね</border></font>" , x=0%, y=0%, refmode=center, height=50%, width=50% , overtext=clip, basecolor=transparent ) drawing: setimage(name=PICT1, parent=BASE, filename="./demo/book.jpg" , refmode=center, width=50%,height=50%, x=0%, y=0%, aspect=fit) drawing: display ( name=BASE, switch=on ) wait ( time=5.0) drawing: display ( name=BASE, switch=off )
音を鳴らす 以下を入力してください sound:open( name=bgm, filename=./datafiles/musicsample.wav) sound:play( name=bgm)
音声ミキサー(レベル変え) 以下を入力してください sound:open( name=bgm, filename=./datafiles/musicsample.wav) sound:level( name=bgm, level=0.02) sound: play( name=bgm) wait(time=5.0) sound: level( name=bgm, level=0.2) sound: level( name=bgm, level=1.0)
音声ミキサー(フェード) 以下を入力してください sound:open( name=bgm, filename=./datafiles/musicsample.wav) sound: play( name=bgm) wait(time=8.0) sound: fade( name=bgm, level=0.0 )
キャラクタを動かす: ターン 以下を入力してください character:turn( name=A, d=-90)
キャラクタを動かす: 指定方向を見る 以下を入力してください character: gaze( name=A, rx=-30, ry=70)
キャラクタを動かす: ジャンプ 以下を入力してください キャラクタを動かす: ジャンプ 以下を入力してください character: jump( name=A, x=0.0, z=0.0, d=0.0)
キャラクタを動かす: 震える 以下を入力してください character: shake( name=A, switch=on) キャラクタを動かす: 震える 以下を入力してください character: shake( name=A, switch=on) wait(time=3.0) character: shake( name=A, switch=off)
キャラクタを動かす: 口を開ける 以下を入力してください character:openmouth( name=A, switch=on) キャラクタを動かす: 口を開ける 以下を入力してください character:openmouth( name=A, switch=on) wait(time=1.0) character:openmouth( name=A, switch=off)
キャラクタを動かす: 表情を変える 以下を入力してください character: expression( name=A, type=sad) キャラクタを動かす: 表情を変える 以下を入力してください character: expression( name=A, type=sad) wait(time=1.0) character: expression( name=A, type=happy) character: expression( name=A, type=neutral)
キャラクタを動かす: ポーズ 以下を入力してください character:definepose( name=A, pose=banzai キャラクタを動かす: ポーズ 以下を入力してください character:definepose( name=A, pose=banzai , joint=RightUpperArm, rx=-130, ry=20) , joint=LeftUpperArm, rx=-130, ry=-20) , joint=Chest, rx=-30) character:definepose( name=A, pose=upper , joint=Jaw, rx=30) character:pose( name=A, pose=banzai) wait(time=1.0) character:pose( name=A, pose=default)
キャラクタを動かす: 移動させる 以下を入力してください キャラクタを動かす: 移動させる 以下を入力してください character: move(name=A, x=1.0, y=1.0, z=0.0, ry=45)
その他
ファイルの場所指定 画像ファイル、音声ファイル、ムービーファイルのパス指定は次の3種。 絶対バスでの指定 (例: C:\sozai\abc.jpg) TVMLスクリプトの場所からの相対パス (例: ./datafiles/news.wav) URL指定(例: http://hayashimasaki.net/XXX.jpg)
ファイルフォーマット ■サウンドファイル TVMLコマンド: sound:open() 使えるフォーマット: wav, ogg ■画像ファイル TVMLコマンド: prop:imageplate(), drawing:setimage() 使えるフォーマット: jpg, png ■ムービーファイル TVMLコマンド: movie:open() 使えるフォーマット: ogv 注意: ・https://convertio.co/ja/ogv-mp4/で変換したら音もOK ・ムービーはprop:openmovieplate()でしか使えない ・movie:play()はskipscriptの中では効かない(バグ) ■直接ファイル指定できないデータ(次ページで後述) キャラクタ、セット、プロップ、モーションキャプチャーデータ 実はキャラクタ、セット、プロップのCGモデルデータは、Unityのassetbundle形式であれば外部ファイルとして参照できる。ただし、assetbundleの作成はUnityプロジェクトのTVML SDKが必要である。assetbundle使用の例は、TVMLScripts/assetbundletest/ assetbundletest.txtを参照のこと。
キャラクタ、セット、プロップデータ これらCGデータは外部ファイルとして参照できない。TVML Playerにあらかじめリソースとして含まれているものが利用できるだけである。以下にVer1.5にバンドルされているものをあげる。 キャラクタ: character:openmodel(filename="data_path") Characters/Bob/Bob Characters/bucchu/bucchu Characters/Justin/Justin Characters/maiko/maiko Characters/mamimi/mamimi Characters/marigo/marigo Characters/Mary/Mary Characters/Mia/Mia Characters/Mia_old/Mia_old Characters/news_caster/news_caster Characters/pooni/pooni Characters/pooni1/pooni1 Characters/pooni2/pooni2 Characters/pooni3/pooni3 Characters/pooni4/pooni4 Characters/pooni5/pooni5 Characters/pris/pris Characters/steward/steward Characters/yuruneko_black/yuruneko_black Characters/yuruneko_mike/yuruneko_mike Characters/yuruneko_white/yuruneko_white セット: set:openmodel(filename="data_path") Setprops/hall/hall Setprops/newnormal/newnormal Setprops/news_set/news_set Setprops/RankingSet_cyber/cyberspace Setprops/spaceship/spaceship プロップ: prop:openmodel(filename="data_path") Setprops/sofa/sofa Setprops/table/table Setprops/table/chabudai Setprops/book/book Setprops/leaf/leaf Setprops/RankingSet_cyber/block_cyber Setprops/RankingSet_cyber/videoboard_cyber Setprops/RankingSet_cyber/videoframe_cyber Setprops/RankingSet_cyber/messageframe_cyber Setprops/rankingframe_16x9/videoboard_cyber_16x9 Setprops/rankingframe_16x9/videoboard_simple_16x9 Setprops/rankingframe_16x9/videoframe_cyber_16x9 キャラクタリストはパワポの最後の付録を参照のこと。
TUT追加キャラクタ TUTで制作した以下のキャラクタ5体が使える character: openmodel(model=A, filename="Characters/General_F/General_F") character: openmodel(model=B, filename="Characters/General_M/General_M") character: openmodel(model=C,filename="Characters/ForHighschool_F/ForHighschool_F") character: openmodel(model=D,filename="Characters/ForHighschool_M/ForHighschool_M") character: openmodel(model=E, filename="Characters/Koukaton/Koukaton")
声質 日本語: character: setvoice(name=A, voicetype="VoiceSommelier:Voice06") // 日立製"ボイスソムリエ"、落ち着いた大人の女性 character: setvoice(name=A, voicetype="VoiceSommelier:Voice07") //日立製"ボイスソムリエ"、女性、ふつう character: setvoice(name=A, voicetype="VoiceSommelier:Voice08") //日立製"ボイスソムリエ"、若い女性 character: setvoice(name=A, voicetype="VoiceSommelier:Voice09") //日立製"ボイスソムリエ"、男性、朗読調 character: setvoice(name=A, voicetype="VoiceSommelier:Voice10") //日立製"ボイスソムリエ"、若い男性 character: setvoice(name=A, voicetype="OpenJTalk:Voice01 ") // フリーソフト"Open JTalk"、男性 character: setvoice(name=A, voicetype="AquesTalk2:aq_f1c") // Aquestalk2、若い女 character: setvoice(name=A, voicetype="AquesTalk2:aq_f3a") // Aquestalk2、 女性 character: setvoice(name=A, voicetype="AquesTalk2:aq_huskey") // Aquestalk2、 ささやき女性 character: setvoice(name=A, voicetype="AquesTalk2:aq_m4b") // Aquestalk2、 男性 character: setvoice(name=A, voicetype="AquesTalk2:aq_mf1") // Aquestalk2、 若い男 character: setvoice(name=A, voicetype="AquesTalk2:aq_rb2") // Aquestalk2、 子供男 character: setvoice(name=A, voicetype="AquesTalk2:aq_rb3") // Aquestalk2、 ロボット character: setvoice(name=A, voicetype="AquesTalk2:aq_rm") // Aquestalk2、 別女性 character: setvoice(name=A, voicetype="AquesTalk2:aq_robo") // Aquestalk2、 子供ロボット character: setvoice(name=A, voicetype="AquesTalk2:aq_yukkuri") // Aquestalk2、 男の子ゆっくり character: setvoice(name=A, voicetype="AquesTalk2:ar_f4") // Aquestalk2、 女の子 character: setvoice(name=A, voicetype="AquesTalk2:ar_m5") // Aquestalk2、 若い別男 character: setvoice(name=A, voicetype="AquesTalk2:ar_mf2") // Aquestalk2、 男の子 character: setvoice(name=A, voicetype="AquesTalk2:ar_rm3") // Aquestalk2、 別女性 英語: character: setvoice(name=A, voicetype=" FLite:Voice01") //フリーソフト"Flite (festival-lite)"、女性
モーションキャプチャーデータ character:openmocap(filename="data_path")でBVHフォーマットのモーションキャプチャーデータが利用できるが、現時点で外部ファイルとして参照できず、TVML Playerにあらかじめリソースとして含まれている以下のものだけ利用できる。 BVHs/A13 BVHs/A24 BVHs/I05 BVHs/I07 BVHs/I08 BVHs/I09 BVHs/I12 BVHs/I13 BVHs/I14 BVHs/I17 BVHs/I21 BVHs/I25 BVHs/I26 BVHs/I29 BVHs/I34 BVHs/I35 BVHs/natoku_001 BVHs/ojigi_001 BVHs/Sasu_002 BVHs/Sasu_004 BVHs/sit_bow_nao BVHs/sit_byebye_nao BVHs/sit_default_nao BVHs/sit_talk00_nao BVHs/sit_talk01_nao BVHs/sit_talk02_nao BVHs/sit_talk03_cam_nao BVHs/talk_002 BVHs/talk_004
キャラクタリスト(付録)
キャラクタリスト(付録)
キャラクタリスト(付録)