@kajidog/mcp-tts-voicevox
Version:
VOICEVOX integration for MCP - Text-to-Speech server using VOICEVOX engine
98 lines (97 loc) • 3.58 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.VoicevoxApi = void 0;
const axios_1 = __importDefault(require("axios"));
const types_1 = require("./types");
const error_1 = require("./error");
class VoicevoxApi {
constructor(baseUrl) {
this.baseUrl = this.normalizeUrl(baseUrl);
}
/**
* テキストから音声合成用クエリを生成
*/
async generateQuery(text, speaker = 1) {
try {
const endpoint = `/audio_query?text=${encodeURIComponent(text)}&speaker=${encodeURIComponent(speaker.toString())}`;
const query = await this.makeRequest("post", endpoint, null, {
"Content-Type": "application/json",
});
return query;
}
catch (error) {
throw (0, error_1.handleError)("音声クエリ生成中にエラーが発生しました", error);
}
}
/**
* 音声合成用クエリから音声ファイルを生成
*/
async synthesize(query, speaker = 1) {
try {
return await this.makeRequest("post", `/synthesis?speaker=${encodeURIComponent(speaker.toString())}`, query, {
"Content-Type": "application/json",
Accept: "audio/wav",
}, "arraybuffer");
}
catch (error) {
throw (0, error_1.handleError)("音声合成中にエラーが発生しました", error);
}
}
/**
* プリセットを使用してテキストから音声合成用クエリを生成
*/
async generateQueryFromPreset(text, presetId, coreVersion) {
try {
let endpoint = `/audio_query_from_preset?text=${encodeURIComponent(text)}&preset_id=${encodeURIComponent(presetId.toString())}`;
if (coreVersion) {
endpoint += `&core_version=${encodeURIComponent(coreVersion)}`;
}
const query = await this.makeRequest("post", endpoint, null, {
"Content-Type": "application/json",
});
return query;
}
catch (error) {
throw (0, error_1.handleError)("プリセットを使用した音声クエリ生成中にエラーが発生しました", error);
}
}
/**
* APIリクエストを実行
* @private
*/
async makeRequest(method, endpoint, data = null, headers = {}, responseType = "json") {
try {
const url = `${this.baseUrl}${endpoint}`;
const config = {
method,
url,
data,
headers,
responseType,
timeout: 30000,
};
const response = await (0, axios_1.default)(config);
if (response.status !== 200) {
throw new types_1.VoicevoxError(`APIリクエストに失敗しました: ${response.status}`, response.status);
}
return response.data;
}
catch (error) {
if (axios_1.default.isAxiosError(error)) {
throw new types_1.VoicevoxError(`APIリクエストに失敗しました: ${error.message}`, error.response?.status || 0);
}
throw error;
}
}
/**
* URLの正規化
* @private
*/
normalizeUrl(url) {
return url.endsWith("/") ? url.slice(0, -1) : url;
}
}
exports.VoicevoxApi = VoicevoxApi;