@kajidog/voicevox-client 0.4.1 → 0.5.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.
Files changed (78) hide show
  1. package/LICENSE +14 -14
  2. package/dist/api.d.ts +36 -2
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +76 -0
  5. package/dist/api.js.map +1 -1
  6. package/dist/client.d.ts +1 -1
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +6 -0
  9. package/dist/client.js.map +1 -1
  10. package/dist/effect/config.d.ts +43 -0
  11. package/dist/effect/config.d.ts.map +1 -0
  12. package/dist/effect/config.js +45 -0
  13. package/dist/effect/config.js.map +1 -0
  14. package/dist/effect/context.d.ts +33 -0
  15. package/dist/effect/context.d.ts.map +1 -0
  16. package/dist/effect/context.js +10 -0
  17. package/dist/effect/context.js.map +1 -0
  18. package/dist/effect/errors.d.ts +130 -0
  19. package/dist/effect/errors.d.ts.map +1 -0
  20. package/dist/effect/errors.js +121 -0
  21. package/dist/effect/errors.js.map +1 -0
  22. package/dist/effect/index.d.ts +34 -0
  23. package/dist/effect/index.d.ts.map +1 -0
  24. package/dist/effect/index.js +67 -0
  25. package/dist/effect/index.js.map +1 -0
  26. package/dist/effect/queue-manager.d.ts +34 -0
  27. package/dist/effect/queue-manager.d.ts.map +1 -0
  28. package/dist/effect/queue-manager.js +59 -0
  29. package/dist/effect/queue-manager.js.map +1 -0
  30. package/dist/effect/services/api-service.d.ts +58 -0
  31. package/dist/effect/services/api-service.d.ts.map +1 -0
  32. package/dist/effect/services/api-service.js +90 -0
  33. package/dist/effect/services/api-service.js.map +1 -0
  34. package/dist/effect/services/audio-generator-service.d.ts +78 -0
  35. package/dist/effect/services/audio-generator-service.d.ts.map +1 -0
  36. package/dist/effect/services/audio-generator-service.js +187 -0
  37. package/dist/effect/services/audio-generator-service.js.map +1 -0
  38. package/dist/effect/services/audio-player-service.d.ts +101 -0
  39. package/dist/effect/services/audio-player-service.d.ts.map +1 -0
  40. package/dist/effect/services/audio-player-service.js +297 -0
  41. package/dist/effect/services/audio-player-service.js.map +1 -0
  42. package/dist/effect/services/event-manager-service.d.ts +96 -0
  43. package/dist/effect/services/event-manager-service.d.ts.map +1 -0
  44. package/dist/effect/services/event-manager-service.js +208 -0
  45. package/dist/effect/services/event-manager-service.js.map +1 -0
  46. package/dist/effect/services/file-manager-service.d.ts +91 -0
  47. package/dist/effect/services/file-manager-service.d.ts.map +1 -0
  48. package/dist/effect/services/file-manager-service.js +215 -0
  49. package/dist/effect/services/file-manager-service.js.map +1 -0
  50. package/dist/effect/utils.d.ts +118 -0
  51. package/dist/effect/utils.d.ts.map +1 -0
  52. package/dist/effect/utils.js +186 -0
  53. package/dist/effect/utils.js.map +1 -0
  54. package/dist/error.js.map +1 -1
  55. package/dist/player.d.ts +110 -0
  56. package/dist/player.d.ts.map +1 -0
  57. package/dist/player.js +183 -0
  58. package/dist/player.js.map +1 -0
  59. package/dist/queue/audio-player.d.ts +44 -0
  60. package/dist/queue/audio-player.d.ts.map +1 -0
  61. package/dist/queue/audio-player.js +344 -0
  62. package/dist/queue/audio-player.js.map +1 -0
  63. package/dist/queue/file-manager.js +9 -9
  64. package/dist/queue/manager.d.ts +134 -0
  65. package/dist/queue/manager.d.ts.map +1 -0
  66. package/dist/queue/manager.js +564 -0
  67. package/dist/queue/manager.js.map +1 -0
  68. package/dist/queue/queue-service.d.ts.map +1 -1
  69. package/dist/queue/queue-service.js +16 -4
  70. package/dist/queue/queue-service.js.map +1 -1
  71. package/dist/shared-queue-manager.d.ts +119 -0
  72. package/dist/shared-queue-manager.d.ts.map +1 -0
  73. package/dist/shared-queue-manager.js +487 -0
  74. package/dist/shared-queue-manager.js.map +1 -0
  75. package/dist/state/types.js.map +1 -1
  76. package/dist/types.d.ts +28 -0
  77. package/dist/types.d.ts.map +1 -1
  78. package/package.json +1 -1
