diff --git a/apps/utils/serializers.py b/apps/utils/serializers.py index ee338fdc..97c3396d 100755 --- a/apps/utils/serializers.py +++ b/apps/utils/serializers.py @@ -45,3 +45,7 @@ class SendSmsSerializer(serializers.Serializer): phone = serializers.CharField(label='手机号') template_code = serializers.CharField(label='模板标识') template_param = serializers.JSONField(label='模板参数') + + +class GenerateVoiceSerializer(serializers.Serializer): + msg = serializers.CharField(label='文本') diff --git a/apps/utils/speech.py b/apps/utils/speech.py index 0c1d6610..f0a2c1cf 100644 --- a/apps/utils/speech.py +++ b/apps/utils/speech.py @@ -1,6 +1,27 @@ from aip import AipSpeech from django.conf import settings +import uuid -def generate_voice(msg:str): + +def generate_voice(msg: str, per: int = 0): + """文本生成语音 + + Args: + msg (str): 文本 + per (int): 男/女声 + + Returns: + bool: 成功 + str: 地址 + dict: result + """ client = AipSpeech(settings.BD_SP_ID, settings.BD_SP_KEY, settings.BD_SP_SECRET) - \ No newline at end of file + result = client.synthesis(msg, 'zh', 1, {'vol': 5, 'spd': 5, 'per': per}) + # 识别正确返回语音二进制 错误则返回dict 参照下面错误码 + if not isinstance(result, dict): + # name = '{}.mp3'.format(uuid.uuid4()) + path = '/media/voice/{}.mp3'.format(uuid.uuid4()) + with open(settings.BASE_DIR + path, 'wb') as f: + f.write(result) + return True, path, None + return False, None, result diff --git a/apps/utils/views.py b/apps/utils/views.py index 2a1eaf6e..2e0a2ca1 100755 --- a/apps/utils/views.py +++ b/apps/utils/views.py @@ -5,13 +5,14 @@ from django.http import HttpResponse from yaml import serialize from apps.utils.errors import SIGN_MAKE_FAIL from apps.utils.sms import send_sms +from apps.utils.speech import generate_voice from server.settings import BASE_DIR import numpy as np from rest_framework.response import Response from rest_framework.exceptions import ParseError from apps.utils.viewsets import CustomGenericViewSet from apps.utils.mixins import CustomCreateModelMixin -from apps.utils.serializers import GenSignatureSerializer, SendSmsSerializer +from apps.utils.serializers import GenSignatureSerializer, GenerateVoiceSerializer, SendSmsSerializer from rest_framework.views import APIView from rest_framework.decorators import action @@ -70,3 +71,15 @@ class TestViewSet(CustomGenericViewSet): vdata = serializer.validated_data res = send_sms(**vdata) return Response(res) + + @action(methods=['post'], detail=False, serializer_class=GenerateVoiceSerializer) + def generate_voice(self, request, pk=None): + """文字转语音测试 + + 文字转语音测试 + """ + serializer = GenerateVoiceSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + vdata = serializer.validated_data + res = generate_voice(**vdata) + return Response(res) diff --git a/requirements.txt b/requirements.txt index 4622e154..d78a6918 100755 --- a/requirements.txt +++ b/requirements.txt @@ -22,3 +22,5 @@ stomp.py==8.0.0 shapely==1.8.2 aliyun-python-sdk-core==2.13.36 baidu-aip==4.16.6 +chardet==5.0.0 +requests==2.28.1