@kajidog/mcp-tts-voicevox
Version:
VOICEVOX integration for MCP - Text-to-Speech server using VOICEVOX engine
82 lines (81 loc) • 3.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.splitText = splitText;
exports.isTestEnvironment = isTestEnvironment;
/**
* テキストを自然な区切りで分割します
* @param text 分割するテキスト
* @param maxLength セグメントの最大長
* @returns 分割されたテキストの配列
*/
function splitText(text, maxLength) {
// 文の区切りとなるパターン
const sentenceEndings = /([。!?])/;
// 自然な区切りとなる接続詞や助詞
const naturalBreaks = /([、しかし、でも、けれど、そして、また、または、それで、だから、ですから、そのため、したがって、ゆえに])/;
const segments = [];
let currentSegment = "";
// 文を句読点で分割
const sentences = text.split(sentenceEndings).reduce((acc, part, i, arr) => {
if (i % 2 === 0) {
// テキスト部分
acc.push(part);
}
else {
// 句読点部分 - 前のテキストと結合
acc[acc.length - 1] += part;
}
return acc;
}, []);
// 文ごとに処理
for (const sentence of sentences) {
if (!sentence.trim())
continue;
// 現在のセグメントに追加してみる
const potentialSegment = currentSegment + sentence;
// 最大長を超えないならそのまま追加
if (potentialSegment.length <= maxLength) {
currentSegment = potentialSegment;
}
else {
// 最大長を超える場合、naturalBreaksで分割を試みる
const parts = sentence.split(naturalBreaks);
// 分割パーツを処理
for (let i = 0; i < parts.length; i++) {
const part = parts[i];
if (!part.trim())
continue;
// 現在のセグメントに追加してみる
const newSegment = currentSegment + part;
// 最大長を超えるかチェック
if (newSegment.length <= maxLength) {
currentSegment = newSegment;
}
else {
// 既存のセグメントがあれば保存
if (currentSegment.trim()) {
segments.push(currentSegment.trim());
}
currentSegment = part;
}
}
}
// 一文が終わったら保存判定
if (currentSegment.length >= maxLength && currentSegment.trim()) {
segments.push(currentSegment.trim());
currentSegment = "";
}
}
// 残りのテキストがあれば追加
if (currentSegment.trim()) {
segments.push(currentSegment.trim());
}
return segments;
}
/**
* テスト環境かどうかを判定します
* @returns テスト環境の場合はtrue、それ以外の場合はfalse
*/
function isTestEnvironment() {
return (process.env.NODE_ENV === "test" || process.env.JEST_WORKER_ID !== undefined);
}