@nahisaho/katashiro-generator 0.2.2 → 0.2.4

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 (93) hide show
  1. package/dist/audio/AudioGenerator.d.ts +82 -0
  2. package/dist/audio/AudioGenerator.d.ts.map +1 -0
  3. package/dist/audio/AudioGenerator.js +561 -0
  4. package/dist/audio/AudioGenerator.js.map +1 -0
  5. package/dist/audio/SSMLBuilder.d.ts +114 -0
  6. package/dist/audio/SSMLBuilder.d.ts.map +1 -0
  7. package/dist/audio/SSMLBuilder.js +269 -0
  8. package/dist/audio/SSMLBuilder.js.map +1 -0
  9. package/dist/audio/index.d.ts +10 -0
  10. package/dist/audio/index.d.ts.map +1 -0
  11. package/dist/audio/index.js +12 -0
  12. package/dist/audio/index.js.map +1 -0
  13. package/dist/audio/types.d.ts +322 -0
  14. package/dist/audio/types.d.ts.map +1 -0
  15. package/dist/audio/types.js +102 -0
  16. package/dist/audio/types.js.map +1 -0
  17. package/dist/chart/ChartGenerator.d.ts +120 -0
  18. package/dist/chart/ChartGenerator.d.ts.map +1 -0
  19. package/dist/chart/ChartGenerator.js +328 -0
  20. package/dist/chart/ChartGenerator.js.map +1 -0
  21. package/dist/chart/DiagramGenerator.d.ts +141 -0
  22. package/dist/chart/DiagramGenerator.d.ts.map +1 -0
  23. package/dist/chart/DiagramGenerator.js +350 -0
  24. package/dist/chart/DiagramGenerator.js.map +1 -0
  25. package/dist/chart/MermaidBuilder.d.ts +291 -0
  26. package/dist/chart/MermaidBuilder.d.ts.map +1 -0
  27. package/dist/chart/MermaidBuilder.js +429 -0
  28. package/dist/chart/MermaidBuilder.js.map +1 -0
  29. package/dist/chart/SvgBuilder.d.ts +103 -0
  30. package/dist/chart/SvgBuilder.d.ts.map +1 -0
  31. package/dist/chart/SvgBuilder.js +503 -0
  32. package/dist/chart/SvgBuilder.js.map +1 -0
  33. package/dist/chart/index.d.ts +12 -0
  34. package/dist/chart/index.d.ts.map +1 -0
  35. package/dist/chart/index.js +13 -0
  36. package/dist/chart/index.js.map +1 -0
  37. package/dist/chart/types.d.ts +244 -0
  38. package/dist/chart/types.d.ts.map +1 -0
  39. package/dist/chart/types.js +107 -0
  40. package/dist/chart/types.js.map +1 -0
  41. package/dist/image/ImageGenerator.d.ts +145 -0
  42. package/dist/image/ImageGenerator.d.ts.map +1 -0
  43. package/dist/image/ImageGenerator.js +402 -0
  44. package/dist/image/ImageGenerator.js.map +1 -0
  45. package/dist/image/PromptOptimizer.d.ts +73 -0
  46. package/dist/image/PromptOptimizer.d.ts.map +1 -0
  47. package/dist/image/PromptOptimizer.js +295 -0
  48. package/dist/image/PromptOptimizer.js.map +1 -0
  49. package/dist/image/index.d.ts +10 -0
  50. package/dist/image/index.d.ts.map +1 -0
  51. package/dist/image/index.js +12 -0
  52. package/dist/image/index.js.map +1 -0
  53. package/dist/image/types.d.ts +237 -0
  54. package/dist/image/types.d.ts.map +1 -0
  55. package/dist/image/types.js +97 -0
  56. package/dist/image/types.js.map +1 -0
  57. package/dist/index.d.ts +5 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +40 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/ogp/OGPGenerator.d.ts +97 -0
  62. package/dist/ogp/OGPGenerator.d.ts.map +1 -0
  63. package/dist/ogp/OGPGenerator.js +245 -0
  64. package/dist/ogp/OGPGenerator.js.map +1 -0
  65. package/dist/ogp/OGPSvgBuilder.d.ts +95 -0
  66. package/dist/ogp/OGPSvgBuilder.d.ts.map +1 -0
  67. package/dist/ogp/OGPSvgBuilder.js +383 -0
  68. package/dist/ogp/OGPSvgBuilder.js.map +1 -0
  69. package/dist/ogp/index.d.ts +10 -0
  70. package/dist/ogp/index.d.ts.map +1 -0
  71. package/dist/ogp/index.js +12 -0
  72. package/dist/ogp/index.js.map +1 -0
  73. package/dist/ogp/types.d.ts +183 -0
  74. package/dist/ogp/types.d.ts.map +1 -0
  75. package/dist/ogp/types.js +204 -0
  76. package/dist/ogp/types.js.map +1 -0
  77. package/dist/video/FrameComposer.d.ts +95 -0
  78. package/dist/video/FrameComposer.d.ts.map +1 -0
  79. package/dist/video/FrameComposer.js +325 -0
  80. package/dist/video/FrameComposer.js.map +1 -0
  81. package/dist/video/VideoGenerator.d.ts +82 -0
  82. package/dist/video/VideoGenerator.d.ts.map +1 -0
  83. package/dist/video/VideoGenerator.js +325 -0
  84. package/dist/video/VideoGenerator.js.map +1 -0
  85. package/dist/video/index.d.ts +10 -0
  86. package/dist/video/index.d.ts.map +1 -0
  87. package/dist/video/index.js +12 -0
  88. package/dist/video/index.js.map +1 -0
  89. package/dist/video/types.d.ts +366 -0
  90. package/dist/video/types.d.ts.map +1 -0
  91. package/dist/video/types.js +111 -0
  92. package/dist/video/types.js.map +1 -0
  93. package/package.json +1 -1
