TVML - TVprogram Making Language
TVMLプレイヤーII
TVMLプレイヤーミニ
TVMLとは何か?
TVMLの言語仕様
TVMLの使用例
TVMLの外部制御モード
キャラクター作成講座
TVML番組制作の解説書
そのほかのトピックス
ダウンロード
TV4U (TV for you)
English
TVMLの使用例

ここでは、TVMLで実際に制作した番組の紹介、および、TVMLのさまざまな使用方法のアイデアについてご紹介します。

TVMLの番組出力例

TVMLプレイヤーには、英語・日本語合わせておよそ70本ていどのサンプルTVML台本が付属しています。以下はその一部の番組出力例 です。

NEWS TODAY 100kbps 英語でしゃべらナイト(5) 100kbps
美食探検 100kbps   英語でしゃべらナイト(6) 100kbps
ドローイングの使い方 100kbps   英語でしゃべらナイト(7) 100kbps
英語でしゃべらナイト(1) 100kbps   英語でしゃべらナイト(8) 100kbps
英語でしゃべらナイト(2) 100kbps   英語でしゃべらナイト(9) 100kbps
英語でしゃべらナイト(3) 100kbps   英語でしゃべらナイト(10) 100kbps
英語でしゃべらナイト(4) 100kbps   英語でしゃべらナイト(11) 100kbps
Robert Johnson 100kbps      
TVMLのさまざまな使用方法

TVMLには、考え方から大きく分けて、テレビ番組制作ツールとしての使用と、マルチメディアの様々な研究者達に対するツールとしての、2つの使用法があります。

TVMLを使えばデスクトップの上だけでテレビ番組をまるまる1本作ってしまうことができます。そうした特性を生かして次のような応用が考えられます。

テレビ番組制作ツールとして

個人向けテレビ番組制作ツールとして。ビデオカメラは普及しましたが、撮影したビデオを番組に仕立てるのは困難でした。TVMLを使えばパーソナルな番組を、例えばご家庭のパソコン上で作ることができます。
簡単な情報系番組などオンエアー番組の制作ツールとして。イベントガイド、天気予報、教育番組などの情報系番組の比較的単純なものはTVMLで制作が可能です。現在でも、NHK、ケーブルテレビなどで実際に使用されています。PC1台で制作できるため、コストと時間が削減でき、CGの専門家でなくとも手軽にCG番組を作ることが出来ます。
プロ向け番組制作シミュレーション、トレーニングツールとして。大量のコンテンツを作らなければならない現在、事前シミュレーションあるいは制作者のトレーニングツールはますます必要になると考えられます。

TVMLは、コンテンツ自動生成などの言語をベースとしたシンボリック処理と、CG生成など映像音声を生成する信号処理の両者を結びつける考え方であると言えるでしょう。両者の研究分野で仕事をしている多くの研究者達の研究成果をテレビ番組という具体的なアウトプットとして得ることができます。現在でも、実際に多くの大学でTVMLを使って様々な研究が展開されています。また、この用途にてTVMLを使用するときは、TVMLプレイヤーの外部制御機能が重要になりますので、そちらも合わせてご覧下さい。

マルチメディアの様々な研究者達に対するツールとして

会話生成、翻訳、コンテンツ自動生成といったシンボリック処理の成果をテレビ番組という形で出力することができます。
動画検索、自動要約生成など、動画のハンドリングの結果をテレビ番組という形で出力することができます。
CG生成、音声合成など様々な研究成果のデモビデオ作成ツールとして使用できます。
TVMLからテレビ番組以外の他のメディア(印刷物など)に変換する研究のベースとなる可能性があります。
TVML台本の例とその番組再生例

次の番組は、「ニューストゥデイ」という簡単なニュース番組です。番組再生例とTVML台本を掲載しました。

分解ショット(A〜H)

A B C
E F G

上記番組のTVML台本

//
// スクリプト (ニュース番組)
//
// (C)2004 林正樹
//

skipscript( switch=on )

// スタジオセットのセットアップ
set: assign( name=studio )
set: openmodel( name=studio, filename="newsshow\newsshow.obj" )
set: change( name=studio )

// 小道具(プロップ)のセットアップ
prop: assign( name=table )
prop: openmodel( name=table, filename="newsshowtable\newsshowtable.obj" )
prop: position( name=table, x=-2.15, y=0.16, z=-3.04, pitch=0.00, yaw=0.00, roll=0.00, scale=1.00 )
prop: visible( name=table, switch=on )
prop: assign( name=plate )
prop: openimageplate( name=plate, filename=".\Datafiles\Image\newstitle.jpg", platesizeh=1.42, platesizev=0.9 )
prop: position( name=plate, x=-1.50, y=1.55, z=-4.45, pitch=0.00, yaw=0.00, roll=0.00, scale=1.00 )
prop: visible( name=plate, switch=on )

