TSsPlayTime, TSsPlayTimeParams

概要

さくらスクリプトの再生時間を予測します。文字数が多い場合や、ウェイトタグが多い場合には再生時間が長くなります。

ベースウェアや再生環境、またその設定によっては再生時間にばらつきが生じます。それらの定数はTSsPlayTimeParamsコンポーネントが保持します。TSsPlayTimeParamsを複数配置して適宜切り替えることで、いろいろな再生環境での再生時間を予測可能です。

基本の使い方

TSsPlayTimeとTSsPlayTimeParams、そしてTSsParserの各コンポーネントを1個ずつフォームに配置します。

TSsParserの説明を参考に、正しくSsParserのMetaPattern, TagPatternを設定します。

オブジェクトインスペクタより、TSsPlayTimeのSsParserプロパティとPlayTimeParamsプロパティに、それぞれ今置いたコンポーネントを設定します。

SsPlayTime.PlayTime 関数にスクリプトを渡すことで、再生時間を計算して、ミリ秒単位で返します。

継承

TObject - TPersistent - TComponent - TSsPlayTime
TObject - TPersistent - TComponent - TSsPlayTimeParams

リファレンス - TSsPlayTimeのメソッドとプロパティ

property PlayTimeParams: TSsPlayTimeParams
計算に使用するTSsPlayTimeParamsコンポーネントを関連づけます。
property SsParser: TSsParser
さくらスクリプトパーサを関連づけます。PlayTimeメソッドに渡る可能性のあるスクリプトを正しく解釈できるように、MetaPattern、TagPatternを設定してください。また、このSsParserコンポーネントの内容はTSsPlayTimeによって書き換えられます。
function PlayTime(const Script: String): integer;
関連づけられたSsParserとPlayTimeParamsを使って、渡されたスクリプトの再生時間(ミリ秒)を予測して返します。スクリプトを解析してウェイトの数、サーフィス変更の数などをカウントし、SsPlayTimeParamsの各設定項目を係数とした単純な1次結合(線形結合)によって再生時間を予測します。

リファレンス - TSsPlayTimeParamsのプロパティ

時間を指定する場合は、単位はすべてミリ秒(1/1000秒)です。

property ProfileName: String;
このパラメータのセットに任意の名前を付けることができます。「materia標準速度」など、わかりやすい名前を付けてください。コンポーネント自体の動作に影響はありません。
property CostConst: integer;
単純にスクリプト再生予測時間に足される定数値です。例えば実際の1文字目の再生開始までにかなりの遅延が生じるような場合に、正の値を指定しておくと、TSsPlayTime.PlayTimeの戻り値にその値が加わります。デフォルトでは0です。
property CostWait: integer read FCostWait;
ウェイトタグ(\w1〜\w9)について、\w1の1個分のウェイト量を指定します。本来の定義では\w1は50msのウェイトと定義されていますが、再生環境や設定によって、ウェイト量は異なります。なお、\w2〜\w9は、それぞれ\w1の正確に2〜9倍のウェイト量であると仮定されています。
property CostHiResWait: integer;
高精度ウェイト\_w[1]のウェイト量です。\_w[n]は\_w[1]のn倍のウェイト量となります。定義からして1msになると思いますが念のため用意されています。
property CostSurface: integer;
サーフィスの1個の切り替えにかかる時間です。なお、シンクロナイズドセクションの場合、2つのサーフィスが同時に切り替わることになりますが、それは考慮されません。またこの値は、再生するマシンの環境によって最も大きく左右されがちなパラメータですので、慎重に決定してください(サーフィスの変更が激しい長文スクリプトでない限り最終結果に大きな影響はないかもしれませんが)
property CostChar: integer;
半角文字1文字分の再生(SpecialCharsに指定されているものを除く)にかかる時間です。
property CostDBChar: integer;
全角文字1文字分の再生(SpecialCharsに指定されているものを除く)にかかる時間です。現在のところ、この値をCostCharと同じとするべき再生環境と、CostDBCharの2倍の再生時間をかける再生環境が存在しているようです。前者のような再生環境では、英文等の再生が比較的遅く見えることになります。
property CostQuickChar: integer;
クイックセクションの場合に1文字の再生にかける時間です。これは全角・半角を区別しません。理想的にはクイックセクション内での文字再生時間はゼロですが、環境によっては小さな正の値を指定することで、予測精度が高まることがあります。
property SpecialChars: TSsPlayTimeSpecialChars;
上記の半角文字・全角文字の予測の例外を指定します。いくつかの再生環境では、句読点に自動的に長めのウェイトをとるものが存在しますので、そのようなものをここで指定してください。設定するのは、TSsPlayTimeSpecialChar型のコレクションであり、Charに文字を、Waitにその文字を再生する場合の時間を指定します。Charは1文字(ダブルバイト文字可)で指定してください。

注意

ベースウェアによる再生時間調整の方針

(記述は、2003年8月現在の状況を元にしています)

ほとんどの再生環境では、スクリプトは実時間とは同期せずに再生されます。例えばPCの負荷が高まったため、1文字表示する間に数秒のラグが生じた、という場合でも、その遅れを取り戻すような処理はなく、淡々と、1文字表示しては規定のウェイト分待ち、1回サーフィスを切り替えて、1文字表示しては規定のウェイト分待ち…というように再生されています。

それに対して、materia互換ベースウェアの一つであるSSPでは、理想のタイムラインより遅れた場合に、その遅れを取り戻すような処理が組み込まれています。理想のタイムラインは、クイックセクションやサーフィス変更のコストをゼロとし、ウェイトタグと通常の発話でのみ時間が進むものとして計算されています。MIDIプレーヤーが全てのノートのタイミングを制御してテンポがずれないのと同様に、SSPではそれぞれの発話の文字出現時刻は完全に制御されています。

TSsPlayTimeの再生時刻予測は、SSPのような方針で実装されている再生環境については、理論上100%正確なものにすることが可能です。逆に、その他多くの再生環境においては、サーフィス変更のタグが実行されることで平均どの程度の時間を使うのか、クイックセクションでは1文字表示するのに平均どの程度かかっているのか、などを実測に基づいて決定することで、TSsPlayTimeParamsの各プロパティを決定していく必要があり、PC環境の差などを考慮する必要もあるため、ある程度の誤差が発生します。