B2BÍøÂçÈí¼þ

 ÕÒ»ØÃÜÂë
 Á¢¼´×¢²á ÉóºËÍøÕ¾ºÅ:QQ:896757558
ËÑË÷
²é¿´: 2|»Ø¸´: 0
´òÓ¡ ÉÏÒ»Ö÷Ìâ ÏÂÒ»Ö÷Ìâ

AIWROKÈí¼þ×Ô¶¯ÎÄ×ÖתÓïÒôÀý×Ó

[¸´ÖÆÁ´½Ó]

1149

Ö÷Ìâ

1154

Ìû×Ó

7873

»ý·Ö

abc

Rank: 9Rank: 9Rank: 9

»ý·Ö
7873
Ìø×ªµ½Ö¸¶¨Â¥²ã
Â¥Ö÷
AIWROKÈí¼þ×Ô¶¯ÎÄ×ÖתÓïÒôÀý×Ó
AIWROKÈí¼þ×Ô¶¯ÎÄ×ÖתÓïÒôÀý×Ó B2BÍøÂçÈí¼þ
  1. /**
  2. * ============================================================================
  3. *  AIWROK TTS Îļþ¢Ý£ºtext-to-speech.cn£¨Î¢Èí Azure Éñ¾­ÍøÂçÒôÉ«¡¤ÃâµÇ¼£©
  4. * ============================================================================
  5. *  À´Ô´£ºhttps://www.text-to-speech.cn/
  6. *        ÍøÕ¾ºó¶Ë´úÀí΢Èí Azure TTS£¬ÒôÉ«ºÍ Edge-TTS ÍêȫһÑù
  7. *        µ«Óà HTTP POST ´úÌæ WebSocket£¬AIWROK ¼æÈÝÐÔ¸üºÃ
  8. *
  9. *  ÒôÖÊ£º⭐⭐⭐⭐⭐  ºÍ¶¹°üÌÒ×ÓÒ»Ñù×ÔÈ»£¬ÎÞ»úÆ÷¸Ð
  10. *
  11. *  ÖÐÎÄÅ®ÉùÍÆ¼ö£º
  12. *    zh-CN-XiaoxiaoNeural   ÏþÏþ  ×î×ÔÈ»£¨Ä¬ÈÏ£©
  13. *    zh-CN-XiaochenNeural   Ïþ³½  ÄêÇáÅ®Éù
  14. *    zh-CN-XiaorouNeural    ÏþÈá  ÎÂÈá
  15. *    zh-CN-XiaohanNeural    Ïþº­  ÎÂÈá
  16. *    zh-CN-XiaomengNeural   ÏþÃΠ ÄêÇáÅ®Éù
  17. *    zh-CN-XiaoyiNeural     ÏþÒÁ  Å®Í¯
  18. *  ÖÐÎÄÄÐÉù£º
  19. *    zh-CN-YunxiNeural      ÔÆÏ£  ÄêÇáÄÐÉù
  20. *    zh-CN-YunjianNeural    ÔÆ½¡  ³ÉÄêÄÐÉù
  21. *
  22. *  Ó÷¨£º
  23. *    ttsWeb("ÄãºÃѽ");
  24. *    ttsWeb("ÄãºÃѽ", "zh-CN-XiaorouNeural");  // ÏþÈá
  25. *
  26. *  Îļþ±£´æ£º/sdcard/Pictures/aiwrok_tts/
  27. * ============================================================================
  28. */

  29. importClass(Packages.android.media.MediaPlayer);
  30. importClass(Packages.java.io.File);
  31. importClass(Packages.java.io.FileInputStream);
  32. importClass(Packages.java.io.FileOutputStream);
  33. importClass(Packages.java.lang.Thread);
  34. importClass(Packages.javax.net.ssl.HttpsURLConnection);
  35. importClass(Packages.java.net.URL);
  36. importClass(Packages.java.io.BufferedReader);
  37. importClass(Packages.java.io.InputStreamReader);
  38. importClass(Packages.java.io.OutputStream);

  39. var WEB_CFG = {
  40.     cacheDir: "/sdcard/Pictures/aiwrok_tts/",
  41.     // ĬÈÏÒôÉ«£ºÏþÏþ£¨×î×ÔÈ»£©
  42.     voice: "zh-CN-XiaoxiaoNeural",
  43.     // ÓïÑÔÖµ±ØÐëÊÇÖÐÎÄÈ«³Æ£¨ÍøÕ¾ÒªÇó£©
  44.     language: "ÖÐÎÄ£¨ÆÕͨ»°£¬¼òÌ壩",
  45.     // ÒôÖÊ£ºaudio-16khz-32kbitrate-mono-mp3 / audio-24khz-160kbitrate-mono-mp3 / audio-48khz-192kbitrate-mono-mp3
  46.     kbitrate: "audio-24khz-160kbitrate-mono-mp3",
  47.     // ÓïËÙ / Òôµ÷
  48.     rate: "0",
  49.     pitch: "0",
  50.     // ÒôÁ¿£¨0-100£©
  51.     volume: "75",
  52.     // Çé¸Ð£º0=ĬÈÏ
  53.     style: "0",
  54.     styledegree: "1",
  55.     // ÆäËû²ÎÊý
  56.     role: "0",
  57.     silence: "",
  58.     predict: "0",
  59.     // ÑéÖ¤Âë£¨ÍøÕ¾¹Ì¶¨Öµ£©
  60.     yzm: "202410170001",
  61.     // µ¥´Î×î´ó×ÖÊý
  62.     maxLen: 200,
  63.     // Á½¸öÕ¾µã£¨»¥Îª±¸Óã©
  64.     sites: [
  65.         {
  66.             page: "https://www.text-to-speech.cn/",
  67.             api: "https://www.text-to-speech.cn/getSpeek.php"
  68.         },
  69.         {
  70.             page: "http://new.text-to-speech.cn/tts/",
  71.             api: "http://new.text-to-speech.cn/wp-content/plugins/speech-tts/getSpeek.php"
  72.         }
  73.     ]
  74. };

  75. function ensureDir() {
  76.     var d = new File(WEB_CFG.cacheDir);
  77.     if (!d.exists()) d.mkdirs();
  78. }

  79. function isValidAudio(p) {
  80.     try {
  81.         var f = new File(p);
  82.         if (!f.exists() || f.length() < 512) return false;
  83.         var fis = new FileInputStream(p);
  84.         var h = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 3);
  85.         var r = fis.read(h);
  86.         fis.close();
  87.         if (r < 2) return false;
  88.         var b0 = h[0] & 0xFF, b1 = h[1] & 0xFF;
  89.         if (b0 == 0x49 && b1 == 0x44) return true;
  90.         if (b0 == 0xFF && (b1 & 0xE0) == 0xE0) return true;
  91.         return false;
  92.     } catch (e) { return false; }
  93. }

  94. function splitText(text, maxLen) {
  95.     var segs = [];
  96.     if (!text) return segs;
  97.     text = String(text);
  98.     var parts = text.split(/([¡££¡£¿!?£¬,£»;\n\r])/);
  99.     var cur = "";
  100.     for (var i = 0; i < parts.length; i++) {
  101.         var p = parts[i];
  102.         if (p == null) continue;
  103.         if (cur.length + p.length > maxLen) {
  104.             if (cur.length > 0) { segs.push(cur); cur = ""; }
  105.             if (p.length > maxLen) {
  106.                 for (var j = 0; j < p.length; j += maxLen) {
  107.                     segs.push(p.substring(j, Math.min(j + maxLen, p.length)));
  108.                 }
  109.             } else { cur = p; }
  110.         } else { cur += p; }
  111.     }
  112.     if (cur.length > 0) segs.push(cur);
  113.     return segs;
  114. }

  115. /**
  116. * ´ÓÒ³Ãæ HTML ÖÐÌáÈ¡ nonce ºÍ token
  117. */
  118. function getPageAuth(pageUrl) {
  119.     var conn = null;
  120.     var reader = null;
  121.     try {
  122.         var url = new URL(pageUrl);
  123.         conn = url.openConnection();
  124.         conn.setRequestMethod("GET");
  125.         conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
  126.         conn.setConnectTimeout(15000);
  127.         conn.setReadTimeout(30000);
  128.         conn.setUseCaches(false);

  129.         var code = conn.getResponseCode();
  130.         if (code != 200) return null;

  131.         reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
  132.         var sb = new java.lang.StringBuilder();
  133.         var line;
  134.         while ((line = reader.readLine()) != null) {
  135.             sb.append(line).append("\n");
  136.         }

  137.         var html = String(sb.toString());

  138.         // ÌáÈ¡ token£¨ÍøÕ¾ÔÚ script ±êÇ©ÀïÓà const token = 'xxx' ¶¨Ò壩
  139.         var token = "";
  140.         var tokenPatterns = [
  141.             /const\s+token\s*=\s*['"]([a-zA-Z0-9:_\-]+)['"]/i,
  142.             /var\s+token\s*=\s*['"]([a-zA-Z0-9:_\-]+)['"]/i,
  143.             /["']token["']\s*[:=]\s*["']([a-zA-Z0-9:_\-]+)["']/i
  144.         ];
  145.         for (var i = 0; i < tokenPatterns.length; i++) {
  146.             var m = html.match(tokenPatterns[i]);
  147.             if (m && m[1]) { token = m[1]; break; }
  148.         }

  149.         // Õ¾µã2¿ÉÄÜÐèÒª nonce£¨WordPress£©
  150.         var nonce = "";
  151.         var noncePatterns = [
  152.             /["']nonce["']\s*[:=]\s*["']([a-f0-9]{6,32})["']/i,
  153.             /nonce\s*[:=]\s*["']([a-f0-9]{6,32})["']/i
  154.         ];
  155.         for (var i = 0; i < noncePatterns.length; i++) {
  156.             var m = html.match(noncePatterns[i]);
  157.             if (m && m[1]) { nonce = m[1]; break; }
  158.         }

  159.         return { nonce: nonce, token: token };
  160.     } catch (e) {
  161.         printl("  ↳ »ñÈ¡Ò³ÃæÈÏÖ¤ÐÅϢʧ°Ü: " + e.message);
  162.         return null;
  163.     } finally {
  164.         if (reader != null) { try { reader.close(); } catch (e) {} }
  165.         if (conn != null) { try { conn.disconnect(); } catch (e) {} }
  166.     }
  167. }

  168. /**
  169. * POST µ½ getSpeek.php »ñÈ¡ TTS ÒôƵ
  170. */
  171. function ttsApiCall(apiUrl, text, voice, auth) {
  172.     var conn = null;
  173.     var reader = null;
  174.     var os = null;
  175.     try {
  176.         // ¹¹½¨±íµ¥Êý¾Ý£¨²ÎÊýÃûºÍÖµ±ØÐëÓëÍøÕ¾ÍêȫһÖ£©
  177.         var params = "language=" + encodeURIComponent(WEB_CFG.language) +
  178.                      "&voice=" + encodeURIComponent(voice) +
  179.                      "&text=" + encodeURIComponent(text) +
  180.                      "&role=" + WEB_CFG.role +
  181.                      "&style=" + WEB_CFG.style +
  182.                      "&rate=" + WEB_CFG.rate +
  183.                      "&pitch=" + WEB_CFG.pitch +
  184.                      "&kbitrate=" + encodeURIComponent(WEB_CFG.kbitrate) +
  185.                      "&silence=" + WEB_CFG.silence +
  186.                      "&styledegree=" + WEB_CFG.styledegree +
  187.                      "&volume=" + WEB_CFG.volume +
  188.                      "&predict=" + WEB_CFG.predict +
  189.                      "&user_id=" +
  190.                      "&yzm=" + WEB_CFG.yzm +
  191.                      "&replice=1";

  192.         if (auth && auth.nonce) params += "&nonce=" + auth.nonce;
  193.         if (auth && auth.token) params += "&token=" + encodeURIComponent(auth.token);

  194.         var url = new URL(apiUrl);
  195.         conn = url.openConnection();
  196.         conn.setRequestMethod("POST");
  197.         conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
  198.         conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
  199.         conn.setRequestProperty("Accept", "application/json, text/plain, */*");
  200.         conn.setRequestProperty("Referer", apiUrl.replace("/getSpeek.php", "/"));
  201.         conn.setDoOutput(true);
  202.         conn.setDoInput(true);
  203.         conn.setConnectTimeout(15000);
  204.         conn.setReadTimeout(30000);
  205.         conn.setUseCaches(false);

  206.         // ·¢ËÍÇëÇóÌ壨Rhino µÄ JS String ûÓÐ getBytes£¬ÒªÓà java.lang.String£©
  207.         os = conn.getOutputStream();
  208.         var jParams = new java.lang.String(params);
  209.         os.write(jParams.getBytes("UTF-8"));
  210.         os.flush();
  211.         os.close();
  212.         os = null;

  213.         var code = conn.getResponseCode();
  214.         var inputStream;
  215.         if (code >= 400) {
  216.             inputStream = conn.getErrorStream();
  217.         } else {
  218.             inputStream = conn.getInputStream();
  219.         }

  220.         if (inputStream == null) return null;

  221.         reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
  222.         var sb = new java.lang.StringBuilder();
  223.         var line;
  224.         while ((line = reader.readLine()) != null) {
  225.             sb.append(line);
  226.         }

  227.         var response = String(sb.toString());
  228.         return { code: code, body: response };
  229.     } catch (e) {
  230.         printl("  ↳ API ÇëÇóʧ°Ü: " + e.message);
  231.         return null;
  232.     } finally {
  233.         if (os != null) { try { os.close(); } catch (e) {} }
  234.         if (reader != null) { try { reader.close(); } catch (e) {} }
  235.         if (conn != null) { try { conn.disconnect(); } catch (e) {} }
  236.     }
  237. }

  238. /**
  239. * ´Ó JSON ÏìÓ¦ÖÐÌáÈ¡ÏÂÔØ URL
  240. */
  241. function parseDownloadUrl(jsonStr) {
  242.     try {
  243.         // Rhino µÄ JSON.parse ¿ÉÄܲ»¿ÉÓã¬ÓÃÕýÔòÌáÈ¡
  244.         // ¸ñʽ: {"code":200,"download":"https://...mp3","srt":""}
  245.         var codeMatch = jsonStr.match(/"code"\s*:\s*(\d+)/);
  246.         if (!codeMatch || codeMatch[1] != "200") {
  247.             printl("  ↳ API ·µ»Ø´íÎó: " + jsonStr.substring(0, 200));
  248.             return null;
  249.         }

  250.         var dlMatch = jsonStr.match(/"download"\s*:\s*"([^"]+)"/);
  251.         if (dlMatch && dlMatch[1]) return dlMatch[1];

  252.         return null;
  253.     } catch (e) {
  254.         printl("  ↳ ½âÎöÏìӦʧ°Ü: " + e.message);
  255.         return null;
  256.     }
  257. }

  258. /**
  259. * ÏÂÔØ MP3 Îļþ£¨´øÖØÊÔ£©
  260. */
  261. function downloadMp3(url, savePath) {
  262.     for (var retry = 0; retry < 3; retry++) {
  263.         try {
  264.             new File(savePath)["delete"]();
  265.             var client = new okHttp();
  266.             client.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
  267.             client.downloadFile(url, savePath);
  268.             if (isValidAudio(savePath)) return true;
  269.         } catch (e) {
  270.             Thread.sleep(1000);
  271.         }
  272.         if (retry < 2) Thread.sleep(1000);
  273.     }
  274.     return false;
  275. }

  276. /**
  277. * ºÏ³Éµ¥¶ÎÎÄ×Ö£¨¶à´ÎÖØÊÔ£¬401ʱµÈ´ýºóË¢ÐÂtoken£©
  278. */
  279. function synthSegment(text, voice, savePath) {
  280.     for (var retry = 0; retry < 4; retry++) {
  281.         for (var s = 0; s < WEB_CFG.sites.length; s++) {
  282.             var site = WEB_CFG.sites[s];

  283.             // 1. ÿ´Î¶¼ÖØÐ»ñÈ¡ token£¨token »á¹ýÆÚ£©
  284.             var auth = getPageAuth(site.page);
  285.             if (!auth) {
  286.                 continue;
  287.             }

  288.             // 2. µ÷ÓÃ API
  289.             var resp = ttsApiCall(site.api, text, voice, auth);
  290.             if (!resp || resp.code != 200) {
  291.                 continue;
  292.             }

  293.             // 3. ½âÎöÏÂÔØ URL
  294.             var dlUrl = parseDownloadUrl(resp.body);
  295.             if (!dlUrl) {
  296.                 // 401 ´íÎó£ºtoken ¹ýÆÚ£¬µÈ 3 ÃëÔÙÊÔ
  297.                 if (resp.body && resp.body.indexOf("401") >= 0) {
  298.                     printl("  ↳ token ¹ýÆÚ£¬µÈ´ý 3 ÃëºóÖØÊÔ...");
  299.                     Thread.sleep(3000);
  300.                 }
  301.                 continue;
  302.             }

  303.             // 4. ÏÂÔØ MP3
  304.             if (downloadMp3(dlUrl, savePath)) {
  305.                 return true;
  306.             }
  307.         }
  308.         // ÖØÊÔǰµÈ´ý
  309.         if (retry < 3) {
  310.             var wait = (retry + 1) * 2000; // 2s, 4s, 6s µÝÔö
  311.             printl("  ↳ µÚ " + (retry + 1) + " ´ÎÖØÊÔ£¨µÈ´ý " + (wait / 1000) + "s£©...");
  312.             Thread.sleep(wait);
  313.         }
  314.     }

  315.     return false;
  316. }

  317. /**
  318. * ÎÄ×ÖתÓïÒô£¨Ö÷º¯Êý£©
  319. * @param text  Îı¾
  320. * @param voice ÒôÉ«Ãû£¨Ä¬ÈÏÏþÏþ£©
  321. * @return ³É¹¦¶ÎÊý
  322. */
  323. function ttsWeb(text, voice) {
  324.     voice = voice || WEB_CFG.voice;
  325.     if (!text || String(text).length === 0) { printl("⚠️ Îı¾Îª¿Õ"); return 0; }
  326.     ensureDir();

  327.     var segs = splitText(text, WEB_CFG.maxLen);
  328.     printl("&#128266; [text-to-speech.cn] ÒôÉ«£º" + voice + " ¹² " + segs.length + " ¶Î");

  329.     var okCount = 0;
  330.     for (var i = 0; i < segs.length; i++) {
  331.         var seg = segs[i];
  332.         var tag = seg.substring(0, 10).replace(/[\\/:*?"<>|]/g, "_");
  333.         var savePath = WEB_CFG.cacheDir + "web_" + voice.replace(/[^a-zA-Z0-9]/g, "").substring(0, 15) +
  334.                        "_" + (i + 1) + "_" + Date.now() + ".mp3";

  335.         printl("[" + (i + 1) + "/" + segs.length + "] " + seg.substring(0, 25) + "...");

  336.         if (synthSegment(seg, voice, savePath)) {
  337.             var f = new File(savePath);
  338.             printl("  ✅ " + f.length() + " bytes");
  339.             okCount++;
  340.         } else {
  341.             printl("  ❌ ºÏ³Éʧ°Ü");
  342.         }

  343.         if (i < segs.length - 1) Thread.sleep(1500);
  344.     }

  345.     printl("✅ Íê³É (" + okCount + "/" + segs.length + " ¶Î)");
  346.     return okCount;
  347. }

  348. // ======================== ÑÝʾ ========================

  349. function demo() {
  350.     printl("========================================");
  351.     printl("  ¢Ý text-to-speech.cn TTS ÑÝʾ");
  352.     printl("  Î¢Èí Azure Éñ¾­ÍøÂçÒôÉ«¡¤ÃâµÇ¼");
  353.     printl("========================================");

  354.     // ²âÊԶ̾ä
  355.     printl("\n¡¾ÏþÏþ - ĬÈÏ¡¿");
  356.     ttsWeb("ÄãºÃѽ£¬ÎÒÊÇÏþÏþ£¬Ò»¸öÎÂůÎľ²µÄÉùÒô¡£½ñÌìµÄ·çºÜÎÂÈᣬÊʺÏÂýÂýÁÄÌì¡£");

  357.     Thread.sleep(500);

  358.     printl("\n¡¾ÏþÈá - ÎÂÈá¡¿");
  359.     ttsWeb("ÄãºÃ£¬ÎÒÊÇÏþÈᣬ˵»°ÇáÇáµÄ£¬ÏñÔÚÄã¶ú±ß½²¹ÊÊÂÒ»Ñù¡£", "zh-CN-XiaorouNeural");

  360.     Thread.sleep(500);

  361.     printl("\n¡¾Ïþ³½ - ÄêÇáÅ®Éù¡¿");
  362.     ttsWeb("ÄãºÃ£¬ÎÒÊÇÏþ³½£¬Ò»¸öÑô¹âµÄÄêÇáÅ®º¢ÉùÒô£¬ºÜ¸ßÐËÈÏʶÄãŶ¡£", "zh-CN-XiaochenNeural");

  363.     Thread.sleep(500);

  364.     printl("\n¡¾ÔÆÏ£ - ÄêÇáÄÐÉù¡¿");
  365.     ttsWeb("ÄãºÃ£¬ÎÒÊÇÔÆÏ££¬Ò»¸öÄêÇáÄÐÉù£¬Ï£ÍûÄãϲ»¶¡£", "zh-CN-YunxiNeural");

  366.     printl("\nÑÝʾ½áÊø¡£MP3 ¶¼ÔÚ /sdcard/Pictures/aiwrok_tts/ Ŀ¼Ï¡£");
  367. }

  368. // ======================== ԣ̩²è¹ÝÈ«ÎÄÀʶÁ ========================

  369. function readArticle() {
  370.     var ARTICLE = [
  371.         "¹âÐ÷Ä©Ä꣬±±¾©µÄԣ̩²è¹ÝµÄÇïÑô×Üб×Åɨ¹ý°ËÏÉ×À£¬²èÍëÀïµÄÜÔÀò¸¡¸¡³Á³Á¡£ÕƹñÍõÀû·¢ß¬×Ų¼½í²Á¹ñ̨£¬ÑÛ¾¦³ò×ÅÃÅ£¬¶ú¶äÈ´ÈöµÃÂú²è¹Ý¶¼ÊÇ£¬ÕâµØ·½£¬Èý½Ì¾ÅÁ÷¾Û¾Û×Å£¬Ïл°Àï²Ø×ÅÂòÂô£¬Ì¾ÆøÀï¹ü×ÅÃÅ·¡£",
  372.         "ÕâÌìÉÎÎ磬³ñ¶ÐׯµÄÇØ¶þүһƨ¹É×øÏ£¬²èû¶Ë¾ÍÌ¾Æø£º»ÞÆø£¬Ðµ½µÄËÕº¼³ñ¶ÐѹÁ˰ë²Ö£¬ÕâÄêÍ·±ø»ÄÂíÂҵģ¬Ë­»¹ÓÐÏÐÇ®×öʲôÐÂÒÂÉÑѽ£¬ÔÙÁÌÁ©Ô£¬ÅÂÊÇÒªÉúùι³æ×ÓÈ¥ÁË¡£",
  373.         "»°Òô¸ÕÂ䣬ÅÜÂëÍ·µÄÀî°ÑÍ·ÏÆÁ±×Ó½øÀ´£¬¹àÁË´óÍëÁ¹²è£ºÄúÄdzÎÒ´ÓÄϱßÔËÀ´Á˰ٽïºÃÒ©²Ä£¬ÕÒ²»×Åϼң¬ÂëÍ·¶ÑÒ»Ìì¿ÛÒ»ÌìµÄÇ®£¬ÔÙºÄÏÂÈ¥£¬ÎҵðѿãÑü´øµ±³öÈ¥ËãÁË¡£",
  374.         "½ÇÂ俪·¹×¯µÄÕÅÅÖ×ÓÒ²ÅÄ×Å´óÍÈ´îÇ»£º¶¼±ðº°¿àÁË£¬ÎÒÄÇ·¹×¯¸Õ»»Á˽ð×ÖÕÐÅÆ£¬Ïë¸ø»ï¼Æ×öÉíÕûÆëµÄÒÂÉÑ£¬»¹ÏëѰµãÕý¾­ºÃÑòÈâ×öÕÐÅÆ²Ë£¬ÅÜÁ˰ëÔ£¬Ã»×ÅÂäѽ£¬ÑÛ¿´¾ÍÒª¿ªÕÅÁË£¬¼±µÃÒ»Âú×ìÊÇÅÝ¡£",
  375.         "ÍõÀû·¢ÊÖÀï²Á×ŲèÍ룬ÂýÓÆÓÆµÄ²åÁË»°£º°¦£¬ÎÒµ±¶à´óµÄÄÑ´¦£¬ÇضþÒ¯£¬ÄúÄdzñ¶Ð£¬ÕÅÕÆ¹ñÕý³îû´¦Âò£¬ÕÅÕÆ¹ñÄúÒªµÄÑòÈ⣬½ÖÎ÷¿ÚÂôÈâµÄÂí´ó¸ç£¬×ò¶ù»¹ÔÚÎÒÕâÄîß¶¶ÚÁ˺ûõ³ö²»È¥£¬Àî°ÑÍ·ÄúÄÇÒ©²Ä£¬¶Ô¹ýµÂÈÊÕÆ¹ñ£¬Ç°¶ù»¹ÍÐÎÒ´òÌýÄϱߵÄлõÄÄÓС£",
  376.         "Èý¾ä»°Â䵨£¬ØíÈËÏÈÊÇã¶ÁËÉñ£¬½ô¸ú×ÅÑÛ¾¦¶¼ÁÁÁË£¬µ±³¡¾Í´Õµ½Ò»×À×Ó£¬ÄúÈü¸·ÖÀû£¬ÎÒµ£µãÔË·Ñ£¬Ã»°ë¸öʱ³½£¬Èý×®ÂòÂôȫ˵Í×ÁË£¬ÇضþÒ¯ÇåÁË¿â´æ£¬Àî°Ñͷж°ü¸¤£¬ÕÅÅÖ×Ó´ÕÁË¿ªÕŵļҵ±£¬¸ö¸öϲÑÕ¿ª£¬ÁÙ×ßÿÈ˶¼Èû¸øÍõÀû·¢Ò»¿éËéÒø×Ó£¬ËµÊǺȲèµÄÇ®¡£",
  377.         "¿¿´°×ø×ŵÄËïÐã²Å£¬´©µÃ´ò²¹¶¡³¤ÉÀ£¬ÌìÌìÀ´²è¹Ý²ä×ùλ³­Ê飬ÕÅ×ì¾ÍÊǺ®´°¿à¶Á£¬Æ¾Õæ²ÅʵѧÁ¢Éí£¬Õâ»á¶ùËûÍÆÁËÍÆÆÆÑÛ¾µ£¬ËáÁïÁïµÄ˵£¬ÕÅÕÆ¹ñ£¬ÄúÕâËãÊÇʲô±¾Ê£¿²»¹ýÊÇˣˣ×ìÆ¤×ÓÇ£Ïߣ¬Í¶»úÈ¡ÇɰÕÁË£¬ÄÄÏñÎÒ£¬ÈÕÈÕ¿à¶Á£¬¿¿µÄÊÇÕæ±¾Ê³Է¹£¬²Å̤ʵѽ¡£",
  378.         "ÍõÀû·¢Ò²²»ÄÕ£¬¸øËûÌíÁ˰ëÍëÈȲ裬Ц×Å˵£ºËïÏÈÉú£¬ÄúŬÁ¦ÊÇÕæµÄ£¬¿ÉÄúϸÏëŶ£¬ÕâÌìϵı¾Ê£¬ÄúѧµÃÍêÂð£¿Äú¼È²»»áÖ¯³ñ¶Ð£¬Ò²²»»áÅÜÂëÍ·£¬±ßÌôÑòÈâ¶¼²»»á£¬×ܲ»ÄÜÑùÑù¶¼×Ô¼ºß¬ÔÚÊÖÀï°É£¿",
  379.         "ÎÒÕâС²è¹Ý£¬×¬µÃ²»¹âÊDzèÇ®£¬Ò²ÊÇÒ»¸ö·½±ãµÄÇ®£¬Ë­ÊÖÀïÓÐÏлõ£¬Ë­ÐÄÀïÓÐÄÑ´¦£¬ÎÒÌý׿Ç×Å£¬µ½Ê±ºòÁ½Í·´Õµ½Ò»¿é¶ù£¬´ó¼Ò¶¼Ê¡ÁËÁ¦Æø£¬ÎÒÒ²Âä¸öÖмä·Ñ£¬ÄúÌìÌìÃÆÍ·³­Ê飬×ÜÏë×Å×Ô¼º³ÉÌì´óµÄʶù£¬¿ÉÁ¬½Ö¶ÔÃæµÄÒ©ÆÌȱɶҩ²Ä¶¼²»ÖªµÀ£¬ÕâŬÁ¦ÓÐɶÓ㬲»¾Í×ßÍáÁËÅÜ¡£",
  380.         "ËïÐã²ÅÕÅÁËÕÅ×죬°ëÌìû˵³ö»°À´¡£",
  381.         "תÑÛ¹ýÁ˰ëÄê£¬ÇØ¶þÒ¯µÄ³ñ¶Ðׯ¿ªÁ˷ֺţ¬Àî°ÑÍ·µÄ»õÕ»¹ÍÁËØí»ï¼Æ£¬ÕÅÅÖ×ӵķ¹×¯³ÉÁ˾©³ÇСÓÐÃûÆøµÄ¹Ý×Ó¡£ØíÈË·êÄê¹ý½Ú¶¼À´¸øÍõÀû·¢ËÍÀñ£¬Ô£Ì©²è¹ÝÒ²·­ÐÞÁËÃÅÃæ£¬±ÈÔ­Ïȳ¨ÁÁ²»ÉÙ¡£",
  382.         "Ö»ÓÐËïÐã²Å£¬»¹ÊÇÌìÌ챧מÉÊé³­£¬×ìÀïÄîß¶×Å»³²Å²»Óö£¬³¤ÉÀÉϵIJ¹¶¡·´µ¹ÓÖ¶àÁËÁ½¿é¡£",
  383.         "ºóÀ´ÓÐÈ˸úÍõÀû·¢Ì̷ֽ¢²ÆµÄ¾÷ÇÏ£¬Ëû×ܰÚ×ÅÊÖЦ£ºÄÄÓÐʲô¾÷ÇÏ£¿ÎÒ¼Èû½ðÉ½Ò²Ã»Òø¿ó£¬¾ÍÊÇÈϵÃÈ˶֪࣬µÀË­ÓÐɶ¡¢Ë­È±É¶£¬¸øÈË´î¸öÇŰÕÁË¡£ÕâÊÀÉϵÄÇ®£¬´ÓÀ´²»ÊÇ߬ÔÚ×Ô¼ºÊÖÀï²Å½ÐÇ®¡£ÄãÒªÊÇÄܳÉÁËÄÇ´îÇŵÄÈË£¬¸÷É«¼ÛÖµ¶¼µÃ´ÓÄãÕâ¶ù¹ý£¬²Æ¸»ÄÄÀﻹÓÃ×·£¿Ëü×ÔÈ»¾ÍÍùÄãÕâ¶ùÁ÷¡£",
  384.         "²è¿ÍÃÇÌýÁË£¬ÓеĵãÍ·£¬ÓÐµÄÆ²×죬²èÍë¸ÇÒ»ÏÆ£¬ÜÔÀò»¨ÏãÓÖÆ®ÂúÁËÒ»ÎÝ×Ó¡£"
  385.     ];

  386.     printl("========================================");
  387.     printl("  Ô£Ì©²è¹ÝµÄ´îÇž­ ¡¤ text-to-speech.cn");
  388.     printl("  ÒôÉ«£ºÏþÏþ£¨Î¢Èí Azure Éñ¾­ÍøÂ磩");
  389.     printl("========================================");
  390.     printl("ÎÄÕ¹² " + ARTICLE.length + " ¶Î");

  391.     ensureDir();
  392.     var okCount = 0;
  393.     var voice = "zh-CN-XiaoxiaoNeural";
  394.     var failed = []; // ¼Ç¼ʧ°ÜµÄ¶ÎÂä

  395.     for (var i = 0; i < ARTICLE.length; i++) {
  396.         var seg = ARTICLE[i];
  397.         var savePath = WEB_CFG.cacheDir + "web_xiaoxiao_seg" + (i + 1) + ".mp3";

  398.         // ÒÑÏÂÔØµÄÌø¹ý
  399.         var existFile = new File(savePath);
  400.         if (existFile.exists() && existFile.length() > 512) {
  401.             printl("\n[" + (i + 1) + "/" + ARTICLE.length + "] ÒÑ´æÔÚ£¬Ìø¹ý (" + existFile.length() + " bytes)");
  402.             okCount++;
  403.             continue;
  404.         }

  405.         printl("\n[" + (i + 1) + "/" + ARTICLE.length + "] " + seg.substring(0, 25) + "...");

  406.         if (synthSegment(seg, voice, savePath)) {
  407.             var f = new File(savePath);
  408.             printl("  ✅ " + f.length() + " bytes");
  409.             okCount++;
  410.         } else {
  411.             printl("  ❌ ºÏ³Éʧ°Ü£¬ÉÔºóÖØÊÔ");
  412.             failed.push(i);
  413.         }

  414.         // ¶Î¼ä¼ä¸ô 2 Ã루±ÜÃâÆµ·±ÇëÇóµ¼Ö token ¹ýÆÚ£©
  415.         if (i < ARTICLE.length - 1) Thread.sleep(2000);
  416.     }

  417.     // µÚ¶þÂÖ£ºÖØÊÔʧ°ÜµÄ¶ÎÂä
  418.     if (failed.length > 0) {
  419.         printl("\n========================================");
  420.         printl("  µÚ¶þÂÖ£ºÖØÊÔ " + failed.length + " ¸öʧ°Ü¶ÎÂä");
  421.         printl("========================================");

  422.         for (var r = 0; r < failed.length; r++) {
  423.             var idx = failed[r];
  424.             var seg = ARTICLE[idx];
  425.             var savePath = WEB_CFG.cacheDir + "web_xiaoxiao_seg" + (idx + 1) + ".mp3";

  426.             printl("\n[ÖØÊÔ " + (r + 1) + "/" + failed.length + "] ¶ÎÂä " + (idx + 1) + ": " + seg.substring(0, 25) + "...");

  427.             // µÈ´ý 5 ÃëÈà token ÀäÈ´
  428.             Thread.sleep(5000);

  429.             if (synthSegment(seg, voice, savePath)) {
  430.                 var f = new File(savePath);
  431.                 printl("  ✅ " + f.length() + " bytes");
  432.                 okCount++;
  433.             } else {
  434.                 printl("  ❌ ÈÔȻʧ°Ü");
  435.             }
  436.         }
  437.     }

  438.     printl("\n========================================");
  439.     printl("  Íê³É (" + okCount + "/" + ARTICLE.length + " ¶Î)");
  440.     printl("  MP3 ±£´æÔÚ: " + WEB_CFG.cacheDir);
  441.     printl("========================================");
  442. }

  443. // ÔËÐУºÈ¡Ïû×¢ÊÍÄãÏëÖ´Ðеĺ¯Êý

  444. // demo();           // ÑÝʾ 4 ÖÖÒôÉ«
  445. readArticle();       // ÀʶÁԣ̩²è¹ÝÈ«ÎÄ
¸´ÖÆ´úÂë

»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

±¾°æ»ý·Ö¹æÔò

¹Ø±Õ

QQ|»ÓªÏúÈí¼þ×ÛºÏÌÖÂÛ|»ÓªÏúÈí¼þÓÐÎʱشð|»ÓªÏúÈí¼þ½Ì³Ì×¨Çø|»ÓªÏúÈí¼þPOST½Å±¾·ÖÏí|»ÓªÏúÈí¼þÆÕͨ½Å±¾·ÖÏí|»ÓªÏúÈí¼þÈí¼þ×ÊѶ|»ÓªÏúÈí¼þ¾«Æ·Èí¼þ|»ÓªÏúÈí¼þ¸üй«¸æ|ÓªÏúÈí¼þ|B2BÈí¼þ|B2BÍøÂçÈí¼þ ( ¾©ICP±¸09078825ºÅ )±¾ÍøÕ¾¿ª·¢µÄÓªÏúÈí¼þÊÇÒ»¿îеÄÍøÂçÓªÏúÈí¼þ£¬Õâ¿îÓªÏú¿ÉÒÔÈ¥ÍøÕ¾Èí¼þ£¬²©¿ÍÈí¼þ£¬B2BÈí¼þ£¬·ÖÀàÐÅÏ¢Íø·¢Ìù£¬¿ÉÒÔÇÀɳ·¢£¬¿ÉÒÔµ½°Ù¶ÈÎÄ¿âÉÏ´«WORDÎĵµ£¬¿ÉÒÔµ½Ò»Ð©ÊÇÏà²áÍøÕ¾×Ô¶¯ÉÏ´«Í¼Æ¬£¬Õâ¸ö×Ô¶¯·¢ÌûÈí¼þ×Ô´øÔÆÖ©Ö룬¼Ó¿ìÊÕ¼£¬ÓÐ6ÖÖ¶Ô½Ó´òÂë½Ó¿Ú£¬·½±ã£¬Ð§Âʸߣ¬Ëٶȿ죬¶øÇÒ¶ÔÍ϶¯µÄÑéÖ¤ÂëÈ«ÍøµÚÒ»¼Ò¶À¼ÒÖ§³Ö£¬È«²¿Ô­´´¼¼Êõ£¬¶À¼ÒÑз¢£¬Õý°æÔ­´´´ø°æÈ¨Èí¼þ¡£Ñ¡ÔñÍòÄÜÓªÏúÈí¼þ£¬¾ÍÑ¡ÔñÁËÒ»ÖÖ׬ǮµÄЧÂÊ£¬´ÓûÓб»³¬Ô½¹ý£¬Ò»Ö±ÔÚŬÁ¦Ñз¢Ð¼¼Êõ¡£·Å·ÉÃÎÏ룬½â·ÅË«ÊÖ£¬À´µã´´Ò⣬³É¾ÍÄãµÄÃÎÏ룬¾ÍÔÚÍòÄÜÓªÏúÈí¼þ¿ªÊ¼

map2

GMT+8, 2026-8-7 08:02 , Processed in 0.116168 second(s), 35 queries .

¿ìËٻظ´ ·µ»Ø¶¥²¿ ·µ»ØÁбí