factory/apps/utils/speech.py

48 lines
1.5 KiB
Python

from aip import AipSpeech
from django.conf import settings
import uuid
import os
from django.utils import timezone
import edge_tts
from asgiref.sync import async_to_sync
def generate_voice(msg: str, per: int = 0):
"""文本生成语音
Args:
msg (str): 文本
per (int): 男/女声
Returns:
bool: 成功
str: 地址
dict: result
"""
file_name = '{}.mp3'.format(uuid.uuid4())
path = '/media/' + timezone.now().strftime('%Y/%m/%d/')
full_path = settings.BASE_DIR + path
if not os.path.exists(full_path):
os.makedirs(full_path)
result = None
if getattr(settings, 'BD_SP_ENABLED', False):
client = AipSpeech(settings.BD_SP_ID, settings.BD_SP_KEY, settings.BD_SP_SECRET)
result = client.synthesis(msg, 'zh', 1, {'vol': 5, 'spd': 5, 'per': per})
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
with open(full_path + file_name, 'wb') as f:
f.write(result)
return True, path + file_name, None
elif getattr(settings, 'EDGE_TTS_ENABLED', False):
if per == 0:
per = 'zh-CN-XiaoxiaoNeural'
else:
per = 'zh-CN-YunjianNeural'
communicate = edge_tts.Communicate(msg, per)
try:
async_to_sync(communicate.save(full_path + file_name))
return True, path + file_name, None
except Exception as e:
result = str(e)
return False, None, result