@onjmin/dtm
    Preparing search index...

    Type Alias SingingVoices

    歌唱モデルをまとめて管理し、koeデモ式の「先読みストリーミング合成」で歌わせる高レベルヘルパ。

    再生開始時に startStream を呼ぶと、各音を全力で先回り合成しながら、 出来た音を AudioContext クロックの絶対時刻へ即スケジュールする。再生はオーディオスレッドが 担うため、合成中にメインスレッドがもたついても同期ズレ・音切れが起きない。スロットルは掛けない。

    典型的な使い方(呼び出し側=シーケンサ): await voices.loadModels(models); // .koe をfetch(ローディング表示) await voices.warm(tracks); // 先頭数音だけ先に合成(頭出しの貯金) seq.start(fromStep); // 楽器とUIはシーケンサ voices.startStream(tracks, seq.getStartTime()); // 歌声は同じアンカーで先読み合成

    type SingingVoices = {
        getSpeechReferenceUnits?: (model: string) => number | undefined;
        loadModels: (models: Iterable<string>) => Promise<void>;
        peekSpeechDurationSec?: (model: string, text: string) => number | undefined;
        planSpeech?: (
            model: string,
            text: string,
            options?: SpeechPlanDetailOptions,
        ) => Promise<number | null>;
        planSpeechDetail?: (
            model: string,
            text: string,
            options?: SpeechPlanDetailOptions,
        ) => Promise<SpeechPlanInfo | null>;
        prepareSpeech?: (
            models: Iterable<string>,
            options?: SpeechPrepareOptions,
        ) => Promise<void>;
        registerVoicebanks?: (banks: Record<string, string | Blob>) => void;
        reset: () => void;
        setVolume: (gain: number) => void;
        speak?: (
            model: string,
            text: string,
            options?: SpeakOptions,
        ) => Promise<SpeechHandle | null>;
        startStream: (
            tracks: StreamVoiceTrack[],
            anchorTime: number,
            opts?: StreamPlaybackOptions,
        ) => void;
        stopStream: () => void;
        warm: (
            tracks: StreamVoiceTrack[],
            count?: number,
            onProgress?: (done: number, total: number) => void,
        ) => Promise<void>;
    }
    Index

    Properties

    getSpeechReferenceUnits?: (model: string) => number | undefined

    語りの基準ピッチ(units)。この行にノートを置くと音源の素の声の高さで話す。 音源がロード済みのときだけ返る(ロード前・klatt は undefined)。

    loadModels: (models: Iterable<string>) => Promise<void>

    使用する歌唱モデル(.koe)をロードして完了を待つ。

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

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

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

    語り(「…」)の計画だけを行い、占める長さ(秒)を返す(ピアノロールの帯表示用)。 音源が未ロードならロードし、TTS アセットが未取得なら取得から始める(初回は重い)。 klatt 等の語りに対応しないモデルや、計画できない本文では null。省略可能。

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

    語りの計画だけを行い、長さとモーラ列(口パク・字幕送り用)を返す。 planSpeech と同じ条件で null。省略可能。

    prepareSpeech?: (
        models: Iterable<string>,
        options?: SpeechPrepareOptions,
    ) => Promise<void>

    読み上げに必要なもの(TTS アセット約 45MB と、指定した音源のマニフェスト)を 先に取得する。ゲームのロード画面など、最初の一言で待たせたくない場面で呼ぶ。 進捗は TTS アセットの合算バイト数(Cache API 済みなら一瞬で total に達する)。 何度呼んでも二重取得はしない。

    registerVoicebanks?: (banks: Record<string, string | Blob>) => void

    koe音源カタログへキーワード → .koe URL(または Blob)を追加・上書き登録する。 カスタムボーカル(@@key icon_url koe_url / DawOptions.customVocals)の音源を 再生前に流し込むために使う。同一キーへ同じ値を再登録した場合はロード済み キャッシュを保ったまま無視する。省略可能(外部注入の実装が無くても動くように)。

    reset: () => void

    ストリーム停止+各モデルの内部状態を初期化する。

    setVolume: (gain: number) => void

    マスタ音量(0〜1のゲイン)をリアルタイムに反映する。 発音時にゲインを焼き込む方式だと再生中の音量変更が既にスケジュール済み・ ストリーミング中の音符に効かないため、全モデル共通の GainNode を介して 常時ライブ反映できるようにする。

    speak?: (
        model: string,
        text: string,
        options?: SpeakOptions,
    ) => Promise<SpeechHandle | null>

    本文を指定した音源で読み上げる(MML を介さない単発の語り。セリフ・ナレーション用)。 音源が未ロードならロードし、TTS アセットが未取得なら取得から始める(初回は重い。 prepareSpeech で先に済ませられる)。 klatt 等の語りに対応しないモデル、未知のモデル、計画できない本文では null。

    startStream: (
        tracks: StreamVoiceTrack[],
        anchorTime: number,
        opts?: StreamPlaybackOptions,
    ) => void

    歌声のストリーミング再生を開始する。anchorTime は startSec=0 が鳴るべき AudioContextクロック秒(=シーケンサの開始時刻と一致させること)。 即座に return し、合成は裏で先回り進行する。

    stopStream: () => void

    進行中のストリームを中断し、スケジュール済みの発音をすべて止める(停止・一時停止・シーク)。

    warm: (
        tracks: StreamVoiceTrack[],
        count?: number,
        onProgress?: (done: number, total: number) => void,
    ) => Promise<void>

    各トラック先頭の数音を先に合成してキャッシュへ積む(頭出しの貯金)。 これで再生開始直後の密なフレーズでもアンダーランしにくくなる。count 既定 PREWARM_NOTES。