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 [] | |