@@ -0,0 +1,44 @@
1
+ /**
2
+ * 音声再生クラス
3
+ * 音声ファイルの再生処理を担当
4
+ */
5
+ export declare class AudioPlayer {
6
+ private audioElement;
7
+ private ffplayAvailable;
8
+ /**
9
+ * ffplayが利用可能かチェック(結果をキャッシュ)
10
+ * @returns ffplayが利用可能な場合true
11
+ */
12
+ checkFfplayAvailable(): boolean;
13
+ /**
14
+ * ストリーミング再生が有効かどうかを判定
15
+ * 環境変数とffplayの利用可能性をチェック
16
+ * @returns ストリーミング再生が有効な場合true
17
+ */
18
+ isStreamingEnabled(): boolean;
19
+ /**
20
+ * ArrayBufferから直接音声を再生(ffplay使用)
21
+ * @param audioData WAV形式の音声データ
22
+ */
23
+ playAudioFromBuffer(audioData: ArrayBuffer): Promise<void>;
24
+ /**
25
+ * 音声ファイルを再生
26
+ * @param filePath 再生する音声ファイル、またはブラウザ環境ではblobURL
27
+ */
28
+ playAudio(filePath: string): Promise<void>;
29
+ private playAudioInNodejs;
30
+ /**
31
+ * ブラウザ環境での音声再生
32
+ * @param audioUrl 再生するblobURL
33
+ * @param retryCount 再試行回数(内部使用)
34
+ * @returns 再生完了を示すPromise
35
+ */
36
+ private playAudioInBrowser;
37
+ /**
38
+ * エラーをログ出力
39
+ * @param message エラーメッセージ
40
+ * @param error エラーオブジェクト
41
+ */
42
+ logError(message: string, error: unknown): void;
43
+ }
44
+ //# sourceMappingURL=audio-player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-player.d.ts","sourceRoot":"","sources":["../../src/queue/audio-player.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,eAAe,CAAuB;IAE9C;;;OAGG;IACI,oBAAoB,IAAI,OAAO,CAuBrC;IAED;;;;OAIG;IACI,kBAAkB,IAAI,OAAO,CASnC;IAED;;;OAGG;IACU,mBAAmB,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDtE;IAED;;;OAGG;IACU,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtD;YAMa,iBAAiB;IA6E/B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAkH1B;;;;OAIG;IACI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAKrD;CACF"}
@@ -0,0 +1,344 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AudioPlayer = void 0;
37
+ const node_child_process_1 = require("node:child_process");
38
+ const fs = __importStar(require("node:fs"));
39
+ const os = __importStar(require("node:os"));
40
+ const error_1 = require("../error");
41
+ const utils_1 = require("../utils");
42
+ /**
43
+ * 音声再生クラス
44
+ * 音声ファイルの再生処理を担当
45
+ */
46
+ class AudioPlayer {
47
+ audioElement = null;
48
+ ffplayAvailable = null;
49
+ /**
50
+ * ffplayが利用可能かチェック(結果をキャッシュ)
51
+ * @returns ffplayが利用可能な場合true
52
+ */
53
+ checkFfplayAvailable() {
54
+ if (this.ffplayAvailable !== null) {
55
+ return this.ffplayAvailable;
56
+ }
57
+ if ((0, utils_1.isBrowser)()) {
58
+ this.ffplayAvailable = false;
59
+ return false;
60
+ }
61
+ try {
62
+ const platform = os.platform();
63
+ if (platform === 'win32') {
64
+ (0, node_child_process_1.execSync)('where ffplay', { stdio: 'ignore' });
65
+ }
66
+ else {
67
+ (0, node_child_process_1.execSync)('which ffplay', { stdio: 'ignore' });
68
+ }
69
+ this.ffplayAvailable = true;
70
+ }
71
+ catch {
72
+ this.ffplayAvailable = false;
73
+ }
74
+ return this.ffplayAvailable;
75
+ }
76
+ /**
77
+ * ストリーミング再生が有効かどうかを判定
78
+ * 環境変数とffplayの利用可能性をチェック
79
+ * @returns ストリーミング再生が有効な場合true
80
+ */
81
+ isStreamingEnabled() {
82
+ // 環境変数で明示的に無効化されている場合
83
+ const envValue = process.env.VOICEVOX_STREAMING_PLAYBACK;
84
+ if (envValue === 'false' || envValue === '0') {
85
+ return false;
86
+ }
87
+ // ffplayが利用可能かチェック
88
+ return this.checkFfplayAvailable();
89
+ }
90
+ /**
91
+ * ArrayBufferから直接音声を再生(ffplay使用)
92
+ * @param audioData WAV形式の音声データ
93
+ */
94
+ async playAudioFromBuffer(audioData) {
95
+ if ((0, utils_1.isBrowser)()) {
96
+ throw new Error('ストリーミング再生はブラウザ環境ではサポートされていません');
97
+ }
98
+ if (!this.checkFfplayAvailable()) {
99
+ throw new Error('ffplayが利用できません。ffmpegをインストールしてください。');
100
+ }
101
+ return new Promise((resolve, reject) => {
102
+ const platform = os.platform();
103
+ // ffplayでstdinから再生
104
+ const args = ['-nodisp', '-autoexit', '-i', 'pipe:0'];
105
+ const spawnOptions = {
106
+ stdio: ['pipe', 'ignore', 'ignore'],
107
+ };
108
+ // Windowsではウィンドウを非表示にする
109
+ if (platform === 'win32') {
110
+ spawnOptions.windowsHide = true;
111
+ }
112
+ const ffplayProcess = (0, node_child_process_1.spawn)('ffplay', args, spawnOptions);
113
+ ffplayProcess.on('close', (code) => {
114
+ if (code === 0) {
115
+ resolve();
116
+ }
117
+ else {
118
+ reject(new Error(`ffplayプロセスがエラーで終了しました (終了コード: ${code})`));
119
+ }
120
+ });
121
+ ffplayProcess.on('error', (error) => {
122
+ reject(new Error(`ffplayプロセスの起動に失敗しました: ${error.message}`));
123
+ });
124
+ // stdinに音声データを書き込み
125
+ const buffer = Buffer.from(audioData);
126
+ ffplayProcess.stdin?.write(buffer, (err) => {
127
+ if (err) {
128
+ reject(new Error(`音声データの書き込みに失敗しました: ${err.message}`));
129
+ return;
130
+ }
131
+ ffplayProcess.stdin?.end();
132
+ });
133
+ });
134
+ }
135
+ /**
136
+ * 音声ファイルを再生
137
+ * @param filePath 再生する音声ファイル、またはブラウザ環境ではblobURL
138
+ */
139
+ async playAudio(filePath) {
140
+ try {
141
+ if ((0, utils_1.isBrowser)()) {
142
+ // ブラウザでの再生
143
+ return this.playAudioInBrowser(filePath);
144
+ }
145
+ // Node.js環境での再生
146
+ return this.playAudioInNodejs(filePath);
147
+ }
148
+ catch (error) {
149
+ // エラー発生時はハンドリングして再スロー
150
+ throw (0, error_1.handleError)(`音声ファイルの再生中にエラーが発生しました: ${filePath}`, error);
151
+ }
152
+ }
153
+ /**
154
+ * Node.js環境での音声再生
155
+ * @param filePath 再生する音声ファイルのパス
156
+ */
157
+ async playAudioInNodejs(filePath) {
158
+ return new Promise((resolve, reject) => {
159
+ // ファイルの存在確認
160
+ if (!fs.existsSync(filePath)) {
161
+ reject(new Error(`音声ファイルが見つかりません: ${filePath}`));
162
+ return;
163
+ }
164
+ // プラットフォームに応じて音声再生コマンドを選択
165
+ const platform = os.platform();
166
+ let command;
167
+ let args;
168
+ switch (platform) {
169
+ case 'darwin': // macOS
170
+ command = 'afplay';
171
+ args = [filePath];
172
+ break;
173
+ case 'win32': {
174
+ // Windows
175
+ command = 'powershell';
176
+ // より簡単で確実なPowerShellコマンドを使用
177
+ const escapedPath = filePath.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
178
+ args = [
179
+ '-c',
180
+ `Add-Type -AssemblyName presentationCore; $player = New-Object system.windows.media.mediaplayer; $player.open('${escapedPath}'); $player.Volume = 0.5; $player.Play(); Start-Sleep 1; Start-Sleep -s $player.NaturalDuration.TimeSpan.TotalSeconds; Exit;`,
181
+ ];
182
+ break;
183
+ }
184
+ case 'linux': {
185
+ // Linux
186
+ // 利用可能なプレイヤーを順番に試す
187
+ const linuxPlayers = ['aplay', 'paplay', 'play', 'ffplay'];
188
+ command =
189
+ linuxPlayers.find((player) => {
190
+ try {
191
+ const { execSync } = require('node:child_process');
192
+ execSync(`which ${player}`, { stdio: 'ignore' });
193
+ return true;
194
+ }
195
+ catch {
196
+ return false;
197
+ }
198
+ }) || 'aplay'; // デフォルトはaplay
199
+ args = command === 'ffplay' ? ['-nodisp', '-autoexit', filePath] : [filePath];
200
+ break;
201
+ }
202
+ default:
203
+ reject(new Error(`サポートされていないプラットフォームです: ${platform}`));
204
+ return;
205
+ }
206
+ // 音声再生プロセスを実行
207
+ const spawnOptions = {
208
+ stdio: 'ignore', // 標準出力を無視
209
+ };
210
+ // WindowsでPowerShellを使用する場合、ウィンドウを非表示にする
211
+ if (platform === 'win32') {
212
+ spawnOptions.windowsHide = true;
213
+ }
214
+ const audioProcess = (0, node_child_process_1.spawn)(command, args, spawnOptions);
215
+ audioProcess.on('close', (code) => {
216
+ if (code === 0) {
217
+ resolve();
218
+ }
219
+ else {
220
+ reject(new Error(`音声再生プロセスがエラーで終了しました (終了コード: ${code})`));
221
+ }
222
+ });
223
+ audioProcess.on('error', (error) => {
224
+ reject(new Error(`音声再生プロセスの起動に失敗しました: ${error.message}`));
225
+ });
226
+ });
227
+ }
228
+ /**
229
+ * ブラウザ環境での音声再生
230
+ * @param audioUrl 再生するblobURL
231
+ * @param retryCount 再試行回数(内部使用)
232
+ * @returns 再生完了を示すPromise
233
+ */
234
+ playAudioInBrowser(audioUrl, retryCount = 0) {
235
+ return new Promise((resolve, reject) => {
236
+ try {
237
+ console.debug('再生しようとしているURL:', audioUrl, '試行回数:', retryCount);
238
+ // 既存の音声要素があれば停止して削除
239
+ if (this.audioElement) {
240
+ this.audioElement.pause();
241
+ this.audioElement.src = '';
242
+ this.audioElement.load(); // メモリ解放のための明示的なリセット
243
+ }
244
+ // 新しい音声要素を作成
245
+ this.audioElement = new Audio();
246
+ // デバッグ用のイベントリスナー
247
+ this.audioElement.addEventListener('loadstart', () => console.debug('Audio loadstart'));
248
+ this.audioElement.addEventListener('durationchange', () => console.debug('Audio durationchange:', this.audioElement?.duration));
249
+ this.audioElement.addEventListener('loadedmetadata', () => console.debug('Audio loadedmetadata'));
250
+ this.audioElement.addEventListener('canplay', () => console.debug('Audio canplay'));
251
+ // サスペンドイベント処理
252
+ this.audioElement.addEventListener('suspend', () => {
253
+ console.debug('Audio suspended');
254
+ });
255
+ // エラーイベントを詳細に捕捉
256
+ this.audioElement.onerror = (event) => {
257
+ const errorCode = this.audioElement?.error?.code;
258
+ const errorMessage = this.audioElement?.error?.message;
259
+ // 実際にエラーオブジェクトが存在するか確認
260
+ if (errorCode !== undefined || errorMessage) {
261
+ console.error('Audio error details:', {
262
+ code: errorCode,
263
+ message: errorMessage,
264
+ event,
265
+ });
266
+ // 最大3回まで再試行
267
+ if (retryCount < 3) {
268
+ console.warn(`再生に失敗しました。再試行します (${retryCount + 1}/3)...`);
269
+ // 少し待ってから再試行
270
+ setTimeout(() => {
271
+ this.playAudioInBrowser(audioUrl, retryCount + 1)
272
+ .then(resolve)
273
+ .catch(reject);
274
+ }, 300);
275
+ return;
276
+ }
277
+ reject(new Error(`Audio playback error: ${errorMessage || 'Unknown error'} (Code: ${errorCode})`));
278
+ }
279
+ else {
280
+ // エラーオブジェクトがないがイベントが発生した場合は警告として扱う
281
+ console.warn('Audio event triggered but no error details available. Continuing playback...');
282
+ // エラーイベントが発生しても実際のエラーがなければ再生を続行
283
+ // ここでrejectしないことで再生を継続
284
+ }
285
+ };
286
+ // 成功イベント
287
+ this.audioElement.onended = () => {
288
+ console.debug('Audio playback completed successfully');
289
+ resolve();
290
+ };
291
+ // 中断イベント
292
+ this.audioElement.onabort = () => {
293
+ console.debug('Audio playback aborted');
294
+ resolve(); // 中断も完了として扱う
295
+ };
296
+ // 事前にpreloadを設定
297
+ this.audioElement.preload = 'auto';
298
+ // クロスオリジン設定
299
+ this.audioElement.crossOrigin = 'anonymous';
300
+ // ソースを設定してロード
301
+ this.audioElement.src = audioUrl;
302
+ this.audioElement.load();
303
+ // 再生開始
304
+ this.audioElement
305
+ .play()
306
+ .then(() => {
307
+ console.debug('Audio playback started successfully');
308
+ })
309
+ .catch((error) => {
310
+ console.error('Failed to start audio playback:', error);
311
+ // 最大3回まで再試行
312
+ if (retryCount < 3) {
313
+ console.warn(`再生開始に失敗しました。再試行します (${retryCount + 1}/3)...`);
314
+ // 少し待ってから再試行
315
+ setTimeout(() => {
316
+ this.playAudioInBrowser(audioUrl, retryCount + 1)
317
+ .then(resolve)
318
+ .catch(reject);
319
+ }, 300);
320
+ return;
321
+ }
322
+ reject(error);
323
+ });
324
+ }
325
+ catch (error) {
326
+ console.error('Unexpected error in audio playback:', error);
327
+ reject(error);
328
+ }
329
+ });
330
+ }
331
+ /**
332
+ * エラーをログ出力
333
+ * @param message エラーメッセージ
334
+ * @param error エラーオブジェクト
335
+ */
336
+ logError(message, error) {
337
+ // テスト環境ではエラーログを出力しない
338
+ if (!(0, utils_1.isTestEnvironment)()) {
339
+ console.error(message, error);
340
+ }
341
+ }
342
+ }
343
+ exports.AudioPlayer = AudioPlayer;
344
+ //# sourceMappingURL=audio-player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-player.js","sourceRoot":"","sources":["../../src/queue/audio-player.ts"],"names":[],"mappings":"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"}
@@ -264,15 +264,15 @@ export class AudioFileManager {
264
264
  try {
265
265
  // スタイルを追加
266
266
  const style = document.createElement('style');
267
- style.textContent = `
268
- @keyframes downloadStart {
269
- from { opacity: 0.99; }
270
- to { opacity: 1; }
271
- }
272
- .download-animation {
273
- animation-duration: 0.1s;
274
- animation-name: downloadStart;
275
- }
267
+ style.textContent = `
268
+ @keyframes downloadStart {
269
+ from { opacity: 0.99; }
270
+ to { opacity: 1; }
271
+ }
272
+ .download-animation {
273
+ animation-duration: 0.1s;
274
+ animation-name: downloadStart;
275
+ }
276
276
  `;
277
277
  document.head.appendChild(style);
278
278
  // アニメーションクラスを追加
@@ -0,0 +1,134 @@
1
+ import type { VoicevoxApi } from '../api';
2
+ import type { AudioQuery, PlaybackOptions } from '../types';
3
+ import { AudioGenerator } from './audio-generator';
4
+ import { AudioFileManager } from './file-manager';
5
+ import { type QueueEventListener, QueueEventType, type QueueItem, QueueItemStatus, type QueueManager } from './types';
6
+ /**
7
+ * VOICEVOXキュー管理クラス
8
+ * 音声合成タスクのキュー管理と実行を担当
9
+ */
10
+ export declare class VoicevoxQueueManager implements QueueManager {
11
+ private queue;
12
+ private isPlaying;
13
+ private isPaused;
14
+ private prefetchSize;
15
+ private currentPlayingItem;
16
+ private immediatePlayIntervals;
17
+ // 依存コンポーネント
18
+ private api;
19
+ private fileManager;
20
+ private eventManager;
21
+ private audioGenerator;
22
+ private audioPlayer;
23
+ private immediatePlayer; // 即時再生用の専用プレイヤー
24
+ /**
25
+ * コンストラクタ
26
+ * @param apiInstance VOICEVOX APIクライアントのインスタンス
27
+ * @param prefetchSize 事前生成するアイテム数
28
+ */
29
+ constructor(apiInstance: VoicevoxApi, prefetchSize?: number);
30
+ /**
31
+ * キューに新しいテキストを追加(オプション付き)
32
+ */
33
+ enqueueTextWithOptions(text: string, speaker: number, options?: PlaybackOptions): Promise<{
34
+ item: QueueItem;
35
+ promises: {
36
+ start?: Promise<void>;
37
+ end?: Promise<void>;
38
+ };
39
+ }>;
40
+ /**
41
+ * キューに新しいテキストを追加(従来の互換性維持)
42
+ */
43
+ enqueueText(text: string, speaker: number): Promise<QueueItem>;
44
+ /**
45
+ * キューに音声合成用クエリを追加(オプション付き)
46
+ */
47
+ enqueueQueryWithOptions(query: AudioQuery, speaker: number, options?: PlaybackOptions): Promise<{
48
+ item: QueueItem;
49
+ promises: {
50
+ start?: Promise<void>;
51
+ end?: Promise<void>;
52
+ };
53
+ }>;
54
+ /**
55
+ * キューに音声合成用クエリを追加(従来の互換性維持)
56
+ * @param query 音声合成用クエリ
57
+ * @param speaker 話者ID
58
+ * @returns 作成されたキューアイテム
59
+ */
60
+ enqueueQuery(query: AudioQuery, speaker: number): Promise<QueueItem>;
61
+ /**
62
+ * キューからアイテムを削除
63
+ * @param itemId 削除するアイテムのID
64
+ * @returns 削除に成功したかどうか
65
+ */
66
+ removeItem(itemId: string): Promise<boolean>;
67
+ /**
68
+ * キューをクリア
69
+ */
70
+ clearQueue(): Promise<void>;
71
+ // --- 再生制御 ---
72
+ startPlayback(): Promise<void>;
73
+ pausePlayback(): Promise<void>;
74
+ resumePlayback(): Promise<void>;
75
+ /**
76
+ * 次のアイテムを再生する
77
+ * 最初のREADY状態のアイテムを再生します
78
+ */
79
+ playNext(): Promise<void>;
80
+ // --- 再生制御ここまで ---
81
+ /**
82
+ * イベントリスナーを追加
83
+ */
84
+ addEventListener(event: QueueEventType, listener: QueueEventListener): void;
85
+ /**
86
+ * イベントリスナーを削除
87
+ */
88
+ removeEventListener(event: QueueEventType, listener: QueueEventListener): void;
89
+ /**
90
+ * 現在のキュー内のアイテムを取得
91
+ */
92
+ getQueue(): QueueItem[];
93
+ /**
94
+ * 特定のアイテムの状態を取得
95
+ */
96
+ getItemStatus(itemId: string): QueueItemStatus | null;
97
+ private playImmediately;
98
+ private processQueue;
99
+ private prefetchAudio;
100
+ /**
101
+ * アイテムの状態を更新し、イベントを発火
102
+ * @param item 状態を更新するアイテム
103
+ * @param status 新しい状態
104
+ * @private
105
+ */
106
+ private updateItemStatus;
107
+ /**
108
+ * バイナリーデータを一時ファイルに保存
109
+ * @param audioData 音声バイナリーデータ
110
+ * @returns 保存した一時ファイルのパス
111
+ */
112
+ saveTempAudioFile(audioData: ArrayBuffer): Promise<string>;
113
+ /**
114
+ * AudioGeneratorインスタンスを取得
115
+ * @returns AudioGeneratorインスタンス
116
+ */
117
+ getAudioGenerator(): AudioGenerator;
118
+ /**
119
+ * FileManagerインスタンスを取得
120
+ * @returns AudioFileManagerインスタンス
121
+ */
122
+ getFileManager(): AudioFileManager;
123
+ /**
124
+ * API インスタンスを取得
125
+ * @returns VoicevoxApi インスタンス
126
+ */
127
+ getApi(): VoicevoxApi;
128
+ /**
129
+ * 全てのリソースをクリーンアップ
130
+ * 使用していないときに呼び出すことで、メモリリークを防止
131
+ */
132
+ cleanup(): void;
133
+ }
134
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/queue/manager.ts"],"names":[],"mappings":"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"}