介绍:
TTS软件效果里,微软推出的免费使用的Edge-TTS平台是效果比较好的,但是目前该平台开始对国内阻止使用了。这里给大家和我一样使用该python库的小伙伴一个临时的解决方法。
提示:建议大家还是要么迁移到国内的收费平台或者是一些免费的开源框架(paddlespeech、gpt-sovits)
解决方案:
这个TTS服务在Edge浏览器中其实也有嵌入,并且国内一样可以使用,经过和官方的访问地址对比发现是多了两个参数Sec-MS-GEC
和Sec-MS-GEC-Version
,只要这两个参数传入就可以通过认证连接WebSocket服务了。所以我们这里在Internet选项中加入代理访问方式,再使用Python的mitmproxy
库来监听代理的8080端口。这样就可以获得浏览器使用TTS时使用的url地址,再从中取出我们需要的两个参数即可。
这里的整个思路都来自github的一位大佬,这里附上他的链接,他也自己开发了一个API供大家使用,同样附上链接。
补充:
1、API的代码
from flask import Flask, jsonify
import json
import osapp = Flask(__name__)@app.route('/get_token', methods=['GET'])
def get_token():if os.path.exists("token.json"):with open("token.json", "r") as f:data = json.load(f)return jsonify(data)else:return jsonify({"error": "token.json not found"}), 404if __name__ == '__main__':app.run(host="0.0.0.0", debug=True)
2、Html的代码做了一个每60秒刷新一次的补充,因为实际使用中发现如果不刷新有的时候mitmproxy
会卡主,必须自行刷新Edge的页面才会恢复,既然这样就直接在脚本中加入。
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>自动循环播放语音</title>
</head>
<body><!-- 多行文本显示 --><div id="textContainer"><p>天王盖地虎,</p><p>宝塔镇河妖。</p></div><script>// 获取所有可用的语音function getVoices() {return new Promise((resolve) => {let voices = speechSynthesis.getVoices();if (voices.length) {resolve(voices);return;}speechSynthesis.onvoiceschanged = () => {voices = speechSynthesis.getVoices();resolve(voices);};});}// 根据语音名称播放文本并监听结束事件async function speakbyvoice(text, voiceName, onEndCallback) {const voices = await getVoices();const utter = new SpeechSynthesisUtterance(text);const voice = voices.find(v => v.name.includes(voiceName));if (voice) {utter.voice = voice;} else {console.warn(`找不到语音:${voiceName}`);}utter.onend = onEndCallback; // 设置播放结束时的回调speechSynthesis.speak(utter);}// 开始循环播放function startPlayback() {const paragraphs = document.querySelectorAll("#textContainer p");let currentParagraphIndex = 0;function playNextParagraph() {if (currentParagraphIndex >= paragraphs.length) {currentParagraphIndex = 0; // 重置为第一个段落}const text = paragraphs[currentParagraphIndex].innerText;speakbyvoice(text, "Xiaoxiao", playNextParagraph);currentParagraphIndex++;}playNextParagraph(); // 开始播放第一个段落}// 页面加载完成后自动开始播放window.onload = startPlayback;// 1分钟后刷新页面setInterval(function(){location.reload();}, 60000);</script>
</body>
</html>
3、尽量避免浏览器其他地址的访问,我的这个API服务是单独拿了一个机器去跑,因为如果使用浏览器做其他的动作的时候也会导致mitmproxy
的卡主。
特别感谢
最后再次感谢github的大神jianchang512
同学