Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pydub | |
| import tempfile | |
| from pathlib import Path | |
| import time | |
| import os | |
| def convert_mp3_to_flac(mp3_file_path, progress=gr.Progress()): | |
| """Convert MP3 file to 16-bit FLAC""" | |
| try: | |
| if not mp3_file_path: | |
| raise ValueError("No file uploaded") | |
| progress(0, desc="Starting conversion...") | |
| # Read MP3 file | |
| progress(0.2, desc="Loading MP3 file...") | |
| audio = pydub.AudioSegment.from_mp3(mp3_file_path) | |
| # Ensure it's 16-bit (PCM_16) | |
| progress(0.5, desc="Converting to 16-bit PCM...") | |
| audio = audio.set_sample_width(2) # 2 bytes = 16 bits | |
| # Save as FLAC | |
| progress(0.8, desc="Saving as FLAC...") | |
| # Create temporary file for output | |
| with tempfile.NamedTemporaryFile(suffix='.flac', delete=False) as tmp: | |
| flac_path = tmp.name | |
| # Export as FLAC with 16-bit PCM | |
| audio.export(flac_path, format="flac", parameters=["-sample_fmt", "s16"]) | |
| progress(1.0, desc="Conversion complete!") | |
| return flac_path | |
| except Exception as e: | |
| error_msg = f"Conversion failed: {str(e)}" | |
| raise gr.Error(error_msg) | |
| def convert_mp3_to_flac(mp3_file_path, progress=gr.Progress()): | |
| """Convert MP3 file to 16-bit FLAC at 44.1kHz""" | |
| try: | |
| if not mp3_file_path: | |
| raise ValueError("No file uploaded") | |
| progress(0, desc="Starting conversion...") | |
| # Read MP3 file | |
| progress(0.2, desc="Loading MP3 file...") | |
| audio = pydub.AudioSegment.from_mp3(mp3_file_path) | |
| # 1. Ensure 16-bit depth | |
| progress(0.4, desc="Converting to 16-bit PCM...") | |
| audio = audio.set_sample_width(2) # 2 bytes = 16 bits | |
| # 2. NEW STEP: Resample to 44.1 kHz if needed[citation:5][citation:7] | |
| # The sample rate is stored as `frame_rate` in pydub[citation:7] | |
| if audio.frame_rate != 44100: | |
| progress(0.6, desc=f"Resampling from {audio.frame_rate} Hz to 44.1 kHz...") | |
| audio = audio.set_frame_rate(44100) # Resample to the required rate | |
| # Save as FLAC | |
| progress(0.8, desc="Saving as 44.1kHz FLAC...") | |
| # Create temporary file for output | |
| with tempfile.NamedTemporaryFile(suffix='.flac', delete=False) as tmp: | |
| flac_path = tmp.name | |
| # Export as FLAC with explicit parameters | |
| audio.export(flac_path, format="flac", parameters=["-sample_fmt", "s16", "-ar", "44100"]) | |
| progress(1.0, desc="Conversion complete!") | |
| return flac_path | |
| except Exception as e: | |
| raise gr.Error(f"Conversion failed: {str(e)}") | |
| def get_file_stats(file_path): | |
| """Get statistics about the uploaded file""" | |
| if not file_path or not os.path.exists(file_path): | |
| return "**File Statistics:** No file uploaded" | |
| try: | |
| audio = pydub.AudioSegment.from_mp3(file_path) | |
| file_size = os.path.getsize(file_path) | |
| stats = f""" | |
| **File Statistics:** | |
| - Duration: {len(audio) / 1000:.2f} seconds | |
| - Channels: {'Mono' if audio.channels == 1 else 'Stereo'} | |
| - Sample Rate: {audio.frame_rate:,} Hz | |
| - Bit Depth: 16-bit (output) | |
| - File Size: {file_size / 1024 / 1024:.2f} MB | |
| - Format: MP3 → FLAC | |
| """ | |
| return stats | |
| except Exception as e: | |
| return f"**File Statistics:** Could not read file details - {str(e)}" | |
| def cleanup_old_files(): | |
| """Clean up temporary files older than 1 hour""" | |
| temp_dir = tempfile.gettempdir() | |
| current_time = time.time() | |
| for ext in ['.flac', '.mp3']: | |
| for file in Path(temp_dir).glob(f"*{ext}"): | |
| try: | |
| if file.stat().st_mtime < (current_time - 3600): | |
| file.unlink() | |
| except: | |
| pass | |
| # Create Gradio interface | |
| with gr.Blocks( | |
| title="MP3 to 16-bit FLAC Converter", | |
| theme=gr.themes.Soft() | |
| ) as demo: | |
| gr.Markdown("# 🎵 MP3 to 16-bit FLAC Converter") | |
| gr.Markdown("Upload an MP3 file and convert it to 16-bit FLAC format") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| mp3_input = gr.File( | |
| label="📁 Upload MP3 File", | |
| file_types=[".mp3"], | |
| type="filepath" | |
| ) | |
| convert_btn = gr.Button( | |
| "🔄 Convert to FLAC", | |
| variant="primary", | |
| size="lg" | |
| ) | |
| with gr.Accordion("⚙️ Conversion Settings", open=False): | |
| gr.Markdown(""" | |
| **Default Settings:** | |
| - Output format: FLAC | |
| - Bit depth: 16-bit | |
| - Channels: Preserved from source | |
| - Sample rate: Preserved from source | |
| - Compression: Lossless | |
| """) | |
| with gr.Column(scale=1): | |
| flac_output = gr.File( | |
| label="💾 Download FLAC File", | |
| file_types=[".flac"] | |
| ) | |
| stats_display = gr.Markdown( | |
| "**File Statistics:** Upload a file to see details" | |
| ) | |
| # Info section | |
| with gr.Accordion("📚 How to Use & Info", open=False): | |
| gr.Markdown(""" | |
| ## Usage Instructions | |
| 1. **Upload** an MP3 file using the upload button or drag & drop | |
| 2. **Check** the file statistics to verify your upload | |
| 3. **Click** the "Convert to FLAC" button | |
| 4. **Wait** for the conversion to complete (progress bar will show) | |
| 5. **Download** your converted FLAC file | |
| ## Technical Information | |
| - **Input**: MP3 files of any bitrate (8-320 kbps) | |
| - **Output**: 16-bit FLAC (lossless compression) | |
| - **Maximum file size**: 200MB | |
| - **Processing time**: ~1-2 seconds per minute of audio | |
| ## Important Notes | |
| ⚠️ **Converting MP3 to FLAC does NOT improve audio quality** | |
| - MP3 is a lossy format - some audio data is permanently removed | |
| - FLAC is lossless but cannot restore what was lost in MP3 compression | |
| - The FLAC file will have the same perceived quality as the original MP3 | |
| ## Use Cases | |
| - Preparing audio for editing software that prefers FLAC | |
| - Archiving music in a lossless format | |
| - Compatibility with devices that require FLAC | |
| """) | |
| # Connect components | |
| mp3_input.change( | |
| fn=get_file_stats, | |
| inputs=[mp3_input], | |
| outputs=[stats_display] | |
| ) | |
| convert_btn.click( | |
| fn=convert_mp3_to_flac, | |
| inputs=[mp3_input], | |
| outputs=[flac_output] | |
| ).then( | |
| fn=lambda: "**Status:** Ready for new conversion", | |
| outputs=[stats_display] | |
| ) | |
| # Clean up old files and launch | |
| if __name__ == "__main__": | |
| cleanup_old_files() | |
| demo.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=False | |
| ) |