Spaces:
Running
Running
Download app.py from jbroot/podgen-api: direct link, hf CLI and curl.
- Browser
- Download file 2.46 kB
-
https://huggingface.co/spaces/jbroot/podgen-api/resolve/main/app.py
- Command line
-
hf download hf://spaces/jbroot/podgen-api/app.py
-
curl -L -o app.py https://huggingface.co/spaces/jbroot/podgen-api/resolve/main/app.py
2.46 kB
| from flask import Flask, request, send_file | |
| from pydub import AudioSegment | |
| from io import BytesIO | |
| import requests | |
| import zipfile | |
| app = Flask(__name__) | |
| def process_audio(segments): | |
| track_1 = AudioSegment.empty() | |
| track_2 = AudioSegment.empty() | |
| full_mix = AudioSegment.empty() | |
| crossfade = 100 | |
| cursor = 0 | |
| print(f"Traitement de {len(segments)} segments...") | |
| for i, seg in enumerate(segments): | |
| try: | |
| r = requests.get(seg['url']) | |
| audio_data = BytesIO(r.content) | |
| chunk = AudioSegment.from_file(audio_data, format="mp3") | |
| except Exception as e: | |
| print(f"Erreur téléchargement segment {i}: {e}") | |
| continue | |
| duration = len(chunk) | |
| if i > 0: cursor -= crossfade | |
| # Track 1 | |
| gap_1 = cursor - len(track_1) | |
| if gap_1 > 0: track_1 += AudioSegment.silent(duration=gap_1) | |
| if str(seg['person']) == "1": track_1 += chunk | |
| # Track 2 | |
| gap_2 = cursor - len(track_2) | |
| if gap_2 > 0: track_2 += AudioSegment.silent(duration=gap_2) | |
| if str(seg['person']) == "2": track_2 += chunk | |
| # Mix | |
| if i == 0: full_mix += chunk | |
| else: full_mix = full_mix.append(chunk, crossfade=crossfade) | |
| cursor += duration | |
| final_len = len(full_mix) | |
| if len(track_1) < final_len: track_1 += AudioSegment.silent(duration=final_len - len(track_1)) | |
| if len(track_2) < final_len: track_2 += AudioSegment.silent(duration=final_len - len(track_2)) | |
| memory_file = BytesIO() | |
| with zipfile.ZipFile(memory_file, 'w') as zf: | |
| for name, audio in [("speaker_1.mp3", track_1), ("speaker_2.mp3", track_2), ("mix.mp3", full_mix)]: | |
| buf = BytesIO() | |
| audio.export(buf, format="mp3") | |
| zf.writestr(name, buf.getvalue()) | |
| memory_file.seek(0) | |
| return memory_file | |
| def home(): | |
| return "PodGen API is running! Send POST requests to /generate" | |
| def generate(): | |
| data = request.json | |
| segments = data.get('segments', []) | |
| if not segments: return {"error": "No segments provided"}, 400 | |
| try: | |
| zip_buffer = process_audio(segments) | |
| return send_file(zip_buffer, mimetype='application/zip', as_attachment=True, download_name='podcast_pack.zip') | |
| except Exception as e: | |
| return {"error": str(e)}, 500 | |
| if __name__ == '__main__': | |
| app.run(host='0.0.0.0', port=7860) |