China Movies Speak Khmer.
May 04, 2026
import os, whisper, asyncio, edge_tts, re
from googletrans import Translator
from moviepy.editor import VideoFileClip, AudioFileClip, CompositeAudioClip
import moviepy.video.fx.all as vfx
# --- ⚙️ កំណត់រចនាសម្ព័ន្ធ ---
Video_Name = "PRO_AI_DUB_BM7.mp4"
VIDEO_PATH = f"input_video/{Video_Name}"
OUTPUT_PATH = f"final_result/CHARACTER_DUB_SLOW_{Video_Name}"
translator = Translator()
# --- 🎙️ បញ្ជីសំឡេងតួអង្គ ---
VOICES = {
"MALE": "km-KH-PisethNeural",
"FEMALE": "km-KH-SreymomNeural"
}
# --- 🧠 ម៉ាស៊ីនវិភាគតួអង្គ និងកែសម្រួលភាសា ---
def identify_and_filter(text):
raw_kh = translator.translate(text, src='zh-cn', dest='km').text
female_keywords = ['នាង', 'ស្រី', 'ព្រះនាង', 'អ្នកនាង', 'ម៉ាក់', 'បងស្រី', 'អូន']
gender = "MALE"
if any(word in raw_kh for word in female_keywords):
gender = "FEMALE"
corrections = {
"អ្នក": "ឯង", "ខ្ញុំ": "យើង",
"តើអ្នកកំពុងធ្វើអ្វី": "ឯងកំពុងធ្វើស្អី?",
"ពិតជា": "ពិតមែនហើយ", "មិនអាច": "មិនបានទេ",
"តើមានរឿងអ្វី": "មានរឿងអី?"
}
for old, new in corrections.items():
raw_kh = raw_kh.replace(old, new)
return raw_kh.strip(), gender
async def generate_character_audio(text, start, duration):
try:
kh_text, gender = identify_and_filter(text)
if not kh_text: return None, None
selected_voice = VOICES[gender]
# បន្ថយល្បឿនមកត្រឹម +0% (ល្បឿនដើម) ដើម្បីឱ្យស្ដាប់បានច្បាស់ល្អ
# ម្ចាស់គ្រូអាចប្តូរជា "+3%" បើចង់ឱ្យលឿនជាងនេះបន្តិច
rate_setting = "+0%"
tmp = f"tmp_{start}.mp3"
communicate = edge_tts.Communicate(kh_text, selected_voice, rate=rate_setting)
await communicate.save(tmp)
audio = AudioFileClip(tmp).set_start(start).volumex(4.5)
# ប្រសិនបើសំឡេងវែងជាងវីដេអូខ្លាំង ទើបយើងបង្កើនល្បឿនតាមរូបភាព
if audio.duration > duration:
return vfx.speedx(audio, factor=audio.duration/duration).set_duration(duration), tmp
return audio, tmp
except Exception as e:
print(f"Error: {e}")
return None, None
async def start_multi_dubbing():
model = whisper.load_model("medium")
print("🔍 កំពុងវិភាគសាច់រឿង (ល្បឿនធម្មជាតិ)...")
transcribe = model.transcribe(VIDEO_PATH, task="transcribe", language="zh")
segments = transcribe['segments']
video = VideoFileClip(VIDEO_PATH)
audio_tracks = [video.audio.volumex(0.15)]
print(f"🎬 កំពុងបញ្ចូលសំឡេងតួអង្គក្នុងល្បឿនសមល្មម...")
tasks = [generate_character_audio(s['text'], s['start'], s['end']-s['start']) for s in segments]
results = await asyncio.gather(*tasks)
temp_files = []
for aud, path in results:
if aud:
audio_tracks.append(aud)
temp_files.append(path)
final_audio = CompositeAudioClip(audio_tracks)
final_video = video.set_audio(final_audio)
final_video.write_videofile(OUTPUT_PATH, codec="libx264", audio_codec="aac")
for f in temp_files:
if os.path.exists(f): os.remove(f)
print(f"✅ រួចរាល់! វីដេអូសំឡេងរលូន៖ {OUTPUT_PATH}")
if __name__ == "__main__":
await start_multi_dubbing()
- Blogger Comment
- Facebook Comment
0 comments:
Post a Comment