Spaces:
Configuration error
Configuration error
File size: 4,443 Bytes
2d610a5 52a3fd6 0ffb1ca 2d610a5 6dc35f3 2d610a5 23200db 2d610a5 6dc35f3 2d610a5 6c85678 4d888b5 f40b874 4d888b5 6c85678 f40b874 6c85678 2d610a5 6c85678 23200db 2d610a5 6c85678 2d610a5 6c85678 2d610a5 6c85678 f40b874 6c85678 2d610a5 6c85678 2d610a5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
import os
import uuid
from django.http import FileResponse
from rest_framework import status
from rest_framework.response import Response
from rest_framework.generics import CreateAPIView
from TTS.api import TTS
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
# from texttovoice.models import TextToSpeech
from .serializers import TextToSpeechSerializer
from rest_framework.parsers import MultiPartParser
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
class TextToSpeechCreateView(CreateAPIView):
serializer_class = TextToSpeechSerializer
authentication_classes = [TokenAuthentication] # Apply token authentication
permission_classes = [IsAuthenticated] # Require authentication for this view
parser_classes = [MultiPartParser]
@swagger_auto_schema(
operation_id='Create a document',
operation_description='Create a document by providing file and s3_key',
manual_parameters=[
openapi.Parameter('file', openapi.IN_FORM, type=openapi.TYPE_FILE, description='Document to be uploaded'),
openapi.Parameter('s3_key', openapi.IN_FORM, type=openapi.TYPE_STRING, description='S3 Key of the Document '
'(folders along with name)')
],
responses={
status.HTTP_200_OK: openapi.Response(
'Success', schema=openapi.Schema(type=openapi.TYPE_OBJECT, properties={
'doc_id': openapi.Schema(type=openapi.TYPE_STRING, description='Document ID'),
'mime_type': openapi.Schema(type=openapi.TYPE_STRING, description='Mime Type of the Document'),
'version_id': openapi.Schema(type=openapi.TYPE_STRING, description='S3 version ID of the document')
})
)
}
)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
text = serializer.validated_data.get("text")
speaker_wav = serializer.validated_data.get("speaker_wav")
language = serializer.validated_data.get("language")
output_filename = f"output_{uuid.uuid4()}.wav"
# try:
# Define the directory path
tmp_dir = "/.local"
# Check if the directory exists and create it if it doesn't
if not os.path.exists(tmp_dir):
os.makedirs(tmp_dir)
print("before creating the speaker file path", os.path)
# Save the uploaded speaker file to a temporary location
speaker_file_path = os.path.join('/tmp', speaker_wav.name)
with open(speaker_file_path, "wb") as destination:
for chunk in speaker_wav.chunks():
destination.write(chunk)
print("after creating the speaker file path",speaker_file_path)
# Generate speech using tts.tts_to_file
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False)
tts.tts_to_file(text=text, file_path=output_filename, speaker_wav=speaker_file_path, language=language)
# Define a function to delete the output file
def file_iterator(file_name):
with open(file_name, 'rb') as f:
yield from f
# Delete the file after sending it
try:
os.remove(file_name)
except Exception as e:
# You might want to log this error
pass
# Use the file_iterator to create a FileResponse
# TextToSpeech.objects.create(
# text=text,
# speaker_wav=speaker_wav,
# language=language,
# created_by=request.user # Assign the authenticated user here
# )
response = FileResponse(file_iterator(output_filename), as_attachment=True, content_type='audio/wav')
return response
# except Exception as e:
# return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|