@coeiro-operator/audio 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,77 @@
1
+ /**
2
+ * src/core/say/chunk-generation-manager.ts: 並行チャンク生成管理
3
+ * 複数チャンクの生成を並行して行い、完成順序ではなく論理順序で管理
4
+ */
5
+ import type { Chunk, AudioResult, VoiceConfig } from './types.js';
6
+ export interface GenerationTask {
7
+ chunk: Chunk;
8
+ voiceConfig: VoiceConfig;
9
+ speed: number;
10
+ startTime: number;
11
+ promise: Promise<AudioResult>;
12
+ }
13
+ export interface GenerationOptions {
14
+ maxConcurrency: number;
15
+ delayBetweenRequests: number;
16
+ pauseUntilFirstComplete: boolean;
17
+ }
18
+ /**
19
+ * チャンク生成の並行制御管理クラス
20
+ */
21
+ export declare class ChunkGenerationManager {
22
+ private activeTasks;
23
+ private completedResults;
24
+ private options;
25
+ private synthesizeFunction;
26
+ private firstChunkCompleted;
27
+ constructor(synthesizeFunction: (chunk: Chunk, voiceConfig: VoiceConfig, speed: number) => Promise<AudioResult>, options?: Partial<GenerationOptions>);
28
+ /**
29
+ * チャンクの生成を開始(並行制御あり)
30
+ */
31
+ startGeneration(chunk: Chunk, voiceConfig: VoiceConfig, speed: number): Promise<void>;
32
+ /**
33
+ * 指定されたチャンクの生成結果を取得(完了まで待機)
34
+ */
35
+ getResult(chunkIndex: number): Promise<AudioResult>;
36
+ /**
37
+ * 指定されたチャンクが生成完了しているかチェック
38
+ */
39
+ isCompleted(chunkIndex: number): boolean;
40
+ /**
41
+ * 指定されたチャンクが生成中かチェック
42
+ */
43
+ isInProgress(chunkIndex: number): boolean;
44
+ /**
45
+ * 現在の並行生成数を取得
46
+ */
47
+ getActiveConcurrency(): number;
48
+ /**
49
+ * 完了待ちの結果数を取得
50
+ */
51
+ getPendingResultsCount(): number;
52
+ /**
53
+ * すべてのタスクの完了を待機
54
+ */
55
+ waitForAllTasks(): Promise<void>;
56
+ /**
57
+ * すべてのタスクをクリア
58
+ */
59
+ clear(): void;
60
+ /**
61
+ * 生成統計情報を取得
62
+ */
63
+ getStats(): {
64
+ activeTasks: number;
65
+ completedResults: number;
66
+ totalMemoryUsage: number;
67
+ };
68
+ private waitForAnyTaskCompletion;
69
+ /**
70
+ * 初回チャンク(チャンク0)の完了を待機
71
+ */
72
+ private waitForFirstChunkCompletion;
73
+ private onTaskCompleted;
74
+ private onTaskFailed;
75
+ private delay;
76
+ }
77
+ //# sourceMappingURL=chunk-generation-manager.d.ts.map
@@ -0,0 +1,178 @@
1
+ /**
2
+ * src/core/say/chunk-generation-manager.ts: 並行チャンク生成管理
3
+ * 複数チャンクの生成を並行して行い、完成順序ではなく論理順序で管理
4
+ */
5
+ import { logger } from '@coeiro-operator/common';
6
+ /**
7
+ * チャンク生成の並行制御管理クラス
8
+ */
9
+ export class ChunkGenerationManager {
10
+ activeTasks = new Map();
11
+ completedResults = new Map();
12
+ options;
13
+ synthesizeFunction;
14
+ firstChunkCompleted = false; // 初回チャンク完了フラグ
15
+ constructor(synthesizeFunction, options = {}) {
16
+ this.synthesizeFunction = synthesizeFunction;
17
+ this.options = {
18
+ maxConcurrency: 2,
19
+ delayBetweenRequests: 100, // 間隔を増加して安定性向上
20
+ pauseUntilFirstComplete: true, // デフォルトで初回ポーズを有効化
21
+ ...options,
22
+ };
23
+ }
24
+ /**
25
+ * チャンクの生成を開始(並行制御あり)
26
+ */
27
+ async startGeneration(chunk, voiceConfig, speed) {
28
+ // 初回ポーズ機能: 初回チャンク完了まで後続チャンクの生成を待機
29
+ if (this.options.pauseUntilFirstComplete && chunk.index > 0 && !this.firstChunkCompleted) {
30
+ logger.debug(`チャンク${chunk.index}: 初回チャンク完了まで生成をポーズ`);
31
+ await this.waitForFirstChunkCompletion();
32
+ }
33
+ // 並行数制限のチェック
34
+ while (this.activeTasks.size >= this.options.maxConcurrency) {
35
+ await this.waitForAnyTaskCompletion();
36
+ }
37
+ // 新しい生成タスクを開始
38
+ const task = {
39
+ chunk,
40
+ voiceConfig,
41
+ speed,
42
+ startTime: Date.now(),
43
+ promise: this.synthesizeFunction(chunk, voiceConfig, speed),
44
+ };
45
+ this.activeTasks.set(chunk.index, task);
46
+ logger.debug(`チャンク${chunk.index}の生成開始 (並行数: ${this.activeTasks.size}, 初回完了: ${this.firstChunkCompleted})`);
47
+ // 生成完了時の処理を設定
48
+ task.promise
49
+ .then((result) => {
50
+ this.onTaskCompleted(chunk.index, result);
51
+ })
52
+ .catch((error) => {
53
+ this.onTaskFailed(chunk.index, error);
54
+ });
55
+ // リクエスト間隔の調整
56
+ if (this.options.delayBetweenRequests > 0) {
57
+ await this.delay(this.options.delayBetweenRequests);
58
+ }
59
+ }
60
+ /**
61
+ * 指定されたチャンクの生成結果を取得(完了まで待機)
62
+ */
63
+ async getResult(chunkIndex) {
64
+ // 既に完了している場合
65
+ if (this.completedResults.has(chunkIndex)) {
66
+ const result = this.completedResults.get(chunkIndex);
67
+ this.completedResults.delete(chunkIndex); // 取得後はクリア
68
+ return result;
69
+ }
70
+ // 生成中の場合は完了を待機
71
+ const activeTask = this.activeTasks.get(chunkIndex);
72
+ if (activeTask) {
73
+ return await activeTask.promise;
74
+ }
75
+ throw new Error(`チャンク${chunkIndex}の生成タスクが見つかりません`);
76
+ }
77
+ /**
78
+ * 指定されたチャンクが生成完了しているかチェック
79
+ */
80
+ isCompleted(chunkIndex) {
81
+ return this.completedResults.has(chunkIndex);
82
+ }
83
+ /**
84
+ * 指定されたチャンクが生成中かチェック
85
+ */
86
+ isInProgress(chunkIndex) {
87
+ return this.activeTasks.has(chunkIndex);
88
+ }
89
+ /**
90
+ * 現在の並行生成数を取得
91
+ */
92
+ getActiveConcurrency() {
93
+ return this.activeTasks.size;
94
+ }
95
+ /**
96
+ * 完了待ちの結果数を取得
97
+ */
98
+ getPendingResultsCount() {
99
+ return this.completedResults.size;
100
+ }
101
+ /**
102
+ * すべてのタスクの完了を待機
103
+ */
104
+ async waitForAllTasks() {
105
+ const promises = Array.from(this.activeTasks.values()).map(task => task.promise);
106
+ await Promise.all(promises);
107
+ }
108
+ /**
109
+ * すべてのタスクをクリア
110
+ */
111
+ clear() {
112
+ this.activeTasks.clear();
113
+ this.completedResults.clear();
114
+ this.firstChunkCompleted = false; // 初回完了フラグもリセット
115
+ }
116
+ /**
117
+ * 生成統計情報を取得
118
+ */
119
+ getStats() {
120
+ let totalMemoryUsage = 0;
121
+ for (const result of this.completedResults.values()) {
122
+ totalMemoryUsage += result.audioBuffer.byteLength;
123
+ }
124
+ return {
125
+ activeTasks: this.activeTasks.size,
126
+ completedResults: this.completedResults.size,
127
+ totalMemoryUsage,
128
+ };
129
+ }
130
+ async waitForAnyTaskCompletion() {
131
+ if (this.activeTasks.size === 0) {
132
+ return;
133
+ }
134
+ const promises = Array.from(this.activeTasks.values()).map(task => task.promise);
135
+ await Promise.race(promises);
136
+ }
137
+ /**
138
+ * 初回チャンク(チャンク0)の完了を待機
139
+ */
140
+ async waitForFirstChunkCompletion() {
141
+ // 既に完了している場合は即座に返す
142
+ if (this.firstChunkCompleted) {
143
+ return;
144
+ }
145
+ // チャンク0のタスクが存在する場合は完了を待機
146
+ const firstTask = this.activeTasks.get(0);
147
+ if (firstTask) {
148
+ await firstTask.promise;
149
+ }
150
+ // ポーリングによる確認(安全のため)
151
+ while (!this.firstChunkCompleted) {
152
+ await this.delay(10); // 10ms間隔でチェック
153
+ }
154
+ }
155
+ onTaskCompleted(chunkIndex, result) {
156
+ const task = this.activeTasks.get(chunkIndex);
157
+ if (task) {
158
+ const duration = Date.now() - task.startTime;
159
+ logger.debug(`チャンク${chunkIndex}生成完了 (所要時間: ${duration}ms)`);
160
+ this.activeTasks.delete(chunkIndex);
161
+ this.completedResults.set(chunkIndex, result);
162
+ // 初回チャンク完了フラグの設定
163
+ if (chunkIndex === 0 && !this.firstChunkCompleted) {
164
+ this.firstChunkCompleted = true;
165
+ logger.debug('初回チャンク完了: 並行生成ポーズを解除');
166
+ }
167
+ }
168
+ }
169
+ onTaskFailed(chunkIndex, error) {
170
+ logger.error(`チャンク${chunkIndex}生成失敗: ${error.message}`);
171
+ this.activeTasks.delete(chunkIndex);
172
+ // エラーの場合は結果をストアしない(getResultで例外が発生)
173
+ }
174
+ delay(ms) {
175
+ return new Promise(resolve => setTimeout(resolve, ms));
176
+ }
177
+ }
178
+ //# sourceMappingURL=chunk-generation-manager.js.map
@@ -0,0 +1,180 @@
1
+ /**
2
+ * src/say/constants.ts: 音声合成システムのデフォルト定数定義
3
+ *
4
+ * 📖 関連ドキュメント:
5
+ * - docs/configuration-options.md - 設定オプション詳細ガイド
6
+ * - docs/installation.md - インストール・セットアップガイド(設定例)
7
+ * - docs/audio-system.md - 音声システム仕様
8
+ * - docs/config-samples/ - 設定ファイルサンプル
9
+ *
10
+ * ⚠️ 重要:これらの定数値を変更した場合は、上記ドキュメントも同期更新が必要です
11
+ *
12
+ * 🔄 設定値同期チェックリスト:
13
+ * 1. constants.ts(このファイル)
14
+ * 2. docs/configuration-options.md の設定表とデフォルト値
15
+ * 3. docs/installation.md の設定例
16
+ * 4. docs/config-samples/*.json のサンプル設定
17
+ * 5. README.md の機能説明(該当する場合)
18
+ */
19
+ export declare const CONNECTION_SETTINGS: {
20
+ /** デフォルトホスト */
21
+ readonly DEFAULT_HOST: "localhost";
22
+ /** デフォルトポート */
23
+ readonly DEFAULT_PORT: "50032";
24
+ };
25
+ export declare const SAMPLE_RATES: {
26
+ /** 音声生成時のサンプルレート(効率重視) */
27
+ readonly SYNTHESIS: 24000;
28
+ /** 再生時のサンプルレート(高品質) */
29
+ readonly PLAYBACK: 48000;
30
+ };
31
+ export declare const AUDIO_FORMAT: {
32
+ /** チャンネル数(モノラル) */
33
+ readonly CHANNELS: 1;
34
+ /** ビット深度 */
35
+ readonly BIT_DEPTH: 16;
36
+ };
37
+ export declare const BUFFER_SIZES: {
38
+ /** デフォルトバッファサイズ(CLI安定性のため2048に増強) */
39
+ readonly DEFAULT: 2048;
40
+ /** 最小バッファサイズ */
41
+ readonly MIN: 256;
42
+ /** 最大バッファサイズ */
43
+ readonly MAX: 8192;
44
+ readonly PRESETS: {
45
+ readonly ULTRA_LOW: {
46
+ readonly HIGH_WATER_MARK: 64;
47
+ readonly LOW_WATER_MARK: 32;
48
+ };
49
+ readonly BALANCED: {
50
+ readonly HIGH_WATER_MARK: 512;
51
+ readonly LOW_WATER_MARK: 256;
52
+ };
53
+ readonly QUALITY: {
54
+ readonly HIGH_WATER_MARK: 512;
55
+ readonly LOW_WATER_MARK: 256;
56
+ };
57
+ };
58
+ };
59
+ export declare const FILTER_SETTINGS: {
60
+ /** ローパスフィルターのデフォルトカットオフ周波数 */
61
+ readonly LOWPASS_CUTOFF: 24000;
62
+ /** ノイズリダクションのデフォルト状態 */
63
+ readonly NOISE_REDUCTION_DEFAULT: false;
64
+ /** ローパスフィルターのデフォルト状態 */
65
+ readonly LOWPASS_FILTER_DEFAULT: false;
66
+ };
67
+ export declare const SPLIT_SETTINGS: {
68
+ readonly DEFAULTS: {
69
+ readonly SMALL_SIZE: 30;
70
+ readonly MEDIUM_SIZE: 50;
71
+ readonly LARGE_SIZE: 100;
72
+ readonly OVERLAP_RATIO: 0.1;
73
+ };
74
+ readonly PUNCTUATION: {
75
+ readonly MAX_CHUNK_SIZE: 150;
76
+ readonly PREFER_SENTENCE: true;
77
+ readonly ALLOW_COMMA_SPLIT: true;
78
+ readonly MIN_CHUNK_SIZE: 10;
79
+ readonly OVERLAP_CHARS: 0;
80
+ };
81
+ readonly PRESETS: {
82
+ readonly ULTRA_LOW: {
83
+ readonly SMALL_SIZE: 20;
84
+ readonly MEDIUM_SIZE: 30;
85
+ readonly LARGE_SIZE: 50;
86
+ readonly OVERLAP_RATIO: 0.05;
87
+ };
88
+ readonly BALANCED: {
89
+ readonly SMALL_SIZE: 30;
90
+ readonly MEDIUM_SIZE: 50;
91
+ readonly LARGE_SIZE: 100;
92
+ readonly OVERLAP_RATIO: 0.1;
93
+ };
94
+ readonly QUALITY: {
95
+ readonly SMALL_SIZE: 40;
96
+ readonly MEDIUM_SIZE: 70;
97
+ readonly LARGE_SIZE: 150;
98
+ readonly OVERLAP_RATIO: 0.15;
99
+ };
100
+ };
101
+ };
102
+ export declare const PADDING_SETTINGS: {
103
+ readonly DEFAULTS: {
104
+ readonly ENABLED: true;
105
+ readonly PRE_PHONEME_LENGTH: 0.01;
106
+ readonly POST_PHONEME_LENGTH: 0.01;
107
+ readonly FIRST_CHUNK_ONLY: true;
108
+ };
109
+ readonly PRESETS: {
110
+ readonly ULTRA_LOW: {
111
+ readonly ENABLED: false;
112
+ readonly PRE_PHONEME_LENGTH: 0;
113
+ readonly POST_PHONEME_LENGTH: 0;
114
+ readonly FIRST_CHUNK_ONLY: true;
115
+ };
116
+ readonly BALANCED: {
117
+ readonly ENABLED: true;
118
+ readonly PRE_PHONEME_LENGTH: 0.01;
119
+ readonly POST_PHONEME_LENGTH: 0.01;
120
+ readonly FIRST_CHUNK_ONLY: true;
121
+ };
122
+ readonly QUALITY: {
123
+ readonly ENABLED: true;
124
+ readonly PRE_PHONEME_LENGTH: 0.02;
125
+ readonly POST_PHONEME_LENGTH: 0.02;
126
+ readonly FIRST_CHUNK_ONLY: false;
127
+ };
128
+ };
129
+ };
130
+ export declare const CROSSFADE_SETTINGS: {
131
+ readonly DEFAULTS: {
132
+ readonly ENABLED: true;
133
+ readonly SKIP_FIRST_CHUNK: true;
134
+ readonly OVERLAP_SAMPLES: 24;
135
+ };
136
+ readonly PRESETS: {
137
+ readonly ULTRA_LOW: {
138
+ readonly ENABLED: false;
139
+ readonly SKIP_FIRST_CHUNK: true;
140
+ readonly OVERLAP_SAMPLES: 0;
141
+ };
142
+ readonly BALANCED: {
143
+ readonly ENABLED: true;
144
+ readonly SKIP_FIRST_CHUNK: true;
145
+ readonly OVERLAP_SAMPLES: 24;
146
+ };
147
+ readonly QUALITY: {
148
+ readonly ENABLED: true;
149
+ readonly SKIP_FIRST_CHUNK: false;
150
+ readonly OVERLAP_SAMPLES: 48;
151
+ };
152
+ };
153
+ };
154
+ export declare const SYNTHESIS_SETTINGS: {
155
+ /** デフォルト話速(WPM) */
156
+ readonly DEFAULT_RATE: 200;
157
+ /** デフォルト音量 */
158
+ readonly DEFAULT_VOLUME: 1;
159
+ /** デフォルト音高 */
160
+ readonly DEFAULT_PITCH: 0;
161
+ /** デフォルトイントネーション */
162
+ readonly DEFAULT_INTONATION: 1;
163
+ };
164
+ export declare const STREAM_SETTINGS: {
165
+ /** チャンク分割の基準文字数 */
166
+ readonly CHUNK_SIZE_CHARS: 50;
167
+ /** チャンク間のオーバーラップ文字数 */
168
+ readonly OVERLAP_CHARS: 5;
169
+ /** 音声バッファサイズ(並列処理数) */
170
+ readonly BUFFER_SIZE: 3;
171
+ /** 音声出力バッファ時間(ms) */
172
+ readonly AUDIO_BUFFER_MS: 100;
173
+ /** 無音パディング時間(ms) */
174
+ readonly SILENCE_PADDING_MS: 50;
175
+ /** 先読みチャンク数 */
176
+ readonly PRELOAD_CHUNKS: 2;
177
+ };
178
+ export type LatencyMode = 'ultra-low' | 'balanced' | 'quality';
179
+ export type SplitMode = 'none' | 'small' | 'medium' | 'large' | 'punctuation';
180
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1,219 @@
1
+ /**
2
+ * src/say/constants.ts: 音声合成システムのデフォルト定数定義
3
+ *
4
+ * 📖 関連ドキュメント:
5
+ * - docs/configuration-options.md - 設定オプション詳細ガイド
6
+ * - docs/installation.md - インストール・セットアップガイド(設定例)
7
+ * - docs/audio-system.md - 音声システム仕様
8
+ * - docs/config-samples/ - 設定ファイルサンプル
9
+ *
10
+ * ⚠️ 重要:これらの定数値を変更した場合は、上記ドキュメントも同期更新が必要です
11
+ *
12
+ * 🔄 設定値同期チェックリスト:
13
+ * 1. constants.ts(このファイル)
14
+ * 2. docs/configuration-options.md の設定表とデフォルト値
15
+ * 3. docs/installation.md の設定例
16
+ * 4. docs/config-samples/*.json のサンプル設定
17
+ * 5. README.md の機能説明(該当する場合)
18
+ */
19
+ // ================================
20
+ // 接続設定
21
+ // ================================
22
+ export const CONNECTION_SETTINGS = {
23
+ /** デフォルトホスト */
24
+ DEFAULT_HOST: 'localhost',
25
+ /** デフォルトポート */
26
+ DEFAULT_PORT: '50032',
27
+ };
28
+ // ================================
29
+ // サンプルレート設定
30
+ // 📄 docs/configuration-options.md: `synthesisRate`, `playbackRate`
31
+ // 📄 docs/audio-system.md: サンプルレート分離の説明
32
+ // ================================
33
+ export const SAMPLE_RATES = {
34
+ /** 音声生成時のサンプルレート(効率重視) */
35
+ SYNTHESIS: 24000,
36
+ /** 再生時のサンプルレート(高品質) */
37
+ PLAYBACK: 48000,
38
+ };
39
+ // ================================
40
+ // 音声フォーマット設定
41
+ // ================================
42
+ export const AUDIO_FORMAT = {
43
+ /** チャンネル数(モノラル) */
44
+ CHANNELS: 1,
45
+ /** ビット深度 */
46
+ BIT_DEPTH: 16,
47
+ };
48
+ // ================================
49
+ // バッファサイズ設定
50
+ // 📄 docs/configuration-options.md: `bufferSize`, `bufferSettings`
51
+ // 📄 docs/installation.md: --buffer-size説明
52
+ // ================================
53
+ export const BUFFER_SIZES = {
54
+ /** デフォルトバッファサイズ(CLI安定性のため2048に増強) */
55
+ DEFAULT: 2048,
56
+ /** 最小バッファサイズ */
57
+ MIN: 256,
58
+ /** 最大バッファサイズ */
59
+ MAX: 8192,
60
+ // プリセット別設定
61
+ PRESETS: {
62
+ ULTRA_LOW: {
63
+ HIGH_WATER_MARK: 64,
64
+ LOW_WATER_MARK: 32,
65
+ },
66
+ BALANCED: {
67
+ HIGH_WATER_MARK: 512,
68
+ LOW_WATER_MARK: 256,
69
+ },
70
+ QUALITY: {
71
+ HIGH_WATER_MARK: 512,
72
+ LOW_WATER_MARK: 256,
73
+ },
74
+ },
75
+ };
76
+ // ================================
77
+ // フィルター設定
78
+ // 📄 docs/configuration-options.md: `processing`セクション
79
+ // 📄 docs/audio-system.md: フィルター技術仕様
80
+ // ================================
81
+ export const FILTER_SETTINGS = {
82
+ /** ローパスフィルターのデフォルトカットオフ周波数 */
83
+ LOWPASS_CUTOFF: 24000,
84
+ /** ノイズリダクションのデフォルト状態 */
85
+ NOISE_REDUCTION_DEFAULT: false,
86
+ /** ローパスフィルターのデフォルト状態 */
87
+ LOWPASS_FILTER_DEFAULT: false,
88
+ };
89
+ // ================================
90
+ // テキスト分割設定
91
+ // 📄 docs/configuration-options.md: `splitMode`, `splitSettings`
92
+ // 📄 docs/installation.md: パフォーマンス最適化の分割設定説明
93
+ // ================================
94
+ export const SPLIT_SETTINGS = {
95
+ DEFAULTS: {
96
+ SMALL_SIZE: 30,
97
+ MEDIUM_SIZE: 50,
98
+ LARGE_SIZE: 100,
99
+ OVERLAP_RATIO: 0.1,
100
+ },
101
+ PUNCTUATION: {
102
+ MAX_CHUNK_SIZE: 150, // 句読点分割時の最大文字数(フォールバック)
103
+ PREFER_SENTENCE: true, // 句点(。)を優先
104
+ ALLOW_COMMA_SPLIT: true, // 読点(、)での分割を許可
105
+ MIN_CHUNK_SIZE: 10, // 最小チャンクサイズ
106
+ OVERLAP_CHARS: 0, // 句読点分割ではオーバーラップなし
107
+ },
108
+ PRESETS: {
109
+ ULTRA_LOW: {
110
+ SMALL_SIZE: 20,
111
+ MEDIUM_SIZE: 30,
112
+ LARGE_SIZE: 50,
113
+ OVERLAP_RATIO: 0.05,
114
+ },
115
+ BALANCED: {
116
+ SMALL_SIZE: 30,
117
+ MEDIUM_SIZE: 50,
118
+ LARGE_SIZE: 100,
119
+ OVERLAP_RATIO: 0.1,
120
+ },
121
+ QUALITY: {
122
+ SMALL_SIZE: 40,
123
+ MEDIUM_SIZE: 70,
124
+ LARGE_SIZE: 150,
125
+ OVERLAP_RATIO: 0.15,
126
+ },
127
+ },
128
+ };
129
+ // ================================
130
+ // パディング設定
131
+ // ================================
132
+ export const PADDING_SETTINGS = {
133
+ DEFAULTS: {
134
+ ENABLED: true,
135
+ PRE_PHONEME_LENGTH: 0.01, // 10ms
136
+ POST_PHONEME_LENGTH: 0.01, // 10ms
137
+ FIRST_CHUNK_ONLY: true,
138
+ },
139
+ PRESETS: {
140
+ ULTRA_LOW: {
141
+ ENABLED: false,
142
+ PRE_PHONEME_LENGTH: 0,
143
+ POST_PHONEME_LENGTH: 0,
144
+ FIRST_CHUNK_ONLY: true,
145
+ },
146
+ BALANCED: {
147
+ ENABLED: true,
148
+ PRE_PHONEME_LENGTH: 0.01,
149
+ POST_PHONEME_LENGTH: 0.01,
150
+ FIRST_CHUNK_ONLY: true,
151
+ },
152
+ QUALITY: {
153
+ ENABLED: true,
154
+ PRE_PHONEME_LENGTH: 0.02,
155
+ POST_PHONEME_LENGTH: 0.02,
156
+ FIRST_CHUNK_ONLY: false,
157
+ },
158
+ },
159
+ };
160
+ // ================================
161
+ // クロスフェード設定
162
+ // ================================
163
+ export const CROSSFADE_SETTINGS = {
164
+ DEFAULTS: {
165
+ ENABLED: true,
166
+ SKIP_FIRST_CHUNK: true,
167
+ OVERLAP_SAMPLES: 24,
168
+ },
169
+ PRESETS: {
170
+ ULTRA_LOW: {
171
+ ENABLED: false,
172
+ SKIP_FIRST_CHUNK: true,
173
+ OVERLAP_SAMPLES: 0,
174
+ },
175
+ BALANCED: {
176
+ ENABLED: true,
177
+ SKIP_FIRST_CHUNK: true,
178
+ OVERLAP_SAMPLES: 24,
179
+ },
180
+ QUALITY: {
181
+ ENABLED: true,
182
+ SKIP_FIRST_CHUNK: false,
183
+ OVERLAP_SAMPLES: 48,
184
+ },
185
+ },
186
+ };
187
+ // ================================
188
+ // 音声合成設定
189
+ // 📄 docs/configuration-options.md: `voice`セクション
190
+ // 📄 docs/installation.md: 基本設定例のrate値
191
+ // ================================
192
+ export const SYNTHESIS_SETTINGS = {
193
+ /** デフォルト話速(WPM) */
194
+ DEFAULT_RATE: 200,
195
+ /** デフォルト音量 */
196
+ DEFAULT_VOLUME: 1.0,
197
+ /** デフォルト音高 */
198
+ DEFAULT_PITCH: 0.0,
199
+ /** デフォルトイントネーション */
200
+ DEFAULT_INTONATION: 1.0,
201
+ };
202
+ // ================================
203
+ // ストリーミング設定
204
+ // ================================
205
+ export const STREAM_SETTINGS = {
206
+ /** チャンク分割の基準文字数 */
207
+ CHUNK_SIZE_CHARS: 50,
208
+ /** チャンク間のオーバーラップ文字数 */
209
+ OVERLAP_CHARS: 5,
210
+ /** 音声バッファサイズ(並列処理数) */
211
+ BUFFER_SIZE: 3,
212
+ /** 音声出力バッファ時間(ms) */
213
+ AUDIO_BUFFER_MS: 100,
214
+ /** 無音パディング時間(ms) */
215
+ SILENCE_PADDING_MS: 50,
216
+ /** 先読みチャンク数 */
217
+ PRELOAD_CHUNKS: 2,
218
+ };
219
+ //# sourceMappingURL=constants.js.map