UNPKG

@kajidog/mcp-tts-voicevox

Version:

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

98 lines (97 loc) 3.58 kB
"use strict"; 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;