Ka wideyow bayɛlɛma ka taa bamanankan na.
import streamlit as st
import tempfile
import os
from pathlib import Path
import torch
import soundfile as sf
import librosa
import numpy as np
from moviepy.editor import VideoFileClip, AudioFileClip
# ====================== PAGE CONFIG ======================
st.set_page_config(
page_title="Bambara Video Dubber | MALIBA-AI",
page_icon="🇲🇱",
layout="centered",
initial_sidebar_state="expanded"
)
st.title("🇲🇱 Bambara Video Dubber")
st.markdown("""
**دبلجة فيديو احترافية إلى البامبارا**
Powered by **MALIBA-AI** — high-quality Bambara ASR + TTS
""")
# ====================== LOAD MODELS (ONCE) ======================
@st.cache_resource(show_spinner="جاري تحميل نماذج MALIBA-AI...")
def load_models():
from whosper import WhosperTranscriber
from maliba_ai.tts.inference import BambaraTTSInference
from maliba_ai.config.settings import Speakers
asr = WhosperTranscriber(model_id="MALIBA-AI/bambara-asr-v3")
tts = BambaraTTSInference()
return asr, tts, Speakers
try:
asr_model, tts_model, Speakers = load_models()
speakers_list = list(Speakers)
except Exception as e:
st.error(f"خطأ في تحميل النماذج: {e}")
st.stop()
# ====================== HELPER FUNCTIONS ======================
def extract_audio(video_path: str, audio_path: str) -> float:
video = VideoFileClip(video_path)
if video.audio is None:
raise ValueError("الفيديو لا يحتوي على صوت")
video.audio.write_audiofile(audio_path, logger=None, verbose=False)
duration = video.duration
video.close()
return duration
def time_stretch(audio_path: str, target_duration: float, output_path: str):
y, sr = librosa.load(audio_path, sr=None)
current = librosa.get_duration(y=y, sr=sr)
if current str:
from openai import OpenAI
client = OpenAI(api_key=api_key, base_url=base_url)
prompt = f"""You are an expert Bambara (Bamanankan) translator.
Translate the following text into natural, fluent, modern Bambara.
Keep the meaning accurate. Use correct orthography (including ɛ, ɔ, ɲ, ŋ).
Only output the Bambara translation, nothing else.
Text:
{ …