bl4dylion's picture
add overlay, sound generation from api
367a693
raw
history blame
2.59 kB
from pydub import AudioSegment
from pathlib import Path
from elevenlabs import ElevenLabs, AsyncElevenLabs
from elevenlabs import play, save
from src.config import logger
def get_audio_duration(filepath: str) -> float:
"""
Returns the duration of the audio file in seconds.
:param filepath: Path to the audio file.
:return: Duration of the audio file in seconds.
"""
audio = AudioSegment.from_file(filepath)
duration_in_seconds = len(audio) / 1000 # Convert milliseconds to seconds
return round(duration_in_seconds, 1)
def add_overlay_for_audio(main_audio_filename: str,
sound_effect_filename: str,
output_filename: str = None,
cycling_effect: bool = True,
decrease_effect_volume: int = 0) -> str:
try:
main_audio = AudioSegment.from_file(main_audio_filename)
effect_audio = AudioSegment.from_file(sound_effect_filename)
except Exception as e:
raise RuntimeError(f"Error loading audio files: {e}")
if cycling_effect:
while len(effect_audio) < len(main_audio):
effect_audio += effect_audio
effect_audio = effect_audio[:len(main_audio)]
if decrease_effect_volume > 0:
effect_audio = effect_audio - decrease_effect_volume
combined_audio = main_audio.overlay(effect_audio)
if output_filename is None:
output_filename = f"{Path(main_audio_filename).stem}_{Path(sound_effect_filename).stem}.wav"
combined_audio.export(output_filename, format="wav")
return output_filename
def sound_generation(sound_generation_data: dict, output_file: str):
client = ElevenLabs(
api_key="YOUR_API_KEY",
)
audio = client.text_to_sound_effects.convert(
text=sound_generation_data['text'],
duration_seconds=sound_generation_data['duration_seconds'],
prompt_influence=sound_generation_data['prompt_influence'],
)
save(audio, output_file)
logger.error("Successfully generated sound effect to file: %s", output_file)
async def sound_generation_async(sound_generation_data: dict, output_file: str):
client = AsyncElevenLabs(
api_key="YOUR_API_KEY",
)
audio = await client.text_to_sound_effects.convert(
text=sound_generation_data['text'],
duration_seconds=sound_generation_data['duration_seconds'],
prompt_influence=sound_generation_data['prompt_influence'],
)
save(audio, output_file)
logger.error("Successfully generated sound effect to file: %s", output_file)