@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.
- package/LICENSE +14 -14
- package/dist/api.d.ts +36 -2
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +76 -0
- package/dist/api.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +6 -0
- package/dist/client.js.map +1 -1
- package/dist/effect/config.d.ts +43 -0
- package/dist/effect/config.d.ts.map +1 -0
- package/dist/effect/config.js +45 -0
- package/dist/effect/config.js.map +1 -0
- package/dist/effect/context.d.ts +33 -0
- package/dist/effect/context.d.ts.map +1 -0
- package/dist/effect/context.js +10 -0
- package/dist/effect/context.js.map +1 -0
- package/dist/effect/errors.d.ts +130 -0
- package/dist/effect/errors.d.ts.map +1 -0
- package/dist/effect/errors.js +121 -0
- package/dist/effect/errors.js.map +1 -0
- package/dist/effect/index.d.ts +34 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +67 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/effect/queue-manager.d.ts +34 -0
- package/dist/effect/queue-manager.d.ts.map +1 -0
- package/dist/effect/queue-manager.js +59 -0
- package/dist/effect/queue-manager.js.map +1 -0
- package/dist/effect/services/api-service.d.ts +58 -0
- package/dist/effect/services/api-service.d.ts.map +1 -0
- package/dist/effect/services/api-service.js +90 -0
- package/dist/effect/services/api-service.js.map +1 -0
- package/dist/effect/services/audio-generator-service.d.ts +78 -0
- package/dist/effect/services/audio-generator-service.d.ts.map +1 -0
- package/dist/effect/services/audio-generator-service.js +187 -0
- package/dist/effect/services/audio-generator-service.js.map +1 -0
- package/dist/effect/services/audio-player-service.d.ts +101 -0
- package/dist/effect/services/audio-player-service.d.ts.map +1 -0
- package/dist/effect/services/audio-player-service.js +297 -0
- package/dist/effect/services/audio-player-service.js.map +1 -0
- package/dist/effect/services/event-manager-service.d.ts +96 -0
- package/dist/effect/services/event-manager-service.d.ts.map +1 -0
- package/dist/effect/services/event-manager-service.js +208 -0
- package/dist/effect/services/event-manager-service.js.map +1 -0
- package/dist/effect/services/file-manager-service.d.ts +91 -0
- package/dist/effect/services/file-manager-service.d.ts.map +1 -0
- package/dist/effect/services/file-manager-service.js +215 -0
- package/dist/effect/services/file-manager-service.js.map +1 -0
- package/dist/effect/utils.d.ts +118 -0
- package/dist/effect/utils.d.ts.map +1 -0
- package/dist/effect/utils.js +186 -0
- package/dist/effect/utils.js.map +1 -0
- package/dist/error.js.map +1 -1
- package/dist/player.d.ts +110 -0
- package/dist/player.d.ts.map +1 -0
- package/dist/player.js +183 -0
- package/dist/player.js.map +1 -0
- package/dist/queue/audio-player.d.ts +44 -0
- package/dist/queue/audio-player.d.ts.map +1 -0
- package/dist/queue/audio-player.js +344 -0
- package/dist/queue/audio-player.js.map +1 -0
- package/dist/queue/file-manager.js +9 -9
- package/dist/queue/manager.d.ts +134 -0
- package/dist/queue/manager.d.ts.map +1 -0
- package/dist/queue/manager.js +564 -0
- package/dist/queue/manager.js.map +1 -0
- package/dist/queue/queue-service.d.ts.map +1 -1
- package/dist/queue/queue-service.js +16 -4
- package/dist/queue/queue-service.js.map +1 -1
- package/dist/shared-queue-manager.d.ts +119 -0
- package/dist/shared-queue-manager.d.ts.map +1 -0
- package/dist/shared-queue-manager.js +487 -0
- package/dist/shared-queue-manager.js.map +1 -0
- package/dist/state/types.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- 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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"}
|