@coeiro-operator/audio 1.0.3 → 1.2.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/README.md +48 -0
- package/dist/audio-player.d.ts +32 -11
- package/dist/audio-player.d.ts.map +1 -1
- package/dist/audio-player.js +236 -210
- package/dist/audio-player.js.map +1 -1
- package/dist/audio-stream-controller.d.ts +27 -7
- package/dist/audio-stream-controller.d.ts.map +1 -1
- package/dist/audio-stream-controller.js +143 -40
- package/dist/audio-stream-controller.js.map +1 -1
- package/dist/audio-synthesizer.d.ts +5 -4
- package/dist/audio-synthesizer.d.ts.map +1 -1
- package/dist/audio-synthesizer.js +36 -23
- package/dist/audio-synthesizer.js.map +1 -1
- package/dist/chunk-generation-manager.d.ts +34 -2
- package/dist/chunk-generation-manager.d.ts.map +1 -1
- package/dist/chunk-generation-manager.js +237 -15
- package/dist/chunk-generation-manager.js.map +1 -1
- package/dist/debug-error-test.d.ts +5 -0
- package/dist/debug-error-test.d.ts.map +1 -0
- package/dist/debug-error-test.js +91 -0
- package/dist/debug-error-test.js.map +1 -0
- package/dist/index.d.ts +18 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -4
- package/dist/index.js.map +1 -1
- package/dist/open-promise.d.ts +18 -0
- package/dist/open-promise.d.ts.map +1 -0
- package/dist/open-promise.js +42 -0
- package/dist/open-promise.js.map +1 -0
- package/dist/queue/speech-queue.d.ts +34 -0
- package/dist/queue/speech-queue.d.ts.map +1 -0
- package/dist/queue/speech-queue.js +36 -0
- package/dist/queue/speech-queue.js.map +1 -0
- package/dist/queue/task-queue.d.ts +52 -0
- package/dist/queue/task-queue.d.ts.map +1 -0
- package/dist/queue/task-queue.js +259 -0
- package/dist/queue/task-queue.js.map +1 -0
- package/dist/queue/types.d.ts +42 -0
- package/dist/queue/types.d.ts.map +1 -0
- package/dist/queue/types.js +5 -0
- package/dist/queue/types.js.map +1 -0
- package/dist/speech-queue.d.ts +4 -49
- package/dist/speech-queue.d.ts.map +1 -1
- package/dist/speech-queue.js +3 -140
- package/dist/speech-queue.js.map +1 -1
- package/dist/speed-utils.d.ts +25 -0
- package/dist/speed-utils.d.ts.map +1 -0
- package/dist/speed-utils.js +77 -0
- package/dist/speed-utils.js.map +1 -0
- package/dist/synthesis-processor.d.ts.map +1 -1
- package/dist/synthesis-processor.js +34 -10
- package/dist/synthesis-processor.js.map +1 -1
- package/dist/test-helpers.d.ts +0 -9
- package/dist/test-helpers.d.ts.map +1 -1
- package/dist/test-helpers.js +1 -80
- package/dist/test-helpers.js.map +1 -1
- package/dist/types.d.ts +41 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/voice-resolver.d.ts.map +1 -1
- package/dist/voice-resolver.js +33 -3
- package/dist/voice-resolver.js.map +1 -1
- package/package.json +4 -6
package/dist/speech-queue.d.ts
CHANGED
|
@@ -1,52 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* src/
|
|
3
|
-
*
|
|
2
|
+
* src/speech-queue.ts: 音声合成キュー管理
|
|
3
|
+
* 後方互換性のためのエクスポート
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
private processCallback;
|
|
8
|
-
private speechQueue;
|
|
9
|
-
private isProcessing;
|
|
10
|
-
private taskIdCounter;
|
|
11
|
-
private errors;
|
|
12
|
-
constructor(processCallback: (task: SpeechTask) => Promise<void>);
|
|
13
|
-
/**
|
|
14
|
-
* 音声タスクをキューに追加(同期的)
|
|
15
|
-
*/
|
|
16
|
-
enqueue(text: string, options?: SynthesizeOptions): SynthesizeResult;
|
|
17
|
-
/**
|
|
18
|
-
* 音声タスクをキューに追加して完了を待つ
|
|
19
|
-
*/
|
|
20
|
-
enqueueAndWait(text: string, options?: SynthesizeOptions): Promise<SynthesizeResult>;
|
|
21
|
-
/**
|
|
22
|
-
* キューに入っているすべてのタスクの完了を待つ
|
|
23
|
-
* @returns エラーが発生した場合はエラーリストを含む結果を返す
|
|
24
|
-
*/
|
|
25
|
-
waitForAllTasks(): Promise<{
|
|
26
|
-
errors: Array<{
|
|
27
|
-
taskId: number;
|
|
28
|
-
error: Error;
|
|
29
|
-
}>;
|
|
30
|
-
}>;
|
|
31
|
-
/**
|
|
32
|
-
* キューの処理を開始
|
|
33
|
-
*/
|
|
34
|
-
private processQueue;
|
|
35
|
-
/**
|
|
36
|
-
* タスクの処理を実行
|
|
37
|
-
*/
|
|
38
|
-
private processTask;
|
|
39
|
-
/**
|
|
40
|
-
* キューの状態を取得
|
|
41
|
-
*/
|
|
42
|
-
getStatus(): {
|
|
43
|
-
queueLength: number;
|
|
44
|
-
isProcessing: boolean;
|
|
45
|
-
nextTaskId: number | null;
|
|
46
|
-
};
|
|
47
|
-
/**
|
|
48
|
-
* キューをクリア
|
|
49
|
-
*/
|
|
50
|
-
clear(): void;
|
|
51
|
-
}
|
|
5
|
+
export { SpeechQueue } from './queue/speech-queue.js';
|
|
6
|
+
export type { SpeechTask } from './queue/speech-queue.js';
|
|
52
7
|
//# sourceMappingURL=speech-queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speech-queue.d.ts","sourceRoot":"","sources":["../src/speech-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"speech-queue.d.ts","sourceRoot":"","sources":["../src/speech-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/speech-queue.js
CHANGED
|
@@ -1,143 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* src/
|
|
3
|
-
*
|
|
2
|
+
* src/speech-queue.ts: 音声合成キュー管理
|
|
3
|
+
* 後方互換性のためのエクスポート
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
export class SpeechQueue {
|
|
7
|
-
processCallback;
|
|
8
|
-
speechQueue = [];
|
|
9
|
-
isProcessing = false;
|
|
10
|
-
taskIdCounter = Date.now();
|
|
11
|
-
errors = [];
|
|
12
|
-
constructor(processCallback) {
|
|
13
|
-
this.processCallback = processCallback;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* 音声タスクをキューに追加(同期的)
|
|
17
|
-
*/
|
|
18
|
-
enqueue(text, options = {}) {
|
|
19
|
-
const taskId = this.taskIdCounter++;
|
|
20
|
-
const task = {
|
|
21
|
-
id: taskId,
|
|
22
|
-
type: 'speech',
|
|
23
|
-
text,
|
|
24
|
-
options,
|
|
25
|
-
timestamp: Date.now(),
|
|
26
|
-
};
|
|
27
|
-
this.speechQueue.push(task);
|
|
28
|
-
// キュー処理を開始
|
|
29
|
-
setTimeout(() => this.processQueue(), 0);
|
|
30
|
-
return {
|
|
31
|
-
success: true,
|
|
32
|
-
taskId,
|
|
33
|
-
queueLength: this.speechQueue.length,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* 音声タスクをキューに追加して完了を待つ
|
|
38
|
-
*/
|
|
39
|
-
async enqueueAndWait(text, options = {}) {
|
|
40
|
-
const taskId = this.taskIdCounter++;
|
|
41
|
-
return new Promise((resolve, reject) => {
|
|
42
|
-
const task = {
|
|
43
|
-
id: taskId,
|
|
44
|
-
type: 'speech',
|
|
45
|
-
text,
|
|
46
|
-
options,
|
|
47
|
-
timestamp: Date.now(),
|
|
48
|
-
resolve: () => resolve({
|
|
49
|
-
success: true,
|
|
50
|
-
taskId,
|
|
51
|
-
queueLength: this.speechQueue.length,
|
|
52
|
-
}),
|
|
53
|
-
reject,
|
|
54
|
-
};
|
|
55
|
-
this.speechQueue.push(task);
|
|
56
|
-
// キュー処理を開始
|
|
57
|
-
setTimeout(() => this.processQueue(), 0);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* キューに入っているすべてのタスクの完了を待つ
|
|
62
|
-
* @returns エラーが発生した場合はエラーリストを含む結果を返す
|
|
63
|
-
*/
|
|
64
|
-
async waitForAllTasks() {
|
|
65
|
-
return new Promise((resolve) => {
|
|
66
|
-
const checkQueue = () => {
|
|
67
|
-
if (this.speechQueue.length === 0 && !this.isProcessing) {
|
|
68
|
-
// エラーリストを返してクリア
|
|
69
|
-
const errors = [...this.errors];
|
|
70
|
-
this.errors = [];
|
|
71
|
-
resolve({ errors });
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
setTimeout(checkQueue, 100);
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
checkQueue();
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* キューの処理を開始
|
|
82
|
-
*/
|
|
83
|
-
async processQueue() {
|
|
84
|
-
if (this.isProcessing) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
if (this.speechQueue.length === 0) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
this.isProcessing = true;
|
|
91
|
-
while (this.speechQueue.length > 0) {
|
|
92
|
-
const task = this.speechQueue.shift();
|
|
93
|
-
if (!task)
|
|
94
|
-
break;
|
|
95
|
-
try {
|
|
96
|
-
await this.processTask(task);
|
|
97
|
-
logger.verbose(`音声タスク完了: ${task.id} (${task.type})`);
|
|
98
|
-
// CLI用完了通知
|
|
99
|
-
if (task.resolve) {
|
|
100
|
-
task.resolve();
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
logger.error(`音声タスクエラー: ${task.id} (${task.type}), ${error.message}`);
|
|
105
|
-
// エラーを保存
|
|
106
|
-
this.errors.push({
|
|
107
|
-
taskId: task.id,
|
|
108
|
-
error: error
|
|
109
|
-
});
|
|
110
|
-
// CLI用エラー通知
|
|
111
|
-
if (task.reject) {
|
|
112
|
-
task.reject(error);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
this.isProcessing = false;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* タスクの処理を実行
|
|
120
|
-
*/
|
|
121
|
-
async processTask(task) {
|
|
122
|
-
// 音声合成タスクの処理
|
|
123
|
-
await this.processCallback(task);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* キューの状態を取得
|
|
127
|
-
*/
|
|
128
|
-
getStatus() {
|
|
129
|
-
return {
|
|
130
|
-
queueLength: this.speechQueue.length,
|
|
131
|
-
isProcessing: this.isProcessing,
|
|
132
|
-
nextTaskId: this.speechQueue[0]?.id || null,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* キューをクリア
|
|
137
|
-
*/
|
|
138
|
-
clear() {
|
|
139
|
-
this.speechQueue = [];
|
|
140
|
-
this.isProcessing = false;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
5
|
+
export { SpeechQueue } from './queue/speech-queue.js';
|
|
143
6
|
//# sourceMappingURL=speech-queue.js.map
|
package/dist/speech-queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speech-queue.js","sourceRoot":"","sources":["../src/speech-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"speech-queue.js","sourceRoot":"","sources":["../src/speech-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* speed-utils.ts: 速度変換ユーティリティ
|
|
3
|
+
*/
|
|
4
|
+
import type { VoiceConfig } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* 速度指定の内部表現(数値のみ)
|
|
7
|
+
*/
|
|
8
|
+
export interface SpeedSpecification {
|
|
9
|
+
rate?: number;
|
|
10
|
+
factor?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 速度指定をCOEIROINKのspeedScale値に変換
|
|
14
|
+
* @param spec - 速度指定
|
|
15
|
+
* @param voiceConfig - 音声設定(スタイル別の話速情報を含む)
|
|
16
|
+
* @returns COEIROINKのspeed値(0.5〜2.0)
|
|
17
|
+
*/
|
|
18
|
+
export declare function convertToSpeed(spec: SpeedSpecification, voiceConfig: VoiceConfig): number;
|
|
19
|
+
/**
|
|
20
|
+
* rateとfactorの両方が指定された場合の検証
|
|
21
|
+
* @param spec - 速度指定
|
|
22
|
+
* @throws 両方が指定されている場合はエラー
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateSpeedParameters(spec: SpeedSpecification): void;
|
|
25
|
+
//# sourceMappingURL=speed-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speed-utils.d.ts","sourceRoot":"","sources":["../src/speed-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAsCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CA8BzF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAItE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* speed-utils.ts: 速度変換ユーティリティ
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from '@coeiro-operator/common';
|
|
5
|
+
/**
|
|
6
|
+
* WPM基準での標準話速
|
|
7
|
+
*/
|
|
8
|
+
const BASE_RATE_WPM = 200;
|
|
9
|
+
const BASE_MORAS_PER_SECOND = 7.5; // 200 WPM時のモーラ/秒
|
|
10
|
+
/**
|
|
11
|
+
* WPMからCOEIROINKのspeed値を計算
|
|
12
|
+
* @param wpm - Words Per Minute
|
|
13
|
+
* @param voiceConfig - 音声設定(スタイル別の話速情報を含む)
|
|
14
|
+
* @returns COEIROINKのspeed値
|
|
15
|
+
*/
|
|
16
|
+
function calculateSpeedFromWPM(wpm, voiceConfig) {
|
|
17
|
+
const targetMorasPerSecond = BASE_MORAS_PER_SECOND * (wpm / BASE_RATE_WPM);
|
|
18
|
+
// 話者の実測速度を取得
|
|
19
|
+
let speakerMorasPerSecond = BASE_MORAS_PER_SECOND;
|
|
20
|
+
logger.debug(`voiceConfig.styleMorasPerSecond: ${JSON.stringify(voiceConfig.styleMorasPerSecond)}`);
|
|
21
|
+
logger.debug(`voiceConfig.selectedStyleId: ${voiceConfig.selectedStyleId}`);
|
|
22
|
+
if (voiceConfig.styleMorasPerSecond && voiceConfig.selectedStyleId !== undefined) {
|
|
23
|
+
// 数値のselectedStyleIdで直接アクセス
|
|
24
|
+
speakerMorasPerSecond = voiceConfig.styleMorasPerSecond[voiceConfig.selectedStyleId] || BASE_MORAS_PER_SECOND;
|
|
25
|
+
logger.debug(`話者固有速度を使用: styleId=${voiceConfig.selectedStyleId} → ${speakerMorasPerSecond} モーラ/秒`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
logger.debug(`デフォルト速度を使用: ${BASE_MORAS_PER_SECOND} モーラ/秒`);
|
|
29
|
+
}
|
|
30
|
+
const speed = targetMorasPerSecond / speakerMorasPerSecond;
|
|
31
|
+
logger.debug(`WPM変換: ${wpm} WPM → ${targetMorasPerSecond.toFixed(2)}モーラ/秒 ÷ ${speakerMorasPerSecond.toFixed(2)}モーラ/秒 → speed=${speed.toFixed(2)}`);
|
|
32
|
+
return speed;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 速度指定をCOEIROINKのspeedScale値に変換
|
|
36
|
+
* @param spec - 速度指定
|
|
37
|
+
* @param voiceConfig - 音声設定(スタイル別の話速情報を含む)
|
|
38
|
+
* @returns COEIROINKのspeed値(0.5〜2.0)
|
|
39
|
+
*/
|
|
40
|
+
export function convertToSpeed(spec, voiceConfig) {
|
|
41
|
+
logger.debug(`convertToSpeed入力 - spec: ${JSON.stringify(spec)}`);
|
|
42
|
+
logger.debug(`convertToSpeed入力 - spec.rate type: ${typeof spec.rate}, value: ${spec.rate}`);
|
|
43
|
+
logger.debug(`convertToSpeed入力 - spec.factor type: ${typeof spec.factor}, value: ${spec.factor}`);
|
|
44
|
+
let speed;
|
|
45
|
+
// factorが優先
|
|
46
|
+
if (spec.factor !== undefined) {
|
|
47
|
+
speed = spec.factor;
|
|
48
|
+
logger.debug(`相対速度: factor=${spec.factor} → speed=${speed}`);
|
|
49
|
+
}
|
|
50
|
+
// rateをWPMとして処理
|
|
51
|
+
else if (spec.rate !== undefined) {
|
|
52
|
+
speed = calculateSpeedFromWPM(spec.rate, voiceConfig);
|
|
53
|
+
logger.debug(`絶対速度: rate=${spec.rate} WPM → speed=${speed.toFixed(2)}`);
|
|
54
|
+
}
|
|
55
|
+
// 未指定
|
|
56
|
+
else {
|
|
57
|
+
speed = 1.0;
|
|
58
|
+
logger.debug('速度未指定: speed=1.0');
|
|
59
|
+
}
|
|
60
|
+
// COEIROINKの制限範囲内に収める
|
|
61
|
+
const clampedSpeed = Math.max(0.5, Math.min(2.0, speed));
|
|
62
|
+
if (clampedSpeed !== speed) {
|
|
63
|
+
logger.warn(`速度を範囲内に制限: ${speed.toFixed(2)} → ${clampedSpeed}`);
|
|
64
|
+
}
|
|
65
|
+
return clampedSpeed;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* rateとfactorの両方が指定された場合の検証
|
|
69
|
+
* @param spec - 速度指定
|
|
70
|
+
* @throws 両方が指定されている場合はエラー
|
|
71
|
+
*/
|
|
72
|
+
export function validateSpeedParameters(spec) {
|
|
73
|
+
if (spec.rate !== undefined && spec.factor !== undefined) {
|
|
74
|
+
throw new Error('rateとfactorは同時に指定できません。どちらか一方を指定してください。');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=speed-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speed-utils.js","sourceRoot":"","sources":["../src/speed-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAWjD;;GAEG;AACH,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,qBAAqB,GAAG,GAAG,CAAC,CAAC,iBAAiB;AAEpD;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,GAAW,EAAE,WAAwB;IAClE,MAAM,oBAAoB,GAAG,qBAAqB,GAAG,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC;IAE3E,aAAa;IACb,IAAI,qBAAqB,GAAG,qBAAqB,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACpG,MAAM,CAAC,KAAK,CAAC,gCAAgC,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC;IAE5E,IAAI,WAAW,CAAC,mBAAmB,IAAI,WAAW,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACjF,4BAA4B;QAC5B,qBAAqB,GAAG,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,qBAAqB,CAAC;QAC9G,MAAM,CAAC,KAAK,CAAC,sBAAsB,WAAW,CAAC,eAAe,MAAM,qBAAqB,QAAQ,CAAC,CAAC;IACrG,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,eAAe,qBAAqB,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG,oBAAoB,GAAG,qBAAqB,CAAC;IAC3D,MAAM,CAAC,KAAK,CACV,UAAU,GAAG,UAAU,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACrI,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAwB,EAAE,WAAwB;IAC/E,MAAM,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,KAAK,CAAC,sCAAsC,OAAO,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5F,MAAM,CAAC,KAAK,CAAC,wCAAwC,OAAO,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAElG,IAAI,KAAa,CAAC;IAElB,YAAY;IACZ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,MAAM,YAAY,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,gBAAgB;SACX,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,gBAAgB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM;SACD,CAAC;QACJ,KAAK,GAAG,GAAG,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACnC,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACzD,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAwB;IAC9D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synthesis-processor.d.ts","sourceRoot":"","sources":["../src/synthesis-processor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"synthesis-processor.d.ts","sourceRoot":"","sources":["../src/synthesis-processor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,OAAO,KAAK,EACV,MAAM,EAEN,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,aAAa;gBAHb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,aAAa;IAGtC;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IAyB/C;;OAEG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;IAiD5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAiCtB;;OAEG;YACW,wBAAwB;IAStC;;OAEG;YACW,iBAAiB;IAyC/B;;OAEG;YACW,sBAAsB;CA6BrC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { logger } from '@coeiro-operator/common';
|
|
5
5
|
import { BUFFER_SIZES, FILTER_SETTINGS } from './constants.js';
|
|
6
|
+
import { convertToSpeed, validateSpeedParameters } from './speed-utils.js';
|
|
6
7
|
export class SynthesisProcessor {
|
|
7
8
|
config;
|
|
8
9
|
audioPlayer;
|
|
@@ -41,13 +42,22 @@ export class SynthesisProcessor {
|
|
|
41
42
|
*/
|
|
42
43
|
async process(text, options = {}) {
|
|
43
44
|
logger.info(`音声合成開始: テキスト="${text.substring(0, 50)}${text.length > 50 ? '...' : ''}"`);
|
|
45
|
+
logger.debug(`process - raw options: ${JSON.stringify(options)}`);
|
|
44
46
|
// オプション解析
|
|
45
47
|
const resolvedOptions = this.resolveOptions(options);
|
|
48
|
+
logger.debug(`process - resolved rate: ${resolvedOptions.rate} (type: ${typeof resolvedOptions.rate})`);
|
|
46
49
|
// サーバー接続確認を最初に行う
|
|
47
50
|
await this.validateServerConnection();
|
|
48
51
|
// 音声設定の解決
|
|
49
52
|
const voiceConfig = await this.voiceResolver.resolveVoiceConfig(resolvedOptions.voice, resolvedOptions.style || undefined, resolvedOptions.allowFallback);
|
|
50
|
-
|
|
53
|
+
// 速度指定を変換(シンプルに両方渡す)
|
|
54
|
+
const speedSpec = {
|
|
55
|
+
rate: typeof resolvedOptions.rate === 'number' ? resolvedOptions.rate : undefined,
|
|
56
|
+
factor: resolvedOptions.factor
|
|
57
|
+
};
|
|
58
|
+
validateSpeedParameters(speedSpec);
|
|
59
|
+
const speed = convertToSpeed(speedSpec, voiceConfig);
|
|
60
|
+
logger.debug(`process - converted speed: ${speed} (type: ${typeof speed})`);
|
|
51
61
|
// 出力モードに応じた処理
|
|
52
62
|
if (resolvedOptions.outputFile) {
|
|
53
63
|
return await this.processFileOutput(text, voiceConfig, speed, resolvedOptions.chunkMode, resolvedOptions.outputFile);
|
|
@@ -62,7 +72,8 @@ export class SynthesisProcessor {
|
|
|
62
72
|
resolveOptions(options) {
|
|
63
73
|
const resolved = {
|
|
64
74
|
voice: options.voice || null,
|
|
65
|
-
rate: options.rate
|
|
75
|
+
rate: options.rate ?? this.config.audio?.defaultRate,
|
|
76
|
+
factor: options.factor,
|
|
66
77
|
outputFile: options.outputFile || null,
|
|
67
78
|
style: options.style || null,
|
|
68
79
|
chunkMode: options.chunkMode || this.config.audio?.splitMode || 'punctuation',
|
|
@@ -93,12 +104,18 @@ export class SynthesisProcessor {
|
|
|
93
104
|
*/
|
|
94
105
|
async processFileOutput(text, voiceConfig, speed, chunkMode, outputFile) {
|
|
95
106
|
logger.info(`ファイル出力モード: ${outputFile}`);
|
|
96
|
-
//
|
|
107
|
+
// Step 1: 音声合成(データ生成のみ)
|
|
108
|
+
logger.info('音声データ生成開始...');
|
|
109
|
+
logger.debug(`合成パラメータ - chunkMode: ${chunkMode}, speed: ${speed}`);
|
|
110
|
+
const generator = this.audioSynthesizer.synthesizeStream(text, voiceConfig, speed, chunkMode);
|
|
111
|
+
// Step 2: データ収集(フラットな処理)
|
|
112
|
+
logger.info('音声データ収集中...');
|
|
97
113
|
const audioChunks = [];
|
|
98
|
-
for await (const audioResult of
|
|
114
|
+
for await (const audioResult of generator) {
|
|
99
115
|
audioChunks.push(audioResult.audioBuffer);
|
|
100
116
|
}
|
|
101
|
-
//
|
|
117
|
+
// Step 3: データ結合
|
|
118
|
+
logger.info('音声データ結合中...');
|
|
102
119
|
const totalLength = audioChunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
|
|
103
120
|
const combinedBuffer = new ArrayBuffer(totalLength);
|
|
104
121
|
const view = new Uint8Array(combinedBuffer);
|
|
@@ -107,7 +124,10 @@ export class SynthesisProcessor {
|
|
|
107
124
|
view.set(new Uint8Array(chunk), offset);
|
|
108
125
|
offset += chunk.byteLength;
|
|
109
126
|
}
|
|
127
|
+
// Step 4: ファイル保存(フラットな呼び出し)
|
|
128
|
+
logger.info('ファイル保存中...');
|
|
110
129
|
await this.audioPlayer.saveAudio(combinedBuffer, outputFile);
|
|
130
|
+
logger.info(`ファイル出力完了: ${outputFile}`);
|
|
111
131
|
return { success: true, outputFile, mode: 'file' };
|
|
112
132
|
}
|
|
113
133
|
/**
|
|
@@ -115,15 +135,19 @@ export class SynthesisProcessor {
|
|
|
115
135
|
*/
|
|
116
136
|
async processStreamingOutput(text, voiceConfig, speed, chunkMode, bufferSize) {
|
|
117
137
|
logger.info('ストリーミング再生モード');
|
|
118
|
-
//
|
|
138
|
+
// Step 1: 音声合成(データ生成のみ)
|
|
139
|
+
logger.info('音声合成開始...');
|
|
140
|
+
logger.debug(`合成パラメータ - chunkMode: ${chunkMode}, speed: ${speed}`);
|
|
141
|
+
const generator = this.audioSynthesizer.synthesizeStream(text, voiceConfig, speed, chunkMode);
|
|
142
|
+
// Step 2: 音声再生(再生のみ) - フラットな呼び出し
|
|
143
|
+
logger.info('音声再生開始...');
|
|
144
|
+
// AudioPlayerの初期化
|
|
119
145
|
if (!(await this.initializeAudioPlayer())) {
|
|
120
146
|
logger.error('音声プレーヤーの初期化に失敗');
|
|
121
147
|
throw new Error('音声プレーヤーの初期化に失敗しました');
|
|
122
148
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
// 真のストリーミング再生:ジェネレータを直接AudioPlayerに渡す
|
|
126
|
-
await this.audioPlayer.playStreamingAudio(this.audioSynthesizer.synthesizeStream(text, voiceConfig, speed, chunkMode), bufferSize);
|
|
149
|
+
// 再生実行
|
|
150
|
+
await this.audioPlayer.playStreamingAudio(generator, bufferSize);
|
|
127
151
|
logger.info('音声ストリーミング再生完了');
|
|
128
152
|
return { success: true, mode: 'streaming' };
|
|
129
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synthesis-processor.js","sourceRoot":"","sources":["../src/synthesis-processor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"synthesis-processor.js","sourceRoot":"","sources":["../src/synthesis-processor.ts"],"names":[],"mappings":"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"}
|
package/dist/test-helpers.d.ts
CHANGED
|
@@ -3,15 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { ConfigManager } from '@coeiro-operator/core';
|
|
5
5
|
import type { Config } from './types.js';
|
|
6
|
-
/**
|
|
7
|
-
* Speakerモックインスタンスを作成
|
|
8
|
-
* Node.js StreamのWritableインターフェースを完全に実装
|
|
9
|
-
*/
|
|
10
|
-
export declare function createMockSpeakerInstance(): any;
|
|
11
|
-
/**
|
|
12
|
-
* エラーを発生させるSpeakerモックインスタンスを作成
|
|
13
|
-
*/
|
|
14
|
-
export declare function createErrorMockSpeakerInstance(): any;
|
|
15
6
|
/**
|
|
16
7
|
* テスト用のConfigManagerモックを作成
|
|
17
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC
|
|
1
|
+
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,GAAE,OAAO,CAAC,MAAM,CAAM,GAAG,aAAa,CAkEtF"}
|
package/dist/test-helpers.js
CHANGED
|
@@ -1,83 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* テスト用ヘルパー関数とモックファクトリ
|
|
3
3
|
*/
|
|
4
|
-
import { vi } from 'vitest';
|
|
5
|
-
/**
|
|
6
|
-
* Speakerモックインスタンスを作成
|
|
7
|
-
* Node.js StreamのWritableインターフェースを完全に実装
|
|
8
|
-
*/
|
|
9
|
-
export function createMockSpeakerInstance() {
|
|
10
|
-
const mockInstance = {
|
|
11
|
-
write: vi.fn((chunk, encoding, callback) => {
|
|
12
|
-
// 引数の数に応じて適切にコールバックを処理
|
|
13
|
-
const cb = typeof encoding === 'function' ? encoding : callback;
|
|
14
|
-
if (cb)
|
|
15
|
-
cb();
|
|
16
|
-
return true;
|
|
17
|
-
}),
|
|
18
|
-
end: vi.fn((chunk, encoding, callback) => {
|
|
19
|
-
// 引数の数に応じて適切にコールバックを処理
|
|
20
|
-
let cb;
|
|
21
|
-
if (typeof chunk === 'function') {
|
|
22
|
-
cb = chunk;
|
|
23
|
-
}
|
|
24
|
-
else if (typeof encoding === 'function') {
|
|
25
|
-
cb = encoding;
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
cb = callback;
|
|
29
|
-
}
|
|
30
|
-
if (cb)
|
|
31
|
-
setTimeout(cb, 10);
|
|
32
|
-
}),
|
|
33
|
-
on: vi.fn(function (event, callback) {
|
|
34
|
-
if (event === 'close') {
|
|
35
|
-
setTimeout(callback, 10);
|
|
36
|
-
}
|
|
37
|
-
return this;
|
|
38
|
-
}),
|
|
39
|
-
once: vi.fn(function (event, callback) {
|
|
40
|
-
if (event === 'close') {
|
|
41
|
-
setTimeout(callback, 10);
|
|
42
|
-
}
|
|
43
|
-
return this;
|
|
44
|
-
}),
|
|
45
|
-
emit: vi.fn(),
|
|
46
|
-
removeListener: vi.fn(function () { return this; }),
|
|
47
|
-
removeAllListeners: vi.fn(function () { return this; }),
|
|
48
|
-
pipe: vi.fn(),
|
|
49
|
-
unpipe: vi.fn(),
|
|
50
|
-
destroy: vi.fn(),
|
|
51
|
-
_writableState: { ended: false },
|
|
52
|
-
writable: true,
|
|
53
|
-
readable: false,
|
|
54
|
-
};
|
|
55
|
-
// thisバインディングを修正
|
|
56
|
-
mockInstance.on = mockInstance.on.bind(mockInstance);
|
|
57
|
-
mockInstance.once = mockInstance.once.bind(mockInstance);
|
|
58
|
-
mockInstance.removeListener = mockInstance.removeListener.bind(mockInstance);
|
|
59
|
-
mockInstance.removeAllListeners = mockInstance.removeAllListeners.bind(mockInstance);
|
|
60
|
-
return mockInstance;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* エラーを発生させるSpeakerモックインスタンスを作成
|
|
64
|
-
*/
|
|
65
|
-
export function createErrorMockSpeakerInstance() {
|
|
66
|
-
const mockInstance = createMockSpeakerInstance();
|
|
67
|
-
mockInstance.on = vi.fn(function (event, callback) {
|
|
68
|
-
if (event === 'error') {
|
|
69
|
-
setTimeout(() => callback(new Error('Mock speaker error')), 10);
|
|
70
|
-
}
|
|
71
|
-
return this;
|
|
72
|
-
}).bind(mockInstance);
|
|
73
|
-
mockInstance.once = vi.fn(function (event, callback) {
|
|
74
|
-
if (event === 'error') {
|
|
75
|
-
setTimeout(() => callback(new Error('Mock speaker error')), 10);
|
|
76
|
-
}
|
|
77
|
-
return this;
|
|
78
|
-
}).bind(mockInstance);
|
|
79
|
-
return mockInstance;
|
|
80
|
-
}
|
|
81
4
|
/**
|
|
82
5
|
* テスト用のConfigManagerモックを作成
|
|
83
6
|
*/
|
|
@@ -88,7 +11,6 @@ export function createMockConfigManager(overrides = {}) {
|
|
|
88
11
|
port: '50032',
|
|
89
12
|
},
|
|
90
13
|
operator: {
|
|
91
|
-
rate: 200,
|
|
92
14
|
timeout: 14400000,
|
|
93
15
|
assignmentStrategy: 'random',
|
|
94
16
|
},
|
|
@@ -140,8 +62,7 @@ export function createMockConfigManager(overrides = {}) {
|
|
|
140
62
|
};
|
|
141
63
|
},
|
|
142
64
|
getAvailableCharacterIds: async () => ['test-speaker-1', 'tsukuyomi'],
|
|
143
|
-
|
|
144
|
-
getRate: async () => mergedConfig.operator.rate,
|
|
65
|
+
getOperatorConfig: async () => mergedConfig.operator,
|
|
145
66
|
getAudioConfig: async () => mergedConfig.audio,
|
|
146
67
|
getConnectionConfig: async () => mergedConfig.connection,
|
|
147
68
|
};
|
package/dist/test-helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"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"}
|