UNPKG

@kajidog/mcp-tts-voicevox

Version:

VOICEVOX integration for MCP - Text-to-Speech server using VOICEVOX engine

89 lines (88 loc) 3.53 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AudioGenerator = void 0; const types_1 = require("./types"); /** * 音声生成クラス * 音声合成処理を担当 */ class AudioGenerator { constructor(apiInstance, fileManager) { this.api = apiInstance; this.fileManager = fileManager; } /** * テキストから音声クエリを生成 * @param text テキスト * @param speaker 話者ID * @returns 音声合成クエリ */ async generateQuery(text, speaker) { try { const query = await this.api.generateQuery(text, speaker); query.prePhonemeLength = 0; query.postPhonemeLength = 0; return query; } catch (error) { // APIエラーをそのまま上位に伝播させる console.error(`Error generating query: ${error}`); throw error; } } /** * テキストから音声データを生成してアイテムに設定 * @param item 処理対象のキューアイテム * @param updateStatus ステータス更新コールバック関数 */ async generateAudio(item, updateStatus) { // PENDING 状態でない場合は処理しない if (item.status !== types_1.QueueItemStatus.PENDING) return; try { updateStatus(item, types_1.QueueItemStatus.GENERATING); const query = await this.api.generateQuery(item.text, item.speaker); query.prePhonemeLength = 0; query.postPhonemeLength = 0; item.query = query; const audioData = await this.api.synthesize(query, item.speaker); item.audioData = audioData; // 一時ファイルに書き込み item.tempFile = await this.fileManager.saveTempAudioFile(audioData); updateStatus(item, types_1.QueueItemStatus.READY); return; } catch (error) { console.error(`Error generating audio for item ${item.id}:`, error); item.error = error instanceof Error ? error : new Error(String(error)); updateStatus(item, types_1.QueueItemStatus.ERROR); throw error; } } /** * クエリから音声データを生成してアイテムに設定 * @param item 処理対象のキューアイテム (queryが必須) * @param updateStatus ステータス更新コールバック関数 */ async generateAudioFromQuery(item, updateStatus) { // PENDING状態でない、またはクエリがない場合は処理しない if (item.status !== types_1.QueueItemStatus.PENDING || !item.query) return; try { updateStatus(item, types_1.QueueItemStatus.GENERATING); const audioData = await this.api.synthesize(item.query, item.speaker); item.audioData = audioData; // 一時ファイルに書き込み item.tempFile = await this.fileManager.saveTempAudioFile(audioData); updateStatus(item, types_1.QueueItemStatus.READY); return; } catch (error) { console.error(`Error generating audio from query for item ${item.id}:`, error); item.error = error instanceof Error ? error : new Error(String(error)); updateStatus(item, types_1.QueueItemStatus.ERROR); throw error; } } } exports.AudioGenerator = AudioGenerator;