UNPKG

koishi-plugin-genshin-voice

Version:
96 lines (95 loc) 2.64 kB
"use strict"; 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;