Spaces:
Configuration error
Configuration error
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] | |
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) | |