Spaces:
Running
Running
from pydub import AudioSegment | |
import os | |
def merge_mp3_files(file_paths, output_filename, pause_ms=500): | |
""" | |
Merges multiple MP3 files into a single MP3 file with a specified pause | |
between each segment. | |
""" | |
if not file_paths: | |
return None | |
combined = AudioSegment.empty() | |
pause_segment = AudioSegment.silent(duration=pause_ms) if pause_ms > 0 else AudioSegment.empty() | |
for i, file_path in enumerate(file_paths): | |
if not os.path.exists(file_path) or os.path.getsize(file_path) == 0: | |
print(f"Warning: File {file_path} is missing or empty. Skipping.") | |
continue | |
try: | |
segment = AudioSegment.from_mp3(file_path) | |
combined += segment | |
if i < len(file_paths) - 1: # Don't add pause after the last segment | |
combined += pause_segment | |
except Exception as e: | |
print(f"Error processing file {file_path}: {e}. Skipping.") | |
continue | |
if len(combined) == 0: | |
print("No valid audio segments found to merge.") | |
return None | |
try: | |
combined.export(output_filename, format="mp3") | |
return output_filename | |
except Exception as e: | |
print(f"Error exporting merged MP3 to {output_filename}: {e}") | |
return None | |
if __name__ == '__main__': | |
# Create dummy mp3 files for testing (requires ffmpeg to be installed and pydub) | |
# This test assumes you have some small MP3s or can generate them. | |
# For a self-contained test, you might need to generate silent MP3s. | |
print("This script is intended to be used as a module.") | |
print("To test, ensure you have some MP3 files and call merge_mp3_files directly.") | |
# Example: | |
# create_dummy_mp3("dummy1.mp3", duration_ms=1000) | |
# create_dummy_mp3("dummy2.mp3", duration_ms=1500) | |
# merge_mp3_files(["dummy1.mp3", "dummy2.mp3"], "merged_output.mp3", pause_ms=200) | |
# os.remove("dummy1.mp3") | |
# os.remove("dummy2.mp3") | |
# os.remove("merged_output.mp3") | |
# Helper to create dummy files if needed for a more robust test | |
def create_dummy_mp3(filename, duration_ms=1000): | |
try: | |
silence = AudioSegment.silent(duration=duration_ms) | |
silence.export(filename, format="mp3") | |
print(f"Created dummy file: {filename}") | |
except Exception as e: | |
print(f"Could not create dummy MP3 {filename}. Ensure ffmpeg is installed and accessible. Error: {e}") | |
# Create dummy files for testing | |
dummy_files_exist = True | |
try: | |
create_dummy_mp3("test_dummy1.mp3", 1000) | |
create_dummy_mp3("test_dummy2.mp3", 1500) | |
except Exception: | |
dummy_files_exist = False | |
print("Skipping merge test as dummy files could not be created (ffmpeg issue?).") | |
if dummy_files_exist: | |
print("\nTesting merge_mp3_files...") | |
files_to_merge = ["test_dummy1.mp3", "test_dummy2.mp3", "non_existent_file.mp3"] | |
output_merged = "test_merged_audio.mp3" | |
result_path = merge_mp3_files(files_to_merge, output_merged, pause_ms=300) | |
if result_path and os.path.exists(result_path): | |
print(f"Successfully merged audio to: {result_path}") | |
# Simple check: merged file should be larger than individual (roughly) | |
merged_size = os.path.getsize(result_path) | |
dummy1_size = os.path.getsize("test_dummy1.mp3") | |
print(f"Size of {result_path}: {merged_size} bytes (dummy1 was {dummy1_size})") | |
if merged_size > dummy1_size : # crude check | |
print("Merge test seems OK.") | |
else: | |
print("Merged file size issue.") | |
os.remove(result_path) | |
else: | |
print("Failed to merge audio.") | |
# Clean up dummy files | |
if os.path.exists("test_dummy1.mp3"): os.remove("test_dummy1.mp3") | |
if os.path.exists("test_dummy2.mp3"): os.remove("test_dummy2.mp3") |