mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-17 05:47:11 +00:00
223 lines
9.2 KiB
JavaScript
223 lines
9.2 KiB
JavaScript
import {Config} from "../config.js";
|
||
|
||
let proxy
|
||
if (Config.proxy) {
|
||
try {
|
||
proxy = (await import('https-proxy-agent')).default
|
||
} catch (e) {
|
||
console.warn('未安装https-proxy-agent,请在插件目录下执行pnpm add https-proxy-agent')
|
||
}
|
||
}
|
||
|
||
const newFetch = (url, options = {}) => {
|
||
const defaultOptions = Config.proxy
|
||
? {
|
||
agent: proxy(Config.proxy)
|
||
}
|
||
: {}
|
||
|
||
const mergedOptions = {
|
||
...defaultOptions,
|
||
...options
|
||
}
|
||
|
||
return fetch(url, mergedOptions)
|
||
}
|
||
|
||
async function generateAudio(text, options = {}) {
|
||
let host = Config.voicevoxSpace
|
||
let speaker = options.speaker?.speaker || '护士机器子T'
|
||
if (speaker === '随机') {
|
||
speaker = supportConfigurations[Math.floor(Math.random() * supportConfigurations.length)].name
|
||
}
|
||
let regex = /^(.*?)-(.*)$/
|
||
let match = regex.exec(speaker)
|
||
let style = null
|
||
if (match) {
|
||
speaker = match[1]
|
||
style = match[2]
|
||
}
|
||
speaker = supportConfigurations.find(s => s.name === speaker)
|
||
let speakerId
|
||
if (style) {
|
||
speakerId = speaker.styles.find(s => s.name === style).id
|
||
} else {
|
||
speakerId = speaker.styles[Math.floor(Math.random() * speaker?.styles.length)].id
|
||
}
|
||
logger.info(`使用${speaker.name}的${speaker.styles.find(s => s.id === speakerId).name}风格基于文本${text}生成语音。`)
|
||
const accentPhrasesResponse = await newFetch(`${host}/accent_phrases?text=${encodeURIComponent(text)}&speaker=${speakerId}`, {
|
||
method: 'POST',
|
||
});
|
||
|
||
const accentPhrases = await accentPhrasesResponse.json();
|
||
|
||
const synthesisResponse = await newFetch(`${host}/synthesis?speaker=${speakerId}&enable_interrogative_upspeak=false`, {
|
||
method: 'POST', headers: {
|
||
'Content-Type': 'application/json',
|
||
}, body: JSON.stringify({
|
||
accent_phrases: accentPhrases,
|
||
speedScale: 1,
|
||
pitchScale: 0,
|
||
intonationScale: 1,
|
||
volumeScale: 1,
|
||
prePhonemeLength: 0.1,
|
||
postPhonemeLength: 0.1,
|
||
outputSamplingRate: 24000,
|
||
outputStereo: false,
|
||
}),
|
||
});
|
||
|
||
const synthesisResponseData = await synthesisResponse.arrayBuffer();
|
||
return Buffer.from(synthesisResponseData);
|
||
}
|
||
|
||
const supportConfigurations = [
|
||
{
|
||
"supported_features": {"permitted_synthesis_morphing": "SELF_ONLY"},
|
||
"name": "四国めたん",
|
||
"speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff",
|
||
"styles": [{"name": "ノーマル", "id": 2}, {"name": "あまあま", "id": 0}, {"name": "ツンツン", "id": 6}, {
|
||
"name": "セクシー", "id": 4
|
||
}, {"name": "ささやき", "id": 36}, {"name": "ヒソヒソ", "id": 37}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "SELF_ONLY"},
|
||
"name": "ずんだもん",
|
||
"speaker_uuid": "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9",
|
||
"styles": [{"name": "ノーマル", "id": 3}, {"name": "あまあま", "id": 1}, {"name": "ツンツン", "id": 7}, {
|
||
"name": "セクシー", "id": 5
|
||
}, {"name": "ささやき", "id": 22}, {"name": "ヒソヒソ", "id": 38}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "春日部つむぎ",
|
||
"speaker_uuid": "35b2c544-660e-401e-b503-0e14c635303a",
|
||
"styles": [{"name": "ノーマル", "id": 8}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "雨晴はう",
|
||
"speaker_uuid": "3474ee95-c274-47f9-aa1a-8322163d96f1",
|
||
"styles": [{"name": "ノーマル", "id": 10}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "波音リツ",
|
||
"speaker_uuid": "b1a81618-b27b-40d2-b0ea-27a9ad408c4b",
|
||
"styles": [{"name": "ノーマル", "id": 9}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "玄野武宏",
|
||
"speaker_uuid": "c30dc15a-0992-4f8d-8bb8-ad3b314e6a6f",
|
||
"styles": [{"name": "ノーマル", "id": 11}, {"name": "喜び", "id": 39}, {"name": "ツンギレ", "id": 40}, {
|
||
"name": "悲しみ", "id": 41
|
||
}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "白上虎太郎",
|
||
"speaker_uuid": "e5020595-5c5d-4e87-b849-270a518d0dcf",
|
||
"styles": [{"name": "ふつう", "id": 12}, {"name": "わーい", "id": 32}, {"name": "びくびく", "id": 33}, {
|
||
"name": "おこ", "id": 34
|
||
}, {"name": "びえーん", "id": 35}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "青山龍星",
|
||
"speaker_uuid": "4f51116a-d9ee-4516-925d-21f183e2afad",
|
||
"styles": [{"name": "ノーマル", "id": 13}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "冥鳴ひまり",
|
||
"speaker_uuid": "8eaad775-3119-417e-8cf4-2a10bfd592c8",
|
||
"styles": [{"name": "ノーマル", "id": 14}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "SELF_ONLY"},
|
||
"name": "九州そら",
|
||
"speaker_uuid": "481fb609-6446-4870-9f46-90c4dd623403",
|
||
"styles": [{"name": "ノーマル", "id": 16}, {"name": "あまあま", "id": 15}, {"name": "ツンツン", "id": 18}, {
|
||
"name": "セクシー", "id": 17
|
||
}, {"name": "ささやき", "id": 19}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "SELF_ONLY"},
|
||
"name": "もち子さん",
|
||
"speaker_uuid": "9f3ee141-26ad-437e-97bd-d22298d02ad2",
|
||
"styles": [{"name": "ノーマル", "id": 20}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "剣崎雌雄",
|
||
"speaker_uuid": "1a17ca16-7ee5-4ea5-b191-2f02ace24d21",
|
||
"styles": [{"name": "ノーマル", "id": 21}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "WhiteCUL",
|
||
"speaker_uuid": "67d5d8da-acd7-4207-bb10-b5542d3a663b",
|
||
"styles": [{"name": "ノーマル", "id": 23}, {"name": "たのしい", "id": 24}, {"name": "かなしい", "id": 25}, {
|
||
"name": "びえーん", "id": 26
|
||
}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "後鬼",
|
||
"speaker_uuid": "0f56c2f2-644c-49c9-8989-94e11f7129d0",
|
||
"styles": [{"name": "人間ver.", "id": 27}, {"name": "ぬいぐるみver.", "id": 28}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "No.7",
|
||
"speaker_uuid": "044830d2-f23b-44d6-ac0d-b5d733caa900",
|
||
"styles": [{"name": "ノーマル", "id": 29}, {"name": "アナウンス", "id": 30}, {"name": "読み聞かせ", "id": 31}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "ちび式じい",
|
||
"speaker_uuid": "468b8e94-9da4-4f7a-8715-a22a48844f9e",
|
||
"styles": [{"name": "ノーマル", "id": 42}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "櫻歌ミコ",
|
||
"speaker_uuid": "0693554c-338e-4790-8982-b9c6d476dc69",
|
||
"styles": [{"name": "ノーマル", "id": 43}, {"name": "第二形態", "id": 44}, {"name": "ロリ", "id": 45}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "小夜/SAYO",
|
||
"speaker_uuid": "a8cc6d22-aad0-4ab8-bf1e-2f843924164a",
|
||
"styles": [{"name": "ノーマル", "id": 46}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "护士机器子T",
|
||
"speaker_uuid": "882a636f-3bac-431a-966d-c5e6bba9f949",
|
||
"styles": [{"name": "ノーマル", "id": 47}, {"name": "楽々", "id": 48}, {"name": "恐怖", "id": 49}, {
|
||
"name": "内緒話", "id": 50
|
||
}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "†聖騎士 紅桜†",
|
||
"speaker_uuid": "471e39d2-fb11-4c8c-8d89-4b322d2498e0",
|
||
"styles": [{"name": "ノーマル", "id": 51}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "雀松朱司",
|
||
"speaker_uuid": "0acebdee-a4a5-4e12-a695-e19609728e30",
|
||
"styles": [{"name": "ノーマル", "id": 52}],
|
||
"version": "0.14.2"
|
||
}, {
|
||
"supported_features": {"permitted_synthesis_morphing": "ALL"},
|
||
"name": "麒ヶ島宗麟",
|
||
"speaker_uuid": "7d1e7ba7-f957-40e5-a3fc-da49f769ab65",
|
||
"styles": [{"name": "ノーマル", "id": 53}],
|
||
"version": "0.14.2"
|
||
}]
|
||
|
||
export default {generateAudio, supportConfigurations}
|