This video is a step-by-step tutorial to show you how to do local dubbing with AI by using Elevan Labs free credit.
Code:
#export ELEVENLABS_API_KEY="<>"
#pip install elevenlabs
#pip install python-dotenv
import os
from typing import Optional
from dotenv import load_dotenv
from dubbing_utils import download_dubbed_file, wait_for_dubbing_completion
from elevenlabs.client import ElevenLabs
ELEVENLABS_API_KEY=os.environ.get('ELEVENLABS_API_KEY')
client = ElevenLabs(api_key=ELEVENLABS_API_KEY,)
def create_dub_from_url(source_url: str,source_language: str,target_language: str,) -> Optional[str]:
response = client.dubbing.dub_a_video_or_an_audio_file(
source_url=source_url,
target_lang=target_language,
mode="automatic",
source_lang=source_language,
num_speakers=1,
watermark=True,
)
dubbing_id = response.dubbing_id
if wait_for_dubbing_completion(dubbing_id):
output_file_path = download_dubbed_file(dubbing_id, target_language)
return output_file_path
else:
return None
if __name__ == "__main__":
source_url = "https://www.youtube.com/shorts/H6C2OYhogIw"
source_language = "en"
target_language = "es"
result = create_dub_from_url(source_url, source_language, target_language)
if result:
print("Dubbing was successful! File saved at:", result)
else:
print("Dubbing failed or timed out.")
================
dubbing_utils.py
import os
import time
from dotenv import load_dotenv
from elevenlabs.client import ElevenLabs
# Load environment variables
load_dotenv()
# Retrieve the API key
ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
if not ELEVENLABS_API_KEY:
raise ValueError(
"ELEVENLABS_API_KEY environment variable not found. "
"Please set the API key in your environment variables."
)
client = ElevenLabs(api_key=ELEVENLABS_API_KEY)
def download_dubbed_file(dubbing_id: str, language_code: str) -> str:
"""
Downloads the dubbed file for a given dubbing ID and language code.
Args:
dubbing_id: The ID of the dubbing project.
language_code: The language code for the dubbing.
Returns:
The file path to the downloaded dubbed file.
"""
dir_path = f"data/{dubbing_id}"
os.makedirs(dir_path, exist_ok=True)
file_path = f"{dir_path}/{language_code}.mp4"
with open(file_path, "wb") as file:
for chunk in client.dubbing.get_dubbed_file(dubbing_id, language_code):
file.write(chunk)
return file_path
def wait_for_dubbing_completion(dubbing_id: str) -> bool:
"""
Waits for the dubbing process to complete by periodically checking the status.
Args:
dubbing_id (str): The dubbing project id.
Returns:
bool: True if the dubbing is successful, False otherwise.
"""
MAX_ATTEMPTS = 120
CHECK_INTERVAL = 10 # In seconds
for _ in range(MAX_ATTEMPTS):
metadata = client.dubbing.get_dubbing_project_metadata(dubbing_id)
if metadata.status == "dubbed":
return True
elif metadata.status == "dubbing":
print(
"Dubbing in progress... Will check status again in",
CHECK_INTERVAL,
"seconds.",
)
time.sleep(CHECK_INTERVAL)
else:
print("Dubbing failed:", metadata.error_message)
return False
print("Dubbing timed out")
return False
No comments:
Post a Comment