A ka fisa dɔɔnin
# ============================================================
# Bambara Professional Video Dubber - صوت نقي بالوقار والثبات
# ============================================================
import streamlit as st
import tempfile
import os
from pathlib import Path
import numpy as np
import soundfile as sf
import librosa
from moviepy.editor import VideoFileClip, AudioFileClip
import re
# -------------------- إعداد الصفحة --------------------
st.set_page_config(
page_title="دبلجة فيديو إلى البامبارا - صوت نقي",
page_icon="🎬",
layout="centered"
)
st.title("🎬 دبلجة فيديو احترافية إلى البامبارا")
st.markdown("""
**صوت نقي جداً • بدون قرقرة • بالوقار والثبات • قراءة صحيحة للأرقام والنص**
""")
# -------------------- تحميل النماذج --------------------
@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()
# -------------------- دوال مساعدة --------------------
def extract_audio(video_path: str, audio_path: str):
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(y, sr, target_duration):
current = librosa.get_duration(y=y, sr=sr)
if current str:
"""تنظيف النص وتجهيزه للقراءة النقية"""
text = text.strip()
text = re.sub(r'\s+', ' ', text)
# إزالة الرموز الغريبة مع الحفاظ على علامات الترقيم الأساسية
text = re.sub(r'[^\w\s\.,!?;:؟٪%0-9ɛɔɲŋƐƆƝŊ\-]', ' ', text)
return text.strip()
def split_into_sentences(text: str):
"""تقسيم النص إلى جمل قصيرة لجودة أع …