|
|
AIWROKÈí¼þ×Ô¶¯ÎÄ×ÖתÓïÒôÀý×Ó
- /**
- * ============================================================================
- * AIWROK TTS Îļþ¢Ý£ºtext-to-speech.cn£¨Î¢Èí Azure Éñ¾ÍøÂçÒôÉ«¡¤ÃâµÇ¼£©
- * ============================================================================
- * À´Ô´£ºhttps://www.text-to-speech.cn/
- * ÍøÕ¾ºó¶Ë´úÀí΢Èí Azure TTS£¬ÒôÉ«ºÍ Edge-TTS ÍêȫһÑù
- * µ«Óà HTTP POST ´úÌæ WebSocket£¬AIWROK ¼æÈÝÐÔ¸üºÃ
- *
- * ÒôÖÊ£º⭐⭐⭐⭐⭐ ºÍ¶¹°üÌÒ×ÓÒ»Ñù×ÔÈ»£¬ÎÞ»úÆ÷¸Ð
- *
- * ÖÐÎÄÅ®ÉùÍÆ¼ö£º
- * zh-CN-XiaoxiaoNeural ÏþÏþ ×î×ÔÈ»£¨Ä¬ÈÏ£©
- * zh-CN-XiaochenNeural Ïþ³½ ÄêÇáÅ®Éù
- * zh-CN-XiaorouNeural ÏþÈá ÎÂÈá
- * zh-CN-XiaohanNeural Ïþº ÎÂÈá
- * zh-CN-XiaomengNeural ÏþÃÎ ÄêÇáÅ®Éù
- * zh-CN-XiaoyiNeural ÏþÒÁ Ůͯ
- * ÖÐÎÄÄÐÉù£º
- * zh-CN-YunxiNeural ÔÆÏ£ ÄêÇáÄÐÉù
- * zh-CN-YunjianNeural ÔÆ½¡ ³ÉÄêÄÐÉù
- *
- * Ó÷¨£º
- * ttsWeb("ÄãºÃѽ");
- * ttsWeb("ÄãºÃѽ", "zh-CN-XiaorouNeural"); // ÏþÈá
- *
- * Îļþ±£´æ£º/sdcard/Pictures/aiwrok_tts/
- * ============================================================================
- */
- importClass(Packages.android.media.MediaPlayer);
- importClass(Packages.java.io.File);
- importClass(Packages.java.io.FileInputStream);
- importClass(Packages.java.io.FileOutputStream);
- importClass(Packages.java.lang.Thread);
- importClass(Packages.javax.net.ssl.HttpsURLConnection);
- importClass(Packages.java.net.URL);
- importClass(Packages.java.io.BufferedReader);
- importClass(Packages.java.io.InputStreamReader);
- importClass(Packages.java.io.OutputStream);
- var WEB_CFG = {
- cacheDir: "/sdcard/Pictures/aiwrok_tts/",
- // ĬÈÏÒôÉ«£ºÏþÏþ£¨×î×ÔÈ»£©
- voice: "zh-CN-XiaoxiaoNeural",
- // ÓïÑÔÖµ±ØÐëÊÇÖÐÎÄÈ«³Æ£¨ÍøÕ¾ÒªÇó£©
- language: "ÖÐÎÄ£¨ÆÕͨ»°£¬¼òÌ壩",
- // ÒôÖÊ£ºaudio-16khz-32kbitrate-mono-mp3 / audio-24khz-160kbitrate-mono-mp3 / audio-48khz-192kbitrate-mono-mp3
- kbitrate: "audio-24khz-160kbitrate-mono-mp3",
- // ÓïËÙ / Òôµ÷
- rate: "0",
- pitch: "0",
- // ÒôÁ¿£¨0-100£©
- volume: "75",
- // Çé¸Ð£º0=ĬÈÏ
- style: "0",
- styledegree: "1",
- // ÆäËû²ÎÊý
- role: "0",
- silence: "",
- predict: "0",
- // ÑéÖ¤Âë£¨ÍøÕ¾¹Ì¶¨Öµ£©
- yzm: "202410170001",
- // µ¥´Î×î´ó×ÖÊý
- maxLen: 200,
- // Á½¸öÕ¾µã£¨»¥Îª±¸Óã©
- sites: [
- {
- page: "https://www.text-to-speech.cn/",
- api: "https://www.text-to-speech.cn/getSpeek.php"
- },
- {
- page: "http://new.text-to-speech.cn/tts/",
- api: "http://new.text-to-speech.cn/wp-content/plugins/speech-tts/getSpeek.php"
- }
- ]
- };
- function ensureDir() {
- var d = new File(WEB_CFG.cacheDir);
- if (!d.exists()) d.mkdirs();
- }
- function isValidAudio(p) {
- try {
- var f = new File(p);
- if (!f.exists() || f.length() < 512) return false;
- var fis = new FileInputStream(p);
- var h = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 3);
- var r = fis.read(h);
- fis.close();
- if (r < 2) return false;
- var b0 = h[0] & 0xFF, b1 = h[1] & 0xFF;
- if (b0 == 0x49 && b1 == 0x44) return true;
- if (b0 == 0xFF && (b1 & 0xE0) == 0xE0) return true;
- return false;
- } catch (e) { return false; }
- }
- function splitText(text, maxLen) {
- var segs = [];
- if (!text) return segs;
- text = String(text);
- var parts = text.split(/([¡££¡£¿!?£¬,£»;\n\r])/);
- var cur = "";
- for (var i = 0; i < parts.length; i++) {
- var p = parts[i];
- if (p == null) continue;
- if (cur.length + p.length > maxLen) {
- if (cur.length > 0) { segs.push(cur); cur = ""; }
- if (p.length > maxLen) {
- for (var j = 0; j < p.length; j += maxLen) {
- segs.push(p.substring(j, Math.min(j + maxLen, p.length)));
- }
- } else { cur = p; }
- } else { cur += p; }
- }
- if (cur.length > 0) segs.push(cur);
- return segs;
- }
- /**
- * ´ÓÒ³Ãæ HTML ÖÐÌáÈ¡ nonce ºÍ token
- */
- function getPageAuth(pageUrl) {
- var conn = null;
- var reader = null;
- try {
- var url = new URL(pageUrl);
- conn = url.openConnection();
- conn.setRequestMethod("GET");
- conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
- conn.setConnectTimeout(15000);
- conn.setReadTimeout(30000);
- conn.setUseCaches(false);
- var code = conn.getResponseCode();
- if (code != 200) return null;
- reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
- var sb = new java.lang.StringBuilder();
- var line;
- while ((line = reader.readLine()) != null) {
- sb.append(line).append("\n");
- }
- var html = String(sb.toString());
- // ÌáÈ¡ token£¨ÍøÕ¾ÔÚ script ±êÇ©ÀïÓà const token = 'xxx' ¶¨Ò壩
- var token = "";
- var tokenPatterns = [
- /const\s+token\s*=\s*['"]([a-zA-Z0-9:_\-]+)['"]/i,
- /var\s+token\s*=\s*['"]([a-zA-Z0-9:_\-]+)['"]/i,
- /["']token["']\s*[:=]\s*["']([a-zA-Z0-9:_\-]+)["']/i
- ];
- for (var i = 0; i < tokenPatterns.length; i++) {
- var m = html.match(tokenPatterns[i]);
- if (m && m[1]) { token = m[1]; break; }
- }
- // Õ¾µã2¿ÉÄÜÐèÒª nonce£¨WordPress£©
- var nonce = "";
- var noncePatterns = [
- /["']nonce["']\s*[:=]\s*["']([a-f0-9]{6,32})["']/i,
- /nonce\s*[:=]\s*["']([a-f0-9]{6,32})["']/i
- ];
- for (var i = 0; i < noncePatterns.length; i++) {
- var m = html.match(noncePatterns[i]);
- if (m && m[1]) { nonce = m[1]; break; }
- }
- return { nonce: nonce, token: token };
- } catch (e) {
- printl(" ↳ »ñÈ¡Ò³ÃæÈÏÖ¤ÐÅϢʧ°Ü: " + e.message);
- return null;
- } finally {
- if (reader != null) { try { reader.close(); } catch (e) {} }
- if (conn != null) { try { conn.disconnect(); } catch (e) {} }
- }
- }
- /**
- * POST µ½ getSpeek.php »ñÈ¡ TTS ÒôƵ
- */
- function ttsApiCall(apiUrl, text, voice, auth) {
- var conn = null;
- var reader = null;
- var os = null;
- try {
- // ¹¹½¨±íµ¥Êý¾Ý£¨²ÎÊýÃûºÍÖµ±ØÐëÓëÍøÕ¾ÍêȫһÖ£©
- var params = "language=" + encodeURIComponent(WEB_CFG.language) +
- "&voice=" + encodeURIComponent(voice) +
- "&text=" + encodeURIComponent(text) +
- "&role=" + WEB_CFG.role +
- "&style=" + WEB_CFG.style +
- "&rate=" + WEB_CFG.rate +
- "&pitch=" + WEB_CFG.pitch +
- "&kbitrate=" + encodeURIComponent(WEB_CFG.kbitrate) +
- "&silence=" + WEB_CFG.silence +
- "&styledegree=" + WEB_CFG.styledegree +
- "&volume=" + WEB_CFG.volume +
- "&predict=" + WEB_CFG.predict +
- "&user_id=" +
- "&yzm=" + WEB_CFG.yzm +
- "&replice=1";
- if (auth && auth.nonce) params += "&nonce=" + auth.nonce;
- if (auth && auth.token) params += "&token=" + encodeURIComponent(auth.token);
- var url = new URL(apiUrl);
- conn = url.openConnection();
- conn.setRequestMethod("POST");
- conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
- conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
- conn.setRequestProperty("Accept", "application/json, text/plain, */*");
- conn.setRequestProperty("Referer", apiUrl.replace("/getSpeek.php", "/"));
- conn.setDoOutput(true);
- conn.setDoInput(true);
- conn.setConnectTimeout(15000);
- conn.setReadTimeout(30000);
- conn.setUseCaches(false);
- // ·¢ËÍÇëÇóÌ壨Rhino µÄ JS String ûÓÐ getBytes£¬ÒªÓà java.lang.String£©
- os = conn.getOutputStream();
- var jParams = new java.lang.String(params);
- os.write(jParams.getBytes("UTF-8"));
- os.flush();
- os.close();
- os = null;
- var code = conn.getResponseCode();
- var inputStream;
- if (code >= 400) {
- inputStream = conn.getErrorStream();
- } else {
- inputStream = conn.getInputStream();
- }
- if (inputStream == null) return null;
- reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
- var sb = new java.lang.StringBuilder();
- var line;
- while ((line = reader.readLine()) != null) {
- sb.append(line);
- }
- var response = String(sb.toString());
- return { code: code, body: response };
- } catch (e) {
- printl(" ↳ API ÇëÇóʧ°Ü: " + e.message);
- return null;
- } finally {
- if (os != null) { try { os.close(); } catch (e) {} }
- if (reader != null) { try { reader.close(); } catch (e) {} }
- if (conn != null) { try { conn.disconnect(); } catch (e) {} }
- }
- }
- /**
- * ´Ó JSON ÏìÓ¦ÖÐÌáÈ¡ÏÂÔØ URL
- */
- function parseDownloadUrl(jsonStr) {
- try {
- // Rhino µÄ JSON.parse ¿ÉÄܲ»¿ÉÓã¬ÓÃÕýÔòÌáÈ¡
- // ¸ñʽ: {"code":200,"download":"https://...mp3","srt":""}
- var codeMatch = jsonStr.match(/"code"\s*:\s*(\d+)/);
- if (!codeMatch || codeMatch[1] != "200") {
- printl(" ↳ API ·µ»Ø´íÎó: " + jsonStr.substring(0, 200));
- return null;
- }
- var dlMatch = jsonStr.match(/"download"\s*:\s*"([^"]+)"/);
- if (dlMatch && dlMatch[1]) return dlMatch[1];
- return null;
- } catch (e) {
- printl(" ↳ ½âÎöÏìӦʧ°Ü: " + e.message);
- return null;
- }
- }
- /**
- * ÏÂÔØ MP3 Îļþ£¨´øÖØÊÔ£©
- */
- function downloadMp3(url, savePath) {
- for (var retry = 0; retry < 3; retry++) {
- try {
- new File(savePath)["delete"]();
- var client = new okHttp();
- client.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
- client.downloadFile(url, savePath);
- if (isValidAudio(savePath)) return true;
- } catch (e) {
- Thread.sleep(1000);
- }
- if (retry < 2) Thread.sleep(1000);
- }
- return false;
- }
- /**
- * ºÏ³Éµ¥¶ÎÎÄ×Ö£¨¶à´ÎÖØÊÔ£¬401ʱµÈ´ýºóË¢ÐÂtoken£©
- */
- function synthSegment(text, voice, savePath) {
- for (var retry = 0; retry < 4; retry++) {
- for (var s = 0; s < WEB_CFG.sites.length; s++) {
- var site = WEB_CFG.sites[s];
- // 1. ÿ´Î¶¼ÖØÐ»ñÈ¡ token£¨token »á¹ýÆÚ£©
- var auth = getPageAuth(site.page);
- if (!auth) {
- continue;
- }
- // 2. µ÷ÓÃ API
- var resp = ttsApiCall(site.api, text, voice, auth);
- if (!resp || resp.code != 200) {
- continue;
- }
- // 3. ½âÎöÏÂÔØ URL
- var dlUrl = parseDownloadUrl(resp.body);
- if (!dlUrl) {
- // 401 ´íÎó£ºtoken ¹ýÆÚ£¬µÈ 3 ÃëÔÙÊÔ
- if (resp.body && resp.body.indexOf("401") >= 0) {
- printl(" ↳ token ¹ýÆÚ£¬µÈ´ý 3 ÃëºóÖØÊÔ...");
- Thread.sleep(3000);
- }
- continue;
- }
- // 4. ÏÂÔØ MP3
- if (downloadMp3(dlUrl, savePath)) {
- return true;
- }
- }
- // ÖØÊÔǰµÈ´ý
- if (retry < 3) {
- var wait = (retry + 1) * 2000; // 2s, 4s, 6s µÝÔö
- printl(" ↳ µÚ " + (retry + 1) + " ´ÎÖØÊÔ£¨µÈ´ý " + (wait / 1000) + "s£©...");
- Thread.sleep(wait);
- }
- }
- return false;
- }
- /**
- * ÎÄ×ÖתÓïÒô£¨Ö÷º¯Êý£©
- * @param text Îı¾
- * @param voice ÒôÉ«Ãû£¨Ä¬ÈÏÏþÏþ£©
- * @return ³É¹¦¶ÎÊý
- */
- function ttsWeb(text, voice) {
- voice = voice || WEB_CFG.voice;
- if (!text || String(text).length === 0) { printl("⚠️ Îı¾Îª¿Õ"); return 0; }
- ensureDir();
- var segs = splitText(text, WEB_CFG.maxLen);
- printl("🔊 [text-to-speech.cn] ÒôÉ«£º" + voice + " ¹² " + segs.length + " ¶Î");
- var okCount = 0;
- for (var i = 0; i < segs.length; i++) {
- var seg = segs[i];
- var tag = seg.substring(0, 10).replace(/[\\/:*?"<>|]/g, "_");
- var savePath = WEB_CFG.cacheDir + "web_" + voice.replace(/[^a-zA-Z0-9]/g, "").substring(0, 15) +
- "_" + (i + 1) + "_" + Date.now() + ".mp3";
- printl("[" + (i + 1) + "/" + segs.length + "] " + seg.substring(0, 25) + "...");
- if (synthSegment(seg, voice, savePath)) {
- var f = new File(savePath);
- printl(" ✅ " + f.length() + " bytes");
- okCount++;
- } else {
- printl(" ❌ ºÏ³Éʧ°Ü");
- }
- if (i < segs.length - 1) Thread.sleep(1500);
- }
- printl("✅ Íê³É (" + okCount + "/" + segs.length + " ¶Î)");
- return okCount;
- }
- // ======================== ÑÝʾ ========================
- function demo() {
- printl("========================================");
- printl(" ¢Ý text-to-speech.cn TTS ÑÝʾ");
- printl(" ΢Èí Azure Éñ¾ÍøÂçÒôÉ«¡¤ÃâµÇ¼");
- printl("========================================");
- // ²âÊԶ̾ä
- printl("\n¡¾ÏþÏþ - ĬÈÏ¡¿");
- ttsWeb("ÄãºÃѽ£¬ÎÒÊÇÏþÏþ£¬Ò»¸öÎÂůÎľ²µÄÉùÒô¡£½ñÌìµÄ·çºÜÎÂÈᣬÊʺÏÂýÂýÁÄÌì¡£");
- Thread.sleep(500);
- printl("\n¡¾ÏþÈá - ÎÂÈá¡¿");
- ttsWeb("ÄãºÃ£¬ÎÒÊÇÏþÈᣬ˵»°ÇáÇáµÄ£¬ÏñÔÚÄã¶ú±ß½²¹ÊÊÂÒ»Ñù¡£", "zh-CN-XiaorouNeural");
- Thread.sleep(500);
- printl("\n¡¾Ïþ³½ - ÄêÇáÅ®Éù¡¿");
- ttsWeb("ÄãºÃ£¬ÎÒÊÇÏþ³½£¬Ò»¸öÑô¹âµÄÄêÇáÅ®º¢ÉùÒô£¬ºÜ¸ßÐËÈÏʶÄãŶ¡£", "zh-CN-XiaochenNeural");
- Thread.sleep(500);
- printl("\n¡¾ÔÆÏ£ - ÄêÇáÄÐÉù¡¿");
- ttsWeb("ÄãºÃ£¬ÎÒÊÇÔÆÏ££¬Ò»¸öÄêÇáÄÐÉù£¬Ï£ÍûÄãϲ»¶¡£", "zh-CN-YunxiNeural");
- printl("\nÑÝʾ½áÊø¡£MP3 ¶¼ÔÚ /sdcard/Pictures/aiwrok_tts/ Ŀ¼Ï¡£");
- }
- // ======================== ԣ̩²è¹ÝÈ«ÎÄÀʶÁ ========================
- function readArticle() {
- var ARTICLE = [
- "¹âÐ÷Ä©Ä꣬±±¾©µÄԣ̩²è¹ÝµÄÇïÑô×Üб×Åɨ¹ý°ËÏÉ×À£¬²èÍëÀïµÄÜÔÀò¸¡¸¡³Á³Á¡£ÕƹñÍõÀû·¢ß¬×Ų¼½í²Á¹ñ̨£¬ÑÛ¾¦³ò×ÅÃÅ£¬¶ú¶äÈ´ÈöµÃÂú²è¹Ý¶¼ÊÇ£¬ÕâµØ·½£¬Èý½Ì¾ÅÁ÷¾Û¾Û×Å£¬Ïл°Àï²Ø×ÅÂòÂô£¬Ì¾ÆøÀï¹ü×ÅÃÅ·¡£",
- "ÕâÌìÉÎÎ磬³ñ¶ÐׯµÄÇØ¶þүһƨ¹É×øÏ£¬²èû¶Ë¾ÍÌ¾Æø£º»ÞÆø£¬Ðµ½µÄËÕº¼³ñ¶ÐѹÁ˰ë²Ö£¬ÕâÄêÍ·±ø»ÄÂíÂҵģ¬Ë»¹ÓÐÏÐÇ®×öʲôÐÂÒÂÉÑѽ£¬ÔÙÁÌÁ©Ô£¬ÅÂÊÇÒªÉúùι³æ×ÓÈ¥ÁË¡£",
- "»°Òô¸ÕÂ䣬ÅÜÂëÍ·µÄÀî°ÑÍ·ÏÆÁ±×Ó½øÀ´£¬¹àÁË´óÍëÁ¹²è£ºÄúÄdzÎÒ´ÓÄϱßÔËÀ´Á˰ٽïºÃÒ©²Ä£¬ÕÒ²»×Åϼң¬ÂëÍ·¶ÑÒ»Ìì¿ÛÒ»ÌìµÄÇ®£¬ÔÙºÄÏÂÈ¥£¬ÎҵðѿãÑü´øµ±³öÈ¥ËãÁË¡£",
- "½ÇÂ俪·¹×¯µÄÕÅÅÖ×ÓÒ²ÅÄ×Å´óÍÈ´îÇ»£º¶¼±ðº°¿àÁË£¬ÎÒÄÇ·¹×¯¸Õ»»Á˽ð×ÖÕÐÅÆ£¬Ïë¸ø»ï¼Æ×öÉíÕûÆëµÄÒÂÉÑ£¬»¹ÏëѰµãÕý¾ºÃÑòÈâ×öÕÐÅÆ²Ë£¬ÅÜÁ˰ëÔ£¬Ã»×ÅÂäѽ£¬ÑÛ¿´¾ÍÒª¿ªÕÅÁË£¬¼±µÃÒ»Âú×ìÊÇÅÝ¡£",
- "ÍõÀû·¢ÊÖÀï²Á×ŲèÍ룬ÂýÓÆÓÆµÄ²åÁË»°£º°¦£¬ÎÒµ±¶à´óµÄÄÑ´¦£¬ÇضþÒ¯£¬ÄúÄdzñ¶Ð£¬ÕÅÕÆ¹ñÕý³îû´¦Âò£¬ÕÅÕÆ¹ñÄúÒªµÄÑòÈ⣬½ÖÎ÷¿ÚÂôÈâµÄÂí´ó¸ç£¬×ò¶ù»¹ÔÚÎÒÕâÄîß¶¶ÚÁ˺ûõ³ö²»È¥£¬Àî°ÑÍ·ÄúÄÇÒ©²Ä£¬¶Ô¹ýµÂÈÊÕÆ¹ñ£¬Ç°¶ù»¹ÍÐÎÒ´òÌýÄϱߵÄлõÄÄÓС£",
- "Èý¾ä»°Â䵨£¬ØíÈËÏÈÊÇã¶ÁËÉñ£¬½ô¸ú×ÅÑÛ¾¦¶¼ÁÁÁË£¬µ±³¡¾Í´Õµ½Ò»×À×Ó£¬ÄúÈü¸·ÖÀû£¬ÎÒµ£µãÔË·Ñ£¬Ã»°ë¸öʱ³½£¬Èý×®ÂòÂôȫ˵Í×ÁË£¬ÇضþÒ¯ÇåÁË¿â´æ£¬Àî°Ñͷж°ü¸¤£¬ÕÅÅÖ×Ó´ÕÁË¿ªÕŵļҵ±£¬¸ö¸öϲÑÕ¿ª£¬ÁÙ×ßÿÈ˶¼Èû¸øÍõÀû·¢Ò»¿éËéÒø×Ó£¬ËµÊǺȲèµÄÇ®¡£",
- "¿¿´°×ø×ŵÄËïÐã²Å£¬´©µÃ´ò²¹¶¡³¤ÉÀ£¬ÌìÌìÀ´²è¹Ý²ä×ùλ³Ê飬ÕÅ×ì¾ÍÊǺ®´°¿à¶Á£¬Æ¾Õæ²ÅʵѧÁ¢Éí£¬Õâ»á¶ùËûÍÆÁËÍÆÆÆÑÛ¾µ£¬ËáÁïÁïµÄ˵£¬ÕÅÕÆ¹ñ£¬ÄúÕâËãÊÇʲô±¾Ê£¿²»¹ýÊÇˣˣ×ìÆ¤×ÓÇ£Ïߣ¬Í¶»úÈ¡ÇɰÕÁË£¬ÄÄÏñÎÒ£¬ÈÕÈÕ¿à¶Á£¬¿¿µÄÊÇÕæ±¾Ê³Է¹£¬²Å̤ʵѽ¡£",
- "ÍõÀû·¢Ò²²»ÄÕ£¬¸øËûÌíÁ˰ëÍëÈȲ裬Ц×Å˵£ºËïÏÈÉú£¬ÄúŬÁ¦ÊÇÕæµÄ£¬¿ÉÄúϸÏëŶ£¬ÕâÌìϵı¾Ê£¬ÄúѧµÃÍêÂð£¿Äú¼È²»»áÖ¯³ñ¶Ð£¬Ò²²»»áÅÜÂëÍ·£¬±ßÌôÑòÈâ¶¼²»»á£¬×ܲ»ÄÜÑùÑù¶¼×Ô¼ºß¬ÔÚÊÖÀï°É£¿",
- "ÎÒÕâС²è¹Ý£¬×¬µÃ²»¹âÊDzèÇ®£¬Ò²ÊÇÒ»¸ö·½±ãµÄÇ®£¬ËÊÖÀïÓÐÏлõ£¬ËÐÄÀïÓÐÄÑ´¦£¬ÎÒÌý׿Ç×Å£¬µ½Ê±ºòÁ½Í·´Õµ½Ò»¿é¶ù£¬´ó¼Ò¶¼Ê¡ÁËÁ¦Æø£¬ÎÒÒ²Âä¸öÖмä·Ñ£¬ÄúÌìÌìÃÆÍ·³Ê飬×ÜÏë×Å×Ô¼º³ÉÌì´óµÄʶù£¬¿ÉÁ¬½Ö¶ÔÃæµÄÒ©ÆÌȱɶҩ²Ä¶¼²»ÖªµÀ£¬ÕâŬÁ¦ÓÐɶÓ㬲»¾Í×ßÍáÁËÅÜ¡£",
- "ËïÐã²ÅÕÅÁËÕÅ×죬°ëÌìû˵³ö»°À´¡£",
- "תÑÛ¹ýÁ˰ëÄê£¬ÇØ¶þÒ¯µÄ³ñ¶Ðׯ¿ªÁ˷ֺţ¬Àî°ÑÍ·µÄ»õÕ»¹ÍÁËØí»ï¼Æ£¬ÕÅÅÖ×ӵķ¹×¯³ÉÁ˾©³ÇСÓÐÃûÆøµÄ¹Ý×Ó¡£ØíÈË·êÄê¹ý½Ú¶¼À´¸øÍõÀû·¢ËÍÀñ£¬Ô£Ì©²è¹ÝÒ²·ÐÞÁËÃÅÃæ£¬±ÈÔÏȳ¨ÁÁ²»ÉÙ¡£",
- "Ö»ÓÐËïÐã²Å£¬»¹ÊÇÌìÌ챧מÉÊé³£¬×ìÀïÄîß¶×Å»³²Å²»Óö£¬³¤ÉÀÉϵIJ¹¶¡·´µ¹ÓÖ¶àÁËÁ½¿é¡£",
- "ºóÀ´ÓÐÈ˸úÍõÀû·¢Ì̷ֽ¢²ÆµÄ¾÷ÇÏ£¬Ëû×ܰÚ×ÅÊÖЦ£ºÄÄÓÐʲô¾÷ÇÏ£¿ÎÒ¼Èû½ðÉ½Ò²Ã»Òø¿ó£¬¾ÍÊÇÈϵÃÈ˶֪࣬µÀËÓÐɶ¡¢Ëȱɶ£¬¸øÈË´î¸öÇŰÕÁË¡£ÕâÊÀÉϵÄÇ®£¬´ÓÀ´²»ÊÇ߬ÔÚ×Ô¼ºÊÖÀï²Å½ÐÇ®¡£ÄãÒªÊÇÄܳÉÁËÄÇ´îÇŵÄÈË£¬¸÷É«¼ÛÖµ¶¼µÃ´ÓÄãÕâ¶ù¹ý£¬²Æ¸»ÄÄÀﻹÓÃ×·£¿Ëü×ÔÈ»¾ÍÍùÄãÕâ¶ùÁ÷¡£",
- "²è¿ÍÃÇÌýÁË£¬ÓеĵãÍ·£¬ÓÐµÄÆ²×죬²èÍë¸ÇÒ»ÏÆ£¬ÜÔÀò»¨ÏãÓÖÆ®ÂúÁËÒ»ÎÝ×Ó¡£"
- ];
- printl("========================================");
- printl(" ԣ̩²è¹ÝµÄ´îÇž ¡¤ text-to-speech.cn");
- printl(" ÒôÉ«£ºÏþÏþ£¨Î¢Èí Azure Éñ¾ÍøÂ磩");
- printl("========================================");
- printl("ÎÄÕ¹² " + ARTICLE.length + " ¶Î");
- ensureDir();
- var okCount = 0;
- var voice = "zh-CN-XiaoxiaoNeural";
- var failed = []; // ¼Ç¼ʧ°ÜµÄ¶ÎÂä
- for (var i = 0; i < ARTICLE.length; i++) {
- var seg = ARTICLE[i];
- var savePath = WEB_CFG.cacheDir + "web_xiaoxiao_seg" + (i + 1) + ".mp3";
- // ÒÑÏÂÔØµÄÌø¹ý
- var existFile = new File(savePath);
- if (existFile.exists() && existFile.length() > 512) {
- printl("\n[" + (i + 1) + "/" + ARTICLE.length + "] ÒÑ´æÔÚ£¬Ìø¹ý (" + existFile.length() + " bytes)");
- okCount++;
- continue;
- }
- printl("\n[" + (i + 1) + "/" + ARTICLE.length + "] " + seg.substring(0, 25) + "...");
- if (synthSegment(seg, voice, savePath)) {
- var f = new File(savePath);
- printl(" ✅ " + f.length() + " bytes");
- okCount++;
- } else {
- printl(" ❌ ºÏ³Éʧ°Ü£¬ÉÔºóÖØÊÔ");
- failed.push(i);
- }
- // ¶Î¼ä¼ä¸ô 2 Ã루±ÜÃâÆµ·±ÇëÇóµ¼Ö token ¹ýÆÚ£©
- if (i < ARTICLE.length - 1) Thread.sleep(2000);
- }
- // µÚ¶þÂÖ£ºÖØÊÔʧ°ÜµÄ¶ÎÂä
- if (failed.length > 0) {
- printl("\n========================================");
- printl(" µÚ¶þÂÖ£ºÖØÊÔ " + failed.length + " ¸öʧ°Ü¶ÎÂä");
- printl("========================================");
- for (var r = 0; r < failed.length; r++) {
- var idx = failed[r];
- var seg = ARTICLE[idx];
- var savePath = WEB_CFG.cacheDir + "web_xiaoxiao_seg" + (idx + 1) + ".mp3";
- printl("\n[ÖØÊÔ " + (r + 1) + "/" + failed.length + "] ¶ÎÂä " + (idx + 1) + ": " + seg.substring(0, 25) + "...");
- // µÈ´ý 5 ÃëÈà token ÀäÈ´
- Thread.sleep(5000);
- if (synthSegment(seg, voice, savePath)) {
- var f = new File(savePath);
- printl(" ✅ " + f.length() + " bytes");
- okCount++;
- } else {
- printl(" ❌ ÈÔȻʧ°Ü");
- }
- }
- }
- printl("\n========================================");
- printl(" Íê³É (" + okCount + "/" + ARTICLE.length + " ¶Î)");
- printl(" MP3 ±£´æÔÚ: " + WEB_CFG.cacheDir);
- printl("========================================");
- }
- // ÔËÐУºÈ¡Ïû×¢ÊÍÄãÏëÖ´Ðеĺ¯Êý
- // demo(); // ÑÝʾ 4 ÖÖÒôÉ«
- readArticle(); // ÀʶÁԣ̩²è¹ÝÈ«ÎÄ
¸´ÖÆ´úÂë
|
|