### 口パクあいうえおを Lua スクリプトから生成する Source: https://oov.github.io/aviutl_psdtoolkit/psd.html PSDToolKit の口パクあいうえお機能を Lua スクリプトから使用するためのオブジェクト生成コード。patterns テーブルで各母音に対応するレイヤーパターンを割り当て、mode で子音処理方法を、alwaysapply で口パク準備がなくても有効にするかを指定する。生成した lipsync オブジェクトは PSD:addstate に渡して使用する。 ```lua -- あ/い/う/え/お/ん に相当するパターンを割り当てる local patterns = { a = "v1.!口/*あ", i = "v1.!口/*い", u = "v1.!口/*う", e = "v1.!口/*え", o = "v1.!口/*お", N = "v1.!口/*ん" local mode = 1 -- 子音処理 local alwaysapply = true -- 口パク準備がなくても有効 local lipsync = require("PSDToolKit").LipSyncLab.new(patterns, mode, alwaysapply) -- 口パクオブジェクトを生成 -- 実際に使用する場合は以下のように PSD:addstate に与えます -- PSD:addstate(lipsync) ``` -------------------------------- ### 口パク 開閉のみを Lua で生成 (PSDToolKit LipSyncSimple) Source: https://oov.github.io/aviutl_psdtoolkit/psd.html Lua スクリプトから口パク 開閉のみオブジェクトを生成するコード。パターンは閉じから開きの順に配列で指定し、速さと常時適用オプションを設定して PSDToolKit の LipSyncSimple を生成する。生成後は PSD:addstate に渡して使用する。 ```lua -- 上から順に 閉じ から 開き へのパターンを入れておく local patterns = { "v1.!口/*閉じ", "v1.!口/*ほぼ閉じ", "v1.!口/*半開き", "v1.!口/*ほぼ開き", "v1.!口/*開き" } local speed = 1 -- 速さ local alwaysapply = true -- 口パク準備がなくても有効 local lipsync = require("PSDToolKit").LipSyncSimple.new(patterns, speed, alwaysapply) -- 口パクオブジェクトを生成 -- 実際に使用する場合は以下のように PSD:addstate に与えます -- PSD:addstate(lipsync) ``` -------------------------------- ### setting.lua で P.wav_firemode を設定する Source: https://oov.github.io/aviutl_psdtoolkit/setting.html setting.lua の設定例。P.wav_firemode を 1 に変更する。local P と return P の行は削除しないこと。 ```lua local P = {} -- これは消さないこと P.wav_firemode = 1 return P -- これは消さないこと ``` -------------------------------- ### 独自の口パク処理を Lua スクリプトで実装する Source: https://oov.github.io/aviutl_psdtoolkit/psd.html 口パクあいうえおを使わずに独自の口パク処理を実装するための Lua スクリプト例。patterns テーブルに音素ごとのレイヤーパターンを割り当て、PSD.talkstate から現在・前・次の音素情報を取得して PSD:addstate で状態を追記する。ts が nil の場合や音素情報が不足している場合の扱いにも注意が必要。 ```lua -- このスクリプトを「口パク あいうえお」の代わりに挿入することで、 -- 自前の口パク処理を実装できます -- (例えば「スクリプト制御」を追加して dofile('script\\lipsync_example.lua') など) -- それぞれの音素に対応した口の形 -- 必要に応じて好きな子音のパターンの追加もできます -- ちなみに CeVIO で使われる音素は以下のようなものですが、 -- lab ファイルを書き出すソフトによっては方言があるかもしれません -- pau -- 無音部分 -- cl -- 「っ」 -- a/i/u/e/o -- 母音 -- A/I/U/E/O -- 無声化された母音 -- ※例「洗濯機」→「s/e/N/t/a/k/U/k/i」 -- N -- 「ん」 -- k/s/t/n/h/m/y/r/w/g/z/d/b/p -- ky/sh/ch/ny/hy/my/ry/gy/j/by/py -- 子音 -- 無声化された母音は通常の母音を使いまわす --(やらない方が自然にみえることもあります) patterns.A = patterns.A or patterns.a or nil patterns.I = patterns.I or patterns.i or nil patterns.U = patterns.U or patterns.u or nil patterns.E = patterns.E or patterns.e or nil patterns.O = patterns.O or patterns.o or nil -- pau は N を割り当て patterns.pau = patterns.pau or patterns.N or nil -- 現在のPSDオブジェクトから音量と音素情報を取得 local ts = PSD.talkstate -- ts には以下のプロパティがあります -- number ts.frame 「口パク準備」基準でのフレーム数 -- number ts.time 「口パク準備」基準での時間(秒) -- number ts.totalframe 「口パク準備」基準での総フレーム数 -- number ts.totaltime 「口パク準備」基準での総時間(秒) -- number ts.wavfile 「口パク準備」で設定された *.wav ファイル名 -- number ts.locut 「口パク準備」で設定されたローカット周波数 -- number ts.hicut 「口パク準備」で設定されたハイカット周波数 -- number ts.threshold 「口パク準備」で設定されたしきい値 -- number ts.deflocut 「PSD ファイルオブジェクト」で設定されたローカット周波数 -- number ts.defhicut 「PSD ファイルオブジェクト」で設定されたハイカット周波数 -- number ts.defthreshold 「PSD ファイルオブジェクト」で設定されたしきい値 -- number ts.progress 現在の音素の開始地点を0、終了地点を1とした時の現在位置 -- string ts.cur 発音中の音素(ない時は空文字列) -- number ts.cur_start 音素が始まる時間(ない時は0) -- number ts.cur_end 音素が終わる時間(ない時は0) -- string ts.prev 前の音素(ない時は空文字列) -- number ts.prev_start 音素が始まる時間(ない時は0) -- number ts.prev_end 音素が終わる時間(ない時は0) -- string ts.next 次の音素(ない時は空文字列) -- number ts.next_start 音素が始まる時間(ない時は0) -- number ts.next_end 音素が終わる時間(ない時は0) -- ts には以下のメソッドがあります -- number ts:getvolume() 現在の音量を取得します -- boolean ts:curisvowel() 現在発音中の音素が母音の時に 1、無声化された母音の時に -1、それ以外の時に 0 -- boolean ts:previsvowel() 前の音素が母音の時に 1、無声化された母音の時に -1、それ以外の時に 0 -- boolean ts:nextisvowel() 次の音素が母音の時に 1、無声化された母音の時に -1、それ以外の時に 0 -- ただし未設定の場合など、ts が正しく取得できない場合は nil です -- また *.lab ファイルのタイムラインへのドラッグ&ドロップにより音素情報を直接タイムライン上に持っている場合は […] -- PSD:addstate を使うと現在のPSDファイルのレイヤー表示に対して状態を追記できます PSD:addstate(patterns.N) else […] PSD:addstate(patterns[ts.cur]) […] PSD:addstate(patterns[ts.prev]) […] end ``` -------------------------------- ### Lua スクリプトで目パチオブジェクトを作成する Source: https://oov.github.io/aviutl_psdtoolkit/psd.html PSDToolKit の Blinker クラスを使って目パチオブジェクトを生成する Lua コードです。patterns には閉じから開きへのレイヤーパターンを順に指定し、interval、speed、offset で間隔・速さ・タイミングを調整します。生成したオブジェクトは PSD:addstate に渡して使用します。 ```lua -- 上から順に 閉じ から 開き へのパターンを入れておく local patterns = { "v1.!目/*閉じ", "v1.!目/*ほぼ閉じ", "v1.!目/*半目", "v1.!目/*ほぼ開き", "v1.!目/*開き" } local interval = 4 -- 間隔(秒) local speed = 1 -- 速さ local offset = 0 -- オフセット local blinker = require("PSDToolKit").Blinker.new(patterns, interval, speed, offset) -- 目パチオブジェクトを生成 -- 実際に使用する場合は以下のように PSD:addstate に与えます -- PSD:addstate(blinker) ``` -------------------------------- ### P:wav_examodifler_wav から P:wav_examodifler_mergedprep までの関数定義 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html このコードブロックは、PSDToolKit の設定ファイルで使用される 5 つの関数を定義します。各関数は、wav ファイルの割り当てや長さ、リップシンク、多目的スライダー、字幕、マージ前処理の設定を行います。一般的な用途では変更不要です。 ```lua function P:wav_examodifler_wav(exa, values, modifiers) exa:set("ao", "start", values.WAV_START) exa:set("ao", "end", values.WAV_END) exa:set("ao", "group", 1) exa:set("ao.0", "file", values.WAV_PATH) end function P:wav_examodifler_lipsync(exa, values, modifiers) exa:set("vo", "start", values.LIPSYNC_START) exa:set("vo", "end", values.LIPSYNC_END) exa:set("vo", "group", self.wav_lipsync_group) exa:set("vo.0", "param", "file=" .. modifiers.ENCODE_LUA_STRING(values.LIPSYNC_PATH)) end function P:wav_examodifler_mpslider(exa, values, modifiers) exa:set("vo", "start", values.MPSLIDER_START) exa:set("vo", "end", values.MPSLIDER_END) exa:set("vo", "group", self.wav_mpslider_group) for i = 0, self.wav_mpslider-1 do local key = "vo." .. i exa:set(key, "_name", i == 0 and "カスタムオブジェクト" or "アニメーション効果") exa:set(key, "track0", "0.00") exa:set(key, "track1", "0.00") exa:set(key, "track2", "0.00") exa:set(key, "track3", "0.00") exa:set(key, "check0", "0") exa:set(key, "type", "0") exa:set(key, "filter", "2") exa:set(key, "name", "多目的スライダー@PSDToolKit") exa:set(key, "param", "") end local key = "vo." .. self.wav_mpslider exa:set(key, "_name", "標準描画") exa:set(key, "X", "0.0") exa:set(key, "Y", "0.0") exa:set(key, "Z", "0.0") exa:set(key, "拡大率", "100.00") exa:set(key, "透明度", "100.0") exa:set(key, "回転", "0.00") exa:set(key, "blend", "0") end function P:wav_examodifler_subtitle(exa, values, modifiers) exa:set("vo", "start", values.SUBTITLE_START) exa:set("vo", "end", values.SUBTITLE_END) exa:set("vo", "group", self.wav_subtitle_group) local text = values.SUBTITLE_TEXT -- wav_subtitle が 2 の時はテキストをスクリプトとして整形する if self.wav_subtitle == 2 then text = self:wav_subtitle_scripter(text) end exa:set("vo.0", "text", modifiers.ENCODE_TEXT(text)) end function P:wav_examodifler_mergedprep(exa, values, modifiers) local endlen = math.max(values.SUBTITLE_END, values.LIPSYNC_END, values.MPSLIDER_END) exa:set("vo", "start", math.min(values.SUBTITLE_START, values.LIPSYNC_START, values.MPSLIDER_START)) exa:set("vo", "end", endlen) exa:set("vo", "group", "1") local idx = 0 local key = "vo." .. idx exa:set(key, "_name", "テキスト") exa:set(key, "サイズ", "1") exa:set(key, "表示速度", "0.0") exa:set(key, "文字毎に個別オブジェクト", "0") exa:set(key, "移動座標上に表示する", "0") exa:set(key, "自動スクロール", "0") exa:set(key, "B", "0") exa:set(key, "I", "0") exa:set(key, "type", "0") exa:set(key, "autoadjust", "0") exa:set(key, "soft", "0") exa:set(key, "monospace", "0") exa:set(key, "align", "4") exa:set(key, "spacing_x", "0") exa:set(key, "spacing_y", "0") exa:set(key, "precision", "0") exa:set(key, "color", "ffffff") exa:set(key, "color2", "000000") exa:set(key, "font", "MS UI Gothic") exa:set(key, "text", modifiers.ENCODE_TEXT(self:wav_mergedprep_scripter(self.wav_subtitle == 2 and values.SUBTITLE_TEXT or "", { st_mgl = values.SUBTITLE_START - 1, st_mgr = endlen - values.SUBTITLE_END, ls_mgl = values.LIPSYNC_START - 1, ls_mgr = endlen - values.LIPSYNC_END, sl_mgl = values.MPSLIDER_START - 1, sl_mgr = endlen - values.MPSLIDER_END, }))) idx = idx + 1 if self.wav_lipsync == 1 and values.LIPSYNC_PATH ~= nil then key = "vo." .. idx exa:set(key, "_name", "アニメーション効果") exa:set(key, "track0", "0.00") exa:set(key, "track1", "0.00") exa:set(key, "track2", "0.00") exa:set(key, "track3", "0.00") exa:set(key, "check0", "0") exa:set(key, "type", "0") exa:set(key, "filter", "2") exa:set(key, "name", "口パク準備@PSDToolKit") exa:set(key, "param", "file=" .. modifiers.ENCODE_LUA_STRING(values.LIPSYNC_PATH)) idx = idx + 1 end for i = 0, self.wav_mpslider-1 do key = "vo." .. idx exa:set(key, "_name", "アニメーション効果") exa:set(key, "track0", "0.00") exa:set(key, "track1", "0.00") exa:set(key, "track2", "0.00") exa:set(key, "track3", "0.00") exa:set(key, "check0", "0") exa:set(key, "type", "0") exa:set(key, "filter", "2") exa:set(key, "name", "多目的スライダー@PSDToolKit") exa:set(key, "param", "") idx = idx + 1 end key = "vo." .. idx exa:set(key, "_name", "標準描画") exa:set(key, "X", "0.0") exa:set(key, "Y", "0.0") exa:set(key, "Z", "0.0") exa:set(key, "拡大率", "100.00") exa:set(key, "透明度", "100.0") exa:set(key, "回転", "0.00") exa:set(key, "blend", "0") end ``` -------------------------------- ### P.wav_mergedprep_scripter 関数定義 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html テキストを統合準備オブジェクト用に整形するスクリプトの処理内容を設定します。一般的な用途では変更不要です。 ```lua function P:wav_mergedprep_scripter(s, o) if s:sub(-2) ~= "\r\n" then s = s .. "\r\n" end return "' end ``` -------------------------------- ### P.wav_exafinder 設定値の例 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html P.wav_exafinder に設定する値の例。0〜5 の数値または関数を設定します。関数の例では `function P:wav_exafinder(path) return "aaa" end` を設定した場合の動作が示されています。 ```plaintext P.wav_exafinder = 0 ``` ```lua function P:wav_exafinder(path) return "aaa" end ``` -------------------------------- ### P.wav_mpslider_margin_before 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 多目的スライダーが音声ファイルよりも何フレーム早く始まるかを設定します。デフォルトは 0 です。 ```plaintext P.wav_mpslider_margin_before = 0 ``` -------------------------------- ### P.wav_mergedprep 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 口パク準備、多目的スライダー、字幕準備の代わりに統合準備オブジェクトを生成するかを設定します。デフォルトは 0 で統合しません。 ```plaintext P.wav_mergedprep = 0 ``` -------------------------------- ### スクリプト制御で目パチを行う (PSD:addstate) Source: https://oov.github.io/aviutl_psdtoolkit/faq.html 目パチや口パクのみを使いたい場合、アニメーション効果の代わりにスクリプト制御を使用する方法です。1024バイトまで入力可能で、目パチ用フォームで組み立てた内容をクリップボードにコピーし、PSD:addstate 関数にペーストして使用します。 ```lua PSD:addstate(ここに組み立てた内容をペースト) ``` -------------------------------- ### P.wav_mpslider 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 多目的スライダーをいくつ生成するかを指定します。0 を指定すると生成されません。デフォルトは 0 です。 ```plaintext P.wav_mpslider = 0 ``` -------------------------------- ### P.wav_firemode_exo 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 特定の条件を満たす *.exo ファイルを投げ込んだときに追加処理を発動させるかを設定します。デフォルトは 1 で発動します。 ```plaintext P.wav_firemode_exo = 1 ``` -------------------------------- ### P.wav_firemode_wavtxt 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 同じ名前の *.wav と *.txt を一緒に投げ込んだときに追加処理を発動させるかを設定します。デフォルトは 1 で発動します。 ```plaintext P.wav_firemode_wavtxt = 1 ``` -------------------------------- ### P.wav_subtitle_scripter 関数定義 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html テキストを字幕準備に整形するスクリプトの処理内容を設定します。一般的な用途では変更不要です。 ```lua function P:wav_subtitle_scripter(s) if s:sub(-2) ~= "\r\n" then s = s .. "\r\n" end return "' end ``` -------------------------------- ### P.wav_mpslider_margin_after 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 多目的スライダーが音声ファイルよりも何フレーム長く続くかを設定します。デフォルトは 0 です。 ```plaintext P.wav_mpslider_margin_after = 0 ``` -------------------------------- ### P.wav_subtitle_margin_before 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 字幕準備が音声ファイルよりも何フレーム早く始まるかを設定します。デフォルトは 0 です。 ```plaintext P.wav_subtitle_margin_before = 0 ``` -------------------------------- ### P.wav_lipsync_offset 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 口パク準備の配置を指定したフレーム数だけずらします。デフォルトは 0 です。 ```plaintext P.wav_lipsync_offset = 0 ``` -------------------------------- ### P.wav_subtitle 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 同じファイル名で拡張子だけが違う *.txt がある場合に字幕準備を作成するかを設定します。デフォルトは 0 で作成しません。 ```plaintext P.wav_subtitle = 0 ``` -------------------------------- ### P.wav_subtitle_encoding 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html *.txt の文字エンコーディングを設定します。デフォルトは "sjis" で、文字化けする場合は変更します。 ```plaintext P.wav_subtitle_encoding = "sjis" ``` -------------------------------- ### PSD:addstate で複数フォルダーのパーツを手動登録する Source: https://oov.github.io/aviutl_psdtoolkit/tutorial.html 手動で `--track0` のスライダー最大値を増やし、`local values` に追加レイヤーを列挙して `PSD:addstate(values, obj.track0)` で登録する例。パーツが複数フォルダーに分かれている場合に一括登録の代わりに使う。 ```lua --track0:!目,0,9,0,1 -- ↑5個足したので最大値も 4 + 5 = 9 に書き換え local values = { "v1.!目/*通常", "v1.!目/*にっこり", "v1.!目/*ぐるぐる", "v1.!目/*つぶり", "v1.!目2/*追記1", -- ここから下が追加したレイヤー "v1.!目2/*追記2", "v1.!目2/*追記3", "v1.!目2/*追記4", "v1.!目2/*追記5", } PSD:addstate(values, obj.track0) ``` -------------------------------- ### P:wav_subtitle_replacer 関数定義 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 字幕準備のテキストに対して書き換えを行う関数を設定します。渡される文字列は常に UTF-8 です。デフォルトではそのまま返します。 ```lua function P:wav_subtitle_replacer(s) return s -- そのままの状態で返す end ``` -------------------------------- ### subobj.notfound による非表示処理 Source: https://oov.github.io/aviutl_psdtoolkit/subobj.html 依存するオブジェクトがタイムライン上に存在しない場合に、オブジェクトを非表示にするためのスクリプトです。subobj.notfound が true のときに obj.alpha を 0 に設定し、処理を終了します。 ```lua if subobj.notfound then obj.alpha = 0 return end ``` -------------------------------- ### P.wav_lipsync 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html *.wav ファイルを投げ込んだ時に口パク準備を自動生成するかを設定します。デフォルトは 0 で生成しません。 ```plaintext P.wav_lipsync = 0 ``` -------------------------------- ### P:wav_subtitle_replacer 設定例: 文頭の「任意のテキスト>」を削除 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 字幕テキストの文頭にある「任意のテキスト>」を削除する設定例です。UTF-8 のバイト列を使用しています。 ```lua function P:wav_subtitle_replacer(s) s = s:gsub("^.-⎜ᢌᖌ", "") return s end ``` -------------------------------- ### P.wav_firemode 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html *.wav ファイルの投げ込み方法による自動生成の発動条件を設定します。デフォルトは 0 で、Shift キーを押しながら投げ込むと発動します。 ```plaintext P.wav_firemode = 0 ``` -------------------------------- ### P:lab_examodifler and P:lab_lipsync_scripter functions Source: https://oov.github.io/aviutl_psdtoolkit/setting.html Customizes .exa file modification and lip-sync scripting for .lab files. These functions are used together to adjust timing and assign script processing. ```lua function P:lab_examodifler(exa, values, modifiers) exa:set("vo", "start", values.START + 1) exa:set("vo", "end", values.END + 1) exa:set("vo", "group", 1) exa:set("vo.0", "text", modifiers.ENCODE_TEXT(values.LIPSYNC)) end ``` ```lua function P:lab_lipsync_scripter(s) return '' end ``` -------------------------------- ### P.wav_subtitle_margin_after 設定値 Source: https://oov.github.io/aviutl_psdtoolkit/setting.html 字幕準備が音声ファイルよりも何フレーム長く続くかを設定します。デフォルトは 0 です。 ```plaintext P.wav_subtitle_margin_after = 0 ``` -------------------------------- ### *.lab ファイルの形式 Source: https://oov.github.io/aviutl_psdtoolkit/prep.html 音素のタイミング情報を 1/10,000,000 秒単位で記述したテキストベースのファイルです。各行は開始時刻、終了時刻、音素の順で並びます。口パク準備で参照する *.lab ファイルの形式です。 ```text 0 1150000 k 1150000 2400000 o 2400000 2900000 N 2900000 3450000 n 3450000 4350000 i 4350000 5250000 ch 5250000 5850000 i 5850000 6450000 w 6450000 7950000 a ```