@@ -0,0 +1,82 @@
1
+ /**
2
+ * AudioGenerator
3
+ * 音声生成・テキスト読み上げエンジン
4
+ * REQ-MEDIA-005: 音声/ポッドキャスト生成
5
+ */
6
+ import type { AudioFormat, AudioQuality, LanguageCode, VoiceConfig, TTSOptions, PodcastScript, GeneratedAudio, AvailableVoice, AudioGeneratorOptions, TextSegment } from './types.js';
7
+ import { PRESET_VOICES } from './types.js';
8
+ /**
9
+ * 音声生成クラス
10
+ */
11
+ export declare class AudioGenerator {
12
+ private readonly provider;
13
+ private readonly options;
14
+ private readonly defaultTTSOptions;
15
+ constructor(options?: AudioGeneratorOptions);
16
+ /**
17
+ * プロバイダーを作成
18
+ */
19
+ private createProvider;
20
+ /**
21
+ * テキストを音声に変換
22
+ * REQ-MEDIA-005-001: テキスト音声変換
23
+ */
24
+ textToSpeech(text: string, options?: TTSOptions): Promise<GeneratedAudio>;
25
+ /**
26
+ * 複数セグメントから音声を生成
27
+ */
28
+ synthesizeSegments(segments: TextSegment[], options?: TTSOptions): Promise<GeneratedAudio>;
29
+ /**
30
+ * ポッドキャストを生成
31
+ * REQ-MEDIA-005-002: ポッドキャスト形式生成
32
+ */
33
+ generatePodcast(script: PodcastScript): Promise<GeneratedAudio>;
34
+ /**
35
+ * イントロ/アウトロを合成
36
+ */
37
+ private synthesizeIntroOutro;
38
+ /**
39
+ * 利用可能な音声を取得
40
+ */
41
+ listVoices(language?: LanguageCode): Promise<AvailableVoice[]>;
42
+ /**
43
+ * プリセット音声を取得
44
+ */
45
+ getPresetVoice(presetName: keyof typeof PRESET_VOICES): VoiceConfig;
46
+ /**
47
+ * 品質プリセットを取得
48
+ */
49
+ getQualityPreset(quality: AudioQuality): {
50
+ sampleRate: number;
51
+ bitrate: number;
52
+ };
53
+ /**
54
+ * サポートされているフォーマットを取得
55
+ */
56
+ getSupportedFormats(): AudioFormat[];
57
+ /**
58
+ * テキストの推定時間を計算
59
+ */
60
+ estimateDuration(text: string, options?: {
61
+ speed?: number;
62
+ language?: LanguageCode;
63
+ }): number;
64
+ /**
65
+ * 長いテキストを分割して合成
66
+ */
67
+ private synthesizeLongText;
68
+ /**
69
+ * オプションをマージ
70
+ */
71
+ private mergeOptions;
72
+ /**
73
+ * メタデータを作成
74
+ */
75
+ private createMetadata;
76
+ /**
77
+ * 複数のバッファを結合
78
+ */
79
+ private combineBuffers;
80
+ }
81
+ export default AudioGenerator;
82
+ //# sourceMappingURL=AudioGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioGenerator.d.ts","sourceRoot":"","sources":["../../src/audio/AudioGenerator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,aAAa,EAEb,cAAc,EAEd,cAAc,EACd,qBAAqB,EACrB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EAKd,MAAM,YAAY,CAAC;AA4PpB;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAa;gBAEnC,OAAO,GAAE,qBAA0B;IAW/C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;;OAGG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC;IAuD/E;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC;IAsDhG;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA0HrE;;OAEG;YACW,oBAAoB;IAYlC;;OAEG;IACG,UAAU,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAepE;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,OAAO,aAAa,GAAG,WAAW;IAYnE;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAIhF;;OAEG;IACH,mBAAmB,IAAI,WAAW,EAAE;IAIpC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;KAAE,GAAG,MAAM;IAW7F;;OAEG;YACW,kBAAkB;IA+BhC;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,cAAc;CAqCvB;AAGD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,561 @@
1
+ /**
2
+ * AudioGenerator
3
+ * 音声生成・テキスト読み上げエンジン
4
+ * REQ-MEDIA-005: 音声/ポッドキャスト生成
5
+ */
6
+ import { PRESET_VOICES, QUALITY_PRESETS, DEFAULT_TTS_OPTIONS, AudioGeneratorError, AUDIO_ERROR_CODES, } from './types.js';
7
+ import { SSMLBuilder, buildSSML, segmentText } from './SSMLBuilder.js';
8
+ /**
9
+ * モックTTSプロバイダー(テスト用)
10
+ */
11
+ class MockTTSProvider {
12
+ voices = [
13
+ { voiceId: 'ja-JP-Wavenet-A', name: 'Mizuki', language: 'ja-JP', gender: 'female', styles: ['neutral', 'cheerful'] },
14
+ { voiceId: 'ja-JP-Wavenet-C', name: 'Takumi', language: 'ja-JP', gender: 'male', styles: ['neutral', 'newscast'] },
15
+ { voiceId: 'en-US-Wavenet-F', name: 'Joanna', language: 'en-US', gender: 'female', styles: ['neutral', 'conversational'] },
16
+ { voiceId: 'en-US-Wavenet-D', name: 'Matthew', language: 'en-US', gender: 'male', styles: ['neutral'] },
17
+ { voiceId: 'zh-CN-Wavenet-A', name: 'Zhiyu', language: 'zh-CN', gender: 'female', styles: ['neutral'] },
18
+ { voiceId: 'ko-KR-Wavenet-A', name: 'Seoyeon', language: 'ko-KR', gender: 'female', styles: ['neutral'] },
19
+ ];
20
+ async synthesize(text, options) {
21
+ // シミュレートした音声データ生成
22
+ const quality = QUALITY_PRESETS[options.quality ?? 'standard'];
23
+ const duration = this.estimateDuration(text, options.voice?.speed);
24
+ const byteLength = Math.floor(duration * quality.bitrate * 1000 / 8);
25
+ // ダミーデータを生成
26
+ const data = new Uint8Array(byteLength);
27
+ for (let i = 0; i < byteLength; i++) {
28
+ data[i] = Math.floor(Math.random() * 256);
29
+ }
30
+ return {
31
+ data,
32
+ format: options.format ?? 'mp3',
33
+ sampleRate: quality.sampleRate,
34
+ channels: 1,
35
+ duration,
36
+ bitrate: quality.bitrate,
37
+ };
38
+ }
39
+ async listVoices(language) {
40
+ if (language) {
41
+ return this.voices.filter(v => v.language === language);
42
+ }
43
+ return this.voices;
44
+ }
45
+ getSupportedFormats() {
46
+ return ['mp3', 'wav', 'ogg'];
47
+ }
48
+ getMaxTextLength() {
49
+ return 5000;
50
+ }
51
+ estimateDuration(text, speed = 1.0) {
52
+ // 日本語: 約5文字/秒、英語: 約15文字/秒
53
+ const isJapanese = /[\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf]/.test(text);
54
+ const charsPerSecond = isJapanese ? 5 : 15;
55
+ return (text.length / charsPerSecond) / speed;
56
+ }
57
+ }
58
+ /**
59
+ * Google Cloud TTS プロバイダー(スタブ)
60
+ */
61
+ class GoogleTTSProvider {
62
+ // @ts-expect-error - Reserved for future implementation
63
+ _apiKey;
64
+ constructor(apiKey) {
65
+ this._apiKey = apiKey;
66
+ }
67
+ async synthesize(_text, _options) {
68
+ // 実際の実装では Google Cloud TTS API を呼び出す
69
+ throw new AudioGeneratorError('Google Cloud TTS APIキーが設定されていません', AUDIO_ERROR_CODES.PROVIDER_NOT_CONFIGURED, { provider: 'google-tts' });
70
+ }
71
+ async listVoices(_language) {
72
+ throw new AudioGeneratorError('Google Cloud TTS APIキーが設定されていません', AUDIO_ERROR_CODES.PROVIDER_NOT_CONFIGURED, { provider: 'google-tts' });
73
+ }
74
+ getSupportedFormats() {
75
+ return ['mp3', 'wav', 'ogg'];
76
+ }
77
+ getMaxTextLength() {
78
+ return 5000;
79
+ }
80
+ }
81
+ /**
82
+ * Amazon Polly プロバイダー(スタブ)
83
+ */
84
+ class AmazonPollyProvider {
85
+ // @ts-expect-error - Reserved for future implementation
86
+ _credentials;
87
+ constructor(credentials) {
88
+ this._credentials = credentials;
89
+ }
90
+ async synthesize(_text, _options) {
91
+ throw new AudioGeneratorError('Amazon Pollyの認証情報が設定されていません', AUDIO_ERROR_CODES.PROVIDER_NOT_CONFIGURED, { provider: 'amazon-polly' });
92
+ }
93
+ async listVoices(_language) {
94
+ throw new AudioGeneratorError('Amazon Pollyの認証情報が設定されていません', AUDIO_ERROR_CODES.PROVIDER_NOT_CONFIGURED, { provider: 'amazon-polly' });
95
+ }
96
+ getSupportedFormats() {
97
+ return ['mp3', 'ogg'];
98
+ }
99
+ getMaxTextLength() {
100
+ return 3000;
101
+ }
102
+ }
103
+ /**
104
+ * ElevenLabs プロバイダー(スタブ)
105
+ */
106
+ class ElevenLabsProvider {
107
+ // @ts-expect-error - Reserved for future implementation
108
+ _apiKey;
109
+ constructor(apiKey) {
110
+ this._apiKey = apiKey;
111
+ }
112
+ async synthesize(_text, _options) {
113
+ throw new AudioGeneratorError('ElevenLabs APIキーが設定されていません', AUDIO_ERROR_CODES.PROVIDER_NOT_CONFIGURED, { provider: 'elevenlabs' });
114
+ }
115
+ async listVoices(_language) {
116
+ throw new AudioGeneratorError('ElevenLabs APIキーが設定されていません', AUDIO_ERROR_CODES.PROVIDER_NOT_CONFIGURED, { provider: 'elevenlabs' });
117
+ }
118
+ getSupportedFormats() {
119
+ return ['mp3', 'wav'];
120
+ }
121
+ getMaxTextLength() {
122
+ return 5000;
123
+ }
124
+ }
125
+ /**
126
+ * OpenAI TTS プロバイダー(スタブ)
127
+ */
128
+ class OpenAITTSProvider {
129
+ // @ts-expect-error - Reserved for future implementation
130
+ _apiKey;
131
+ constructor(apiKey) {
132
+ this._apiKey = apiKey;
133
+ }
134
+ async synthesize(_text, _options) {
135
+ throw new AudioGeneratorError('OpenAI APIキーが設定されていません', AUDIO_ERROR_CODES.PROVIDER_NOT_CONFIGURED, { provider: 'openai-tts' });
136
+ }
137
+ async listVoices(_language) {
138
+ // OpenAI TTSは6つの音声をサポート
139
+ return [
140
+ { voiceId: 'alloy', name: 'Alloy', language: 'en-US', gender: 'neutral' },
141
+ { voiceId: 'echo', name: 'Echo', language: 'en-US', gender: 'male' },
142
+ { voiceId: 'fable', name: 'Fable', language: 'en-US', gender: 'neutral' },
143
+ { voiceId: 'onyx', name: 'Onyx', language: 'en-US', gender: 'male' },
144
+ { voiceId: 'nova', name: 'Nova', language: 'en-US', gender: 'female' },
145
+ { voiceId: 'shimmer', name: 'Shimmer', language: 'en-US', gender: 'female' },
146
+ ];
147
+ }
148
+ getSupportedFormats() {
149
+ return ['mp3', 'wav', 'ogg', 'aac', 'flac'];
150
+ }
151
+ getMaxTextLength() {
152
+ return 4096;
153
+ }
154
+ }
155
+ /**
156
+ * Azure TTS プロバイダー(スタブ)
157
+ */
158
+ class AzureTTSProvider {
159
+ // @ts-expect-error - Reserved for future implementation
160
+ _credentials;
161
+ constructor(credentials) {
162
+ this._credentials = credentials;
163
+ }
164
+ async synthesize(_text, _options) {
165
+ throw new AudioGeneratorError('Azure Speech Serviceの認証情報が設定されていません', AUDIO_ERROR_CODES.PROVIDER_NOT_CONFIGURED, { provider: 'azure-tts' });
166
+ }
167
+ async listVoices(_language) {
168
+ throw new AudioGeneratorError('Azure Speech Serviceの認証情報が設定されていません', AUDIO_ERROR_CODES.PROVIDER_NOT_CONFIGURED, { provider: 'azure-tts' });
169
+ }
170
+ getSupportedFormats() {
171
+ return ['mp3', 'wav', 'ogg'];
172
+ }
173
+ getMaxTextLength() {
174
+ return 10000; // Azure supports longer text
175
+ }
176
+ }
177
+ /**
178
+ * 音声生成クラス
179
+ */
180
+ export class AudioGenerator {
181
+ provider;
182
+ options;
183
+ defaultTTSOptions;
184
+ constructor(options = {}) {
185
+ this.options = options;
186
+ this.provider = this.createProvider(options.provider ?? 'mock');
187
+ this.defaultTTSOptions = {
188
+ ...DEFAULT_TTS_OPTIONS,
189
+ provider: options.provider,
190
+ format: options.defaultFormat,
191
+ quality: options.defaultQuality,
192
+ };
193
+ }
194
+ /**
195
+ * プロバイダーを作成
196
+ */
197
+ createProvider(providerType) {
198
+ switch (providerType) {
199
+ case 'google-tts':
200
+ return new GoogleTTSProvider(this.options.apiKey);
201
+ case 'amazon-polly':
202
+ return new AmazonPollyProvider(this.options.awsCredentials);
203
+ case 'elevenlabs':
204
+ return new ElevenLabsProvider(this.options.apiKey);
205
+ case 'openai-tts':
206
+ return new OpenAITTSProvider(this.options.apiKey);
207
+ case 'azure-tts':
208
+ return new AzureTTSProvider(this.options.azureCredentials);
209
+ case 'mock':
210
+ default:
211
+ return new MockTTSProvider();
212
+ }
213
+ }
214
+ /**
215
+ * テキストを音声に変換
216
+ * REQ-MEDIA-005-001: テキスト音声変換
217
+ */
218
+ async textToSpeech(text, options) {
219
+ // バリデーション
220
+ if (!text || typeof text !== 'string') {
221
+ throw new AudioGeneratorError('テキストが空または無効です', AUDIO_ERROR_CODES.INVALID_TEXT, { text });
222
+ }
223
+ const mergedOptions = this.mergeOptions(options);
224
+ // テキストの長さをチェック
225
+ const maxLength = this.provider.getMaxTextLength();
226
+ if (text.length > maxLength) {
227
+ // 長いテキストは分割して合成
228
+ return this.synthesizeLongText(text, mergedOptions);
229
+ }
230
+ try {
231
+ // SSML構築(オプション)
232
+ let processedText = text;
233
+ if (mergedOptions.enableSSML) {
234
+ processedText = buildSSML(text, {
235
+ language: mergedOptions.voice?.language,
236
+ rate: mergedOptions.voice?.speed,
237
+ pitch: mergedOptions.voice?.pitch,
238
+ volume: mergedOptions.voice?.volume,
239
+ });
240
+ }
241
+ const buffer = await this.provider.synthesize(processedText, mergedOptions);
242
+ const metadata = this.createMetadata(text, buffer, mergedOptions);
243
+ return {
244
+ audio: buffer,
245
+ metadata,
246
+ segments: [{
247
+ startTime: 0,
248
+ endTime: buffer.duration,
249
+ text,
250
+ }],
251
+ };
252
+ }
253
+ catch (error) {
254
+ if (error instanceof AudioGeneratorError) {
255
+ throw error;
256
+ }
257
+ throw new AudioGeneratorError(`音声合成に失敗しました: ${error instanceof Error ? error.message : String(error)}`, AUDIO_ERROR_CODES.SYNTHESIS_FAILED, { originalError: error });
258
+ }
259
+ }
260
+ /**
261
+ * 複数セグメントから音声を生成
262
+ */
263
+ async synthesizeSegments(segments, options) {
264
+ if (!segments || segments.length === 0) {
265
+ throw new AudioGeneratorError('セグメントが空です', AUDIO_ERROR_CODES.INVALID_TEXT, { segments });
266
+ }
267
+ const mergedOptions = this.mergeOptions(options);
268
+ const audioBuffers = [];
269
+ const outputSegments = [];
270
+ let currentTime = 0;
271
+ for (const segment of segments) {
272
+ const segmentOptions = {
273
+ ...mergedOptions,
274
+ voice: segment.voice ?? mergedOptions.voice,
275
+ };
276
+ // 前のポーズを追加
277
+ if (segment.pauseBefore) {
278
+ currentTime += segment.pauseBefore / 1000;
279
+ }
280
+ const buffer = await this.provider.synthesize(segment.text, segmentOptions);
281
+ audioBuffers.push(buffer);
282
+ outputSegments.push({
283
+ startTime: currentTime,
284
+ endTime: currentTime + buffer.duration,
285
+ text: segment.text,
286
+ speaker: segment.speakerId,
287
+ });
288
+ currentTime += buffer.duration;
289
+ // 後のポーズを追加
290
+ if (segment.pauseAfter) {
291
+ currentTime += segment.pauseAfter / 1000;
292
+ }
293
+ }
294
+ const combinedBuffer = this.combineBuffers(audioBuffers, mergedOptions.format ?? 'mp3');
295
+ const fullText = segments.map(s => s.text).join(' ');
296
+ const metadata = this.createMetadata(fullText, combinedBuffer, mergedOptions);
297
+ return {
298
+ audio: combinedBuffer,
299
+ metadata,
300
+ segments: outputSegments,
301
+ };
302
+ }
303
+ /**
304
+ * ポッドキャストを生成
305
+ * REQ-MEDIA-005-002: ポッドキャスト形式生成
306
+ */
307
+ async generatePodcast(script) {
308
+ // バリデーション
309
+ if (!script.title) {
310
+ throw new AudioGeneratorError('ポッドキャストタイトルが必要です', AUDIO_ERROR_CODES.INVALID_SCRIPT, { script });
311
+ }
312
+ if (!script.segments || script.segments.length === 0) {
313
+ throw new AudioGeneratorError('ポッドキャストセグメントが必要です', AUDIO_ERROR_CODES.INVALID_SCRIPT, { script });
314
+ }
315
+ const speakerMap = new Map(script.speakers.map(s => [s.id, s]));
316
+ const audioBuffers = [];
317
+ const outputSegments = [];
318
+ let currentTime = 0;
319
+ // イントロを生成
320
+ if (script.intro) {
321
+ const introBuffer = await this.synthesizeIntroOutro(script.intro, 'intro');
322
+ audioBuffers.push(introBuffer);
323
+ outputSegments.push({
324
+ startTime: currentTime,
325
+ endTime: currentTime + introBuffer.duration,
326
+ text: script.intro,
327
+ speaker: '_intro',
328
+ });
329
+ currentTime += introBuffer.duration;
330
+ }
331
+ // メインセグメントを生成
332
+ for (const segment of script.segments) {
333
+ const speaker = speakerMap.get(segment.speakerId);
334
+ if (!speaker) {
335
+ throw new AudioGeneratorError(`スピーカーが見つかりません: ${segment.speakerId}`, AUDIO_ERROR_CODES.SPEAKER_NOT_FOUND, { speakerId: segment.speakerId });
336
+ }
337
+ const segmentOptions = {
338
+ ...this.defaultTTSOptions,
339
+ voice: speaker.voice,
340
+ };
341
+ // SSMLでスタイル適用
342
+ let processedText = segment.text;
343
+ if (segment.emotion || segment.style) {
344
+ const builder = new SSMLBuilder(speaker.voice.language ?? 'ja-JP');
345
+ if (segment.style) {
346
+ builder.start().style(segment.text, segment.style).end();
347
+ }
348
+ else {
349
+ builder.start().text(segment.text).end();
350
+ }
351
+ processedText = builder.build();
352
+ segmentOptions.enableSSML = true;
353
+ }
354
+ const buffer = await this.provider.synthesize(processedText, segmentOptions);
355
+ audioBuffers.push(buffer);
356
+ outputSegments.push({
357
+ startTime: currentTime,
358
+ endTime: currentTime + buffer.duration,
359
+ text: segment.text,
360
+ speaker: segment.speakerId,
361
+ });
362
+ currentTime += buffer.duration;
363
+ // セグメント間のポーズ
364
+ if (segment.pauseAfter) {
365
+ currentTime += segment.pauseAfter / 1000;
366
+ }
367
+ else {
368
+ currentTime += 0.5; // デフォルト500ms
369
+ }
370
+ }
371
+ // アウトロを生成
372
+ if (script.outro) {
373
+ const outroBuffer = await this.synthesizeIntroOutro(script.outro, 'outro');
374
+ audioBuffers.push(outroBuffer);
375
+ outputSegments.push({
376
+ startTime: currentTime,
377
+ endTime: currentTime + outroBuffer.duration,
378
+ text: script.outro,
379
+ speaker: '_outro',
380
+ });
381
+ currentTime += outroBuffer.duration;
382
+ }
383
+ const combinedBuffer = this.combineBuffers(audioBuffers, this.defaultTTSOptions.format ?? 'mp3');
384
+ const metadata = {
385
+ title: script.title,
386
+ description: script.description,
387
+ format: combinedBuffer.format,
388
+ duration: combinedBuffer.duration,
389
+ sampleRate: combinedBuffer.sampleRate,
390
+ channels: combinedBuffer.channels,
391
+ bitrate: combinedBuffer.bitrate,
392
+ fileSize: combinedBuffer.data.length,
393
+ createdAt: new Date().toISOString(),
394
+ provider: this.options.provider ?? 'mock',
395
+ speakers: script.speakers.map(s => s.name),
396
+ segmentCount: script.segments.length,
397
+ };
398
+ return {
399
+ audio: combinedBuffer,
400
+ metadata,
401
+ segments: outputSegments,
402
+ };
403
+ }
404
+ /**
405
+ * イントロ/アウトロを合成
406
+ */
407
+ async synthesizeIntroOutro(text, type) {
408
+ const options = {
409
+ ...this.defaultTTSOptions,
410
+ voice: {
411
+ ...PRESET_VOICES['ja-female-1'],
412
+ speed: type === 'intro' ? 1.0 : 0.95, // アウトロは少しゆっくり
413
+ },
414
+ };
415
+ return this.provider.synthesize(text, options);
416
+ }
417
+ /**
418
+ * 利用可能な音声を取得
419
+ */
420
+ async listVoices(language) {
421
+ try {
422
+ return await this.provider.listVoices(language);
423
+ }
424
+ catch (error) {
425
+ if (error instanceof AudioGeneratorError) {
426
+ throw error;
427
+ }
428
+ throw new AudioGeneratorError('音声リストの取得に失敗しました', AUDIO_ERROR_CODES.VOICE_NOT_AVAILABLE, { language, originalError: error });
429
+ }
430
+ }
431
+ /**
432
+ * プリセット音声を取得
433
+ */
434
+ getPresetVoice(presetName) {
435
+ const voice = PRESET_VOICES[presetName];
436
+ if (!voice) {
437
+ throw new AudioGeneratorError(`プリセット音声が見つかりません: ${presetName}`, AUDIO_ERROR_CODES.VOICE_NOT_AVAILABLE, { presetName });
438
+ }
439
+ return voice;
440
+ }
441
+ /**
442
+ * 品質プリセットを取得
443
+ */
444
+ getQualityPreset(quality) {
445
+ return QUALITY_PRESETS[quality];
446
+ }
447
+ /**
448
+ * サポートされているフォーマットを取得
449
+ */
450
+ getSupportedFormats() {
451
+ return this.provider.getSupportedFormats();
452
+ }
453
+ /**
454
+ * テキストの推定時間を計算
455
+ */
456
+ estimateDuration(text, options) {
457
+ const speed = options?.speed ?? 1.0;
458
+ const language = options?.language ?? 'ja-JP';
459
+ // 言語による文字/秒の調整
460
+ const isJapanese = language.startsWith('ja') || /[\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf]/.test(text);
461
+ const charsPerSecond = isJapanese ? 5 : 15;
462
+ return (text.length / charsPerSecond) / speed;
463
+ }
464
+ /**
465
+ * 長いテキストを分割して合成
466
+ */
467
+ async synthesizeLongText(text, options) {
468
+ const maxLength = this.provider.getMaxTextLength();
469
+ const chunks = segmentText(text, { maxLength, preserveSentences: true });
470
+ const audioBuffers = [];
471
+ const segments = [];
472
+ let currentTime = 0;
473
+ for (const chunk of chunks) {
474
+ const buffer = await this.provider.synthesize(chunk, options);
475
+ audioBuffers.push(buffer);
476
+ segments.push({
477
+ startTime: currentTime,
478
+ endTime: currentTime + buffer.duration,
479
+ text: chunk,
480
+ });
481
+ currentTime += buffer.duration;
482
+ }
483
+ const combinedBuffer = this.combineBuffers(audioBuffers, options.format ?? 'mp3');
484
+ const metadata = this.createMetadata(text, combinedBuffer, options);
485
+ return {
486
+ audio: combinedBuffer,
487
+ metadata,
488
+ segments,
489
+ };
490
+ }
491
+ /**
492
+ * オプションをマージ
493
+ */
494
+ mergeOptions(options) {
495
+ return {
496
+ ...this.defaultTTSOptions,
497
+ ...options,
498
+ voice: {
499
+ ...this.defaultTTSOptions.voice,
500
+ ...options?.voice,
501
+ },
502
+ };
503
+ }
504
+ /**
505
+ * メタデータを作成
506
+ */
507
+ createMetadata(text, buffer, options) {
508
+ return {
509
+ format: buffer.format,
510
+ duration: buffer.duration,
511
+ sampleRate: buffer.sampleRate,
512
+ channels: buffer.channels,
513
+ bitrate: buffer.bitrate,
514
+ fileSize: buffer.data.length,
515
+ createdAt: new Date().toISOString(),
516
+ provider: this.options.provider ?? 'mock',
517
+ voice: options.voice?.voiceName ?? options.voice?.voiceId,
518
+ language: options.voice?.language,
519
+ textLength: text.length,
520
+ wordCount: text.split(/\s+/).length,
521
+ };
522
+ }
523
+ /**
524
+ * 複数のバッファを結合
525
+ */
526
+ combineBuffers(buffers, format) {
527
+ if (buffers.length === 0) {
528
+ return {
529
+ data: new Uint8Array(0),
530
+ format,
531
+ sampleRate: 22050,
532
+ channels: 1,
533
+ duration: 0,
534
+ };
535
+ }
536
+ if (buffers.length === 1) {
537
+ return buffers[0];
538
+ }
539
+ // 全バッファのデータを結合
540
+ const totalLength = buffers.reduce((sum, b) => sum + b.data.length, 0);
541
+ const combinedData = new Uint8Array(totalLength);
542
+ let offset = 0;
543
+ for (const buffer of buffers) {
544
+ combinedData.set(buffer.data, offset);
545
+ offset += buffer.data.length;
546
+ }
547
+ const totalDuration = buffers.reduce((sum, b) => sum + b.duration, 0);
548
+ const firstBuffer = buffers[0];
549
+ return {
550
+ data: combinedData,
551
+ format,
552
+ sampleRate: firstBuffer.sampleRate,
553
+ channels: firstBuffer.channels,
554
+ duration: totalDuration,
555
+ bitrate: firstBuffer.bitrate,
556
+ };
557
+ }
558
+ }
559
+ // デフォルトエクスポート
560
+ export default AudioGenerator;
561
+ //# sourceMappingURL=AudioGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioGenerator.js","sourceRoot":"","sources":["../../src/audio/AudioGenerator.ts"],"names":[],"mappings":"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"}