48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
from aip import AipSpeech
 | 
						|
from django.conf import settings
 | 
						|
import uuid
 | 
						|
import os
 | 
						|
from django.utils import timezone
 | 
						|
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):
 | 
						|
        import edge_tts
 | 
						|
        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
 |