クメール語マネーエクスプレイナー は何をしますか?
各動画は、二人の一般人の同じ金銭判断を通して、計算過程を声に出して説明し、視聴者が自分で判断できるようにします。視聴者は数字に惹かれ、その数字が正直であることからチャンネルを信頼します。
動作例は、templates/project/内の「講vs銀行」動画(src/story/)です。
チャンネルを保護するルール
- オリジナル作品のみ。 スタイル調査で他のチャンネルを参考にすることはあっても、スクリプト、キャラクター、サムネイル、ロゴ、ショットをコピーしてはいけません。また、動画や説明文で他のチャンネル名を決して明かさないでください。キャスト、ストーリー、ビジュアルアイデンティティ(クラマを巻いたガイドを含む)は独自のものです。
- 正直なお金。 前提条件を画面上に表示します。最も良く見える選択肢のリスクも含め、両方の側面を示します。個人的な推奨ではなく、質問すべき事項を提示します。すべての説明文は、金融アドバイスではないという一文と、キャラクターは架空であるという説明で締めくくります。
- 実在の人物は登場させない。 名前のある個人や企業に対する詐欺の告発は、このフォーマットの役割ではありません。報道された事例からパターンを説明し、説明文にリンクを貼ります。
- 費用: 音声にはKiriTTSクレジットがかかります。1,100文字のパイロット版で433クレジット使用したため、9分の動画では約3,000〜3,500クレジットになります。音声を生成する前に
get_usageで残高を確認し、ユーザーに見積もりを伝え、まずスクリプトの承認を得てください。
パイプライン
1. トピック
ユーザーがトピックを指定しない場合、それぞれ一行の説明付きで3つ提案します。良いトピックは、カンボジアの誰もが認識する分岐点であり、ソースのある数字があり、明白な答えが間違っていたり不完全だったりするようなひねりがあるものです。提案する前に、現在のトレンドを検索してください。
最初に内容を確定し、まだわかっていないことだけを尋ねます:トピック、音声(デフォルトはMaly;アカウントにクローンボイスがある場合があります。list_voicesを参照)、チャンネル名(story.tsxのCHANNEL;空欄にするとバッジが非表示になります)。
2. リサーチと計算
- カンボジアの一次情報源(カンボジア国立銀行、国立統計局、銀行の金利表、法律事務所の税務メモ、信頼できる報道機関)があれば、それを使用します。公開日を記載してください。金利や税法は変更されます。
- トピックに合わせて
scripts/calc.pyを書き換えます。画面上とナレーション内のすべての数字はこれに由来し、src/story/numbers.jsonに書き出されます。健全性チェックのアサーションを追加します。「勝者」が負けるシナリオを含む、いくつかのシナリオを実行します。 - ソースがあるものと仮定したものを分け、仮定した値は画面上に
<Note>でラベル付けします。事実にソースがない場合は、明確な仮定として提示するか、削除し、その旨をユーザーに伝えます。
3. スクリプト
8〜10分で約7,000〜9,000クメール文字。パイロット版の音声は約1秒間に15文字でした。1ビートは約70文字の1〜2文で構成されるため、9分の動画には約100〜120ビートがあります。構造とクメール語の表記ルールについては、references/script-formula.mdを参照してください。
src/story/script.jsonに書き出し(シーンはビートを含みます。形式は以下)、ユーザーに全文のクメール語スクリプトとソース・仮定を表示します。音声生成の前に承認を待ちます。 ユーザーがクメール語の言い回しや用語の権威です。
4. プロジェクトのセットアップ
templates/project/を新しいフォルダにコピーし、npm installを実行してから、src/story/script.json、src/story/story.tsx、scripts/calc.pyを置き換えます。再利用可能なものを追加する場合を除き、src/engine/は変更しないでください。短いパスを使用します(「落とし穴」を参照)。
5. クレジット使用前のルックテスト
python scripts/calc.py
python scripts/build_timeline.py --placeholder
python scripts/check_numbers.py
npx tsc --noEmit
node scripts/stills.mjs out/look/x_ 100,400,900 0.5
自分でフレームを確認し、references/visual-style.mdのチェックリストと照合します。音声が入ったら、各行を開始付近と終了付近の2回確認します。終了時のみのスチルでは、音声が数字に達するまで空のままのカードを見逃します。シーンを1つずつ書き、それぞれ確認します。なぜなら、レイアウトの問題は今修正する方がはるかにコストがかからないからです。
6. 音声
python scripts/tts_todo.py
これにより、新規または変更されたビートのみがリストされます。各ビートについて、KiriTTSのtext_to_speechを、ビートのttsフィールド(またはtext)と1つの一貫した音声で呼び出し、デリバリー設定は設定しません。URLをダウンロードしてvoice/<id>.mp3に保存し(リンクは約1日で期限切れ)、python scripts/tts_todo.py --done <id> <speech_id>で記録します。ビートごとに1つのクリップであるため、間違った単語があれば1文を修正するだけで済みます。
単語レベルのキューポイントはオプションです。get_word_timestampsの出力をvoice/<id>.words.jsonとして保存し、at('b03', 'word')を使用します。at('b03', .5)のようなフラクションで十分なことが多いです。数字、名前、外来語は聞いて確認してください。KiriTTSが正しく読まない場合は、そのビートにttsスペルを追加します。
7. タイムライン、音声、レンダリング
python scripts/build_timeline.py
python scripts/make_audio.py
npx remotion render src/index.ts Main out/video.mp4 --codec h264 --crf 18 --muted
ffmpeg -y -i out/video.mp4 -i out/mix.wav -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 192k -shortest out/final.mp4
python scripts/qa.py out/final.mp4 out/qa
npx remotion still src/index.ts Thumbnail out/thumb.png
長い動画は時間がかかるため、レンダリングはバックグラウンドで実行します。ルックや音声が新しい場合は、ユーザーのレビューのために、最初のシーンの短いパイロット版をフル動画の前にレンダリングします。
8. QA
out/qa/report.mdを読み、すべてのコンタクトシートを確認します。黒やフリーズしたフレーム、-15 LUFSから大きく外れたラウドネスを調査します。画面上のすべての数値がnumbers.jsonと一致し、クメール語のテキストが切り取られたり重なったりしていないことを確認します。
9. 納品
mp4とサムネイルをSendUserFileで送信します。また、out/description.mdをクメール語で作成します。内容は、フック、計算過程の要約(前提条件、リスク、自分自身に問いかける質問を含む)、架空のキャラクターと金融アドバイスではない旨の文章、コメントを促す文言、timeline.jsonの実タイムスタンプに基づくチャプター、ソースリンク、ハッシュタグです。ユーザーが依頼しない限り、アップロードや公開は絶対に行わないでください。
script.jsonの形式
{ "gap": 0.3, "scene_gap": 0.7, "tail": 1.5,
"scenes": [{ "id": "Hook", "chapter": 0, "music": "light", "beats": [
{ "id": "h1", "text": "Khmer sentence", "tts": "optional spoken spelling", "sfx": [{"at": 0.75, "type": "coin"}] }
]}]}
- シーンの
idは、story.tsxのSCENES内のコンポーネントと一致する必要があります。 chapterはCHAPTERSのインデックスです。0はフックで、バーが非表示になります。music:light、tense、resolve。sfxの種類: pop whoosh coin cash ding thud tick paper sad tada alarm。atはビートの時間に対する割合です。重要な情報の表示時に使用し、すべての行に使わないでください。
シーンの書き方
src/story/story.tsxを読んでください。それがシーンの書き方のリファレンスです。簡単に言うと、const {f, at} = useScene()でフレームとビート時間を取得し、すべての要素は<Show at={...} out={...} x y>を通じて登場します。秒単位でタイミングが設定されていないため、音声を再生成してもシーンが壊れることはありません。
利用可能なパーツ:
engine/Figure: 顔、ポーズ、歩行、手に持った小道具。各キャラクターはストーリーの先頭で一度だけ定義します。engine/Props: Title, Label, Chip, Tag, Bubble, ThoughtCloud, Jar, Coin, Bill, MoneyBag, Calendar, Bank, House, Stall, Notebook, Phone, Rock, Umbrella, StormCloud, CheckMark, VsBadge, Arrow, FlyingMoney, Note, Moto, NameChip。engine/Charts: Card, Counter, Bars, LineChart, MonthGrid、およびmoney()。engine/Stage:mood、tint、zoom、focus。
トピックに新しい小道具が必要な場合、同じインクスタイルでストーリーファイルに描き、再利用可能であればengine/Props.tsxに移動します。
落とし穴(これらはすべて実際に発生しました)
- Windowsのパス制限。 プロジェクトパスが長すぎて
node_modules内のファイルが260文字を超えると、Remotionが失敗します:スチルでFailed to launch the browser process/spawn ... chrome-headless-shell、フルレンダリングでgetExecutableDirエラー。別のブラウザを指定しても2つ目の問題は解決しません。プロジェクトはD:/videos/<name>のような短いパス(約100文字未満)に配置し、そこからnpm installを実行してください。 - 一時領域。 各バンドルはテンポラリフォルダにコピーされ、削除されません。C:ドライブの空き容量が少ない場合、
RENDER_TMPをstills.mjsに、TEMP/TMPをCLIに設定し、より大きなドライブを指定してください。 <Show>のデフォルトはx=0, y=0 であるため、中央揃えのタイトルが半分画面外に出ます。中央揃えの要素には常にx={960}を渡してください。- Koulen体の数字の読みづらさ("12"が"I2"のように見える)。
Titleは既に本文フォントで数字と記号を設定しています。それを迂回しないでください。 - 顔の上のタグ。 立っているフィギュアの頭の高さは約y=470で、上げた手はさらに高くなります。タグはフィギュアの上のy≈300-350に配置してください。
- Remotionは
--mutedで使用可能な音声を出力しないため、常に後ほど示すようにmix.wavをマルチプレクサしてください。 - TSXを大量に含むBashのヒアドキュメントは、Windowsの一部のシェルで解析に失敗する可能性があります。ソースファイルはファイルツールで作成してください。