// 照明のセットアップ
light: assign( name=light1 )
light: model( name=light1, type=flat, x=1.0, y=1.0, z=1.0, r=1.0, g=1.0, b=1.0 )
light: assign( name=light2 )
light: model( name=light2, type=flat, x=-1.0, y=1.0, z=1.0, r=1.0, g=1.0, b=1.0 )

// キャラクタのセットアップ
character: casting( name=Mika )
character: openmodel( modelname=kokubo, filename="kokubo\kokubo.bm" )
character: bindmodel( name=Mika, modelname=kokubo )
character: setvoice( name=Mika, voicetype="female01" )
character: position( name=Mika, x=-0.05, y=0.0, z=-2.8, d=0.0, posture=standing )

// カメラのセットアップ
camera: assign( name=CamA )
camera: movement( name=CamA, x=-0.05, y=1.65, z=-0.6, tilt=5.0, vangle=20 )
camera: switch( name=CamA )

// サウンドのプリオープン
sound: open( name=newssound, filename=".\Datafiles\Sound\newsmusic.wav" )
sound: open( name=supersound, filename=".\Datafiles\Sound\newssuper.wav" )

// ドローイングのセットアップ
drawing: assign( name=newsticker )
drawing: openbase( name=newsticker )
drawing: assign( name=tickerback )
drawing: openplain( name=tickerback, parent=newsticker, height=9%, width=80% )
drawing: setimage( name=tickerback, filename=".\Datafiles\Image\superbase.tif", aspect=free )
drawing: position( name=tickerback, x=0%, y=-35% )
drawing: assign( name=tickertext )
drawing: openplain( name=tickertext, parent=newsticker, height=9%, width=80% )
drawing: position( name=tickertext, x=13%, y=-35% )

// 字幕をオフ
setcaption( switch=off )

skipscript( switch=off )

// ここから番組スタート

// オープニングタイトル .........
video: switcher( source=title )
title: select( type=imagefile, filename=".\Datafiles\Image\newstitle.jpg" )
sound: play( name=newssound )
wait( time=3 )

// スタジオショット ...........
video: switcher( source=studio )
character: look( name=Mika, what=camera )
super: on( type=text, text="小宮山 美香" )
wait( time=0.5 )
character: bow( name=Mika )
character: talk( name=Mika, text="こんにちは。ニューストゥデイの時間です" )
super: off( )
wait( time=0.5 )

// キャスター移動
character: look( name=Mika, what=lookforward )
character: walk( name=Mika, x=-0.7, y=0.0, z=-3.7, wait=no )
camera: movement( name=CamA, x=-1.21, y=1.5, z=-1.48, tilt=2.0, vangle=30, speed=0.5 )
character: wait_walk( name=Mika )
character: turn( name=Mika, d=-2.0 )
character: look( name=Mika, what=camera )

// ニュース話題紹介 ...........

wait( time=0.5 )
sound: play( name=supersound )
drawing: settext( name=tickertext, text="東京時代まつりが開催", fontsize=50%, style=bold )
//drawing: position( name=tickertext, x=13%, y=-35% )
super: on( type=drawing, drawingname=newsticker, x=160, y=0, destx=0, desty=0, action=move, frame=12 )

wait( time=0.5 )
character: talk( name=Mika, text="今日の話題です" )
character: talk( name=Mika, text="浅草で、歴史を感じさせるイベント、東京時代祭りが開催されました" )
super: off( )
wait( time=0.5 )

// ムービー出しのバックでナレーション .........

movie: open( name=movie1, filename=".\Datafiles\Movie\news2-2.mpg" )
movie: play( name=movie1, from=0, wait=no )
video: switcher( source=movie1 )
narration: talk( who=Mika, text="この東京時代祭りは" )
narration: talk( who=Mika, text="浅草寺創始から現代までの歴史絵巻を" )
narration: talk( who=Mika, text="総勢1600名の大行列で表現するものです" )
movie: wait_play( frame=210 )

// スタジオ戻し ...........

video: switcher( source=studio )
wait( time=0.5 )
character: talk( name=Mika, text="あいにくの雨の中" )
character: talk( name=Mika, text="沿道には祭りを一目見ようと集まった人々で賑わいました" )

// エンディング ...........

sound: play( name=newssound )
character: talk( name=Mika, text="以上、今日の話題でした" )
character: bow( name=Mika )
character: look( name=Mika, what=camera, track=off )

camera: movement( name=CamA, x=0.69, y=3.07, z=1.08, pan=24.50, tilt=22.50, roll=0.00, vangle=47.00, transition=continuous, style=servo, speed=1 )
sound: mixer( source=newssound, action=fadeout, fadetime=2.0 )
wait( time=2.5 )

end( )

//---------TVML台本終わり ----------------