纳米Plus

autobcb_admin (12020)2天前

单独的纳米 ai 改自晴天
二维码导入(APP尚未完成该功能)
{
    "name": "纳米Plus",
    "html": "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>默认tts<\/title>\n<\/head>\n<body>\n\n<script defer src=\"https:\/\/static.cloudflareinsights.com\/beacon.min.js\/v8c78df7c7c0f484497ecbca7046644da1771523124516\" integrity=\"sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==\" data-cf-beacon='{\"version\":\"2024.11.0\",\"token\":\"702014e4293d4dedac01462951f7029c\",\"r\":1,\"server_timing\":{\"name\":{\"cfCacheStatus\":true,\"cfEdge\":true,\"cfExtPri\":true,\"cfL4\":true,\"cfOrigin\":true,\"cfSpeedBrain\":true},\"location_startswith\":null}}' crossorigin=\"anonymous\"><\/script>\n<\/body>\n<!-- 没用到jq请去掉-->\n<script src=\"https:\/\/vc.jd.com\/web\/js\/jquery-3.1.1.min.js\"><\/script>\n<script>\n    var isCookieJar=true;\/\/ 不需要CookieJar请修改此处\n    class FlutterJSBridge {\n        constructor() {\n            this.init(); \/\/前台webview 里必须删除这行\n        }\n\n        init() {\n            if (window.flutter_inappwebview) {\n                this.isReady = true;\n                this.CookieJar();\n            } else {\n                window.addEventListener('flutterInAppWebViewPlatformReady', () => {\n                    this.isReady = true;\n                    console.log('JSBridge初始化完成');\n                    this.CookieJar();\n                });\n            }\n        }\n\n        \/\/通知原生页面初始化完成,仅在书源和tts生效,webview请勿使用,只有通知加载成功后才允许运行,否则会一直等待加载成功\n        async CookieJar() {\n            try {\n                await window.flutter_inappwebview.callHandler('CookieJar', isCookieJar);\n            } catch (error) {\n                console.error('汇报完成准备失败:', error);\n            }\n        }\n\n        \/\/获取应用编译版本\n        async getbuildNumber() {\n            try {\n                return await window.flutter_inappwebview.callHandler('buildNumber');\n            } catch (error) {\n                return  0;\n            }\n        }\n\n        \/\/获取应用版本\n        async getversion() {\n            try {\n                return await window.flutter_inappwebview.callHandler('version');\n            } catch (error) {\n                return  \"0.0.0\";\n            }\n        }\n\n        \/\/获取设备唯一id\n        async getDeviceid() {\n            try {\n                return await window.flutter_inappwebview.callHandler('id');\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/\/获取设备平台 此处返回 windows、macos、ios、ohos、android\n        async getDevice() {\n            try {\n                return await window.flutter_inappwebview.callHandler('device');\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/\/输出日志,前台webview请勿使用\n        \/\/str 为 String\n        async log(str) {\n            try {\n                return await window.flutter_inappwebview.callHandler('log',str);\n            } catch (error) {\n                return  false;\n            }\n        }\n\n        \/\/书源调试时可输出 html 代码到前台\n        \/\/type 0 搜索源码 , 1详情源码 ,2目录源码 ,3正文源码\n        \/\/str 为 String\n        \/\/type 为int\n        async text(type,str) {\n            try {\n                return await window.flutter_inappwebview.callHandler('text',type,str);\n            } catch (error) {\n                return  false;\n            }\n        }\n\n        \/\/toast弹窗\n        \/\/str 为 String\n        async showToast(str) {\n            try {\n                return await window.flutter_inappwebview.callHandler('showToast',str);\n            } catch (error) {\n                return  false;\n            }\n        }\n\n        \/\/获取默认ua\n        async getWebViewUA() {\n            try {\n                return await window.flutter_inappwebview.callHandler('getWebViewUA');\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/\/通过url打开外部应用\n        \/\/url 为 String\n        async openurl(url) {\n            try {\n                return await window.flutter_inappwebview.callHandler('openurl',url,\"\");\n            } catch (error) {\n                return  false;\n            }\n        }\n\n        \/\/通过url打开外部应用并附带mimeType\n        \/\/url 为 String\n        \/\/mimeType 为 String\n        async openurlwithMimeType(url,mimeType) {\n            try {\n                return await window.flutter_inappwebview.callHandler('openurl',url,mimeType);\n            } catch (error) {\n                return  false;\n            }\n        }\n\n        \/**\n         * 使用webView访问网络\n         * @param html 直接用webView载入的html, 如果html为空直接访问url\n         * @param url html内如果有相对路径的资源不传入url访问不了\n         * @param js 用来取返回值的js语句, 没有就返回整个源代码\n         * @param body 当参数不为空的时候,会以post请求,此时请务必在 header 中带上content-type\n         * @param header 请求的header头,此参数必须是json字符串\n         * @return 返回js获取的内容\n         *\/\n        async webview(url,js,html,body,header) {\n            try {\n                return await window.flutter_inappwebview.callHandler('webview',url,js,html,body,header,\"\",\"\");\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/**\n         * overrideUrlRegex 为正则表达式\n         * 使用方法和上面的一样\n         * 但返回的内容为正则到的内容,如果无法正则到则返回 js 获取的内容,如果 js 为空则返回页面 html\n         *\/\n        async webViewGetOverrideUrl(url,js,html,body,header,overrideUrlRegex) {\n            try {\n                return await window.flutter_inappwebview.callHandler('webview',url,js,html,body,header,overrideUrlRegex,\"\");\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/**\n         * 使用webView获取资源url\n         * urlregex 为正则表达式\n         * 使用方法和上面的一样\n         * 但返回的内容为正则到的内容,如果无法正则到则返回 js 获取的内容,如果 js 为空则返回页面 html\n         *\/\n        async webViewGetSource(url,js,html,body,header,urlregex) {\n            try {\n                return await window.flutter_inappwebview.callHandler('webview',url,js,html,body,header,\"\",urlregex);\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n\n        \/**\n         * 启动前台 webview 访问链接并获取结束时的 html,可用于手工过盾\n         * @param url 网址\n         * @param title 标题\n         * @param header 请求的header头,此参数必须是json字符串\n         * @return 返回网页的内容\n         *\/\n        async startBrowser(url,title,header) {\n            try {\n                return await window.flutter_inappwebview.callHandler('startBrowser',url,title,header);\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/**\n         * 启动前台 webview 并对每次打开的 url 进行拦截\n         * @param url 网址\n         * @param title 标题\n         * @param header 请求的header头,此参数必须是json字符串\n         *\/\n        async startBrowserWithShouldOverrideUrlLoading(url,title,header) {\n            try {\n                return await window.flutter_inappwebview.callHandler('startBrowserWithShouldOverrideUrlLoading',url,title,header);\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/\/专门为段评设置的半屏显示,不返回任何东西\n        async startBrowserDp(url,title) {\n            try {\n                return await window.flutter_inappwebview.callHandler('startBrowserDp',url,title);\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/\/仅前台webview可以使用,返回按钮,返回上一个页面\n        async back() {\n            try {\n                return await window.flutter_inappwebview.callHandler('back');\n            } catch (error) {\n                return  false;\n            }\n        }\n\n        \/\/将 utf8字符串转到 gbk 并 url 编码\n        async utf8ToGbkUrlEncoded(str) {\n            try {\n                return await window.flutter_inappwebview.callHandler('utf8ToGbkUrlEncoded',str);\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/*\n        * @param str为图片链接\n        * @param header 请求的header头,此参数必须是json字符串\n        * 此函数是让用户输入图片中的验证码,当链接为空则直接让用户输入验证码\n        *\/\n        async getVerificationCode(str,header) {\n            try {\n                return await window.flutter_inappwebview.callHandler('getVerificationCode',str,header);\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/\/提交内容书本信息 json 后的字符串\n        async addbook(book) {\n            try {\n                return await window.flutter_inappwebview.callHandler('addbook',book);\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/\/utf8 字符串转base64\n        async base64encode(str) {\n            try {\n                return await window.flutter_inappwebview.callHandler('base64encode',str);\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n        \/\/base64 转utf8字符串\n        async base64decode(str) {\n            try {\n                return await window.flutter_inappwebview.callHandler('base64decode',str);\n            } catch (error) {\n                return  \"\";\n            }\n        }\n\n\n\n    }\n\n    \/\/webview请勿使用\n    \/\/以下提交的url,headers,body 都必须为字符串,headers必须为json字符串\n    \/\/当followRedirects 为 false 时不处理重定向,当为 true 时会自动处理重定向 ,如不明白用途直接用 true 最佳\n    \/\/ 以下所有参数除当followRedirects外均为 String\n    \/\/ 如果需要使用http2协议 请在url 前添加 http2:\/\/ ,例如 http2:\/\/baidu.com\n    \/\/ 如果https一直被盾拦截 ,可以使用https2协议\n    class Http {\n        constructor() {}\n\n        \/*\n         * 通用返回字段\n         * method post get 或者 head\n         * body 请求返回后的字节的 base64\n         * headers  map<String,List<String>> 可通过headers[\"\"]来或者\n         * statusCode 状态码\n         * statusMessage\n         * data 返回后的字节 格式化后的内容\n         *\/\n        async Get(url,headers,followRedirects) {\n            try {\n                return await window.flutter_inappwebview.callHandler('http',\"get\",url,\"\",JSON.stringify(headers),followRedirects,\"\");\n            } catch (error) {\n                return  null;\n            }\n        }\n\n        async Head(url,headers,followRedirects) {\n            try {\n                return await window.flutter_inappwebview.callHandler('http',\"head\",url,\"\",JSON.stringify(headers),followRedirects,\"\");\n            } catch (error) {\n                return  null;\n            }\n        }\n\n\n        async Post(url,headers,body,contenttype,followRedirects) {\n            try {\n                return await window.flutter_inappwebview.callHandler('http',\"post\",url,body,JSON.stringify(headers),followRedirects,contenttype);\n            } catch (error) {\n                return  null;\n            }\n        }\n    }\n\n    class Cache {\n        constructor() {}\n        async get(key) {\n            try {\n                return await window.flutter_inappwebview.callHandler('cache.get',key);\n            } catch (error) {\n                return  null;\n            }\n        }\n\n        async set(key,value) {\n            try {\n                return await window.flutter_inappwebview.callHandler('cache.set',key,value);\n            } catch (error) {\n                return  null;\n            }\n        }\n\n        async remove(key) {\n            try {\n                return await window.flutter_inappwebview.callHandler('cache.remove',key);\n            } catch (error) {\n                return  null;\n            }\n        }\n\n        \/\/如果登录为弹窗格式的,里面输入框输入的内容可以通过这个函数获取,默认返回的json格式或者为空,需要自行转换\n        async getLoginInfo(){\n            return await  this.get(\"LoginInfo\")\n        }\n\n        \/\/将修改后的弹窗输入内容报错 ,必须 JSON.stringify,不然会出错\n        async putLoginInfo(info){\n            return await  this.set(\"LoginInfo\",info)\n        }\n\n        \/\/获取书本变量\n        async getbookVariable(bookurl){\n            return await  this.get(bookurl)\n        }\n\n        \/\/写入书本变量\n        async setbookVariable(bookurl,value){\n            return await  this.set(bookurl,value)\n        }\n    }\n\n    class Cookie {\n        constructor() {}\n\n        \/\/通过url获取当前url的所有cookie\n        async get(url) {\n            try {\n                return await window.flutter_inappwebview.callHandler('cookie.get',url);\n            } catch (error) {\n                return  null;\n            }\n        }\n\n        \/\/通过url删除当前url的所有cookie\n        async remove(url) {\n            try {\n                return await window.flutter_inappwebview.callHandler('cookie.remove',url);\n            } catch (error) {\n                return  null;\n            }\n        }\n\n\n        \/\/通过url保存当前url的所有cookie\n        async set(url,value) {\n            try {\n                return await window.flutter_inappwebview.callHandler('cookie.set',url,value);\n            } catch (error) {\n                return  null;\n            }\n        }\n\n        \/\/设置单独一个cookie\n        async setCookie(url,key,value) {\n            try {\n                return await window.flutter_inappwebview.callHandler('cookie.setcookie',url,key,value);\n            } catch (error) {\n                return  null;\n            }\n        }\n\n        \/\/通过 url 获取单个 cookie 的值\n        async getCookie(url,value) {\n            try {\n                return await window.flutter_inappwebview.callHandler('cookie.getCookie',url,value);\n            } catch (error) {\n                return  null;\n            }\n        }\n    }\n\n    \/\/安全的创建一个 div 解析 html\n    function parseHTMLSafely(htmlStr) {\n        try {\n            \/\/ 在函数作用域内创建独立的临时容器\n            \/\/ 每个调用创建新的jQuery对象,互不影响\n            var tempDiv = document.createElement('div');\n            tempDiv.innerHTML = htmlStr;\n            return $(tempDiv);\n        } catch (e) {\n            flutterBridge.log(\"HTML解析错误:\"+e.message);\n            return $('<div>');\n        }\n    }\n\n    \/\/parseHTMLSafely 创建的用完后必须删除\n    function removeHTMLSafely(tempContainer) {\n        try {\n            tempContainer.innerHTML = '';\n            if (tempContainer.parentNode) {\n                tempContainer.parentNode.removeChild(tempContainer);\n            }\n        } catch (e) {\n            flutterBridge.log(\"HTML移除失败:\"+e.message);\n        }\n    }\n\n    \/\/移除 css js,创建parseHTMLSafely前如果用不上 cssjs 建议移除\n    function removeHTMLTags(htmlString) {\n        \/\/ 移除script标签\n        let result = htmlString.replace(\/<script\\b[^<]*(?:(?!<\\\/script>)<[^<]*)*<\\\/script>\/gi, '');\n        \/\/ 移除style标签\n        result = result.replace(\/<style\\b[^<]*(?:(?!<\\\/style>)<[^<]*)*<\\\/style>\/gi, '');\n        return result;\n    }\n\n<\/script>\n\n<script>\n    const flutterBridge = new FlutterJSBridge();\n    const cache = new Cache();\n    const http = new Http();\n    const cookie = new Cookie();\n\n    \/\/ ========== 完整的TTS引擎数据 ==========\n    const ttsData = {\n        \"microsoft\": {\n            name: \"微软 Azure\",\n            icon: \"microsoft\",\n            iconClass: \"fab fa-microsoft\",\n            engines: [\n                {id: \"ms-xiaoxiao\", name: \"晓晓\", desc: \"女声·温暖亲切\", voice: \"zh-CN-XiaoxiaoNeural\"},\n                {id: \"ms-xiaoyi\", name: \"晓亦\", desc: \"女声·活泼可爱\", voice: \"zh-CN-XiaoyiNeural\"},\n                {id: \"ms-xiaochen\", name: \"晓辰\", desc: \"女声·清新自然\", voice: \"zh-CN-XiaochenNeural\"},\n                {id: \"ms-xiaohan\", name: \"晓涵\", desc: \"女声·知性优雅\", voice: \"zh-CN-XiaohanNeural\"},\n                {id: \"ms-xiaomeng\", name: \"晓梦\", desc: \"女声·甜美可人\", voice: \"zh-CN-XiaomengNeural\"},\n                {id: \"ms-xiaomo\", name: \"晓墨\", desc: \"女声·温柔细腻\", voice: \"zh-CN-XiaomoNeural\"},\n                {id: \"ms-xiaoqiu\", name: \"晓秋\", desc: \"女声·成熟稳重\", voice: \"zh-CN-XiaoqiuNeural\"},\n                {id: \"ms-xiaorou\", name: \"晓柔\", desc: \"女声·柔和舒适\", voice: \"zh-CN-XiaorouNeural\"},\n                {id: \"ms-xiaorui\", name: \"晓翠\", desc: \"女声·清脆明亮\", voice: \"zh-CN-XiaoruiNeural\"},\n                {id: \"ms-xiaoshuang\", name: \"晓双\", desc: \"童声·活泼可爱\", voice: \"zh-CN-XiaoshuangNeural\"},\n                {id: \"ms-xiaoyan\", name: \"晓颜\", desc: \"女声·端庄大方\", voice: \"zh-CN-XiaoyanNeural\"},\n                {id: \"ms-xiaoyou\", name: \"晓悠\", desc: \"童声·天真烂漫\", voice: \"zh-CN-XiaoyouNeural\"},\n                {id: \"ms-xiaozhen\", name: \"晓甄\", desc: \"女声·大气专业\", voice: \"zh-CN-XiaozhenNeural\"},\n                {id: \"ms-yunxi\", name: \"云溪\", desc: \"男声·青年活力\", voice: \"zh-CN-YunxiNeural\"},\n                {id: \"ms-yunjian\", name: \"云间\", desc: \"男声·沉稳大气\", voice: \"zh-CN-YunjianNeural\"},\n                {id: \"ms-yunyang\", name: \"云扬\", desc: \"男声·新闻播报\", voice: \"zh-CN-YunyangNeural\"},\n                {id: \"ms-yunfeng\", name: \"云枫\", desc: \"男声·浑厚磁性\", voice: \"zh-CN-YunfengNeural\"},\n                {id: \"ms-yunhao\", name: \"云皓\", desc: \"男声·阳光温暖\", voice: \"zh-CN-YunhaoNeural\"},\n                {id: \"ms-yunjie\", name: \"云杰\", desc: \"男声·成熟稳重\", voice: \"zh-CN-YunjieNeural\"},\n                {id: \"ms-yunxia\", name: \"云夏\", desc: \"男声·少年清澈\", voice: \"zh-CN-YunxiaNeural\"},\n                {id: \"ms-yunye\", name: \"云野\", desc: \"男声·沧桑故事\", voice: \"zh-CN-YunyeNeural\"},\n                {id: \"ms-yunze\", name: \"云泽\", desc: \"男声·浑厚有力\", voice: \"zh-CN-YunzeNeural\"},\n                {id: \"ms-xiaoxiao-dia\", name: \"晓晓DIA\", desc: \"女声·方言版\", voice: \"zh-CN-XiaoxiaoDialectsNeural\"},\n                {id: \"ms-xiaoxiao-mt\", name: \"晓晓MT\", desc: \"女声·多语言\", voice: \"zh-CN-XiaoxiaoMultilingualNeural\"},\n                {id: \"ms-xiaoyu-mt\", name: \"晓宇MT\", desc: \"女声·多语言\", voice: \"zh-CN-XiaoyuMultilingualNeural\"},\n                {id: \"ms-yunxiao-mt\", name: \"云晓MT\", desc: \"男声·多语言\", voice: \"zh-CN-YunxiaoMultilingualNeural\"},\n                {id: \"ms-yunyi-mt\", name: \"云逸MT\", desc: \"男声·多语言\", voice: \"zh-CN-YunyiMultilingualNeural\"},\n                {id: \"ms-yunfan-mt\", name: \"云帆MT\", desc: \"男声·多语言\", voice: \"zh-CN-YunfanMultilingualNeural\"},\n                {\n                    id: \"ms-xiaochen-hd\",\n                    name: \"晓辰HD\",\n                    desc: \"女声·高清版\",\n                    voice: \"zh-CN-Xiaochen:DragonHDLatestNeural\"\n                },\n                {id: \"ms-yunfan-hd\", name: \"云帆HD\", desc: \"男声·高清版\", voice: \"zh-CN-Yunfan:DragonHDLatestNeural\"},\n                {\n                    id: \"ms-xiaochen-fhd\",\n                    name: \"晓辰FHD\",\n                    desc: \"女声·超高清\",\n                    voice: \"zh-CN-Xiaochen:DragonHDFlashLatestNeural\"\n                },\n                {\n                    id: \"ms-xiaoxiao-fhd\",\n                    name: \"晓晓FHD\",\n                    desc: \"女声·超高清\",\n                    voice: \"zh-CN-Xiaoxiao:DragonHDFlashLatestNeural\"\n                },\n                {\n                    id: \"ms-xiaoxiao2-fhd\",\n                    name: \"潇潇FHD\",\n                    desc: \"女声·超高清\",\n                    voice: \"zh-CN-Xiaoxiao2:DragonHDFlashLatestNeural\"\n                },\n                {\n                    id: \"ms-yunxiao-fhd\",\n                    name: \"云觉FHD\",\n                    desc: \"男声·超高清\",\n                    voice: \"zh-CN-Yunxiao:DragonHDFlashLatestNeural\"\n                },\n                {\n                    id: \"ms-yunye-fhd\",\n                    name: \"云野FHD\",\n                    desc: \"男声·超高清\",\n                    voice: \"zh-CN-Yunye:DragonHDFlashLatestNeural\"\n                },\n                {\n                    id: \"ms-yunyi-fhd\",\n                    name: \"云逸FHD\",\n                    desc: \"男声·超高清\",\n                    voice: \"zh-CN-Yunyi:DragonHDFlashLatestNeural\"\n                },\n                {id: \"ms-hsiao-chen\", name: \"晓宸(繁)\", desc: \"女声·台湾繁体\", voice: \"zh-TW-HsiaoChenNeural\"},\n                {id: \"ms-hsiao-yu\", name: \"晓语(繁)\", desc: \"女声·台湾繁体\", voice: \"zh-TW-HsiaoYuNeural\"},\n                {id: \"ms-yun-jhe\", name: \"云喆(繁)\", desc: \"男声·台湾繁体\", voice: \"zh-TW-YunJheNeural\"}\n            ]\n        },\n        \"nano\": {\n            name: \"纳米 AI\",\n            icon: \"nano\",\n            iconClass: \"fas fa-robot\",\n            engines: [\n                {id: \"nano-deepseek\", name: \"DeepSeek\", desc: \"AI·深度求索\", voice: \"DeepSeek\"},\n                {id: \"nano-doubao\", name: \"豆包\", desc: \"AI·字节跳动\", voice: \"doubao\"},\n                {id: \"nano-zhinao\", name: \"智脑\", desc: \"AI·360智脑\", voice: \"zhinao\"},\n                {id: \"nano-tongyi\", name: \"通义\", desc: \"AI·阿里巴巴\", voice: \"tongyi\"},\n                {id: \"nano-hunyuan\", name: \"混元\", desc: \"AI·腾讯\", voice: \"hunyuan\"},\n                {id: \"nano-wenxin\", name: \"文心\", desc: \"AI·百度\", voice: \"wenxin\"},\n                {id: \"nano-minimax\", name: \"MiniMax\", desc: \"AI·MiniMax\", voice: \"MiniMax\"},\n                {id: \"nano-zhipu\", name: \"智谱\", desc: \"AI·智谱清言\", voice: \"zhipu\"},\n                {id: \"nano-shangtang\", name: \"商汤\", desc: \"AI·商汤科技\", voice: \"shangtang\"},\n                {id: \"nano-lingyi\", name: \"零一\", desc: \"AI·零一万物\", voice: \"lingyi\"},\n                {id: \"nano-baixiaoying\", name: \"百小应\", desc: \"AI·百度\", voice: \"baixiaoying\"},\n                {id: \"nano-xunfei\", name: \"星火\", desc: \"AI·讯飞\", voice: \"xunfei\"},\n                {id: \"nano-stepspark\", name: \"星辰\", desc: \"AI·Step\", voice: \"stepspark\"},\n                {id: \"nano-kimi\", name: \"Kimi\", desc: \"AI·月之暗面\", voice: \"Kimi\"}\n            ]\n        },\n        \"sibiachi\": {\n            name: \"思必驰\",\n            icon: \"sibiachi\",\n            iconClass: \"fas fa-brain\",\n            engines: [\n                \/\/ 男声 - 精品系列\n                {id: \"sbc-yukaimp\", name: \"俞师\", desc: \"男声·精品\", voiceId: \"yukaimp\"},\n                {id: \"sbc-jlshimp\", name: \"季师\", desc: \"男声·精品\", voiceId: \"jlshimp\"},\n                {id: \"sbc-tzruimp\", name: \"小睿\", desc: \"男声·精品\", voiceId: \"tzruimp\"},\n                {id: \"sbc-wjianm\", name: \"小江\", desc: \"男声·精品\", voiceId: \"wjianm_xsheng\"},\n\n                \/\/ 男声 - 标准\/其他风格\n                {id: \"sbc-xijunm\", name: \"小军\", desc: \"男声·严肃\", voiceId: \"xijunm\"},\n                {id: \"sbc-xijunma\", name: \"小军温和\", desc: \"男声·温和\", voiceId: \"xijunma\"},\n                {id: \"sbc-gdgm\", name: \"纲叔\", desc: \"男声·沉稳\", voiceId: \"gdgm\"},\n                {id: \"sbc-yukaim\", name: \"老师\", desc: \"男声·磁性\", voiceId: \"yukaim_all\"},\n                {id: \"sbc-kaolam\", name: \"考拉\", desc: \"男声·电台\", voiceId: \"kaolam_diantai\"},\n                {id: \"sbc-geyoump\", name: \"葛爷\", desc: \"男声·淡定\", voiceId: \"geyoump\"},\n                {id: \"sbc-geyou\", name: \"葛爷风趣\", desc: \"男声·风趣\", voiceId: \"geyou\"},\n                {id: \"sbc-zxcm\", name: \"星哥\", desc: \"男声·幽默\", voiceId: \"zxcm\"},\n                {id: \"sbc-zxcmp\", name: \"星哥风趣\", desc: \"男声·风趣\", voiceId: \"zxcmp\"},\n                {id: \"sbc-qiumum\", name: \"秋木\", desc: \"男声·故事\", voiceId: \"qiumum_0gushi\"},\n\n                \/\/ 童声\n                {id: \"sbc-tangtang\", name: \"堂堂\", desc: \"童音·男\", voiceId: \"tangtang_boyfp\"},\n                {id: \"sbc-gdfanf-boy\", name: \"方方\", desc: \"童音·男\", voiceId: \"gdfanf_boy\"},\n\n                \/\/ 女声 - 精品系列\n                {id: \"sbc-cyangfp\", name: \"初阳\", desc: \"女声·精品\", voiceId: \"cyangfp\"},\n                {id: \"sbc-aningfp\", name: \"安宁\", desc: \"女声·精品\", voiceId: \"aningfp\"},\n                {id: \"sbc-xizhefp\", name: \"行者\", desc: \"女声·精品\", voiceId: \"xizhefp\"},\n                {id: \"sbc-feyinfp\", name: \"风吟\", desc: \"女声·精品\", voiceId: \"feyinfp\"},\n\n                \/\/ 女声 - 甜美\/温柔\n                {id: \"sbc-zhilingfp\", name: \"小玲\", desc: \"女声·甜美\", voiceId: \"zhilingfp\"},\n                {id: \"sbc-xjingfp\", name: \"小静\", desc: \"女声·甜美\", voiceId: \"xjingfp\"},\n                {id: \"sbc-xmguof\", name: \"婷婷\", desc: \"女声·甜美\", voiceId: \"xmguof\"},\n                {id: \"sbc-xmamif\", name: \"小咪\", desc: \"女声·甜美\", voiceId: \"xmamif\"},\n                {id: \"sbc-gqlanfp\", name: \"小兰\", desc: \"女声·温柔\", voiceId: \"gqlanfp\"},\n                {id: \"sbc-madoufp-wenrou\", name: \"麻豆\", desc: \"女声·温柔\", voiceId: \"madoufp_wenrou\"},\n\n                \/\/ 女声 - 客服\/标准\n                {id: \"sbc-xijiufp\", name: \"小九\", desc: \"女声·客服\", voiceId: \"xijiufp\"},\n                {id: \"sbc-juan1f\", name: \"小美\", desc: \"女声·客服\", voiceId: \"juan1f\"},\n                {id: \"sbc-gdfanfp\", name: \"芳芳\", desc: \"女声·客服\", voiceId: \"gdfanfp\"},\n                {id: \"sbc-cyangf\", name: \"初阳\", desc: \"女声·标准\", voiceId: \"cyangf\"},\n                {id: \"sbc-lucyfa\", name: \"小浩\", desc: \"女声·标准\", voiceId: \"lucyfa\"},\n                {id: \"sbc-luyaof\", name: \"瑶瑶\", desc: \"女声·标准\", voiceId: \"luyaof\"},\n                {id: \"sbc-yaayif\", name: \"阿姨\", desc: \"女声·标准\", voiceId: \"yaayif\"},\n                {id: \"sbc-gdfanf\", name: \"方方\", desc: \"女声·标准\", voiceId: \"gdfanf_natong\"},\n\n                \/\/ 女声 - 其他特色\n                {id: \"sbc-anonyf\", name: \"小佚\", desc: \"女声·平和\", voiceId: \"anonyf\"},\n                {id: \"sbc-smjief\", name: \"小洁\", desc: \"女声·清亮\", voiceId: \"smjief\"},\n                {id: \"sbc-xjingf\", name: \"小静\", desc: \"女声·飘逸\", voiceId: \"xjingf\"},\n                {id: \"sbc-jjingfp\", name: \"晶晶\", desc: \"女声·知性\", voiceId: \"jjingfp\"},\n                {id: \"sbc-hyanif\", name: \"小妮\", desc: \"女声·邻家\", voiceId: \"hyanif\"},\n                {id: \"sbc-kaolaf\", name: \"考拉\", desc: \"女声·清纯\", voiceId: \"kaolaf\"},\n                {id: \"sbc-xiyaof\", name: \"小妖\", desc: \"女声·传统\", voiceId: \"xiyaof\"},\n                {id: \"sbc-xiyaof-qx\", name: \"小妖\", desc: \"女声·清新\", voiceId: \"xiyaof_qingxin\"},\n                {id: \"sbc-zzherf\", name: \"株儿\", desc: \"女声·传统\", voiceId: \"zzherf\"},\n                {id: \"sbc-lanyuf\", name: \"蓝雨\", desc: \"女声·传统\", voiceId: \"lanyuf\"},\n                {id: \"sbc-xbekef\", name: \"贝壳\", desc: \"女声·传统\", voiceId: \"xbekef\"},\n                {id: \"sbc-feyinf\", name: \"风吟\", desc: \"女声·传统\", voiceId: \"feyinf\"},\n                {id: \"sbc-qianranf\", name: \"然然\", desc: \"女声·可爱\", voiceId: \"qianranf\"},\n                {id: \"sbc-lzliafp\", name: \"连连\", desc: \"女声·可爱\", voiceId: \"lzliafp\"},\n                {id: \"sbc-zhiling-hk\", name: \"小玲\", desc: \"女声·欢快\", voiceId: \"zhilingfp_huankuai\"},\n                {id: \"sbc-linbafp\", name: \"零八\", desc: \"女声·清新\", voiceId: \"linbafp_qingxin\"},\n\n                \/\/ 女声 - 商务\/电台\/故事\n                {id: \"sbc-lili1f-sw\", name: \"璃璃\", desc: \"女声·商务\", voiceId: \"lili1f_shangwu\"},\n                {id: \"sbc-lili1f-yb\", name: \"璃璃\", desc: \"女声·娱报\", voiceId: \"lili1f_yubo\"},\n                {id: \"sbc-lili1f-dt\", name: \"璃璃\", desc: \"女声·电台\", voiceId: \"lili1f_diantai\"},\n                {id: \"sbc-zzhuaf\", name: \"砖砖\", desc: \"女声·故事\", voiceId: \"zzhuaf\"},\n                {id: \"sbc-juyinf\", name: \"绝音\", desc: \"女声·恐怖\", voiceId: \"juyinf_guigushi\"},\n\n                \/\/ 方言 - 粤语\n                {id: \"sbc-hchunf\", name: \"何春\", desc: \"方言·粤语\", voiceId: \"hchunf_ctn\"},\n                {id: \"sbc-lunaif\", name: \"晓健\", desc: \"方言·粤语\", voiceId: \"lunaif_ctn\"},\n\n                \/\/ 方言 - 其他\n                {id: \"sbc-yezi1f\", name: \"叶子\", desc: \"方言·上海\", voiceId: \"yezi1f_csh\"},\n                {id: \"sbc-dayaof\", name: \"大瑶\", desc: \"方言·山东\", voiceId: \"dayaof_csd\"},\n                {id: \"sbc-wqingf\", name: \"文卿\", desc: \"方言·四川\", voiceId: \"wqingf_csn\"},\n                {id: \"sbc-ppangf\", name: \"胖胖\", desc: \"方言·四川\", voiceId: \"ppangf_csn\"},\n                {id: \"sbc-xizhuf\", name: \"木兰\", desc: \"方言·河南\", voiceId: \"xizhuf_cyu\"},\n                {id: \"sbc-xjingf-db\", name: \"翠花\", desc: \"方言·东北\", voiceId: \"xjingf_cdb\"},\n                {id: \"sbc-qfyanf\", name: \"风颜\", desc: \"方言·闽南\", voiceId: \"qfyanf_cmn\"},\n\n                \/\/ 英文\n                {id: \"sbc-brettmp\", name: \"BRETT\", desc: \"英文·男声\", voiceId: \"brettmp\"}\n            ]\n        },\n        \/\/ \"baidu-ai\": {\n        \/\/     name: \"百度AI(推荐)\",\n        \/\/     icon: \"baidu-ai\",\n        \/\/     iconClass: \"fas fa-fire\",\n        \/\/     engines: [\n        \/\/         {id: \"bdai-xiaoyao\", name: \"情感杜逍遥\", desc: \"男声·推荐\", per: \"3\", type: \"ai\"},\n        \/\/         {id: \"bdai-yaya\", name: \"情感度丫丫\", desc: \"女声·情感\", per: \"4\", type: \"ai\"},\n        \/\/         {id: \"bdai-4114\", name: \"AI评书\", desc: \"男声·推荐\", per: \"4114\", type: \"ai\"},\n        \/\/         {id: \"bdai-4117\", name: \"情感温柔女声\", desc: \"女声·推荐\", per: \"4117\", type: \"ai\"}\n        \/\/     ]\n        \/\/ },\n        \"baidu\": {\n            name: \"百度语音\",\n            icon: \"baidu\",\n            iconClass: \"fas fa-cloud\",\n            engines: [\n                {id: \"bd-dubowen\", name: \"度博文\", desc: \"男声·推荐\", per: \"106\", pdt: \"301\", host: \"tts\"},\n                {id: \"bd-duxiaoyao\", name: \"度逍遥\", desc: \"男声·推荐\", per: \"3\", pdt: \"505\", host: \"tts\"},\n                \/\/ {id: \"bd-4126\", name: \"PER4126温柔淑女\", desc: \"女声·温柔\", per: \"4126\", pdt: \"232\", host: \"tts\"},\n                \/\/ {id: \"bd-5118\", name: \"PER5118优美女声\", desc: \"女声·推荐\", per: \"5118\", pdt: \"220\", host: \"tsn\"},\n                \/\/ {id: \"bd-4126\", name: \"PER4126温柔淑女\", desc: \"女声·温柔\", per: \"4126\", pdt: \"232\", host: \"tts\"},\n                \/\/ {id: \"bd-0\", name: \"PER0000度小美\", desc: \"女声·标准\", per: \"0\", pdt: \"160\", host: \"tts\"},\n                \/\/ {id: \"bd-2\", name: \"PER0002度小宇\", desc: \"男声·标准\", per: \"2\", pdt: \"301\", host: \"tts\"},\n                \/\/ {id: \"bd-3\", name: \"PER0003度逍遥②\", desc: \"男声·情感\", per: \"3\", pdt: \"160\", host: \"tts\"},\n                \/\/ {id: \"bd-4\", name: \"PER0004度丫丫\", desc: \"女声·可爱\", per: \"4\", pdt: \"301\", host: \"tts\"},\n                \/\/ {id: \"bd-5\", name: \"PER0005度小娇\", desc: \"女声·娇俏\", per: \"5\", pdt: \"301\", host: \"tts\"},\n                \/\/ {id: \"bd-100\", name: \"PER0100标准女声\", desc: \"女声·标准\", per: \"100\", pdt: \"160\", host: \"tts\"},\n                \/\/ {id: \"bd-103\", name: \"PER0103度米朵\", desc: \"女声·甜美\", per: \"103\", pdt: \"301\", host: \"tts\"},\n                \/\/ {id: \"bd-106\", name: \"PER0106度博文\", desc: \"男声·稳重\", per: \"106\", pdt: \"301\", host: \"tts\"},\n                \/\/ {id: \"bd-110\", name: \"PER0110度小童\", desc: \"童声\", per: \"110\", pdt: \"232\", host: \"tsn\"},\n                \/\/ {id: \"bd-111\", name: \"PER0111度小萌\", desc: \"童声·萌\", per: \"111\", pdt: \"220\", host: \"tsn\"},\n                \/\/ {id: \"bd-1100\", name: \"PER1100度小乔\", desc: \"女声·古风\", per: \"1100\", pdt: \"160\", host: \"tts\"},\n                \/\/ {id: \"bd-1200\", name: \"PER1200普通女声\", desc: \"女声·普通\", per: \"1200\", pdt: \"160\", host: \"tts\"},\n                \/\/ {id: \"bd-4003\", name: \"PER4003度逍遥①\", desc: \"男声·情感\", per: \"4003\", pdt: \"232\", host: \"tsn\"},\n                \/\/ {id: \"bd-4007\", name: \"PER4007台湾女声\", desc: \"女声·台湾\", per: \"4007\", pdt: \"232\", host: \"tts\"},\n                \/\/ {id: \"bd-4100\", name: \"PER4100温暖女声\", desc: \"女声·温暖\", per: \"4100\", pdt: \"220\", host: \"tts\"},\n                \/\/ {id: \"bd-4103\", name: \"PER4103萝莉女声\", desc: \"女声·萝莉\", per: \"4103\", pdt: \"232\", host: \"tsn\"},\n                \/\/ {id: \"bd-4105\", name: \"PER4105情感女声\", desc: \"女声·情感\", per: \"4105\", pdt: \"220\", host: \"tts\"},\n                \/\/ {id: \"bd-4106\", name: \"PER4106激情男声\", desc: \"男声·激情\", per: \"4106\", pdt: \"12\", host: \"tts\"},\n                \/\/ {id: \"bd-4114\", name: \"PER4114百度评书\", desc: \"男声·评书\", per: \"4114\", pdt: \"220\", host: \"tsn\"},\n                \/\/ {id: \"bd-4115\", name: \"PER4115情感男声\", desc: \"男声·情感\", per: \"4115\", pdt: \"220\", host: \"tsn\"},\n                \/\/ {id: \"bd-4117\", name: \"PER4117甜美女声\", desc: \"女声·甜美\", per: \"4117\", pdt: \"220\", host: \"tts\"},\n                \/\/ {id: \"bd-4118\", name: \"PER4118度小鹿\", desc: \"女声·知性\", per: \"4118\", pdt: \"232\", host: \"tts\"},\n                \/\/ {id: \"bd-4119\", name: \"PER4119度小鹿②\", desc: \"女声·知性\", per: \"4119\", pdt: \"220\", host: \"tsn\"},\n                \/\/ {id: \"bd-4121\", name: \"PER4121青年男声\", desc: \"男声·青年\", per: \"4121\", pdt: \"232\", host: \"tsn\"},\n                \/\/ {id: \"bd-4123\", name: \"PER4123百度解说\", desc: \"男声·解说\", per: \"4123\", pdt: \"12\", host: \"tts\"},\n                \/\/ {id: \"bd-4125\", name: \"PER4125沙雕女声\", desc: \"女声·搞笑\", per: \"4125\", pdt: \"220\", host: \"tts\"},\n                \/\/ {id: \"bd-4127\", name: \"PER4127儒雅男声\", desc: \"男声·儒雅\", per: \"4127\", pdt: \"12\", host: \"tts\"},\n                \/\/ {id: \"bd-4128\", name: \"PER4128醇厚男声\", desc: \"男声·醇厚\", per: \"4128\", pdt: \"12\", host: \"tts\"},\n                \/\/ {id: \"bd-4129\", name: \"PER4129少年男声\", desc: \"男声·少年\", per: \"4129\", pdt: \"12\", host: \"tts\"},\n                \/\/ {id: \"bd-5003\", name: \"PER5003说书人\", desc: \"男声·评书\", per: \"5003\", pdt: \"220\", host: \"tsn\"},\n                \/\/ {id: \"bd-5117\", name: \"PER5117百度女声\", desc: \"女声·标准\", per: \"5117\", pdt: \"232\", host: \"tts\"}\n            ]\n        },\n        \"sogou\": {\n            name: \"搜狗语音\",\n            icon: \"sogou\",\n            iconClass: \"fas fa-comment-dots\",\n            engines: [\n                {id: \"sg-xiyue\", name: \"夕月\", desc: \"女声·御姐(推荐)\", speaker: \"xiyue-pro\"},\n                {id: \"sg-wanqing\", name: \"婉清\", desc: \"女声·婉约\", speaker: \"wanqing-pro\"},\n                {id: \"sg-kangge\", name: \"康哥\", desc: \"男声·稳重\", speaker: \"kangge-pro\"},\n                {id: \"sg-ruoxi\", name: \"若曦\", desc: \"女声·温婉\", speaker: \"xf5-pro\"},\n                {id: \"sg-ahua\", name: \"阿华\", desc: \"男声·亲切\", speaker: \"ahua-pro\"},\n                {id: \"sg-axing\", name: \"阿星\", desc: \"男声·活泼\", speaker: \"axing-pro\"},\n                {id: \"sg-yani\", name: \"雅妮\", desc: \"女声·优雅\", speaker: \"yani-pro\"},\n                {id: \"sg-qingfeng\", name: \"青峰\", desc: \"男声·清朗\", speaker: \"qingfeng-pro\"}\n            ]\n        },\n        \"google\": {\n            name: \"谷歌语音\",\n            icon: \"google\",\n            iconClass: \"fab fa-google\",\n            engines: [\n                {id: \"gg-zh\", name: \"中文女声\", desc: \"女声·普通话\", lang: \"zh-ch\"},\n                {id: \"gg-tw\", name: \"台湾女声\", desc: \"女声·台湾\", lang: \"zh-tw\"},\n                {id: \"gg-hk\", name: \"粤语女声\", desc: \"女声·粤语\", lang: \"zh-HK\"}\n            ]\n        },\n        \"xunfei\": {\n            name: \"讯飞语音\",\n            icon: \"xunfei\",\n            iconClass: \"fas fa-volume-up\",\n            engines: [\n                {id: \"xf-xiaoyan\", name: \"小燕\", desc: \"女声·标准\", voice: \"iflytek\"},\n                {id: \"xf-xiaolin\", name: \"小琳\", desc: \"女声·台普\", voice: \"iflytekXiaolin\"},\n                {id: \"xf-xiaomei\", name: \"小美\", desc: \"女声·粤语\", voice: \"iflytekXiaomei\"}\n            ]\n        },\n        \"other\": {\n            name: \"其他语音\",\n            icon: \"other\",\n            iconClass: \"fas fa-ellipsis-h\",\n            engines: [\n                {id: \"ot-xiaoai\", name: \"小爱同学\", desc: \"小米·智能助手\", type: \"xiaoai\"},\n                {id: \"ot-xiaona\", name: \"微软小娜\", desc: \"微软·Cortana\", type: \"cortana\"},\n                {id: \"ot-guichu\", name: \"鬼畜女声\", desc: \"特效·搞笑\", type: \"mandarin\"}\n            ]\n        }\n    };\n\n    \/\/ ========== 微软TTS API列表 ==========\n    const msApis = [\n        {url: \"https:\/\/skybook.qzz.io\/tts\", fhd: true, key: \"skybook\"},\n        \/\/ {url: \"http:\/\/171.113.113.119:8085\/tts\", fhd: true},\n        {url: \"http:\/\/5.45.99.149:8075\/tts\", fhd: true},\n        {url: \"http:\/\/104.214.168.83:8080\/tts\", fhd: true},\n        \/\/ {url: \"http:\/\/74.48.40.244:8010\/tts\", fhd: true},\n        {url: \"http:\/\/47.119.125.172:8080\/tts\", fhd: true},\n        {url: \"http:\/\/64.112.42.45:9080\/tts\", fhd: true},\n        {url: \"http:\/\/36.248.181.23:22335\/tts\", fhd: true},\n        \/\/ {url: \"http:\/\/180.114.35.250:1080\/tts\", fhd: true},\n        {url: \"http:\/\/124.71.164.73:8085\/tts\", fhd: true},\n        {url: \"http:\/\/190.92.218.92:8080\/tts\", fhd: true}\n    ];\n\n\n    \/\/ ========== MD5算法实现 ==========\n    function md5(string) {\n        function md5cycle(x, k) {\n            var a = x[0], b = x[1], c = x[2], d = x[3];\n            a = ff(a, b, c, d, k[0], 7, -680876936);\n            d = ff(d, a, b, c, k[1], 12, -389564586);\n            c = ff(c, d, a, b, k[2], 17, 606105819);\n            b = ff(b, c, d, a, k[3], 22, -1044525330);\n            a = ff(a, b, c, d, k[4], 7, -176418897);\n            d = ff(d, a, b, c, k[5], 12, 1200080426);\n            c = ff(c, d, a, b, k[6], 17, -1473231341);\n            b = ff(b, c, d, a, k[7], 22, -45705983);\n            a = ff(a, b, c, d, k[8], 7, 1770035416);\n            d = ff(d, a, b, c, k[9], 12, -1958414417);\n            c = ff(c, d, a, b, k[10], 17, -42063);\n            b = ff(b, c, d, a, k[11], 22, -1990404162);\n            a = ff(a, b, c, d, k[12], 7, 1804603682);\n            d = ff(d, a, b, c, k[13], 12, -40341101);\n            c = ff(c, d, a, b, k[14], 17, -1502002290);\n            b = ff(b, c, d, a, k[15], 22, 1236535329);\n            a = gg(a, b, c, d, k[1], 5, -165796510);\n            d = gg(d, a, b, c, k[6], 9, -1069501632);\n            c = gg(c, d, a, b, k[11], 14, 643717713);\n            b = gg(b, c, d, a, k[0], 20, -373897302);\n            a = gg(a, b, c, d, k[5], 5, -701558691);\n            d = gg(d, a, b, c, k[10], 9, 38016083);\n            c = gg(c, d, a, b, k[15], 14, -660478335);\n            b = gg(b, c, d, a, k[4], 20, -405537848);\n            a = gg(a, b, c, d, k[9], 5, 568446438);\n            d = gg(d, a, b, c, k[14], 9, -1019803690);\n            c = gg(c, d, a, b, k[3], 14, -187363961);\n            b = gg(b, c, d, a, k[8], 20, 1163531501);\n            a = gg(a, b, c, d, k[13], 5, -1444681467);\n            d = gg(d, a, b, c, k[2], 9, -51403784);\n            c = gg(c, d, a, b, k[7], 14, 1735328473);\n            b = gg(b, c, d, a, k[12], 20, -1926607734);\n            a = hh(a, b, c, d, k[5], 4, -378558);\n            d = hh(d, a, b, c, k[8], 11, -2022574463);\n            c = hh(c, d, a, b, k[11], 16, 1839030562);\n            b = hh(b, c, d, a, k[14], 23, -35309556);\n            a = hh(a, b, c, d, k[1], 4, -1530992060);\n            d = hh(d, a, b, c, k[4], 11, 1272893353);\n            c = hh(c, d, a, b, k[7], 16, -155497632);\n            b = hh(b, c, d, a, k[10], 23, -1094730640);\n            a = hh(a, b, c, d, k[13], 4, 681279174);\n            d = hh(d, a, b, c, k[0], 11, -358537222);\n            c = hh(c, d, a, b, k[3], 16, -722521979);\n            b = hh(b, c, d, a, k[6], 23, 76029189);\n            a = hh(a, b, c, d, k[9], 4, -640364487);\n            d = hh(d, a, b, c, k[12], 11, -421815835);\n            c = hh(c, d, a, b, k[15], 16, 530742520);\n            b = hh(b, c, d, a, k[2], 23, -995338651);\n            a = ii(a, b, c, d, k[0], 6, -198630844);\n            d = ii(d, a, b, c, k[7], 10, 1126891415);\n            c = ii(c, d, a, b, k[14], 15, -1416354905);\n            b = ii(b, c, d, a, k[5], 21, -57434055);\n            a = ii(a, b, c, d, k[12], 6, 1700485571);\n            d = ii(d, a, b, c, k[3], 10, -1894986606);\n            c = ii(c, d, a, b, k[10], 15, -1051523);\n            b = ii(b, c, d, a, k[1], 21, -2054922799);\n            a = ii(a, b, c, d, k[8], 6, 1873313359);\n            d = ii(d, a, b, c, k[15], 10, -30611744);\n            c = ii(c, d, a, b, k[6], 15, -1560198380);\n            b = ii(b, c, d, a, k[13], 21, 1309151649);\n            a = ii(a, b, c, d, k[4], 6, -145523070);\n            d = ii(d, a, b, c, k[11], 10, -1120210379);\n            c = ii(c, d, a, b, k[2], 15, 718787259);\n            b = ii(b, c, d, a, k[9], 21, -343485551);\n            x[0] = add32(a, x[0]);\n            x[1] = add32(b, x[1]);\n            x[2] = add32(c, x[2]);\n            x[3] = add32(d, x[3]);\n        }\n\n        function cmn(q, a, b, x, s, t) {\n            a = add32(add32(a, q), add32(x, t));\n            return add32((a << s) | (a >>> (32 - s)), b);\n        }\n\n        function ff(a, b, c, d, x, s, t) {\n            return cmn((b & c) | ((~b) & d), a, b, x, s, t);\n        }\n\n        function gg(a, b, c, d, x, s, t) {\n            return cmn((b & d) | (c & (~d)), a, b, x, s, t);\n        }\n\n        function hh(a, b, c, d, x, s, t) {\n            return cmn(b ^ c ^ d, a, b, x, s, t);\n        }\n\n        function ii(a, b, c, d, x, s, t) {\n            return cmn(c ^ (b | (~d)), a, b, x, s, t);\n        }\n\n        function md51(s) {\n            var n = s.length, state = [1732584193, -271733879, -1732584194, 271733878], i;\n            for (i = 64; i <= s.length; i += 64) {\n                md5cycle(state, md5blk(s.substring(i - 64, i)));\n            }\n            s = s.substring(i - 64);\n            var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n            for (i = 0; i < s.length; i++) tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);\n            tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n            if (i > 55) {\n                md5cycle(state, tail);\n                for (i = 0; i < 16; i++) tail[i] = 0;\n            }\n            tail[14] = n * 8;\n            md5cycle(state, tail);\n            return state;\n        }\n\n        function md5blk(s) {\n            var md5blks = [], i;\n            for (i = 0; i < 64; i += 4) {\n                md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n            }\n            return md5blks;\n        }\n\n        var hex_chr = '0123456789abcdef'.split('');\n\n        function rhex(n) {\n            var s = '', j = 0;\n            for (; j < 4; j++) s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];\n            return s;\n        }\n\n        function hex(x) {\n            for (var i = 0; i < x.length; i++) x[i] = rhex(x[i]);\n            return x.join('');\n        }\n\n        function add32(a, b) {\n            return (a + b) & 0xFFFFFFFF;\n        }\n\n        return hex(md51(string));\n    }\n\n    \/\/ ========== 生成音频URL或请求配置 ==========\n    async function generateAudio(text,speed) {\n        let selectedId = await cache.get('tts');\n        if (!selectedId) {\n            selectedId = \"DeepSeek\";\n        }\n        let getTime = (o) => new Date(Date.now()+o*36e5).toISOString().replace('Z',`+${o.toString().padStart(2,'0')}:00`);\n        let time = getTime(8)\n        const encoded = encodeURIComponent(text);\n        let webViewUA = navigator.userAgent;\n        let _e = [\n            \"Web\",\n            time,\n            \"1.2\",\n            \"21329384620368073434705174017567\",\n            md5(webViewUA)\n        ]\n        let headers = {\n            \"User-Agent\": webViewUA,\n            \"device-platform\": _e[0],\n            \"timestamp\": _e[1],\n            \"zm-ver\": _e[2],\n            \"access-token\": _e[3],\n            \"zm-token\": \"\",\n            \"zm-ua\": _e[4],\n            \"Content-Type\": \"application\/x-www-form-urlencoded\"\n        }\n        _e[3] || _e.splice(3,1)\n        headers[\"zm-token\"] = md5(_e.join(\"\"))\n        return {\n            method: 'post',\n            url: `https:\/\/bot.n.cn\/api\/tts\/v1?roleid=${selectedId}`,\n            headers,\n            body: `text=${encoded}&set_speed=${speed\/10}&audio_type=mp3&format=stream`\n        };\n    }\n\n    \/\/ ========== 工具函数 ==========\n    function findEngine(id) {\n        for (const p of Object.values(ttsData)) {\n            const e = p.engines.find(x => x.id === id);\n            if (e) return e;\n        }\n        return null;\n    }\n\n    function findPlatform(id) {\n        for (const [k, p] of Object.entries(ttsData)) {\n            if (p.engines.some(e => e.id === id)) return k;\n        }\n        return null;\n    }\n\n\n    \/\/ tts链接返回方式 ,不可缺少参数\n    async function getttsurl(speakText,speechRate){\n        let op = await generateAudio(speakText,speechRate);\n        return JSON.stringify(op);\n    }\n\n\n    \/\/返回http开头的则任务登录链接会跳webview,其他的会按照json解析显示弹窗\n    async function getloginurl(){\n        \/\/return 'https:\/\/qysg.gyks.cf\/qysgttslogin.html?t=11';\n        var login=[\n            {\n                \"name\": \"▱▱▱▱显示当前接口▱▱▱▱\",\n                \"type\": \"button\",\n                \"action\": \"gettts()\"\n            },\n            {\n                \"name\": \"DeepSeek\",\n                \"type\": \"button\",\n                \"action\": \"settts('DeepSeek')\",\n                \"style\": {\n                    \"layout_wrapBefore\": true,\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"豆包\",\n                \"type\": \"button\",\n                \"action\": \"settts('doubao')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"智脑\",\n                \"type\": \"button\",\n                \"action\": \"settts('zhinao')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"通义\",\n                \"type\": \"button\",\n                \"action\": \"settts('tongyi')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"混元\",\n                \"type\": \"button\",\n                \"action\": \"settts('hunyuan')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"文心\",\n                \"type\": \"button\",\n                \"action\": \"settts('wenxin')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"Max\",\n                \"type\": \"button\",\n                \"action\": \"settts('MiniMax')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"智谱\",\n                \"type\": \"button\",\n                \"action\": \"settts('zhipu')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"商汤\",\n                \"type\": \"button\",\n                \"action\": \"settts('shangtang')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"零一\",\n                \"type\": \"button\",\n                \"action\": \"settts('lingyi')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"小应\",\n                \"type\": \"button\",\n                \"action\": \"settts('baixiaoying')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"星火\",\n                \"type\": \"button\",\n                \"action\": \"settts('xunfei')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"星辰\",\n                \"type\": \"button\",\n                \"action\": \"settts('stepspark')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            },\n            {\n                \"name\": \"Kimi\",\n                \"type\": \"button\",\n                \"action\": \"settts('Kimi')\",\n                \"style\": {\n                    \"layout_flexBasisPercent\": 0.2\n                }\n            }\n        ];\n        return JSON.stringify(login)\n    }\n\n    async  function settts(v){\n        await  cache.set(\"tts\",v);\n        flutterBridge.showToast(\"成功切换:\"+v)\n    }\n\n    async  function gettts(){\n       var get = await  cache.get(\"tts\");\n       flutterBridge.showToast(\"当前接口:\"+get)\n    }\n\n    \/\/如果登录 url 为非 http 开头的弹窗界面,每次修改完弹窗就会执行此函数\n    async function login(){\n\n    }\n<\/script>\n\n<\/html>\n      ",
    "login": true
}
广告