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

 
Copyright © 2026. BM7//ANGKOR - All Rights Reserved
Template Created by ThemeXpose | BM7//ANGKOR