chain-service/chain_service/services/audio_converter.py

34 lines
885 B
Python

from chain_service.utils.sync_to_async import sync_to_async
import os
import ffmpeg
import aiofiles
from uuid import uuid4
from io import BytesIO
class AudioConverterService:
@sync_to_async
def __audio_to_ogg(self, audio: BytesIO) -> str:
filename = f"./audios/{uuid4()}.ogg"
process = (
ffmpeg.input("pipe:")
.output(filename, codec="libopus", audio_bitrate="32k", loglevel="quiet")
.overwrite_output()
.run_async(pipe_stdin=True)
)
process.communicate(input=audio.getbuffer())
return filename
async def audio_to_ogg(self, audio: BytesIO) -> BytesIO:
filename = await self.__audio_to_ogg(audio)
async with aiofiles.open(filename, "rb") as file:
content = BytesIO(initial_bytes=await file.read())
os.remove(filename)
return content