Files

44 lines
10 KiB
JSON

[
{
"id": -100,
"name": "1.百度",
"url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=3&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}",
"contentType": "audio/wav"
},
{
"id": -29,
"name": "2.阿里云语音",
"url": "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts,{\"method\": \"POST\",\"body\": {\"appkey\":\"{{source.getLoginInfoMap().get('AppKey')}}\",\"text\":\"{{speakText}}\",\"format\":\"mp3\",\"volume\":100,\"speech_rate\":{{String((speakSpeed) * 20 - 400)}} }}",
"contentType": "audio/mpeg",
"loginUrl": "function login(){var loginInfo = source.getLoginInfoMap();\nvar accessKeyId = loginInfo.get('AccessKeyId');\nvar accessKeySecret = loginInfo.get('AccessKeySecret');\nvar timestamp = java.timeFormatUTC(new Date().getTime(), \"yyyy-MM-dd'T'HH:mm:ss'Z'\", 0);\nvar aly = new JavaImporter(Packages.javax.crypto.Mac, Packages.javax.crypto.spec.SecretKeySpec, Packages.javax.xml.bind.DatatypeConverter, Packages.java.net.URLEncoder, Packages.java.lang.String, Packages.android.util.Base64);\nwith (aly) {\n function percentEncode(value) {\n return URLEncoder.encode(value, \"UTF-8\").replace(\"+\", \"%20\")\n .replace(\"*\", \"%2A\").replace(\"%7E\", \"~\")\n }\n\n function sign(stringToSign, accessKeySecret) {\n var mac = Mac.getInstance('HmacSHA1');\n mac.init(new SecretKeySpec(String(accessKeySecret + '&').getBytes(\"UTF-8\"), \"HmacSHA1\"));\n var signData = mac.doFinal(String(stringToSign).getBytes(\"UTF-8\"));\n var signBase64 = Base64.encodeToString(signData, Base64.NO_WRAP);\n var signUrlEncode = percentEncode(signBase64);\n return signUrlEncode;\n }\n}\nvar query = 'AccessKeyId=' + accessKeyId + '&Action=CreateToken&Format=JSON&RegionId=cn-shanghai&SignatureMethod=HMAC-SHA1&SignatureNonce=' + java.randomUUID() + '&SignatureVersion=1.0&Timestamp=' + percentEncode(timestamp) + '&Version=2019-02-28';\nvar signStr = sign('GET&' + percentEncode('/') + '&' + percentEncode(query), accessKeySecret);\nvar queryStringWithSign = \"Signature=\" + signStr + \"&\" + query;\nvar body = java.ajax('http://nls-meta.cn-shanghai.aliyuncs.com/?' + queryStringWithSign)\nvar res = JSON.parse(body)\nif (res.Message) {\n throw new Error(res.Message)\n}\nvar header = { \"X-NLS-Token\": res.Token.Id };\nsource.putLoginHeader(JSON.stringify(header))}",
"loginUi": [
{
"name": "AppKey",
"type": "text"
},
{
"name": "AccessKeyId",
"type": "text"
},
{
"name": "AccessKeySecret",
"type": "text"
}
],
"loginCheckJs": "var response = result;\nif (response.headers().get(\"Content-Type\") != \"audio/mpeg\") {\n var body = JSON.parse(response.body().string())\n if (body.status == 40000001) {\n source.login()\n java.getHeaderMap().putAll(source.getHeaderMap(true))\n response = java.getResponse()\n } else {\n throw body.message\n }\n}\nresponse"
},
{
"concurrentRate": "1500",
"contentType": "audio/mpeg",
"enabledCookieJar": false,
"header": "",
"id": 1768175007437,
"jsLib": "//明月照大江 · next引擎源\n//--洛娅橙\nvar banben = \"0.0.2\";\nvar styleM = {\n \"无风格\": \"\",\n \"助手\": \"assistant\",\n \"聊天\": \"chat\",\n \"客户服务\": \"customerservice\",\n \"新闻播报\": \"newscast\",\n \"深情\": \"affectionate\",\n \"愤怒\": \"angry\",\n \"平静\": \"calm\",\n \"欢快\": \"cheerful\",\n \"不满\": \"disgruntled\",\n \"恐惧\": \"fearful\",\n \"温柔\": \"gentle\",\n \"抒情\": \"lyrical\",\n \"悲伤\": \"sad\",\n \"严肃\": \"serious\",\n \"诗歌朗诵\": \"poetry-reading\",\n \"友好\": \"friendly\",\n \"随意聊天\": \"chat-casual\",\n \"耳语\": \"whispering\",\n \"歉意\": \"sorry\",\n \"兴奋\": \"excited\"\n};\n\nvar apiM = {\n \"http://171.113.113.119:8085/tts\": true,\n \"http://5.45.99.149:8075/tts\": true,\n \"http://104.214.168.83:8080/tts\": true,\n \"http://74.48.40.244:8010/tts\": true,\n \"http://47.119.125.172:8080/tts\": true,\n \"http://64.112.42.45:9080/tts\": true,\n \"http://146.56.188.115:8080/tts\": false,\n \"https://t.leftsite.cn/tts\": false,\n \"http://47.79.92.215:18080/tts\": false,\n \"http://36.248.181.23:22335/tts\": true,\n \"http://180.114.35.250:1080/tts\": true,\n \"http://124.71.164.73:8085/tts\": true,\n \"http://190.92.218.92:8080/tts\": true\n};\n\nvar fyrM = {\n \"晓晓\": \"zh-CN-XiaoxiaoNeural\",\n \"晓亦\": \"zh-CN-XiaoyiNeural\",\n \"晓辰\": \"zh-CN-XiaochenNeural\",\n \"晓涵\": \"zh-CN-XiaohanNeural\",\n \"晓梦\": \"zh-CN-XiaomengNeural\",\n \"晓墨\": \"zh-CN-XiaomoNeural\",\n \"晓秋\": \"zh-CN-XiaoqiuNeural\",\n \"晓柔\": \"zh-CN-XiaorouNeural\",\n \"晓睿\": \"zh-CN-XiaoruiNeural\",\n \"晓双\": \"zh-CN-XiaoshuangNeural\",\n \"晓颜\": \"zh-CN-XiaoyanNeural\",\n \"晓悠\": \"zh-CN-XiaoyouNeural\",\n \"晓甄\": \"zh-CN-XiaozhenNeural\",\n \"云溪\": \"zh-CN-YunxiNeural\",\n \"云间\": \"zh-CN-YunjianNeural\",\n \"云扬\": \"zh-CN-YunyangNeural\",\n \"云枫\": \"zh-CN-YunfengNeural\",\n \"云皓\": \"zh-CN-YunhaoNeural\",\n \"云杰\": \"zh-CN-YunjieNeural\",\n \"云夏\": \"zh-CN-YunxiaNeural\",\n \"云野\": \"zh-CN-YunyeNeural\",\n \"云泽\": \"zh-CN-YunzeNeural\",\n\n \"晓晓DIA\": \"zh-CN-XiaoxiaoDialectsNeural\",\n \"晓晓MT\": \"zh-CN-XiaoxiaoMultilingualNeural\",\n \"晓宇MT\": \"zh-CN-XiaoyuMultilingualNeural\",\n \"云晓MT\": \"zh-CN-YunxiaoMultilingualNeural\",\n \"云逸MT\": \"zh-CN-YunyiMultilingualNeural\",\n \"云帆MT\": \"zh-CN-YunfanMultilingualNeural\",\n\n \"晓辰HD\": \"zh-CN-Xiaochen:DragonHDLatestNeural\",\n \"云帆HD\": \"zh-CN-Yunfan:DragonHDLatestNeural\",\n\n \"晓辰FHD\": \"zh-CN-Xiaochen:DragonHDFlashLatestNeural\",\n \"晓晓FHD\": \"zh-CN-Xiaoxiao:DragonHDFlashLatestNeural\",\n \"潇潇FHD\": \"zh-CN-Xiaoxiao2:DragonHDFlashLatestNeural\",\n \"云萧FHD\": \"zh-CN-Yunxiao:DragonHDFlashLatestNeural\",\n \"云野FHD\": \"zh-CN-Yunye:DragonHDFlashLatestNeural\",\n \"云逸FHD\": \"zh-CN-Yunyi:DragonHDFlashLatestNeural\",\n\n \"晓宸_繁\": \"zh-TW-HsiaoChenNeural\",\n \"晓语_繁\": \"zh-TW-HsiaoYuNeural\",\n \"云喆_繁\": \"zh-TW-YunJheNeural\"\n};\n\nfunction apiurl(speakText, speakSpeed, apiurl) {\n let info = this.source.getLoginInfoMap();\n let api = apiurl || info[\"api\"];\n let apik = apiM[api];\n let fyr = info[\"发言人\"];\n let fyrk = fyrM[fyr];\n let fg = info[\"风格\"];\n let fgk = styleM[fg];\n let body = {};\n let params = `?t=${speakText}&v=${fyrk}&r=${(speakSpeed - 10) * 10}&p=0&s=${fgk}&api_key=`;\n return `${api}${params}`;\n}",
"lastUpdateTime": 1770778835144,
"loginCheckJs": "if (result.code() != 200) {\n java.toast(\"接口失效\\n正在切换中...\");\n java.log(\"失效接口:\" + java.ruleUrl)\n let ulm = Object.keys(apiM);\n let uls = ulm.map(x => apiurl(\"测试\", 10, x));\n let resl = java.ajaxTestAll(uls, 3000, true);\n let goodI = -1,\n i = 0;\n let goodt = 9999;\n for (let res of resl) {\n let time = res.callTime();\n if (time > 0 && time < goodt) {\n goodI = i;\n goodt = time;\n }\n i++;\n }\n if (goodI != -1) {\n let goodurl = ulm[goodI];\n java.toast(java.log(\"\\n已选择最优接口:\" + goodurl));\n let Info = source.getLoginInfoMap();\n Info['api'] = goodurl;\n source.putLoginInfo(JSON.stringify(Info));\n java.initUrl();\n result = java.getResponse();\n } else {\n java.toast(\"需在登录界面切换接口\\n引擎版本号:\" + banben);\n }\n}\nresult",
"loginUi": "@js:\nlet styleS = Object.keys(styleM).map(key => `\"${key}\"`).join(',');\nlet fyrS = Object.keys(fyrM).map(key => `\"${key}\"`).join(',');\nlet apiS = Object.keys(apiM).map(key => `\"${key}\"`).join(',');\n`[{\n \"name\": \"发言人\",\n \"viewName\": \"'发言人:'\",\n \"action\":\"clear()\",\n \"type\": \"select\",\n \"chars\": [${fyrS}],\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n },\n {\n \"name\": \"风格\",\n \"viewName\": \"'风格:'\",\n \"action\":\"clear()\",\n \"type\": \"select\",\n \"chars\": [${styleS}],\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n },\n {\n \"name\": \"api\",\n \"viewName\": \"'接口:'\",\n \"action\":\"checkjk()\",\n \"type\": \"select\",\n \"chars\": [${apiS}],\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_wrapBefore\": true\n }\n },\n {\n \"name\": \"自动清除缓存\",\n \"viewName\": \"'切换发言人时清理缓存 '\",\n \"type\": \"toggle\",\n \"chars\": [\"✅\",\"🔳\"],\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1,\n \"layout_justifySelf\":\"right\",\n \"layout_wrapBefore\": true\n }\n }\n]`;",
"loginUrl": "function login() {}\n\nfunction checkjk() {\n let jk = result[\"api\"];\n let fhd = apiM[jk];\n java.toast(`\\n当前接口${fhd?\"✓支持\":\"X不支持\"}FHD发言人\\n正在测试延迟...`);\n let url = apiurl(\"测试\", 10, jk);\n let res = java.ajaxTestAll([url], 3000, true)[0];\n let time = res.callTime();\n if (time < 0) {\n java.toast(java.log(`\\n接口:${jk}\\n无法访问 ${time}`));\n return\n }\n java.toast(`\\n接口:${jk}\\n延迟时间为${time}`);\n}\n\nfunction clear() {\n if (result[\"自动清除缓存\"] == \"🔳\") return;\n java.clearTtsCache();\n}",
"name": "🌈Next引擎-长按切换音色",
"url": "@js:apiurl(speakText,speakSpeed);"
}
]