Spaces:
Paused
Paused
#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 [] | |