Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/pycaps/cli/render_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def render(

language: Optional[str] = typer.Option(None, "--lang", help="Language of the video, example: --lang=en", rich_help_panel="Whisper", show_default=False),
whisper_model: Optional[str] = typer.Option(None, "--whisper-model", help="Whisper model to use, example: --whisper-model=base", rich_help_panel="Whisper", show_default=False),
whisper_prompt: Optional[str] = typer.Option(None, "--whisper-prompt", help="Vocabulary hints for Whisper to improve accuracy (e.g., 'BrandName, TechTerm')", rich_help_panel="Whisper", show_default=False),

video_quality: Optional[VideoQuality] = typer.Option(None, "--video-quality", help="Final video quality", rich_help_panel="Video", show_default=False),

Expand Down Expand Up @@ -82,7 +83,7 @@ def render(
if output: builder.with_output_video(output)
if style: builder.add_css_content(_parse_styles(style))
# TODO: this has a little issue (if you set lang via js + whisper model by cli, it will change the lang to None)
if language or whisper_model: builder.with_whisper_config(language=language, model_size=whisper_model if whisper_model else "base")
if language or whisper_model or whisper_prompt: builder.with_whisper_config(language=language, model_size=whisper_model if whisper_model else "base", initial_prompt=whisper_prompt)
if subtitle_data: builder.with_subtitle_data_path(subtitle_data)
if transcription_preview: builder.should_preview_transcription(True)
if video_quality: builder.with_video_quality(video_quality)
Expand Down
4 changes: 2 additions & 2 deletions src/pycaps/pipeline/caps_pipeline_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ def with_custom_subtitle_renderer(self, subtitle_renderer: SubtitleRenderer) ->
self._caps_pipeline._renderer = subtitle_renderer
return self

def with_whisper_config(self, language: Optional[str] = None, model_size: str = "base") -> "CapsPipelineBuilder":
self._caps_pipeline._transcriber = WhisperAudioTranscriber(model_size=model_size, language=language)
def with_whisper_config(self, language: Optional[str] = None, model_size: str = "base", initial_prompt: Optional[str] = None) -> "CapsPipelineBuilder":
self._caps_pipeline._transcriber = WhisperAudioTranscriber(model_size=model_size, language=language, initial_prompt=initial_prompt)
return self

def with_custom_audio_transcriber(self, audio_transcriber: AudioTranscriber) -> "CapsPipelineBuilder":
Expand Down
5 changes: 4 additions & 1 deletion src/pycaps/transcriber/whisper_audio_transcriber.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,20 @@
from pycaps.logger import logger

class WhisperAudioTranscriber(AudioTranscriber):
def __init__(self, model_size: str = "base", language: Optional[str] = None, model: Optional[Any] = None):
def __init__(self, model_size: str = "base", language: Optional[str] = None, model: Optional[Any] = None, initial_prompt: Optional[str] = None):
"""
Transcribes audio using OpenAI's Whisper model.

Args:
model_size: Size of the Whisper model to use (e.g., "tiny", "base").
language: Language of the audio (e.g., "en", "es").
model: (Optional) A pre-loaded Whisper model instance. If provided, model_size is ignored.
initial_prompt: (Optional) Vocabulary hints for Whisper to improve accuracy on specific words (e.g., brand names).
"""
self._model_size = model_size
self._language = language
self._model = model
self._initial_prompt = initial_prompt

def transcribe(self, audio_path: str) -> Document:
"""
Expand All @@ -25,6 +27,7 @@ def transcribe(self, audio_path: str) -> Document:
audio_path,
word_timestamps=True,
language=self._language,
initial_prompt=self._initial_prompt,
verbose=False # TODO: we should pass our --verbose param here
)

Expand Down