Назад к задачам
Middle — Senior
5

Ревью функции преобразования текста в аудио

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Необходимо выполнить код‑ревью функции text_to_voice, которая получает текст из тела запроса, отправляет его во внешнее API InferKit, затем с помощью Amazon Polly синтезирует речь, сохраняет полученный аудиофайл в S3 и возвращает предписанную ссылку на файл.

@swagger_auto_schema(method='post', request_body=RequestSerializer, responses={200: USER_RESPONSE, 400: BAD_RESPONSE})
@api_view(["POST"])
def text_to_voice(request):
    text = request.data.get("text")
    payload = {"length": 500}

    if text:
        payload["prompt"] = {"text": text}
        headers = {"Authorization": f"Bearer {settings.INFERKIT_API_KEY}"}
        response = requests.post(settings.INFERKIT_URL, headers=headers, json=payload)

        if response.status_code == 400 and "Out of generation credits" in response.text:
            return views.Response({"error_message": "Out of generation credits"}, status=400)

        if not response.ok:
            logger.error(f"Status code {response.status_code} from inferkit with {response.text}.")
            raise views.exceptions.ParseError("Text generation API failed. Please, try again.")

        response_text = response.json().get("data", {}).get("text") if response.ok else ""

        aws_kwargs = {
            "aws_access_key_id": settings.AWS_ACCESS_KEY_ID,
            "aws_secret_access_key": settings.AWS_SECRET_ACCESS_KEY
        }

        polly_client = boto3.Session(region_name=settings.AWS_REGION_NAME, **aws_kwargs).client("polly")
        generated_audio = polly_client.synthesize_speech(Text=response_text, OutputFormat=settings.AWS_FILE_TYPE, VoiceId="Joey", LanguageCode="en-US")

        s3_connection = boto3.resource("s3", **aws_kwargs)
        file_name = f"{datetime.now().isoformat()}.{settings.AWS_FILE_TYPE}"
        s3_connection.Bucket(settings.AWS_BUCKET_NAME).put_object(
            Key=file_name,
            Body=generated_audio.get("AudioStream").read(),
            ContentType=settings.AWS_FILE_TYPE
        )

        file_url = s3_connection.meta.client.generate_presigned_url(
            ClientMethod="get_object",
            Params={"Bucket": settings.AWS_BUCKET_NAME, "Key": file_name}
        )

        return views.Response({"message": response_text, "file_url": file_url})