背景:
在进行MoneyPrinter项目国内环境搭建中,发现框架本身的TikTok文字转语音部分的代码已经不能用了,最好是能够找到国内网站的替换方案。
实现:
感谢网站:https://www.text-to-speech.cn/
代码:
# -*- coding:UTF-8 -*-
"""
@ProjectName :
@FileName : tts-demo
@Description : 文字转语音
@Time : 2024/5/10 14:44
@Author : Qredsun
"""
import time
import uuid
from urllib.parse import urlencode
import requests
from loguru import logger
class textToSpeech():
BASE_URL = "https://www.text-to-speech.cn/"
HEADER = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0',
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'X-Requested-With': 'XMLHttpRequest',
'Origin': BASE_URL,
'Connection': 'keep-alive',
'Referer': BASE_URL,
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
}
def get_speaker_list(self):
url = f"{self.BASE_URL}/getSpeekList.php"
response = requests.get(url, headers=self.HEADER)
if response.ok:
response_json = response.json()
speaker_list = response_json
logger.debug(f'返回获取音频配置列表:{speaker_list}')
logger.info('转换接口使用的是语言(key)、ShortName')
return speaker_list
logger.error(f'获取音频配置失败:{response.text}')
return None
def convert_voice(self, txt="Look at this cute cat! Isn't it adorable? It looks so fluffy and cuddly", /, *, language="English (United States)", voice="AvaMultilingualNeural",
file_name=None):
logger.debug(f'待转化音频的内容:{txt}')
url = f"{self.BASE_URL}/getSpeek.php"
payload = {
"language": language,
"voice": voice,
"text": txt,
"role": 0,
"style": 0,
"rate": 0,
"pitch": 0,
"kbitrate": "audio-16khz-32kbitrate-mono-mp3",
"silence": "",
"styledegree": 1,
"volume": 75,
"predict": 0,
"user_id": "",
"yzm": "",
"replice": 1,
}
cookies = {
"Hm_lvt_b38a22175a63114a18d55183d7ddb4c4": int(time.time()),
"Hm_lpvt_b38a22175a63114a18d55183d7ddb4c4": int(time.time()),
"language": language,
"voice": voice,
"kbitrate": "audio-16khz-32kbitrate-mono-mp3",
"role": 0,
"style": 0,
"speed": 0,
"pitch": 0,
"checkuser": time.strftime("%Y-%m-%d", time.localtime())
}
cookies_str = urlencode(cookies)
# logger.debug(f'cookies: {cookies_str}')
headers = {
'Cookie': cookies_str,
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
headers.update(self.HEADER)
response = requests.request("POST", url, headers=headers, data=payload)
if not response.ok:
logger.error(f'转换音频失败:{response.text}')
return None
response_json = response.json()
if response_json['code'] == 200:
url = response_json["download"]
logger.info(f'返回音频下载连接:{url}')
if file_name:
self.save_voice(url, video_id=file_name)
return url
def save_voice(self, url, /, *, video_id=None):
try:
video_id = video_id if video_id else uuid.uuid4()
with open(video_id, "wb") as f:
f.write(requests.get(url).content)
logger.info(f'音频已保存至{video_id}')
except Exception as e:
logger.error(f'音频保存失败:{e}')
if __name__ == '__main__':
c2v = textToSpeech()
# c2v.get_speaker_list() # 获取可用的语言及声音
url = c2v.convert_voice('我真的是服了', language = "中文(普通话,简体)", voice = "zh-CN-XiaoxiaoNeural")