@onjmin/dtm
    Preparing search index...

    Type Alias VoiceModel

    歌唱合成モデルの実装シグネチャ

    type VoiceModel = {
        breathSample?: (targetSec: number) => Promise<AudioBuffer | null>;
        peekSpeechDurationSec?: (text: string) => number | undefined;
        planSpeech?: (
            text: string,
            options?: SpeechPlanDetailOptions,
        ) => Promise<number | null>;
        planSpeechDetail?: (
            text: string,
            options?: SpeechPlanDetailOptions,
        ) => Promise<SpeechPlanInfo | null>;
        renderEndingToCache?: (
            vowel: string,
            pitch: Units,
            expr?: VoiceExpression,
        ) => Promise<string | null>;
        renderToCache?: (
            syllable: LyricSyllable,
            prevVowel: string,
            pitch: number,
            durationMs: number,
            vibrato?: boolean,
            expr?: VoiceExpression,
            pitchSegments?: PitchSegment[],
        ) => Promise<string | null>;
        reset?: () => void;
        scheduleCached?: (
            key: string,
            t0: number,
            peak: number,
            pan: number,
            reverbSend?: number,
            delaySend?: number,
            destination?: AudioNode,
            continuation?: boolean,
            fadeOut?: boolean,
            fadeIn?: boolean,
            fadeCurve?: FadeStop[],
            durationSec?: number,
        ) => void;
        scheduleSpeech?: (
            key: string,
            t0: number,
            peak: number,
            pan: number,
            reverbSend?: number,
            delaySend?: number,
            destination?: AudioNode,
        ) => void;
        speak?: (
            text: string,
            pitch: number,
            options?: SpeakVoiceOptions,
        ) => Promise<SpeechHandle | null>;
        speakToCache?: (
            text: string,
            pitch: number,
            expr?: VoiceExpression,
            awaitRender?: boolean | "first-chunk",
        ) => Promise<string | null>;
        speechDurationSec?: (key: string) => number | undefined;
        speechReferenceUnits?: () => number | undefined;
        stopAll?: () => void;
        (syllable: LyricSyllable, e: PlayNoteEvent): void;
    }
    Index

    Properties

    breathSample?: (targetSec: number) => Promise<AudioBuffer | null>

    音源が持つ息継ぎ素片(息 息短 b1 など)から、吸う形(包絡の山が後ろ寄り)で targetSec の隙間にいちばん合う長さのものを選んで AudioBuffer で返す。 素片は最大振幅1へ正規化済み。音源に息継ぎ素片が無ければ null (呼び出し側はノイズ合成へ落とす)。候補の PCM は音源ごとに1度だけまとめて引く。

    peekSpeechDurationSec?: (text: string) => number | undefined

    計画済みの語りの長さ(秒)を同期で引く(描画ループ用。未計画なら undefined)。

    planSpeech?: (
        text: string,
        options?: SpeechPlanDetailOptions,
    ) => Promise<number | null>

    語りの計画だけを行い、占める長さ(秒)を返す(ピアノロールの帯表示用)。 長さは基準ピッチに依らないので本文だけで引ける。アセット未取得なら取得から始める。 options の感情・話し方で長さは変わる(省略時 neutral)。

    planSpeechDetail?: (
        text: string,
        options?: SpeechPlanDetailOptions,
    ) => Promise<SpeechPlanInfo | null>

    planSpeech と同じ計画から、長さに加えてモーラ列も返す。

    renderEndingToCache?: (
        vowel: string,
        pitch: Units,
        expr?: VoiceExpression,
    ) => Promise<string | null>

    語尾の素片(連続音バンクの a R n R 等: 母音が自然に抜けていく収録)を 目標ピッチで合成してキャッシュへ積み、キーを返す。音源に無ければ null (呼び出し側はゲインのフェードだけで終える従来どおりになる)。 長さは素片の固定範囲(抜けの部分)から決めるので、呼び出し側は指定しない。

    renderToCache?: (
        syllable: LyricSyllable,
        prevVowel: string,
        pitch: number,
        durationMs: number,
        vibrato?: boolean,
        expr?: VoiceExpression,
        pitchSegments?: PitchSegment[],
    ) => Promise<string | null>

    1音節を合成してキャッシュへ積み、再生に使うキャッシュキーを返す(重い処理はここ)。 ストリーミングスケジューラが「先回り合成」に使う。直前母音は呼び出し側が明示で渡す (モデル内部状態に依存しないので、同一モデルを複数トラックで共有しても干渉しない)。 合成不能(該当音素なし・無声)なら null。klatt 等の軽量モデルは未実装でよい。

    reset?: () => void

    内部状態(直前母音など)を初期化する。

    scheduleCached?: (
        key: string,
        t0: number,
        peak: number,
        pan: number,
        reverbSend?: number,
        delaySend?: number,
        destination?: AudioNode,
        continuation?: boolean,
        fadeOut?: boolean,
        fadeIn?: boolean,
        fadeCurve?: FadeStop[],
        durationSec?: number,
    ) => void

    renderToCache 済みのバッファを絶対時刻 t0(AudioContextクロック秒)へスケジュールする。 t0 は未来の任意時刻でよく、再生はオーディオスレッドが担うのでメインスレッドのもたつきに影響されない。

    scheduleSpeech?: (
        key: string,
        t0: number,
        peak: number,
        pan: number,
        reverbSend?: number,
        delaySend?: number,
        destination?: AudioNode,
    ) => void

    speakToCache 済みの語りを絶対時刻 t0(AudioContext クロック秒)へスケジュールする。 まだ合成中のチャンクは届き次第、同じ t0 基準で置く。t0 を過ぎてから届いた分は 途中から(遅れたぶんを飛ばして)鳴らし、後続との同期を保つ。

    speak?: (
        text: string,
        pitch: number,
        options?: SpeakVoiceOptions,
    ) => Promise<SpeechHandle | null>

    本文をこの音源で読み上げる(MML を介さない単発の語り)。speakToCache と 同じ合成を、発話ごとに止められるハンドル付きで鳴らす。いつ鳴らし始めるか・遅れて 届いたチャンクをどう置くかは SpeakVoiceOptions.awaitRender / SpeakVoiceOptions.lateChunks で選ぶ(scheduleSpeech は常に skip)。 計画不能(読みが取れない・アセット取得失敗)なら null。koe 音源専用。

    speakToCache?: (
        text: string,
        pitch: number,
        expr?: VoiceExpression,
        awaitRender?: boolean | "first-chunk",
    ) => Promise<string | null>

    語り(「…」)を合成してキャッシュへ積み、再生に使うキャッシュキーを返す。 計画(読み・韻律・ユニット選択)が出来た時点で返り、合成はチャンクごとに裏で続く (scheduleSpeech は届いたチャンクから順に置く)。awaitRender は "first-chunk" で最初のチャンクが出るまで(頭出しの貯金用。長文でも再生開始を 塞がない)、true で全チャンクの合成完了まで待つ(書き出し用)。 pitch は話す基準ピッチ(units)。計画不能(読みが取れない・アセット取得失敗)なら null。 koe 音源専用。klatt 等は未実装でよい(その場合は語りは鳴らない)。

    speechDurationSec?: (key: string) => number | undefined

    speakToCache 済みの語りが占める長さ(秒)。未計画なら undefined。

    speechReferenceUnits?: () => number | undefined

    語りの基準ピッチ(units)。この行にノートを置くと音源の素の声の高さで話す。 音源の収録ピッチの中央値(多音階音源では収録セットの中央値)。

    stopAll?: () => void

    スケジュール済みの発音をすべて即停止する(停止・一時停止・シーク時)。