podgen-api / app.py
jbroot's picture
Update app.py
1dec28c verified
Raw History Blame Contribute Delete
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
@app.route('/')
def home():
return "PodGen API is running! Send POST requests to /generate"
@app.route('/generate', methods=['POST'])
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)