demorrha / core /audio_files.py
rick
clean & organise the source code
a085f2e unverified
raw
history blame
3.43 kB
#coding: utf-8
from pydub import AudioSegment
#from openai import OpenAI
#from io import BytesIO
#from typing import Any
#from typing import Dict
#from typing import IO
from typing import List
from typing import Optional
from typing import Tuple
from typing import Union
import base64
import io
def concatenate_audio_files(audio_list: List[Tuple[Union[bytes, str], float]]) -> Optional[bytes]:
"""
Concatène plusieurs fichiers audio avec des effets sonores.
Args:
audio_list (List[Tuple[Union[bytes, str], float]]): Une liste de tuples, chacun contenant
des octets audio (ou une chaîne base64) et la durée.
Returns:
Optional[bytes]: L'audio concaténé sous forme d'octets, ou None en cas d'erreur.
"""
# Créer un segment audio vide
final_audio = AudioSegment.empty()
try:
# Charger les effets sonores
begin_sound = AudioSegment.from_mp3(
"sound-effects/voice-message-play-begin/voice-message-play-begin-1.mp3"
)
end_sound = AudioSegment.from_mp3(
"sound-effects/voice-message-play-ending/voice-message-play-ending-1.mp3"
)
# 5 secondes de silence
silence = AudioSegment.silent(duration=1500) # 1500 ms = 1.5 secondes
for audio_data, _ in audio_list:
# Convertir en bytes si c'est une chaîne base64
if isinstance(audio_data, str):
audio_bytes = base64.b64decode(audio_data)
else:
audio_bytes = audio_data
# Convertir les octets en un segment audio
segment = AudioSegment.from_mp3(io.BytesIO(audio_bytes))
# Ajouter le son de début, le segment TTS, le son de fin et le silence
final_audio += begin_sound + segment + end_sound + silence
# Convertir le segment audio final en octets
buffer = io.BytesIO()
final_audio.export(buffer, format="mp3")
return buffer.getvalue()
except IOError as e:
print(f"Erreur lors de la lecture ou de l'écriture des fichiers audio : {e}")
return None
except Exception as e:
print(f"Une erreur inattendue s'est produite : {e}")
return None
def split_audio(audio_file, max_size_mb: int = 25) -> List[bytes]:
"""
Divise un fichier audio en segments de taille maximale spécifiée.
Args:
audio_file: Fichier audio ouvert en mode binaire.
max_size_mb (int): Taille maximale de chaque segment en Mo.
Returns:
List[bytes]: Liste des segments audio divisés sous forme de bytes.
"""
try:
audio_file.seek(0)
audio = AudioSegment.from_file(audio_file)
duration_ms = len(audio)
segment_duration_ms = int(
(max_size_mb * 1024 * 1024 * 8) /
(audio.frame_rate * audio.sample_width * audio.channels)
)
segments = []
for start in range(0, duration_ms, segment_duration_ms):
end = min(start + segment_duration_ms, duration_ms)
segment = audio[start:end]
with io.BytesIO() as buffer:
segment.export(buffer, format="mp3")
segments.append(buffer.getvalue())
return segments
except Exception as e:
print(f"Une erreur s'est produite lors de la division de l'audio : {e}")
return []