@kajidog/mcp-tts-voicevox
Version:
VOICEVOX integration for MCP - Text-to-Speech server using VOICEVOX engine
89 lines (88 loc) • 3.53 kB
JavaScript
;
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;