koishi-plugin-genshin-voice
Version:
Genshin character speech synthesis
96 lines (95 loc) • 2.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.apply = exports.Config = exports.name = void 0;
const koishi_1 = require("koishi");
exports.name = 'genshin-voice';
exports.Config = koishi_1.Schema.object({});
const key = [5, 188, 209, 154, 2, 90, 41, 129, 174, 177, 125, 55, 77, 165, 40, 97];
function encode(text) {
return Buffer.from(text).map((n, i) => n + (15 % (key[i % key.length] + i))).toString('hex');
}
const aliasMap = {
埃洛伊: [],
安柏: [],
丽莎: [],
菲谢尔: [],
凯亚: [],
迪卢克: [],
琴: [],
诺艾尔: [],
芭芭拉: [],
阿贝多: [],
班尼特: [],
迪奥娜: [],
罗莎莉亚: [],
莫娜: [],
砂糖: [],
雷泽: [],
温迪: ['巴巴托斯', '风神'],
优菈: [],
可莉: [],
重云: [],
七七: [],
烟绯: [],
甘雨: [],
香菱: [],
北斗: [],
辛焱: [],
行秋: [],
胡桃: [],
刻晴: [],
凝光: [],
云堇: [],
钟离: ['岩神'],
夜兰: [],
申鹤: [],
达达利亚: ['公子'],
魈: [],
宵宫: [],
托马: [],
早柚: [],
五郎: [],
久岐忍: [],
九条裟罗: ['裟罗'],
枫原万叶: ['万叶'],
雷电将军: ['雷神'],
神里绫华: ['绫华'],
神里绫人: ['绫人'],
珊瑚宫心海: ['心海'],
鹿野院平藏: ['平藏'],
荒泷一斗: ['一斗'],
八重神子: ['神子'],
提纳里: [],
赛诺: [],
柯莱: [],
多莉: [],
坎蒂丝: [],
妮露: [],
珐露珊: [],
莱依拉: [],
纳西妲: ['草神'],
流浪者: ['散兵'],
};
const charMap = {};
for (const [name, alias] of Object.entries(aliasMap)) {
charMap[name] = name;
for (const item of alias) {
charMap[item] = name;
}
}
function apply(ctx, config) {
ctx.command('genshin.voice <name> <text:text>', '原神角色语言合成')
.action(async (_, name, text) => {
if (!name)
return '请输入角色名。';
name = charMap[name];
if (!name)
return '无法识别角色名。';
if (!text)
return '请输入语音文本。';
text += '。';
const data = await ctx.http.get(`https://ai-api.baimianxiao.cn/api/${encode(name)}/${encode(text)}/0.4/0.6/1.12/${encode(Math.floor(Date.now() / 1000).toString())}.ai`, { responseType: 'arraybuffer' });
return koishi_1.h.audio(data, 'audio/x-wav');
});
}
exports.apply = apply;