From 4dbde2b9486a7d3af6140a4d42cb3ca7b45db6a8 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Thu, 18 Dec 2025 20:49:39 +0200 Subject: [PATCH] 491 add mms (#1313) --- buzz/buzz.py | 4 + buzz/cuda_setup.py | 133 +++++++ buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/en_US/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 137 +++++--- buzz/locale/nl/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 128 ++++--- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 128 ++++--- buzz/model_loader.py | 74 ++++ buzz/settings/settings.py | 1 + buzz/store/keyring_store.py | 3 - buzz/transcriber/recording_transcriber.py | 36 +- buzz/transcriber/whisper_file_transcriber.py | 44 ++- buzz/transformers_whisper.py | 332 ++++++++++++++++-- buzz/widgets/application.py | 7 + .../general_preferences_widget.py | 27 +- .../hugging_face_search_line_edit.py | 3 +- .../transcriber/mms_language_line_edit.py | 48 +++ .../transcription_options_group_box.py | 53 ++- .../transcription_view_mode_tool_button.py | 1 + .../transcription_viewer_widget.py | 6 +- docs/docs/faq.md | 6 + docs/docs/installation.md | 23 +- docs/docs/preferences.md | 2 + pyproject.toml | 15 + .../io.github.chidiwilliams.Buzz.metainfo.xml | 19 + tests/conftest.py | 11 +- .../transcriber/transformers_whisper_test.py | 46 +++ .../whisper_file_transcriber_test.py | 1 - ...st.py => transformers_transcriber_test.py} | 6 +- uv.lock | 235 ++++++++----- 39 files changed, 2049 insertions(+), 888 deletions(-) create mode 100644 buzz/cuda_setup.py create mode 100644 buzz/widgets/transcriber/mms_language_line_edit.py create mode 100644 tests/transcriber/transformers_whisper_test.py rename tests/{transformers_whisper_test.py => transformers_transcriber_test.py} (71%) diff --git a/buzz/buzz.py b/buzz/buzz.py index 09a63d9f..d4a7a34b 100644 --- a/buzz/buzz.py +++ b/buzz/buzz.py @@ -7,6 +7,10 @@ import sys from pathlib import Path from typing import TextIO +# Set up CUDA library paths before any torch imports +# This must happen before platformdirs or any other imports that might indirectly load torch +import buzz.cuda_setup # noqa: F401 + from platformdirs import user_log_dir, user_cache_dir, user_data_dir # Will download all Huggingface data to the app cache directory diff --git a/buzz/cuda_setup.py b/buzz/cuda_setup.py new file mode 100644 index 00000000..09ba0731 --- /dev/null +++ b/buzz/cuda_setup.py @@ -0,0 +1,133 @@ +""" +CUDA library path setup for nvidia packages installed via pip. + +This module must be imported BEFORE any torch or CUDA-dependent libraries are imported. +It handles locating and loading CUDA libraries (cuDNN, cuBLAS, etc.) from the nvidia +pip packages. + +On Windows: Uses os.add_dll_directory() to add library paths +On Linux: Uses ctypes to preload libraries (LD_LIBRARY_PATH is read at process start) +On macOS: No action needed (CUDA not supported) +""" + +import ctypes +import logging +import os +import platform +import sys +from pathlib import Path + + +logger = logging.getLogger(__name__) + + +def _get_nvidia_package_lib_dirs() -> list[Path]: + """Find all nvidia package library directories in site-packages.""" + lib_dirs = [] + + # Find site-packages directories + site_packages_dirs = [] + for path in sys.path: + if "site-packages" in path: + site_packages_dirs.append(Path(path)) + + # Also check relative to the current module for frozen apps + if getattr(sys, "frozen", False): + # For frozen apps, check the _internal directory + frozen_lib_dir = Path(sys._MEIPASS) if hasattr(sys, "_MEIPASS") else Path(sys.executable).parent + nvidia_dir = frozen_lib_dir / "nvidia" + if nvidia_dir.exists(): + for pkg_dir in nvidia_dir.iterdir(): + if pkg_dir.is_dir(): + lib_subdir = pkg_dir / "lib" + if lib_subdir.exists(): + lib_dirs.append(lib_subdir) + # Some packages have bin directory on Windows + bin_subdir = pkg_dir / "bin" + if bin_subdir.exists(): + lib_dirs.append(bin_subdir) + + # Check each site-packages for nvidia packages + for sp_dir in site_packages_dirs: + nvidia_dir = sp_dir / "nvidia" + if nvidia_dir.exists(): + for pkg_dir in nvidia_dir.iterdir(): + if pkg_dir.is_dir(): + lib_subdir = pkg_dir / "lib" + if lib_subdir.exists(): + lib_dirs.append(lib_subdir) + # Some packages have bin directory on Windows + bin_subdir = pkg_dir / "bin" + if bin_subdir.exists(): + lib_dirs.append(bin_subdir) + + return lib_dirs + + +def _setup_windows_dll_directories(): + """Add nvidia library directories to Windows DLL search path.""" + lib_dirs = _get_nvidia_package_lib_dirs() + for lib_dir in lib_dirs: + try: + os.add_dll_directory(str(lib_dir)) + logger.debug(f"Added DLL directory: {lib_dir}") + except (OSError, AttributeError) as e: + logger.debug(f"Could not add DLL directory {lib_dir}: {e}") + + +def _preload_linux_libraries(): + """Preload CUDA libraries on Linux using ctypes. + + On Linux, LD_LIBRARY_PATH is only read at process start, so we need to + manually load the libraries using ctypes before torch tries to load them. + """ + lib_dirs = _get_nvidia_package_lib_dirs() + + # Libraries to skip - NVBLAS requires special configuration and causes issues + skip_patterns = ["libnvblas"] + + loaded_libs = set() + + for lib_dir in lib_dirs: + if not lib_dir.exists(): + continue + + # Find all .so files in the directory + for lib_file in sorted(lib_dir.glob("*.so*")): + if lib_file.name in loaded_libs: + continue + if lib_file.is_symlink() and not lib_file.exists(): + continue + + # Skip problematic libraries + if any(pattern in lib_file.name for pattern in skip_patterns): + logger.debug(f"Skipping library: {lib_file}") + continue + + try: + # Use RTLD_GLOBAL so symbols are available to other libraries + ctypes.CDLL(str(lib_file), mode=ctypes.RTLD_GLOBAL) + loaded_libs.add(lib_file.name) + logger.debug(f"Preloaded library: {lib_file}") + except OSError as e: + # Some libraries may have missing dependencies, that's ok + logger.debug(f"Could not preload {lib_file}: {e}") + + +def setup_cuda_libraries(): + """Set up CUDA library paths for the current platform. + + This function should be called as early as possible, before any torch + or CUDA-dependent libraries are imported. + """ + system = platform.system() + + if system == "Windows": + _setup_windows_dll_directories() + elif system == "Linux": + _preload_linux_libraries() + # macOS doesn't have CUDA support, so nothing to do + + +# Auto-run setup when this module is imported +setup_cuda_libraries() diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index e3c3ba24..dcb31aa1 100644 --- a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po +++ b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: buzz\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -176,25 +176,39 @@ msgid "Live recording mode" msgstr "Mode d'enregistrament en directe" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "Utilitza només la CPU i desactiveu l'acceleració de la GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" "Establiu això si els models més grans no s'ajusten a la memòria de la GPU i " "Buzz es bloqueja" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "Desactiva la GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "Prova de clau OpenAI API" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -202,11 +216,11 @@ msgstr "" "La vostra clau API és vàlida. Buzz utilitzarà aquesta clau per realitzar " "transcripcions de l'API de Whisper i traduccions de la IA." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "Clau API no vàlida" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -214,11 +228,11 @@ msgstr "" "L'API només admet caràcters base64 (A-Za-z0-9+/).-). Altres caràcters de la " "clau API poden causar errors." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "Selecciona la carpeta d'exportació" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -316,8 +330,8 @@ msgstr "Descàrrega fallida" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Error" @@ -335,28 +349,40 @@ msgstr "Atura" msgid "Detect Language" msgstr "Detecta l'idioma" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Executa" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Model:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" "L'ús per primera vegada d'un model pot trigar diversos minuts a carregar-se." -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "Clau API:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Tasca:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Idioma:" @@ -601,13 +627,13 @@ msgid "End" msgstr "Finalitza" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Text" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -617,7 +643,7 @@ msgstr "Traducció" msgid "View" msgstr "Veure" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "Marqua de temps" @@ -625,65 +651,65 @@ msgstr "Marqua de temps" msgid "Export" msgstr "Exporta" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "Traduir" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "Redimensionar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "Cerca" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "Mostra/amaga la barra de cerca (Ctrl+F)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "Cerca:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "Introduïu el text a cercar..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "Coincidència anterior (Maj+Retorn)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 #, fuzzy msgid "Next match (Ctrl+Enter)" msgstr "Coincidència següent (retorn)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "Neteja" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "Controls de reproducció:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "Segment de bucle" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "Activa/desactiva el bucle en fer clic als segments de transcripció" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "Segueix l'àudio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -691,44 +717,44 @@ msgstr "" "Activa/desactiva seguint la posició d'àudio actual a la transcripció. Quan " "està activada, es desplaça automàticament al text actual." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "Desplaça't fins a l'actual" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "Desplaçar-se fins al text que es parla actualment" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "1 de més de 100 coincidències" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "1 de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr " coincidències" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "No s'ha trobat cap coincidència" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr " de més de 100 coincidències" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr " de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "Clau API necessària" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "Introduïu la clau API d'OpenAI a les preferències" @@ -888,14 +914,14 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "No s'ha pogut desar la clau OpenAI API a l'anell de claus" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" "El servidor Whisper no s'ha pogut iniciar. Consulteu els registres per " "obtenir més informació." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1269,15 +1295,15 @@ msgstr "Sundanès" msgid "Cantonese" msgstr "Cantonès" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "S'ha produït un error de connexió" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "Començant Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "Cancel·la la transcripció" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index 08302e50..5773e1a3 100644 --- a/buzz/locale/da_DK/LC_MESSAGES/buzz.po +++ b/buzz/locale/da_DK/LC_MESSAGES/buzz.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -176,23 +176,37 @@ msgid "Live recording mode" msgstr "Live optagelsesmode" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "OpenAI API Nøgle test" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -200,12 +214,12 @@ msgstr "" "Din API nøgle er gyldig. Buzz vil benytte nøglen til at anvende Whisper API " "transkription og AI oversættelser." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 #, fuzzy msgid "Invalid API key" msgstr "Ugyldig API-nøgle" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -213,11 +227,11 @@ msgstr "" "API supporterer kun base64 tegn (A-Za-z0-9+/=_-). Andre tegn i API-nøglen " "kan guve fejl. " -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "Vælg eksport-mappe" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -315,8 +329,8 @@ msgstr "Download mislykkedes" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Fejl" @@ -334,27 +348,39 @@ msgstr "Stop" msgid "Detect Language" msgstr "Detekter sprog" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Kør" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Model:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "Først gang kan brug af en model tage flere minutter at indlæse." -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "API-nøgle:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Opgave:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Sprog:" @@ -598,13 +624,13 @@ msgid "End" msgstr "Slut" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Tekst" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -614,7 +640,7 @@ msgstr "Oversættelse" msgid "View" msgstr "Vis" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "Tidsstempler" @@ -622,107 +648,107 @@ msgstr "Tidsstempler" msgid "Export" msgstr "Eksporter" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "Oversæt" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "Behandel størrelse" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "API-nøgle påkrævet" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "Indtast venligst OpenAI API-nøgle i indstillinger" @@ -882,12 +908,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Kan ikke gemme OpenAI API-nøgle i nøgleringen" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1259,15 +1285,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "Der er opstået en forbindelsesfejl" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "Afbryd transkription" diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index eb751acc..979badb1 100644 --- a/buzz/locale/de_DE/LC_MESSAGES/buzz.po +++ b/buzz/locale/de_DE/LC_MESSAGES/buzz.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -176,23 +176,37 @@ msgid "Live recording mode" msgstr "Live-Aufnahmemodus" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "OpenAI-API-Schlüssel Test" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -200,11 +214,11 @@ msgstr "" "Ihr API-Schlüssel ist gültig. Buzz verwendet diesen Schlüssel, um Whisper-" "API-Transkriptionen und KI-Übersetzungen durchzuführen." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "Ungültiger API-Schlüssel" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -212,11 +226,11 @@ msgstr "" "Die API unterstützt nur Base64-Zeichen (A-Za-z0-9+/=_-). Andere Zeichen im " "API-Schlüssel können Fehler verursachen." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "Exportordner auswählen" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -315,8 +329,8 @@ msgstr "Der Download ist fehlgeschlagen" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Fehler" @@ -334,29 +348,41 @@ msgstr "Stoppen" msgid "Detect Language" msgstr "Sprache erkennen" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Ausführen" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Modell:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" "Bei der ersten Verwendung eines Modells kann das Laden mehrere Minuten " "dauern." -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "API-Schlüssel:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Aufgabe:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Sprache:" @@ -599,13 +625,13 @@ msgid "End" msgstr "Ende" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Text" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -615,7 +641,7 @@ msgstr "Übersetzung" msgid "View" msgstr "Anzeigen" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "Zeitstempel" @@ -623,107 +649,107 @@ msgstr "Zeitstempel" msgid "Export" msgstr "Export" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "Übersetzen" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "Größe ändern" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "API-Schlüssel erforderlich" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "Bitte geben Sie den OpenAI-API-Schlüssel in den Einstellungen ein" @@ -884,12 +910,12 @@ msgstr "" "Der OpenAI-API-Schlüssel kann nicht im Schlüsselbund gespeichert werden" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1261,15 +1287,15 @@ msgstr "Sundanesisch" msgid "Cantonese" msgstr "Kantonesisch" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "Ein Verbindungsfehler ist aufgetreten" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "Transkription abbrechen" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index e604ee25..c2a09010 100644 --- a/buzz/locale/en_US/LC_MESSAGES/buzz.po +++ b/buzz/locale/en_US/LC_MESSAGES/buzz.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -175,43 +175,57 @@ msgid "Live recording mode" msgstr "" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -306,8 +320,8 @@ msgstr "" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "" @@ -325,27 +339,39 @@ msgstr "" msgid "Detect Language" msgstr "" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "" @@ -582,13 +608,13 @@ msgid "End" msgstr "" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -598,7 +624,7 @@ msgstr "" msgid "View" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "" @@ -606,107 +632,107 @@ msgstr "" msgid "Export" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "" @@ -862,12 +888,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1238,15 +1264,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 msgid "Starting transcription..." msgstr "" diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 69fd2c3a..e7757df4 100644 --- a/buzz/locale/es_ES/LC_MESSAGES/buzz.po +++ b/buzz/locale/es_ES/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -178,25 +178,39 @@ msgid "Live recording mode" msgstr "Modo de grabación en directo" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "Usa solo CPU y desactiva la aceleración de GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" "Configure esto si los modelos más grandes no se ajustan a la memoria de su " "GPU y Buzz se bloquea" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "Desactivar GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "Prueba de la clave API de OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -204,11 +218,11 @@ msgstr "" "Tu clave API es válida. Buzz usará esta clave para realizar transcripciones " "de la API de Whisper y traducciones de IA." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "Clave API no válida" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -216,11 +230,11 @@ msgstr "" "La API solo admite caracteres base64 (A-Za-z0-9+/=_-). Otros caracteres de " "la clave de API pueden causar errores." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "Seleccione Exportar carpeta" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -322,8 +336,8 @@ msgstr "Descarga fallida" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Error" @@ -344,32 +358,44 @@ msgstr "Detener" msgid "Detect Language" msgstr "Detectar idioma" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + # automatic translation #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Ejecutar" # automatic translation -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Modelo:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" "El uso por primera vez de un modelo puede tardar varios minutos en cargarse." -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "Clave API:" # automatic translation -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Tarea:" # automatic translation -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Idioma:" @@ -638,14 +664,14 @@ msgid "End" msgstr "Fin" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Texto" # automatic translation #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -655,7 +681,7 @@ msgstr "Traducción" msgid "View" msgstr "Ver" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "Marcas de tiempo" @@ -663,67 +689,67 @@ msgstr "Marcas de tiempo" msgid "Export" msgstr "Exportar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "Traducir" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "Cambiar el tamaño" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "Buscar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "Mostrar/Ocultar barra de búsqueda (Ctrl+F)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "Encontrar:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "Introducir texto para encontrar..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "Coincidencia anterior (Mayús+Intro)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 #, fuzzy msgid "Next match (Ctrl+Enter)" msgstr "Siguiente coincidencia (Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "Limpiar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "Controles de reproducción:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "Segmento de bucle" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" "Activar/desactivar la reproducción en bucle al hacer clic en segmentos de la " "transcripción" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "Seguir audio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -732,44 +758,44 @@ msgstr "" "transcripción. Cuando está activado, se desplaza automáticamente al texto " "actual." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "Desplácese hasta Actual" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "Desplazarse hasta el texto hablado actualmente" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "1 de 100+ coincidencias" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "1 de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr " coincidencias" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "No se encontraron coincidencias" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr " de 100+ coincidencias" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr " de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "Clave de API requerida" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "Ingrese la clave API de OpenAI en las preferencias" @@ -939,14 +965,14 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "No se puede guardar la clave de la API de OpenAI en el llavero" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" "El servidor Whisper no se pudo iniciar. Consulta los registros para obtener " "más detalles." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1321,16 +1347,16 @@ msgstr "Sundanés" msgid "Cantonese" msgstr "Cantonés" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "Se ha producido un error de conexión" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." # automatic translation -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "Cancelar transcripción" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 53f6279e..2bcbd210 100644 --- a/buzz/locale/it_IT/LC_MESSAGES/buzz.po +++ b/buzz/locale/it_IT/LC_MESSAGES/buzz.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: buzz\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: 2025-11-09 20:22+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -176,25 +176,39 @@ msgid "Live recording mode" msgstr "Modalità di registrazione in diretta" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "Utilizza solo la CPU e disattiva l'accelerazione GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" "Imposta questa opzione se i modelli più grandi non si adattano alla memoria " "della tua GPU e Buzz si blocca" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "Disabilita GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "Test della chiave API OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -202,11 +216,11 @@ msgstr "" "La tua chiave API è valida. Buzz utilizzerà questa chiave per eseguire le " "trascrizioni API Whisper e le traduzioni AI." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "Chiave API non valida" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -214,11 +228,11 @@ msgstr "" "L'API supporta solo caratteri base64 (A-Za-z0-9+/=). Altri caratteri nella " "chiave API potrebbero causare errori." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "Seleziona la cartella di esportazione" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -316,8 +330,8 @@ msgstr "Download non riuscito" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Errore" @@ -335,29 +349,41 @@ msgstr "Arresta" msgid "Detect Language" msgstr "Rileva la lingua" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Avvia" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Modello:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" "Il caricamento di un modello al primo utilizzo potrebbe richiedere diversi " "minuti." -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "Chiave API:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Compito:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Lingua:" @@ -602,13 +628,13 @@ msgid "End" msgstr "Fine" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Testo" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -618,7 +644,7 @@ msgstr "Traduzione" msgid "View" msgstr "Visualizza" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "Timestamp" @@ -626,66 +652,66 @@ msgstr "Timestamp" msgid "Export" msgstr "Esporta" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "Tradurre" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "Ridimensionare" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "Trova" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "Mostra/Nascondi barra di ricerca (Ctrl+F)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "Trova:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "Inserisci il testo per trovare..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "Corrispondenza precedente (Maiusc+Invio)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 #, fuzzy msgid "Next match (Ctrl+Enter)" msgstr "Prossima corrispondenza (Invio)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "Elimina" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "Controlli di riproduzione:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "Ciclo di segmento" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" "Abilita/disabilita il loop quando si fa clic sui segmenti della trascrizione" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "Segui Audio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -694,44 +720,44 @@ msgstr "" "trascrizione. Quando abilitato, scorre automaticamente fino al testo " "corrente." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "Scorri fino al Corrente" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "Scorrere fino al testo attualmente pronunciato" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "1 di 100+ corrispondenze" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "1 di" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "corrispondenze" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "Nessuna corrispondenza trovata" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr " di oltre 100 corrispondenze" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr " di " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "Chiave API richiesta" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "Inserisci la chiave API OpenAI nelle preferenze" @@ -891,13 +917,13 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Impossibile salvare la chiave API OpenAI nel portachiavi" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" "Impossibile avviare il server Whisper. Controllare i log per i dettagli." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1271,15 +1297,15 @@ msgstr "Sundanese" msgid "Cantonese" msgstr "Cantonese" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "Si è verificato un errore di connessione" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "Avvio di Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 msgid "Starting transcription..." msgstr "Inizio trascrizione..." diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index a683e72b..83ee5f76 100644 --- a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po +++ b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -174,23 +174,37 @@ msgid "Live recording mode" msgstr "ライブ録音" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "OpenAI APIキー テスト" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -198,22 +212,22 @@ msgstr "" "あなたのAPIキーは有効です。Buzzはこのキーを使ってWhisper APIの書き起こしとAI" "翻訳を行います。" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 #, fuzzy msgid "Invalid API key" msgstr "OpenAI APIキー" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "出力フォルダを選択" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -311,8 +325,8 @@ msgstr "ダウンロード失敗" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "エラー" @@ -330,27 +344,39 @@ msgstr "停止する" msgid "Detect Language" msgstr "自動検出" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "実行" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "モデル:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "APIキー:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "タスク:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "言語:" @@ -594,13 +620,13 @@ msgid "End" msgstr "終了" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "テキスト" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -610,7 +636,7 @@ msgstr "翻訳" msgid "View" msgstr "表示" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "タイムスタンプ" @@ -618,107 +644,107 @@ msgstr "タイムスタンプ" msgid "Export" msgstr "出力" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "翻訳" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "リサイズ" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "APIキーが必要" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "設定画面でOpenAI APIキーを入力してください" @@ -877,12 +903,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "OpenAI API キーをkeyringに保存できません" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1254,15 +1280,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "接続エラーが発生しました" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "文字起こしをキャンセルする" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 1d126d07..a34f5558 100644 --- a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po +++ b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" -"PO-Revision-Date: 2025-12-13 10:52+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" +"PO-Revision-Date: 2025-12-14 09:03+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -177,25 +177,41 @@ msgstr "" "režīms" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "Izmantot 8bitu kvantizāciju, lai samazinātu nepieciešamo atmiņu" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" +"Izmantojams Huggingface un Faster whisper modeļiem, lai samazinātu " +"nepieciešamo atmiņas daudzumu, nedaudz zaudējot atpazīšanas kvalitāti." + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "Optimizēt GPU atmiņu" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "Izmantot tikai CPU un deaktivēt GPU paātrināšanu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" "Aktivizējiet šo, ja lielāki modeļi neietilpst jūsu video kartes atmiņā un " "Buzz avarē" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "Deaktivēt GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "OpenAI API atslēgas pārbaude" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -203,11 +219,11 @@ msgstr "" "Jūsu API atslēga ir derīga. Buzz izmantos to runas atpazīšanai ar Whisper " "API un tulkošanai." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "Nederīga API atslēga" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -215,11 +231,11 @@ msgstr "" "API atbalsta tikai base64 simbolus (A-Za-z0-9+/=_-). Citi simboli API " "atslēgā var radīt kļūdas." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "Izvēlieties mapi kurā eksportēt" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -275,7 +291,7 @@ msgstr "Veids" #: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 msgid "Huggingface ID of a Faster whisper model" -msgstr "Faster Whisper modeļa Huggingface ID" +msgstr "Faster whisper modeļa Huggingface ID" #: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 msgid "Download" @@ -317,8 +333,8 @@ msgstr "Lejupielāde neizdevās" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Kļūda" @@ -336,27 +352,42 @@ msgstr "Apturēt" msgid "Detect Language" msgstr "Noteikt valodu" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "piem. eng, fra, deu" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" +"Ievadiet valodas ISO 639-3 kodu (3 burti).\n" +"Piemēram: eng (Angļu), fra (Franču), deu (Vācu),\n" +"spa (Spāņu), lav (Latviešu)" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Apstrādāt" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Modelis:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "Pirmā modeļa ielādes reize var aizņemt pat vairākas minūtes." -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "API atslēga:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Uzdevums:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Valoda:" @@ -600,13 +631,13 @@ msgid "End" msgstr "Beigas" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Teksts" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -616,7 +647,7 @@ msgstr "Tulkojums" msgid "View" msgstr "Skats" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "Laiks" @@ -624,64 +655,64 @@ msgstr "Laiks" msgid "Export" msgstr "Eksportēt" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "Tulkot" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "Mainīt garumu" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "Noteikt runātājus" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "Meklēt" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "Rādīt/Slēpt meklēšanas joslu (Ctrl+F)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "Meklēt:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "Ievadiet meklējamo..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "Iepriekšējais rezultāts (Shift+Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "Nākamais rezultāts (Ctrl+Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "Notīrīt" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "Atskaņošana:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "Atkārtot segmentu" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "Nosaka vai atkārtot izvēlēto segmentu" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "Sekot audio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -689,44 +720,44 @@ msgstr "" "Nosaka vai atskaņojot audio iezīmētajam segmentam vajadzētu automātiski " "sekot tam kas tiek atskaņots." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "Pāriet uz tekošo" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "Pāriet uz šobrīd atskaņojamo tesktu" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "1 no 100+ " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "1 no " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr " " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "Nekas nav atrasts" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr " no 100+" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr " no " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "API atslēgas kļūda" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "Lūdzu ievadiet OpenAI API atslēgu iestatījumos" @@ -884,14 +915,14 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Neizdevās saglabāt OpenAI API atslēgu atslēgu saišķī" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" "Whisper serverim neizdevās ieslēgties. Lūdzu pārbaudiet lietotnes žurnāla " "ierakstus." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1265,15 +1296,15 @@ msgstr "Sundāņu" msgid "Cantonese" msgstr "Kantonas" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "Notika savienojuma kļūda" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "Palaiž Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 msgid "Starting transcription..." msgstr "Sāk atpazīšanu..." diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index eb8dfa6f..7f35c3d6 100644 --- a/buzz/locale/nl/LC_MESSAGES/buzz.po +++ b/buzz/locale/nl/LC_MESSAGES/buzz.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -179,23 +179,37 @@ msgid "Live recording mode" msgstr "Live-opnamemodus" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "OpenAI-api-sleuteltest" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -203,11 +217,11 @@ msgstr "" "De api-sleutel is geldig. Buzz zal deze sleutel gebruiken om transcripties " "en AI-vertalingen op te vragen bij Whisper." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "Ongeldige api-sleutel" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -215,11 +229,11 @@ msgstr "" "De api ondersteunt alleen base64-tekens (A–Za–z0–9+/=_-). Andere tekens " "kunnen problemen veroorzaken." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "Kies een exportmap" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -317,8 +331,8 @@ msgstr "Het downloaden is mislukt" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Foutmelding" @@ -336,29 +350,41 @@ msgstr "Stoppen" msgid "Detect Language" msgstr "Taal herkennen" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Uitvoeren" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Model:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" "Let op: de eerste keer kan het enkele minuten duren voordat het model " "geladen is." -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "Api-sleutel:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Taak:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Taal:" @@ -599,13 +625,13 @@ msgid "End" msgstr "Einde" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Tekst" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -615,7 +641,7 @@ msgstr "Vertaling" msgid "View" msgstr "Bekijken" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "Tijdstippen" @@ -623,107 +649,107 @@ msgstr "Tijdstippen" msgid "Export" msgstr "Exporteren" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "Vertalen" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "Grootte" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "Api-sleutel vereist" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "Voer de OpenAI-api-sleutel in in de instellingen" @@ -883,12 +909,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "De OpenAI-api-sleutel kan niet worden bewaard in de sleutelbos" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1260,15 +1286,15 @@ msgstr "Soedanees" msgid "Cantonese" msgstr "Kantonees" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "Er is een verbindingsfout opgetreden" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "Transcriptie wissen" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index fb8bb348..f1fea38d 100644 --- a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po +++ b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -178,44 +178,58 @@ msgid "Live recording mode" msgstr "Nagrywanie na żywo" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 #, fuzzy msgid "Invalid API key" msgstr "Nieprawidłowy URL" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -318,8 +332,8 @@ msgstr "Pobrany" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Błąd" @@ -337,27 +351,39 @@ msgstr "Zatrzymaj" msgid "Detect Language" msgstr "Wykryj język" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Rozpocznij" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Model:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Zadanie:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Język:" @@ -606,13 +632,13 @@ msgid "End" msgstr "Zakończ" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Tekst" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 #, fuzzy @@ -623,7 +649,7 @@ msgstr "Nowa transkrypcja" msgid "View" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "" @@ -631,107 +657,107 @@ msgstr "" msgid "Export" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "" @@ -895,12 +921,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1273,15 +1299,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "Anuluj transkrypcję" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index 30772b58..812a0280 100644 --- a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po +++ b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Buzz\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -176,24 +176,38 @@ msgid "Live recording mode" msgstr "Modo de gravação ao vivo" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "Usar somente a CPU e desabilitar aceleração por GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" "Marque isso se modelos maiores não couberem na memória da GPU e o Buzz travar" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "Desabilitar GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "Teste da Chave API OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -201,11 +215,11 @@ msgstr "" "Sua chave API é válida. O Buzz usará esta chave para realizar transcrições " "API Whisper e traduções de IA." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "Chave API inválida" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -213,11 +227,11 @@ msgstr "" "A API suporta apenas caracteres base64 (A-Za-z0-9+/=_-). Outros caracteres " "na chave API podem causar erros." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "Selecionar Pasta de Exportação" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -315,8 +329,8 @@ msgstr "Falha ao baixar" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Erro" @@ -334,27 +348,39 @@ msgstr "Parar" msgid "Detect Language" msgstr "Detectar Idioma" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Executar" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Modelo:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "O primeiro uso de um modelo pode levar vários minutos para carregar." -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "Chave API:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Tarefa:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Idioma:" @@ -599,13 +625,13 @@ msgid "End" msgstr "Fim" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Texto" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -615,7 +641,7 @@ msgstr "Tradução" msgid "View" msgstr "Visualizar" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "Marcações de tempo" @@ -623,65 +649,65 @@ msgstr "Marcações de tempo" msgid "Export" msgstr "Exportar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "Traduzir" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "Redimensionar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "Procurar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "Mostrar/Ocultar a Barra de Pesquisa" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "Procurar:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "Digite o texto a procurar..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "Encontro prévio (Shift+Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 #, fuzzy msgid "Next match (Ctrl+Enter)" msgstr "Póximo encontro (Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "Limpar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "Controles de Reprodução:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "Segmento de Loop" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "Habilitar/desabilitar loop ao clicar em segmentos de transcrição" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "Siga o Áudio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -689,44 +715,44 @@ msgstr "" "Ativar/desativar a opção de seguir a posição atual do áudio na transcrição. " "Quando ativado, rola automaticamente para o texto atual." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "Rolar para o Atual" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "Role até o texto falado no momento" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "1 de 100+ encontros" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "1 de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr " encontros" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "Nada encontrado" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr " de 100+ encontros" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr " de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "Chave API Necessária" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "Insira a chave API OpenAI nas preferências" @@ -886,12 +912,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Não foi possível salvar a chave da API OpenAI no cofre de chaves" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "Falha ao iniciar o servidor Whisper. Verifique os logs." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1265,15 +1291,15 @@ msgstr "Sundanês" msgid "Cantonese" msgstr "Cantonês" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "Ocorreu um erro de conexão" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "Iniciando transcrição..." diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 39a56d0b..ecf0eb0b 100644 --- a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po +++ b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -176,23 +176,37 @@ msgid "Live recording mode" msgstr "Живий запис" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "Тест API-ключа OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -200,22 +214,22 @@ msgstr "" "Ваш API-ключ дійсний. Buzz використає цей ключ для транскрипції з Whisper " "API та перекладу ШІ." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 #, fuzzy msgid "Invalid API key" msgstr "API-ключ OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "Виберіть теку для експорту" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -313,8 +327,8 @@ msgstr "Невдале завантаження" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "Помилка" @@ -332,27 +346,39 @@ msgstr "Зупинити" msgid "Detect Language" msgstr "Визначити мову" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "Запуск" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "Модель:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "API-ключ:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "Завдання:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "Мова:" @@ -596,13 +622,13 @@ msgid "End" msgstr "Кінець" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "Текст" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 msgid "Translation" @@ -612,7 +638,7 @@ msgstr "Переклад" msgid "View" msgstr "Вигляд" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "Позначки часу" @@ -620,107 +646,107 @@ msgstr "Позначки часу" msgid "Export" msgstr "Експорт" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "Перекласти" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "Потрібен API-ключ" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "Будь ласка, введіть API-ключ OpenAI в налаштуваннях" @@ -879,12 +905,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "Не вдається додати до звʼязки ключів API-ключ OpenAI" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1256,15 +1282,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "Виникла помилка зʼєднання" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "Скасувати транскрипцію" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 4e71c3f0..a6053e7c 100644 --- a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po +++ b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -179,33 +179,47 @@ msgid "Live recording mode" msgstr "现场录制模式" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "测试OpenAI API Key" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." msgstr "您的API密钥有效。Buzz将使用此密钥执行 Whisper API 识别和 AI 翻译。" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "无效的API key" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 #, fuzzy msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " @@ -213,11 +227,11 @@ msgid "" msgstr "" "API只支持 base64字符(A-Za-z0-9+/=)。其他字符在API密钥中可能导致错误。" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "选择输出文件夹" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -321,8 +335,8 @@ msgstr "下载模型失败" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "错误" @@ -340,27 +354,39 @@ msgstr "停止" msgid "Detect Language" msgstr "检测语言" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "开始执行" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "模型:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "首次使用模型可能需要几分钟的时间才能加载" -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "Api Key:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "任务:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "语言:" @@ -607,13 +633,13 @@ msgid "End" msgstr "结束" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "文本" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 #, fuzzy @@ -624,7 +650,7 @@ msgstr "翻译" msgid "View" msgstr "查看" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "时间戳" @@ -632,107 +658,107 @@ msgstr "时间戳" msgid "Export" msgstr "导出" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "翻译" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "调整大小" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "需要API Key" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "请在偏好设置中输入OpenAI API Key" @@ -895,12 +921,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "无法将OpenAI API密钥保存到密钥串" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1273,15 +1299,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "连接发生错误" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "取消识别" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index beb2e501..795a4111 100644 --- a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po +++ b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-16 08:58+0200\n" +"POT-Creation-Date: 2025-12-17 19:51+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -178,43 +178,57 @@ msgid "Live recording mode" msgstr "現場錄製" #: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +msgid "" +"Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " +"but may slightly decrease transcription quality." +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +msgid "Reduce GPU RAM" +msgstr "" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:198 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:200 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:225 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:231 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 msgid "OpenAI API Key Test" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:226 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:242 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 msgid "Invalid API key" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:243 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:264 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 msgid "Select Export Folder" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:334 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 msgid "" "OpenAI API returned invalid response. Please check the API url or your key. " "Transcription and translation may still work if the API does not support key " @@ -316,8 +330,8 @@ msgstr "下載模型" #: buzz/widgets/transcription_tasks_table_widget.py:704 #: buzz/widgets/transcription_tasks_table_widget.py:774 #: buzz/widgets/transcription_tasks_table_widget.py:805 -#: buzz/widgets/main_window.py:283 buzz/model_loader.py:577 -#: buzz/model_loader.py:591 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:651 +#: buzz/model_loader.py:665 msgid "Error" msgstr "" @@ -335,27 +349,39 @@ msgstr "停止" msgid "Detect Language" msgstr "檢測語言" +#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +msgid "e.g., eng, fra, deu" +msgstr "" + +#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +msgid "" +"Enter an ISO 639-3 language code (3 letters).\n" +"Examples: eng (English), fra (French), deu (German),\n" +"spa (Spanish), lav (Latvian)" +msgstr "" + #: buzz/widgets/transcriber/file_transcriber_widget.py:84 msgid "Run" msgstr "開始執行" -#: buzz/widgets/transcriber/transcription_options_group_box.py:93 +#: buzz/widgets/transcriber/transcription_options_group_box.py:101 msgid "Model:" msgstr "模型:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:105 +#: buzz/widgets/transcriber/transcription_options_group_box.py:113 msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:115 +#: buzz/widgets/transcriber/transcription_options_group_box.py:123 msgid "Api Key:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:116 +#: buzz/widgets/transcriber/transcription_options_group_box.py:124 msgid "Task:" msgstr "任務:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:117 +#: buzz/widgets/transcriber/transcription_options_group_box.py:125 +#: buzz/widgets/transcriber/transcription_options_group_box.py:126 msgid "Language:" msgstr "語言:" @@ -602,13 +628,13 @@ msgid "End" msgstr "" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:43 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 msgid "Text" msgstr "" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:49 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:50 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 #: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 #, fuzzy @@ -619,7 +645,7 @@ msgstr "新錄製" msgid "View" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:56 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 msgid "Timestamps" msgstr "" @@ -627,107 +653,107 @@ msgstr "" msgid "Export" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:285 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 msgid "Translate" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:295 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 msgid "Resize" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:308 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:320 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:325 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:424 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:430 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:443 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:452 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:461 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:489 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:494 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:497 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:504 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:507 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:556 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:559 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:892 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:895 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:900 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:973 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:976 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1368 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 msgid "API Key Required" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1369 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 msgid "Please enter OpenAI API Key in preferences" msgstr "" @@ -889,12 +915,12 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:397 +#: buzz/transcriber/recording_transcriber.py:417 msgid "Whisper server failed to start. Check logs for details." msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:60 -#: buzz/transcriber/recording_transcriber.py:401 +#: buzz/transcriber/recording_transcriber.py:421 msgid "" "Whisper server failed to start due to insufficient memory. Please try again " "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " @@ -1267,15 +1293,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:224 buzz/model_loader.py:610 +#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:684 msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:333 +#: buzz/transcriber/recording_transcriber.py:353 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:388 +#: buzz/transcriber/recording_transcriber.py:408 #, fuzzy msgid "Starting transcription..." msgstr "取消錄製" diff --git a/buzz/model_loader.py b/buzz/model_loader.py index 24a0a5dc..87531189 100644 --- a/buzz/model_loader.py +++ b/buzz/model_loader.py @@ -131,6 +131,80 @@ HUGGING_FACE_MODEL_ALLOW_PATTERNS = [ "vocab.json", ] +# MMS models use different patterns - adapters are downloaded on-demand by transformers +MMS_MODEL_ALLOW_PATTERNS = [ + "model.safetensors", + "pytorch_model.bin", + "config.json", + "preprocessor_config.json", + "tokenizer_config.json", + "vocab.json", + "special_tokens_map.json", + "added_tokens.json", +] + +# ISO 639-1 to ISO 639-3 language code mapping for MMS models +ISO_639_1_TO_3 = { + "en": "eng", "fr": "fra", "de": "deu", "es": "spa", "it": "ita", + "pt": "por", "ru": "rus", "ja": "jpn", "ko": "kor", "zh": "cmn", + "ar": "ara", "hi": "hin", "nl": "nld", "pl": "pol", "sv": "swe", + "tr": "tur", "uk": "ukr", "vi": "vie", "cs": "ces", "da": "dan", + "fi": "fin", "el": "ell", "he": "heb", "hu": "hun", "id": "ind", + "ms": "zsm", "no": "nob", "ro": "ron", "sk": "slk", "th": "tha", + "bg": "bul", "ca": "cat", "hr": "hrv", "lt": "lit", "lv": "lav", + "sl": "slv", "et": "est", "sr": "srp", "tl": "tgl", "bn": "ben", + "ta": "tam", "te": "tel", "mr": "mar", "gu": "guj", "kn": "kan", + "ml": "mal", "pa": "pan", "ur": "urd", "fa": "pes", "sw": "swh", + "af": "afr", "az": "azj", "be": "bel", "bs": "bos", "cy": "cym", + "eo": "epo", "eu": "eus", "ga": "gle", "gl": "glg", "hy": "hye", + "is": "isl", "ka": "kat", "kk": "kaz", "km": "khm", "lo": "lao", + "mk": "mkd", "mn": "khk", "my": "mya", "ne": "npi", "si": "sin", + "sq": "sqi", "uz": "uzn", "zu": "zul", "am": "amh", "jw": "jav", + "la": "lat", "so": "som", "su": "sun", "tt": "tat", "yo": "yor", +} + + +def map_language_to_mms(language_code: str) -> str: + """Convert ISO 639-1 code to ISO 639-3 code for MMS models. + + If the code is already 3 letters, returns it as-is. + If the code is not found in the mapping, returns as-is. + """ + if not language_code: + return "eng" # Default to English for MMS + if len(language_code) == 3: + return language_code # Already ISO 639-3 + return ISO_639_1_TO_3.get(language_code, language_code) + + +def is_mms_model(model_id: str) -> bool: + """Detect if a HuggingFace model is an MMS (Massively Multilingual Speech) model. + + Detection criteria: + 1. Model ID contains "mms-" (e.g., facebook/mms-1b-all) + 2. Model config has model_type == "wav2vec2" with adapter architecture + """ + if not model_id: + return False + + # Fast check: model ID pattern + if "mms-" in model_id.lower(): + return True + + # For cached/downloaded models, check config.json + try: + import json + config_path = huggingface_hub.hf_hub_download( + model_id, "config.json", local_files_only=True, cache_dir=model_root_dir + ) + with open(config_path) as f: + config = json.load(f) + # MMS models have model_type "wav2vec2" and use adapter architecture + return (config.get("model_type") == "wav2vec2" + and config.get("adapter_attn_dim") is not None) + except Exception: + return False + @dataclass() class TranscriptionModel: diff --git a/buzz/settings/settings.py b/buzz/settings/settings.py index cd8923df..a33cead5 100644 --- a/buzz/settings/settings.py +++ b/buzz/settings/settings.py @@ -70,6 +70,7 @@ class Settings: AUDIO_PLAYBACK_RATE = "audio/playback-rate" FORCE_CPU = "force-cpu" + REDUCE_GPU_MEMORY = "reduce-gpu-memory" def get_user_identifier(self) -> str: user_id = self.value(self.Key.USER_IDENTIFIER, "") diff --git a/buzz/store/keyring_store.py b/buzz/store/keyring_store.py index 0915e018..670be19e 100644 --- a/buzz/store/keyring_store.py +++ b/buzz/store/keyring_store.py @@ -82,9 +82,6 @@ def _get_portal_secret() -> bytes | None: break if secret_data: - logging.debug( - "Successfully retrieved portal secret (%d bytes)", len(secret_data) - ) return secret_data return None diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index 6800f006..929c12cb 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -21,10 +21,10 @@ from PyQt6.QtCore import QObject, pyqtSignal from buzz import whisper_audio from buzz.locale import _ from buzz.assets import APP_BASE_DIR -from buzz.model_loader import ModelType +from buzz.model_loader import ModelType, map_language_to_mms from buzz.settings.settings import Settings from buzz.transcriber.transcriber import TranscriptionOptions, Task -from buzz.transformers_whisper import TransformersWhisper +from buzz.transformers_whisper import TransformersTranscriber from buzz.settings.recording_transcriber_mode import RecordingTranscriberMode import whisper @@ -105,10 +105,18 @@ class RecordingTranscriber(QObject): if force_cpu != "false": device = "cpu" + # Check if user wants reduced GPU memory usage (int8 quantization) + reduce_gpu_memory = os.getenv("BUZZ_REDUCE_GPU_MEMORY", "false") != "false" + compute_type = "default" + if reduce_gpu_memory: + compute_type = "int8" if device == "cpu" else "int8_float16" + logging.debug(f"Using {compute_type} compute type for reduced memory usage") + model = faster_whisper.WhisperModel( model_size_or_path=model_path, download_root=model_root_dir, device=device, + compute_type=compute_type, cpu_threads=(os.cpu_count() or 8)//2, ) @@ -132,7 +140,7 @@ class RecordingTranscriber(QObject): logging.debug("Will use whisper API on %s, %s", custom_openai_base_url, self.whisper_api_model) else: # ModelType.HUGGING_FACE - model = TransformersWhisper(model_path) + model = TransformersTranscriber(model_path) initial_prompt = self.transcription_options.initial_prompt @@ -211,13 +219,25 @@ class RecordingTranscriber(QObject): self.transcription_options.model.model_type == ModelType.HUGGING_FACE ): - assert isinstance(model, TransformersWhisper) + assert isinstance(model, TransformersTranscriber) + # Handle MMS-specific language and task + if model.is_mms_model: + language = map_language_to_mms( + self.transcription_options.language or "eng" + ) + effective_task = Task.TRANSCRIBE.value + else: + language = ( + self.transcription_options.language + if self.transcription_options.language is not None + else "en" + ) + effective_task = self.transcription_options.task.value + result = model.transcribe( audio=samples, - language=self.transcription_options.language - if self.transcription_options.language is not None - else "en", - task=self.transcription_options.task.value, + language=language, + task=effective_task, ) else: # OPEN_AI_WHISPER_API, also used for WHISPER_CPP if self.openai_client is None: diff --git a/buzz/transcriber/whisper_file_transcriber.py b/buzz/transcriber/whisper_file_transcriber.py index e329c587..a0882a7d 100644 --- a/buzz/transcriber/whisper_file_transcriber.py +++ b/buzz/transcriber/whisper_file_transcriber.py @@ -18,8 +18,8 @@ from PyQt6.QtCore import QObject from buzz import whisper_audio from buzz.conn import pipe_stderr -from buzz.model_loader import ModelType, WhisperModelSize -from buzz.transformers_whisper import TransformersWhisper +from buzz.model_loader import ModelType, WhisperModelSize, map_language_to_mms +from buzz.transformers_whisper import TransformersTranscriber from buzz.transcriber.file_transcriber import FileTranscriber from buzz.transcriber.transcriber import FileTranscriptionTask, Segment, Task from buzz.transcriber.whisper_cpp import WhisperCpp @@ -123,6 +123,10 @@ class WhisperFileTranscriber(FileTranscriber): def transcribe_whisper( cls, stderr_conn: Connection, task: FileTranscriptionTask ) -> None: + # Preload CUDA libraries in the subprocess - must be done before importing torch + # This is needed because multiprocessing creates a fresh process without the main process's preloaded libraries + from buzz import cuda_setup # noqa: F401 + # Patch subprocess on Windows to prevent console window flash # This is needed because multiprocessing spawns a new process without the main process patches if sys.platform == "win32": @@ -182,17 +186,29 @@ class WhisperFileTranscriber(FileTranscriber): @classmethod def transcribe_hugging_face(cls, task: FileTranscriptionTask) -> List[Segment]: - model = TransformersWhisper(task.model_path) - language = ( - task.transcription_options.language - if task.transcription_options.language is not None - else "en" - ) + model = TransformersTranscriber(task.model_path) + + # Handle language - MMS uses ISO 639-3 codes, Whisper uses ISO 639-1 + if model.is_mms_model: + language = map_language_to_mms(task.transcription_options.language or "eng") + # MMS only supports transcription, ignore translation task + effective_task = Task.TRANSCRIBE.value + # MMS doesn't support word-level timestamps + word_timestamps = False + else: + language = ( + task.transcription_options.language + if task.transcription_options.language is not None + else "en" + ) + effective_task = task.transcription_options.task.value + word_timestamps = task.transcription_options.word_level_timings + result = model.transcribe( audio=task.file_path, language=language, - task=task.transcription_options.task.value, - word_timestamps=task.transcription_options.word_level_timings, + task=effective_task, + word_timestamps=word_timestamps, ) return [ Segment( @@ -228,10 +244,18 @@ class WhisperFileTranscriber(FileTranscriber): if force_cpu != "false": device = "cpu" + # Check if user wants reduced GPU memory usage (int8 quantization) + reduce_gpu_memory = os.getenv("BUZZ_REDUCE_GPU_MEMORY", "false") != "false" + compute_type = "default" + if reduce_gpu_memory: + compute_type = "int8" if device == "cpu" else "int8_float16" + logging.debug(f"Using {compute_type} compute type for reduced memory usage") + model = faster_whisper.WhisperModel( model_size_or_path=model_size_or_path, download_root=model_root_dir, device=device, + compute_type=compute_type, cpu_threads=(os.cpu_count() or 8)//2, ) diff --git a/buzz/transformers_whisper.py b/buzz/transformers_whisper.py index 0164fd2f..96ee0f47 100644 --- a/buzz/transformers_whisper.py +++ b/buzz/transformers_whisper.py @@ -1,14 +1,28 @@ import os import sys +import logging +import platform import numpy as np import torch import requests -from typing import Optional, Union -from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline +from typing import Union +from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline, BitsAndBytesConfig from transformers.pipelines import AutomaticSpeechRecognitionPipeline from transformers.pipelines.audio_utils import ffmpeg_read from transformers.pipelines.automatic_speech_recognition import is_torchaudio_available +from buzz.model_loader import is_mms_model, map_language_to_mms + + +def is_intel_mac() -> bool: + """Check if running on Intel Mac (x86_64).""" + return sys.platform == 'darwin' and platform.machine() == 'x86_64' + + +def is_peft_model(model_id: str) -> bool: + """Check if model is a PEFT model based on model ID containing '-peft'.""" + return "-peft" in model_id.lower() + class PipelineWithProgress(AutomaticSpeechRecognitionPipeline): # pragma: no cover # Copy of transformers `AutomaticSpeechRecognitionPipeline.chunk_iter` method with custom progress output @@ -162,11 +176,23 @@ class PipelineWithProgress(AutomaticSpeechRecognitionPipeline): # pragma: no co yield {"is_last": True, **processed, **extra} -class TransformersWhisper: - def __init__( - self, model_id: str - ): +class TransformersTranscriber: + """Unified transcriber for HuggingFace models (Whisper and MMS).""" + + def __init__(self, model_id: str): self.model_id = model_id + self._is_mms = is_mms_model(model_id) + self._is_peft = is_peft_model(model_id) + + @property + def is_mms_model(self) -> bool: + """Returns True if this is an MMS model.""" + return self._is_mms + + @property + def is_peft_model(self) -> bool: + """Returns True if this is a PEFT model.""" + return self._is_peft def transcribe( self, @@ -175,39 +201,85 @@ class TransformersWhisper: task: str, word_timestamps: bool = False, ): + """Transcribe audio using either Whisper or MMS model.""" + if self._is_mms: + return self._transcribe_mms(audio, language) + else: + return self._transcribe_whisper(audio, language, task, word_timestamps) + + def _transcribe_whisper( + self, + audio: Union[str, np.ndarray], + language: str, + task: str, + word_timestamps: bool = False, + ): + """Transcribe using Whisper model.""" force_cpu = os.getenv("BUZZ_FORCE_CPU", "false") use_cuda = torch.cuda.is_available() and force_cpu == "false" device = "cuda" if use_cuda else "cpu" torch_dtype = torch.float16 if use_cuda else torch.float32 - use_safetensors = True - if os.path.exists(self.model_id): - safetensors_files = [f for f in os.listdir(self.model_id) if f.endswith(".safetensors")] - use_safetensors = len(safetensors_files) > 0 + # Check if this is a PEFT model + if is_peft_model(self.model_id): + model, processor, use_8bit = self._load_peft_model(device, torch_dtype) + else: + use_safetensors = True + if os.path.exists(self.model_id): + safetensors_files = [f for f in os.listdir(self.model_id) if f.endswith(".safetensors")] + use_safetensors = len(safetensors_files) > 0 - model = AutoModelForSpeechSeq2Seq.from_pretrained( - self.model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=use_safetensors - ) + # Check if user wants reduced GPU memory usage (8-bit quantization) + # Skip on Intel Macs as bitsandbytes is not available there + reduce_gpu_memory = os.getenv("BUZZ_REDUCE_GPU_MEMORY", "false") != "false" + use_8bit = False + if device == "cuda" and reduce_gpu_memory and not is_intel_mac(): + try: + import bitsandbytes # noqa: F401 + use_8bit = True + print("Using 8-bit quantization for reduced GPU memory usage") + except ImportError: + print("bitsandbytes not available, using standard precision") - model.generation_config.language = language - model.to(device) + if use_8bit: + quantization_config = BitsAndBytesConfig(load_in_8bit=True) + model = AutoModelForSpeechSeq2Seq.from_pretrained( + self.model_id, + quantization_config=quantization_config, + device_map="auto", + use_safetensors=use_safetensors + ) + else: + model = AutoModelForSpeechSeq2Seq.from_pretrained( + self.model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=use_safetensors + ) + model.to(device) - processor = AutoProcessor.from_pretrained(self.model_id) + model.generation_config.language = language - pipe = pipeline( - "automatic-speech-recognition", - pipeline_class=PipelineWithProgress, - generate_kwargs={"language": language, "task": task}, - model=model, - tokenizer=processor.tokenizer, - feature_extractor=processor.feature_extractor, + processor = AutoProcessor.from_pretrained(self.model_id) + + pipeline_kwargs = { + "task": "automatic-speech-recognition", + "pipeline_class": PipelineWithProgress, + "generate_kwargs": { + "language": language, + "task": task, + "no_repeat_ngram_size": 3, + "repetition_penalty": 1.2, + }, + "model": model, + "tokenizer": processor.tokenizer, + "feature_extractor": processor.feature_extractor, # pipeline has built in chunking, works faster, but we loose progress output # needed for word level timestamps, otherwise there is huge RAM usage on longer audios - chunk_length_s=30 if word_timestamps else None, - torch_dtype=torch_dtype, - device=device, - ignore_warning=True # Ignore warning about chunk_length_s being experimental for seq2seq models - ) + "chunk_length_s": 30 if word_timestamps else None, + "torch_dtype": torch_dtype, + "ignore_warning": True, # Ignore warning about chunk_length_s being experimental for seq2seq models + } + if not use_8bit: + pipeline_kwargs["device"] = device + pipe = pipeline(**pipeline_kwargs) transcript = pipe( audio, @@ -238,3 +310,207 @@ class TransformersWhisper: "segments": segments, } + def _load_peft_model(self, device: str, torch_dtype): + """Load a PEFT (Parameter-Efficient Fine-Tuning) model. + + PEFT models require loading the base model first, then applying the adapter. + The base model path is extracted from the PEFT config. + + Returns: + Tuple of (model, processor, use_8bit) + """ + from peft import PeftModel, PeftConfig + from transformers import WhisperForConditionalGeneration, WhisperFeatureExtractor, WhisperTokenizer + + print(f"Loading PEFT model: {self.model_id}") + + # Get the PEFT model ID (handle both local paths and repo IDs) + peft_model_id = self._get_peft_repo_id() + + # Load PEFT config to get base model path + peft_config = PeftConfig.from_pretrained(peft_model_id) + base_model_path = peft_config.base_model_name_or_path + print(f"PEFT base model: {base_model_path}") + + # Load the base Whisper model + # Use 8-bit quantization on CUDA if user enabled "Reduce GPU RAM" and bitsandbytes is available + # Skip on Intel Macs as bitsandbytes is not available there + reduce_gpu_memory = os.getenv("BUZZ_REDUCE_GPU_MEMORY", "false") != "false" + use_8bit = False + if device == "cuda" and reduce_gpu_memory and not is_intel_mac(): + try: + import bitsandbytes # noqa: F401 + use_8bit = True + print("Using 8-bit quantization for reduced GPU memory usage") + except ImportError: + print("bitsandbytes not available, using standard precision for PEFT model") + + if use_8bit: + quantization_config = BitsAndBytesConfig(load_in_8bit=True) + model = WhisperForConditionalGeneration.from_pretrained( + base_model_path, + quantization_config=quantization_config, + device_map="auto" + ) + else: + model = WhisperForConditionalGeneration.from_pretrained( + base_model_path, + torch_dtype=torch_dtype, + low_cpu_mem_usage=True + ) + model.to(device) + + # Apply the PEFT adapter + model = PeftModel.from_pretrained(model, peft_model_id) + model.config.use_cache = True + + # Load feature extractor and tokenizer from base model + feature_extractor = WhisperFeatureExtractor.from_pretrained(base_model_path) + tokenizer = WhisperTokenizer.from_pretrained(base_model_path, task="transcribe") + + # Create a simple processor-like object that the pipeline expects + class PeftProcessor: + def __init__(self, feature_extractor, tokenizer): + self.feature_extractor = feature_extractor + self.tokenizer = tokenizer + + processor = PeftProcessor(feature_extractor, tokenizer) + + return model, processor, use_8bit + + def _get_peft_repo_id(self) -> str: + """Extract HuggingFace repo ID from local cache path for PEFT models.""" + model_id = self.model_id + + # If it's already a repo ID (contains / but not a file path), return as-is + if "/" in model_id and not os.path.exists(model_id): + return model_id + + # Extract repo ID from cache path + if "models--" in model_id: + parts = model_id.split("models--") + if len(parts) > 1: + repo_part = parts[1].split(os.sep + "snapshots")[0] + repo_id = repo_part.replace("--", "/", 1) + return repo_id + + # Fallback: return as-is + return model_id + + def _get_mms_repo_id(self) -> str: + """Extract HuggingFace repo ID from local cache path or return as-is if already a repo ID.""" + model_id = self.model_id + + # If it's already a repo ID (contains / but not a file path), return as-is + if "/" in model_id and not os.path.exists(model_id): + return model_id + + # Extract repo ID from cache path like: + # Linux: /home/user/.cache/Buzz/models/models--facebook--mms-1b-all/snapshots/xxx + # Windows: C:\Users\user\.cache\Buzz\models\models--facebook--mms-1b-all\snapshots\xxx + if "models--" in model_id: + # Extract the part after "models--" and before "/snapshots" or "\snapshots" + parts = model_id.split("models--") + if len(parts) > 1: + # Split on os.sep to handle both Windows and Unix paths + repo_part = parts[1].split(os.sep + "snapshots")[0] + # Convert facebook--mms-1b-all to facebook/mms-1b-all + repo_id = repo_part.replace("--", "/", 1) + return repo_id + + # Fallback: return as-is + return model_id + + def _transcribe_mms( + self, + audio: Union[str, np.ndarray], + language: str, + ): + """Transcribe using MMS (Massively Multilingual Speech) model.""" + from transformers import Wav2Vec2ForCTC, AutoProcessor as MMSAutoProcessor + from transformers.pipelines.audio_utils import ffmpeg_read as mms_ffmpeg_read + + force_cpu = os.getenv("BUZZ_FORCE_CPU", "false") + use_cuda = torch.cuda.is_available() and force_cpu == "false" + device = "cuda" if use_cuda else "cpu" + + # Map language code to ISO 639-3 for MMS + mms_language = map_language_to_mms(language) + print(f"MMS transcription with language: {mms_language} (original: {language})") + + sys.stderr.write("0%\n") + + # Use repo ID for MMS to allow adapter downloads + # Local paths don't work for adapter downloads + repo_id = self._get_mms_repo_id() + print(f"MMS using repo ID: {repo_id} (from model_id: {self.model_id})") + + # Load processor and model with target language + # This will download the language adapter if not cached + processor = MMSAutoProcessor.from_pretrained( + repo_id, + target_lang=mms_language + ) + + model = Wav2Vec2ForCTC.from_pretrained( + repo_id, + target_lang=mms_language, + ignore_mismatched_sizes=True + ) + model.to(device) + + sys.stderr.write("25%\n") + + # Load and process audio + if isinstance(audio, str): + with open(audio, "rb") as f: + audio_data = f.read() + audio_array = mms_ffmpeg_read(audio_data, processor.feature_extractor.sampling_rate) + else: + audio_array = audio + + # Ensure audio is the right sample rate + sampling_rate = processor.feature_extractor.sampling_rate + + sys.stderr.write("50%\n") + + # Process audio in chunks for progress reporting + inputs = processor( + audio_array, + sampling_rate=sampling_rate, + return_tensors="pt", + padding=True + ) + inputs = {k: v.to(device) for k, v in inputs.items()} + + sys.stderr.write("75%\n") + + # Run inference + with torch.no_grad(): + outputs = model(**inputs).logits + + # Decode + ids = torch.argmax(outputs, dim=-1)[0] + transcription = processor.decode(ids) + + sys.stderr.write("100%\n") + + # Calculate approximate duration for segment + duration = len(audio_array) / sampling_rate if isinstance(audio_array, np.ndarray) else 0 + + # Return in same format as Whisper for consistency + # MMS doesn't provide word-level timestamps, so we return a single segment + return { + "text": transcription, + "segments": [{ + "start": 0, + "end": duration, + "text": transcription.strip(), + "translation": "" + }] if transcription.strip() else [] + } + + +# Alias for backward compatibility +TransformersWhisper = TransformersTranscriber + diff --git a/buzz/widgets/application.py b/buzz/widgets/application.py index 571257a5..0448298c 100755 --- a/buzz/widgets/application.py +++ b/buzz/widgets/application.py @@ -47,6 +47,13 @@ class Application(QApplication): ) if force_cpu_enabled: os.environ["BUZZ_FORCE_CPU"] = "true" + + # Set BUZZ_REDUCE_GPU_MEMORY environment variable if Reduce GPU RAM setting is enabled + reduce_gpu_memory_enabled = self.settings.value( + key=Settings.Key.REDUCE_GPU_MEMORY, default_value=False + ) + if reduce_gpu_memory_enabled: + os.environ["BUZZ_REDUCE_GPU_MEMORY"] = "true" font_size = self.settings.value( key=Settings.Key.FONT_SIZE, default_value=self.font().pointSize() diff --git a/buzz/widgets/preferences_dialog/general_preferences_widget.py b/buzz/widgets/preferences_dialog/general_preferences_widget.py index 8f29f5de..af569091 100644 --- a/buzz/widgets/preferences_dialog/general_preferences_widget.py +++ b/buzz/widgets/preferences_dialog/general_preferences_widget.py @@ -188,6 +188,20 @@ class GeneralPreferencesWidget(QWidget): layout.addRow(_("Live recording mode"), self.recording_transcriber_mode) + self.reduce_gpu_memory_enabled = self.settings.value( + key=Settings.Key.REDUCE_GPU_MEMORY, default_value=False + ) + + self.reduce_gpu_memory_checkbox = QCheckBox(_("Use 8-bit quantization to reduce memory usage")) + self.reduce_gpu_memory_checkbox.setChecked(self.reduce_gpu_memory_enabled) + self.reduce_gpu_memory_checkbox.setObjectName("ReduceGPUMemoryCheckbox") + self.reduce_gpu_memory_checkbox.setToolTip( + _("Applies to Huggingface and Faster Whisper models. " + "Reduces GPU memory usage but may slightly decrease transcription quality.") + ) + self.reduce_gpu_memory_checkbox.stateChanged.connect(self.on_reduce_gpu_memory_changed) + layout.addRow(_("Reduce GPU RAM"), self.reduce_gpu_memory_checkbox) + self.force_cpu_enabled = self.settings.value( key=Settings.Key.FORCE_CPU, default_value=False ) @@ -295,12 +309,23 @@ class GeneralPreferencesWidget(QWidget): import os self.force_cpu_enabled = state == 2 self.settings.set_value(Settings.Key.FORCE_CPU, self.force_cpu_enabled) - + if self.force_cpu_enabled: os.environ["BUZZ_FORCE_CPU"] = "true" else: os.environ.pop("BUZZ_FORCE_CPU", None) + def on_reduce_gpu_memory_changed(self, state: int): + import os + self.reduce_gpu_memory_enabled = state == 2 + self.settings.set_value(Settings.Key.REDUCE_GPU_MEMORY, self.reduce_gpu_memory_enabled) + + if self.reduce_gpu_memory_enabled: + os.environ["BUZZ_REDUCE_GPU_MEMORY"] = "true" + else: + os.environ.pop("BUZZ_REDUCE_GPU_MEMORY", None) + + class ValidateOpenAIApiKeyJob(QRunnable): class Signals(QObject): success = pyqtSignal() diff --git a/buzz/widgets/transcriber/hugging_face_search_line_edit.py b/buzz/widgets/transcriber/hugging_face_search_line_edit.py index db9da3af..b53bbfa7 100644 --- a/buzz/widgets/transcriber/hugging_face_search_line_edit.py +++ b/buzz/widgets/transcriber/hugging_face_search_line_edit.py @@ -64,7 +64,8 @@ class HuggingFaceSearchLineEdit(LineEdit): def focusInEvent(self, event): super().focusInEvent(event) - self.clear() + # Defer selectAll to run after mouse events are processed + QTimer.singleShot(0, self.selectAll) def on_text_edited(self, text: str): self.model_selected.emit(text) diff --git a/buzz/widgets/transcriber/mms_language_line_edit.py b/buzz/widgets/transcriber/mms_language_line_edit.py new file mode 100644 index 00000000..4f101d6d --- /dev/null +++ b/buzz/widgets/transcriber/mms_language_line_edit.py @@ -0,0 +1,48 @@ +from typing import Optional + +from PyQt6.QtCore import pyqtSignal +from PyQt6.QtWidgets import QWidget, QSizePolicy + +from buzz.locale import _ +from buzz.widgets.line_edit import LineEdit + + +class MMSLanguageLineEdit(LineEdit): + """Text input for MMS language codes (ISO 639-3). + + MMS models support 1000+ languages using ISO 639-3 codes (3 letters). + Examples: eng (English), fra (French), deu (German), spa (Spanish) + """ + + languageChanged = pyqtSignal(str) + + def __init__( + self, + default_language: str = "eng", + parent: Optional[QWidget] = None + ): + super().__init__(default_language, parent) + self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) + self.setPlaceholderText(_("e.g., eng, fra, deu")) + self.setToolTip( + _("Enter an ISO 639-3 language code (3 letters).\n" + "Examples: eng (English), fra (French), deu (German),\n" + "spa (Spanish), lav (Latvian)") + ) + self.setMaxLength(10) # Allow some flexibility for edge cases + self.setMinimumWidth(100) + + self.textChanged.connect(self._on_text_changed) + + def _on_text_changed(self, text: str): + """Emit language changed signal with cleaned text.""" + cleaned = text.strip().lower() + self.languageChanged.emit(cleaned) + + def language(self) -> str: + """Get the current language code.""" + return self.text().strip().lower() + + def setLanguage(self, language: str): + """Set the language code.""" + self.setText(language.strip().lower() if language else "eng") diff --git a/buzz/widgets/transcriber/transcription_options_group_box.py b/buzz/widgets/transcriber/transcription_options_group_box.py index 844e4df9..1524086e 100644 --- a/buzz/widgets/transcriber/transcription_options_group_box.py +++ b/buzz/widgets/transcriber/transcription_options_group_box.py @@ -10,7 +10,7 @@ from PyQt6.QtWidgets import QGroupBox, QWidget, QFormLayout, QComboBox, QLabel, from buzz.locale import _ from buzz.settings.settings import Settings from buzz.widgets.icon import INFO_ICON_PATH -from buzz.model_loader import ModelType, WhisperModelSize, get_whisper_cpp_file_path +from buzz.model_loader import ModelType, WhisperModelSize, get_whisper_cpp_file_path, is_mms_model from buzz.transcriber.transcriber import TranscriptionOptions, Task from buzz.widgets.model_type_combo_box import ModelTypeComboBox from buzz.widgets.openai_api_key_line_edit import OpenAIAPIKeyLineEdit @@ -20,6 +20,7 @@ from buzz.widgets.transcriber.hugging_face_search_line_edit import ( HuggingFaceSearchLineEdit, ) from buzz.widgets.transcriber.languages_combo_box import LanguagesComboBox +from buzz.widgets.transcriber.mms_language_line_edit import MMSLanguageLineEdit from buzz.widgets.transcriber.tasks_combo_box import TasksComboBox @@ -87,6 +88,13 @@ class TranscriptionOptionsGroupBox(QGroupBox): ) self.languages_combo_box.languageChanged.connect(self.on_language_changed) + # MMS language input (text field for ISO 639-3 codes) + self.mms_language_line_edit = MMSLanguageLineEdit( + default_language="eng", parent=self + ) + self.mms_language_line_edit.languageChanged.connect(self.on_mms_language_changed) + self.mms_language_line_edit.setVisible(False) + self.advanced_settings_button = AdvancedSettingsButton(self) self.advanced_settings_button.clicked.connect(self.open_advanced_settings) @@ -115,6 +123,7 @@ class TranscriptionOptionsGroupBox(QGroupBox): self.form_layout.addRow(_("Api Key:"), self.openai_access_token_edit) self.form_layout.addRow(_("Task:"), self.tasks_combo_box) self.form_layout.addRow(_("Language:"), self.languages_combo_box) + self.form_layout.addRow(_("Language:"), self.mms_language_line_edit) self.reset_visible_rows() @@ -133,6 +142,14 @@ class TranscriptionOptionsGroupBox(QGroupBox): self.transcription_options.language = language self.transcription_options_changed.emit(self.transcription_options) + def on_mms_language_changed(self, language: str): + """Handle MMS language code changes.""" + if language == "": + language = "eng" # Default to English for MMS + + self.transcription_options.language = language + self.transcription_options_changed.emit(self.transcription_options) + def on_task_changed(self, task: Task): self.transcription_options.task = task self.transcription_options_changed.emit(self.transcription_options) @@ -229,6 +246,9 @@ class TranscriptionOptionsGroupBox(QGroupBox): self.transcription_options.model.model_type == ModelType.WHISPER_CPP ) + # Update language widget visibility (MMS vs Whisper) + self._update_language_widget_visibility() + def on_model_type_changed(self, model_type: ModelType): self.transcription_options.model.model_type = model_type if not model_type.supports_initial_prompt: @@ -254,3 +274,34 @@ class TranscriptionOptionsGroupBox(QGroupBox): self.transcription_options_changed.emit(self.transcription_options) self.settings.save_custom_model_id(self.transcription_options.model) + + # Update language widget visibility based on whether this is an MMS model + self._update_language_widget_visibility() + + def _update_language_widget_visibility(self): + """Update language widget visibility based on whether the selected model is MMS.""" + model_type = self.transcription_options.model.model_type + model_id = self.transcription_options.model.hugging_face_model_id + + # Check if this is an MMS model + is_mms = (model_type == ModelType.HUGGING_FACE and is_mms_model(model_id)) + + # Show MMS language input for MMS models, show dropdown for others + self.form_layout.setRowVisible(self.mms_language_line_edit, is_mms) + self.form_layout.setRowVisible(self.languages_combo_box, not is_mms) + + # Sync the language value when switching between MMS and non-MMS + if is_mms: + # When switching to MMS, use the MMS language input value + mms_lang = self.mms_language_line_edit.language() + if mms_lang: + self.transcription_options.language = mms_lang + self.transcription_options_changed.emit(self.transcription_options) + else: + # When switching from MMS to a regular model, use the dropdown's current value + # This prevents invalid MMS language codes (like "eng") being used with Whisper + current_index = self.languages_combo_box.currentIndex() + dropdown_lang = self.languages_combo_box.languages[current_index][0] + if self.transcription_options.language != dropdown_lang: + self.transcription_options.language = dropdown_lang if dropdown_lang else None + self.transcription_options_changed.emit(self.transcription_options) diff --git a/buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py b/buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py index 4c9abc01..610f7d79 100644 --- a/buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +++ b/buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py @@ -34,6 +34,7 @@ class TranscriptionViewModeToolButton(QToolButton): self.setIcon(VisibilityIcon(self)) self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) self.setPopupMode(QToolButton.ToolButtonPopupMode.MenuButtonPopup) + self.setMinimumWidth(80) translation.connect(self.on_translation_available) diff --git a/buzz/widgets/transcription_viewer/transcription_viewer_widget.py b/buzz/widgets/transcription_viewer/transcription_viewer_widget.py index 768ef365..546936a6 100644 --- a/buzz/widgets/transcription_viewer/transcription_viewer_widget.py +++ b/buzz/widgets/transcription_viewer/transcription_viewer_widget.py @@ -267,6 +267,7 @@ class TranscriptionViewerWidget(QWidget): export_tool_button.setToolButtonStyle( Qt.ToolButtonStyle.ToolButtonTextBesideIcon ) + export_tool_button.setMinimumWidth(100) export_transcription_menu = ExportTranscriptionMenu( transcription, @@ -1124,6 +1125,7 @@ class TranscriptionViewerWidget(QWidget): if self.view_mode == ViewMode.TIMESTAMPS: self.text_display_box.hide() self.table_widget.show() + self.media_splitter.show() if self.current_media_player: self.current_media_player.show() # Show playback controls in timestamps mode @@ -1149,6 +1151,7 @@ class TranscriptionViewerWidget(QWidget): self.text_display_box.setPlainText(combined_text.strip()) self.text_display_box.show() self.table_widget.hide() + self.media_splitter.hide() if self.current_media_player: self.current_media_player.hide() # Hide playback controls in text mode @@ -1164,6 +1167,7 @@ class TranscriptionViewerWidget(QWidget): ) self.text_display_box.show() self.table_widget.hide() + self.media_splitter.hide() if self.current_media_player: self.current_media_player.hide() # Hide playback controls in translation mode @@ -1494,7 +1498,7 @@ class TranscriptionViewerWidget(QWidget): if self.currently_selected_segment is None: self.highlight_table_match(0) - if current_segment_index == 0 and segments[1]: + if current_segment_index == 0 and len(segments) > 1: self.highlight_table_match(1) self.highlight_table_match(current_segment_index) diff --git a/docs/docs/faq.md b/docs/docs/faq.md index ab47a824..1eb3207e 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -37,6 +37,12 @@ Model size to use will depend on your hardware and use case. Smaller models will When choosing among large models consider the following. "Large" is the first released older model, "Large-V2" is later updated model with better accuracy, for some languages considered the most robust and stable. "Large-V3" is the latest model with the best accuracy in many cases, but some times can hallucinate or invent words that were never in the audio. "Turbo" model tries to get a good balance between speed and accuracy. The only sure way to know what model best suits your needs is to test them all in your language. +In addition to choosing an appropriate model size you also can choose whisper type. +- **Whisper** is initial OpenAI implementation, it is accurate but slow and requires a lot of RAM. +- Faster **Whisper** is an optimized implementation, it is orders of magnitude faster than regular Whisper and requires less RAM. Use this option if you have an Nvidia GPU with at least 6GB of VRAM. +- **Whisper.cpp** is optimized C++ implementation, it quite fast and efficient and will use any brand of GPU. Whisper.cpp is capable of running real time transcription even on a modern laptop with integrated GPU. It can also run on CPU only. Use this option if you do not have Nvidia GPU. +- **HuggingFace** option is a `Transformers` implementation and is good in that it supports wide range of custom models that may be optimized for a particular language. This option also supports [MMS](https://ai.meta.com/blog/multilingual-model-speech-recognition/) family of models from Meta AI that support over 1000 of worlds languages as well as [PEFT](https://github.com/huggingface/peft) adjustments to Whisper models. + ### 5. How to get GPU acceleration for faster transcription? On Linux GPU acceleration is supported out of the box on Nvidia GPUs. If you still get any issues install [CUDA 12](https://developer.nvidia.com/cuda-downloads), [cuBLASS](https://developer.nvidia.com/cublas) and [cuDNN](https://developer.nvidia.com/cudnn). diff --git a/docs/docs/installation.md b/docs/docs/installation.md index d5f5c4e2..633ea9cd 100644 --- a/docs/docs/installation.md +++ b/docs/docs/installation.md @@ -4,26 +4,17 @@ sidebar_position: 2 --- To install Buzz, download the [latest version](https://github.com/chidiwilliams/buzz/releases/latest) for your operating -system. Buzz is available on **Mac** (Intel), **Windows**, and **Linux**. (For Apple Silicon, please see -the [App Store version](https://apps.apple.com/us/app/buzz-captions/id6446018936?mt=12&itsct=apps_box_badge&itscg=30200).) +system. Buzz is available on **Mac** (Intel), **Windows**, and **Linux**. -## macOS (Intel, macOS 11.7 and later) +### macOS -Install via [brew](https://brew.sh/): +Download the `.dmg` from the [SourceForge](https://sourceforge.net/projects/buzz-captions/files/). -```shell -brew install --cask buzz -``` +### Windows -Alternatively, download and run the `Buzz-x.y.z.dmg` file. +Get the installation files from the [SourceForge](https://sourceforge.net/projects/buzz-captions/files/). -For Mac Silicon (and for a better experience on Mac Intel), -download [Buzz Captions](https://apps.apple.com/us/app/buzz-captions/id6446018936?mt=12&itsct=apps_box_badge&itscg=30200) -on the App Store. - -## Windows (Windows 10 and later) - -Download and run the `Buzz-x.y.z.exe` file. +App is not signed, you will get a warning when you install it. Select `More info` -> `Run anyway`. ## Linux @@ -49,8 +40,6 @@ Alternatively, on Ubuntu 20.04 and later, install the dependencies: sudo apt-get install libportaudio2 ``` -Then, download and extract the `Buzz-x.y.z-unix.tar.gz` file - ## PyPI ```shell diff --git a/docs/docs/preferences.md b/docs/docs/preferences.md index 1e48e9de..b6c8bd5e 100644 --- a/docs/docs/preferences.md +++ b/docs/docs/preferences.md @@ -109,6 +109,8 @@ Defaults to [user_cache_dir](https://pypi.org/project/platformdirs/). **BUZZ_FORCE_CPU** - Will force Buzz to use CPU and not GPU, useful for setups with older GPU if that is slower than GPU or GPU has issues. Example usage `BUZZ_FORCE_CPU=true`. Available since `1.2.1` +**BUZZ_REDUCE_GPU_MEMORY** - Will use 8bit quantization for Huggingface adn Faster Whisper transcriptions to reduce required GPU memory. Example usage `BUZZ_REDUCE_GPU_MEMORY=true`. Available since `1.4.0` + **BUZZ_MERGE_REGROUP_RULE** - Custom regroup merge rule to use when combining transcripts with word-level timings. More information on available options [in stable-ts repo](https://github.com/jianfch/stable-ts?tab=readme-ov-file#regrouping-methods). Available since `1.3.0` **BUZZ_DISABLE_TELEMETRY** - Buzz collects basic OS name and architecture usage statistics to better focus development efforts. This variable lets disable collection of these statistics. Example usage `BUZZ_DISABLE_TELEMETRY=true`. Available since `1.3.0` diff --git a/pyproject.toml b/pyproject.toml index db82c21f..8d39405a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,10 @@ dependencies = [ "openai-whisper==20250625", "transformers>=4.53,<5", "accelerate>=1.12.0,<2", + "peft>=0.14.0,<1", + # Overriden in uv.tool section below to ensure CUDA 12.9 compatibility + # Skip on Intel Macs (x86_64), use 0.49.0 on ARM Macs, 0.45.0+ elsewhere + "bitsandbytes>=0.45.0; sys_platform != 'darwin' or platform_machine != 'x86_64'", "polib>=1.2.0,<2", "srt-equalizer>=0.1.10,<0.2", # For Intel macOS (x86_64) - use older versions that support Intel @@ -79,6 +83,9 @@ dependencies = [ "demucs", "certifi==2025.11.12", "torchcodec>=0.9.0; sys_platform != 'darwin' or platform_machine != 'x86_64'", + "torch>=2.2.2", + "torchaudio>=2.2.2", + "datasets>=4.4.1", ] repository = "https://github.com/chidiwilliams/buzz" documentation = "https://chidiwilliams.github.io/buzz/docs" @@ -115,6 +122,14 @@ default-groups = [ "build", ] +# Should be removed after nemo-toolkit update to 2.6.0 +# Forcing a CUDA 12.9 compatable bitsandbytes version +# ARM Macs use 0.49.0, others use 0.47.0 (Intel Macs skip entirely via marker) +override-dependencies = [ + "bitsandbytes==0.49.0; sys_platform == 'darwin' and platform_machine == 'arm64'", + "bitsandbytes==0.47.0; sys_platform != 'darwin'", +] + [tool.uv.sources] demucs = { path = "demucs_repo", editable = true } torch = [ diff --git a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml index b94e23bd..988beeab 100644 --- a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml +++ b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml @@ -64,6 +64,25 @@ + + https://github.com/chidiwilliams/buzz/releases/tag/v1.4.0 + +

Adding speaker identification on transcriptions and video support for transcription viewer, improvements to transcription table and support for over 1000 of worlds languages via MMS models.

+

Release details:

+
    +
  • Speaker identification on finished transcripts
  • +
  • Support for video in transcription viewer
  • +
  • Ability to add notes and restart transcriptions in main table
  • +
  • Adding support for more than 1000 languages via MMS model family when transcribing with Huggingface transcription type
  • +
  • Adding support for PEFT models when transcribing with Huggingface transcription type
  • +
  • Adding support for 8bit quantization for Huggingface and faster Whisper transcriptions
  • +
  • Updated libraries and dependencies to support latest GPUs
  • +
  • Support for secrets portal for snap packages on Linux
  • +
  • Ability to specify model to use when transcribing with OpenAI API
  • +
  • Ability to access application logs from About screen
  • +
+
+
https://github.com/chidiwilliams/buzz/releases/tag/v1.3.3 diff --git a/tests/conftest.py b/tests/conftest.py index 1ab7a4b5..a551d91e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,10 +1,19 @@ +import multiprocessing import os import platform import random import string -from pathlib import Path import pytest + +# Set multiprocessing to use 'spawn' instead of 'fork' on Linux +# This is required because Qt creates threads early, and forking a multi-threaded +# process can lead to deadlocks. The main application sets this in buzz/buzz.py. +if platform.system() != "Windows": + try: + multiprocessing.set_start_method("spawn", force=True) + except RuntimeError: + pass # Already set from PyQt6.QtSql import QSqlDatabase from _pytest.fixtures import SubRequest diff --git a/tests/transcriber/transformers_whisper_test.py b/tests/transcriber/transformers_whisper_test.py new file mode 100644 index 00000000..69c72705 --- /dev/null +++ b/tests/transcriber/transformers_whisper_test.py @@ -0,0 +1,46 @@ +import os +from unittest.mock import patch + +import pytest + +from buzz.transformers_whisper import TransformersTranscriber + + +class TestGetMmsRepoId: + """Tests for TransformersTranscriber._get_mms_repo_id method.""" + + def test_repo_id_returned_as_is(self): + """Test that a HuggingFace repo ID is returned unchanged.""" + transcriber = TransformersTranscriber("facebook/mms-1b-all") + with patch("os.path.exists", return_value=False): + assert transcriber._get_mms_repo_id() == "facebook/mms-1b-all" + + def test_linux_cache_path(self): + """Test extraction from Linux-style cache path.""" + linux_path = "/home/user/.cache/Buzz/models/models--facebook--mms-1b-all/snapshots/abc123" + transcriber = TransformersTranscriber(linux_path) + with patch("os.path.exists", return_value=True), \ + patch("buzz.transformers_whisper.os.sep", "/"): + assert transcriber._get_mms_repo_id() == "facebook/mms-1b-all" + + def test_windows_cache_path(self): + """Test extraction from Windows-style cache path.""" + windows_path = r"C:\Users\user\.cache\Buzz\models\models--facebook--mms-1b-all\snapshots\abc123" + transcriber = TransformersTranscriber(windows_path) + with patch("os.path.exists", return_value=True), \ + patch("buzz.transformers_whisper.os.sep", "\\"): + assert transcriber._get_mms_repo_id() == "facebook/mms-1b-all" + + def test_fallback_returns_model_id(self): + """Test that model_id is returned as fallback when pattern not matched.""" + transcriber = TransformersTranscriber("some-local-model") + with patch("os.path.exists", return_value=True): + assert transcriber._get_mms_repo_id() == "some-local-model" + + def test_nested_org_name(self): + """Test extraction with different org/model names.""" + linux_path = "/home/user/.cache/Buzz/models/models--openai--whisper-large-v3/snapshots/xyz" + transcriber = TransformersTranscriber(linux_path) + with patch("os.path.exists", return_value=True), \ + patch("buzz.transformers_whisper.os.sep", "/"): + assert transcriber._get_mms_repo_id() == "openai/whisper-large-v3" diff --git a/tests/transcriber/whisper_file_transcriber_test.py b/tests/transcriber/whisper_file_transcriber_test.py index 94466c38..e4041edf 100644 --- a/tests/transcriber/whisper_file_transcriber_test.py +++ b/tests/transcriber/whisper_file_transcriber_test.py @@ -3,7 +3,6 @@ import logging import os import platform import shutil -import sys import tempfile import time from typing import List diff --git a/tests/transformers_whisper_test.py b/tests/transformers_transcriber_test.py similarity index 71% rename from tests/transformers_whisper_test.py rename to tests/transformers_transcriber_test.py index 235984d3..dabf1714 100644 --- a/tests/transformers_whisper_test.py +++ b/tests/transformers_transcriber_test.py @@ -1,17 +1,17 @@ import platform import pytest -from buzz.transformers_whisper import TransformersWhisper +from buzz.transformers_whisper import TransformersTranscriber from tests.audio import test_audio_path -class TestTransformersWhisper: +class TestTransformersTranscriber: @pytest.mark.skipif( platform.system() == "Darwin", reason="Not supported on Darwin", ) def test_should_transcribe(self): - model = TransformersWhisper("openai/whisper-tiny") + model = TransformersTranscriber("openai/whisper-tiny") result = model.transcribe( audio=test_audio_path, language="fr", task="transcribe" ) diff --git a/uv.lock b/uv.lock index 7d9a086f..07a5205a 100644 --- a/uv.lock +++ b/uv.lock @@ -10,6 +10,12 @@ resolution-markers = [ "platform_machine != 'arm64' and platform_machine != 'x86_64' and sys_platform == 'darwin'", ] +[manifest] +overrides = [ + { name = "bitsandbytes", marker = "sys_platform != 'darwin'", specifier = "==0.47.0" }, + { name = "bitsandbytes", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'", specifier = "==0.49.0" }, +] + [[package]] name = "absl-py" version = "2.3.1" @@ -31,8 +37,8 @@ dependencies = [ { name = "pyyaml" }, { name = "safetensors" }, { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4a/8e/ac2a9566747a93f8be36ee08532eb0160558b07630a081a6056a9f89bf1d/accelerate-1.12.0.tar.gz", hash = "sha256:70988c352feb481887077d2ab845125024b2a137a5090d6d7a32b57d03a45df6", size = 398399, upload-time = "2025-11-21T11:27:46.973Z" } wheels = [ @@ -53,13 +59,13 @@ name = "aiohttp" version = "3.13.2" source = { registry = "https://pypi.org/simple/" } dependencies = [ - { name = "aiohappyeyeballs", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "aiosignal", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "attrs", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "frozenlist", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "multidict", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "propcache", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "yarl", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/ce/3b83ebba6b3207a7135e5fcaba49706f8a4b6008153b4e30540c982fae26/aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca", size = 7837994, upload-time = "2025-10-28T20:59:39.937Z" } wheels = [ @@ -87,8 +93,8 @@ name = "aiosignal" version = "1.4.0" source = { registry = "https://pypi.org/simple/" } dependencies = [ - { name = "frozenlist", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "typing-extensions", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "frozenlist" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ @@ -224,15 +230,37 @@ wheels = [ [[package]] name = "bitsandbytes" -version = "0.46.0" +version = "0.47.0" source = { registry = "https://pypi.org/simple/" } +resolution-markers = [ + "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux')", + "sys_platform != 'darwin' and sys_platform != 'linux'", + "platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", +] dependencies = [ - { name = "numpy", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "numpy", marker = "sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/72/27/ec6ee3408e09e01ab05db07af5a97dc76db7bc18824cf5f5dbc98e1e08a4/bitsandbytes-0.46.0-py3-none-manylinux_2_24_x86_64.whl", hash = "sha256:ef38883cfd26f36a0dfff1715f620f87cee3813431f33e10e9658205160cb89b", size = 67047276, upload-time = "2025-05-27T21:25:31.299Z" }, - { url = "https://files.pythonhosted.org/packages/f3/06/2ef5f6b28d8fa442c670b5acc1eb09dd57d4edb00b435b35529c3f09936c/bitsandbytes-0.46.0-py3-none-win_amd64.whl", hash = "sha256:121820a6df80ae3b7e361f7ef193279c3204c361a7e21eb43b5ffa7293403979", size = 66452401, upload-time = "2025-05-27T21:25:35.552Z" }, + { url = "https://files.pythonhosted.org/packages/aa/eb/477d6b5602f469c7305fd43eec71d890c39909f615c1d7138f6e7d226eff/bitsandbytes-0.47.0-py3-none-manylinux_2_24_aarch64.whl", hash = "sha256:2f805b76891a596025e9e13318b675d08481b9ee650d65e5d2f9d844084c6521", size = 30004641, upload-time = "2025-08-11T18:51:20.524Z" }, + { url = "https://files.pythonhosted.org/packages/9c/40/91f1a5a694f434bc13cba160045fdc4e867032e627b001bf411048fefd9c/bitsandbytes-0.47.0-py3-none-manylinux_2_24_x86_64.whl", hash = "sha256:68f3fffd494a47ed1fd7593bfc5dd2ac69b68260599b71b4c4b3a32f90f3b184", size = 61284639, upload-time = "2025-08-11T18:51:23.581Z" }, + { url = "https://files.pythonhosted.org/packages/18/a9/e07a227f1cd6562844cea2f05ee576b0991a9a91f45965c06034178ba0f6/bitsandbytes-0.47.0-py3-none-win_amd64.whl", hash = "sha256:4880a6d42ca9628b5a571c8cc3093dc3f5f52511e5a9e47d52d569807975531a", size = 60725121, upload-time = "2025-08-11T18:51:27.543Z" }, +] + +[[package]] +name = "bitsandbytes" +version = "0.49.0" +source = { registry = "https://pypi.org/simple/" } +resolution-markers = [ + "platform_machine == 'arm64' and sys_platform == 'darwin'", +] +dependencies = [ + { name = "numpy", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "packaging", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/96/2b825cb874477a26478df0ce8ce3550abe81af1c7bcbc47871f0619b120c/bitsandbytes-0.49.0-py3-none-macosx_14_0_arm64.whl", hash = "sha256:17d5b57e6d51b78bcfc07da0e93db061181b25bffabfafe101dd9b75c2710872", size = 129838, upload-time = "2025-12-11T20:50:39.645Z" }, ] [[package]] @@ -250,6 +278,8 @@ version = "1.4.0" source = { editable = "." } dependencies = [ { name = "accelerate" }, + { name = "bitsandbytes", version = "0.47.0", source = { registry = "https://pypi.org/simple/" }, marker = "sys_platform != 'darwin'" }, + { name = "bitsandbytes", version = "0.49.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, { name = "certifi" }, { name = "cmake" }, { name = "coverage" }, @@ -257,6 +287,7 @@ dependencies = [ { name = "ctranslate2", version = "4.6.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' or sys_platform != 'darwin'" }, { name = "darkdetect" }, { name = "dataclasses-json" }, + { name = "datasets" }, { name = "demucs" }, { name = "diffq" }, { name = "dora-search" }, @@ -285,6 +316,7 @@ dependencies = [ { name = "openai" }, { name = "openai-whisper" }, { name = "openunmix" }, + { name = "peft" }, { name = "platformdirs" }, { name = "polib" }, { name = "posthog" }, @@ -299,11 +331,11 @@ dependencies = [ { name = "stable-ts" }, { name = "submitit" }, { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "torchaudio", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, { name = "torchaudio", version = "2.8.0", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'" }, - { name = "torchaudio", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "torchaudio", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, { name = "torchaudio", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, { name = "torchcodec", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "tqdm" }, @@ -340,6 +372,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "accelerate", specifier = ">=1.12.0,<2" }, + { name = "bitsandbytes", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'", specifier = ">=0.45.0" }, { name = "certifi", specifier = "==2025.11.12" }, { name = "cmake", specifier = ">=4.2.0,<5" }, { name = "coverage", specifier = "==7.12.0" }, @@ -348,6 +381,7 @@ requires-dist = [ { name = "ctranslate2", marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'", specifier = "==4.3.1" }, { name = "darkdetect", specifier = ">=0.8.0,<0.9" }, { name = "dataclasses-json", specifier = ">=0.6.4,<0.7" }, + { name = "datasets", specifier = ">=4.4.1" }, { name = "demucs", editable = "demucs_repo" }, { name = "diffq", specifier = ">=0.2.4,<0.3" }, { name = "dora-search", specifier = ">=0.1.12,<0.2" }, @@ -376,6 +410,7 @@ requires-dist = [ { name = "openai", specifier = ">=1.14.2,<2" }, { name = "openai-whisper", specifier = "==20250625" }, { name = "openunmix", specifier = ">=1.3.0,<2" }, + { name = "peft", specifier = ">=0.14.0,<1" }, { name = "platformdirs", specifier = ">=4.2.1,<5" }, { name = "polib", specifier = ">=1.2.0,<2" }, { name = "posthog", specifier = ">=3.23.0,<4" }, @@ -390,9 +425,13 @@ requires-dist = [ { name = "stable-ts", specifier = ">=2.19.1,<3" }, { name = "submitit", specifier = ">=1.5.2,<2" }, { name = "torch", marker = "sys_platform != 'darwin'", specifier = "==2.8.0", index = "https://download.pytorch.org/whl/cu129" }, + { name = "torch", marker = "sys_platform != 'darwin'", specifier = ">=2.2.2", index = "https://download.pytorch.org/whl/cu129" }, + { name = "torch", marker = "sys_platform == 'darwin'", specifier = ">=2.2.2", index = "https://pypi.org/simple/" }, { name = "torch", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'", specifier = "==2.8.0", index = "https://pypi.org/simple/" }, { name = "torch", marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'", specifier = "==2.2.2", index = "https://pypi.org/simple/" }, { name = "torchaudio", marker = "sys_platform != 'darwin'", specifier = "==2.8.0", index = "https://download.pytorch.org/whl/cu129" }, + { name = "torchaudio", marker = "sys_platform != 'darwin'", specifier = ">=2.2.2", index = "https://download.pytorch.org/whl/cu129" }, + { name = "torchaudio", marker = "sys_platform == 'darwin'", specifier = ">=2.2.2", index = "https://pypi.org/simple/" }, { name = "torchaudio", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'", specifier = "==2.8.0", index = "https://pypi.org/simple/" }, { name = "torchaudio", marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'", specifier = "==2.2.2", index = "https://pypi.org/simple/" }, { name = "torchcodec", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'", specifier = ">=0.9.0" }, @@ -789,20 +828,20 @@ name = "datasets" version = "4.4.1" source = { registry = "https://pypi.org/simple/" } dependencies = [ - { name = "dill", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "filelock", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "fsspec", extra = ["http"], marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "httpx", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "huggingface-hub", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "multiprocess", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "numpy", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "packaging", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "pandas", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "pyarrow", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "pyyaml", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "requests", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "tqdm", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "xxhash", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "dill" }, + { name = "filelock" }, + { name = "fsspec", extra = ["http"] }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "xxhash" }, ] sdist = { url = "https://files.pythonhosted.org/packages/93/bf/0dae295d6d1ba0b1a200a9dd216838464b5bbd05da01407cb1330b377445/datasets-4.4.1.tar.gz", hash = "sha256:80322699aa8c0bbbdb7caa87906da689c3c2e29523cff698775c67f28fdab1fc", size = 585341, upload-time = "2025-11-05T16:00:38.162Z" } wheels = [ @@ -830,12 +869,12 @@ dependencies = [ { name = "openunmix" }, { name = "pyyaml" }, { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "torchaudio", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, { name = "torchaudio", version = "2.8.0", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'" }, - { name = "torchaudio", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torchaudio", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64' and sys_platform == 'darwin') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "torchaudio", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torchaudio", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, { name = "tqdm" }, ] @@ -879,8 +918,8 @@ dependencies = [ { name = "cython" }, { name = "numpy" }, { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5a/fd/4c58807bf855c5929ffa6da55f26dd6b9ae462a4193f5e09cc49fbbfd451/diffq-0.2.4.tar.gz", hash = "sha256:049064861e974ebf00d0badab8b324c775037371419eda3150985b9d477b5bd2", size = 157139, upload-time = "2023-05-05T12:39:43.089Z" } @@ -926,8 +965,8 @@ dependencies = [ { name = "retrying" }, { name = "submitit" }, { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "treetable" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d5/9d/9a13947db237375486c0690f4741dd2b7e1eee20e0ffcb55dbd1b21cc600/dora_search-0.1.12.tar.gz", hash = "sha256:2956fd2c4c7e4b9a4830e83f0d4cf961be45cfba1a2f0570281e91d15ac516fb", size = 87111, upload-time = "2023-05-23T14:36:24.743Z" } @@ -1098,7 +1137,7 @@ wheels = [ [package.optional-dependencies] http = [ - { name = "aiohttp", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "aiohttp" }, ] [[package]] @@ -1559,8 +1598,8 @@ version = "0.2.7" source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a1/19/c9e1596b5572c786b93428d0904280e964c930fae7e6c9368ed9e1b63922/julius-0.2.7.tar.gz", hash = "sha256:3c0f5f5306d7d6016fcc95196b274cae6f07e2c9596eed314e4e7641554fbb08", size = 59640, upload-time = "2022-09-19T16:13:34.2Z" } @@ -1688,8 +1727,8 @@ dependencies = [ { name = "soundfile" }, { name = "tabulate" }, { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "tqdm" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2e/fd/32baf46d238f029a22b2c1762fc717ebdb85515fb48bafa395d3de5da0f5/lhotse-1.32.1.tar.gz", hash = "sha256:8b0e946d1bd2c695b09df831ea612913f1a1f103b1aea36a4b43a8778be0a3d5", size = 674412, upload-time = "2025-11-24T16:42:25.511Z" } @@ -1769,8 +1808,8 @@ dependencies = [ { name = "packaging", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "pytorch-lightning", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "pyyaml", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "torchmetrics", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "tqdm", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "typing-extensions", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, @@ -2075,7 +2114,7 @@ name = "multiprocess" version = "0.70.18" source = { registry = "https://pypi.org/simple/" } dependencies = [ - { name = "dill", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "dill" }, ] sdist = { url = "https://files.pythonhosted.org/packages/72/fd/2ae3826f5be24c6ed87266bc4e59c46ea5b059a103f3d7e7eb76a52aeecb/multiprocess-0.70.18.tar.gz", hash = "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d", size = 1798503, upload-time = "2025-04-17T03:11:27.742Z" } wheels = [ @@ -2166,8 +2205,8 @@ dependencies = [ { name = "setuptools", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "tensorboard", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "text-unidecode", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "tqdm", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "wget", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "wrapt", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, @@ -2179,7 +2218,8 @@ wheels = [ [package.optional-dependencies] asr = [ - { name = "bitsandbytes", marker = "platform_machine == 'x86_64' and sys_platform != 'darwin'" }, + { name = "bitsandbytes", version = "0.47.0", source = { registry = "https://pypi.org/simple/" }, marker = "sys_platform != 'darwin'" }, + { name = "bitsandbytes", version = "0.49.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, { name = "braceexpand", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "cloudpickle", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "ctc-segmentation", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, @@ -2563,8 +2603,8 @@ dependencies = [ { name = "numpy" }, { name = "tiktoken" }, { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "tqdm" }, { name = "triton", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or sys_platform == 'linux2'" }, ] @@ -2577,12 +2617,12 @@ source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "numpy" }, { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "torchaudio", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, { name = "torchaudio", version = "2.8.0", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'" }, - { name = "torchaudio", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torchaudio", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64' and sys_platform == 'darwin') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "torchaudio", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torchaudio", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, { name = "tqdm" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/ef/4ad54e3ecb1e89f7f7bdb4c7b751e43754e892d3c32a8550e5d0882565df/openunmix-1.3.0.tar.gz", hash = "sha256:cc9245ce728700f5d0b72c67f01be4162777e617cdc47f9b035963afac180fc8", size = 45889, upload-time = "2024-04-16T11:10:47.121Z" } @@ -2679,17 +2719,18 @@ name = "peft" version = "0.18.0" source = { registry = "https://pypi.org/simple/" } dependencies = [ - { name = "accelerate", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "huggingface-hub", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "numpy", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "packaging", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "psutil", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "pyyaml", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "safetensors", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, - { name = "tqdm", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "transformers", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "accelerate" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, + { name = "tqdm" }, + { name = "transformers" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4b/0c/f2938db546ac7fc961ab5917cd50fcf5d0d70b406de93e3faccaa504e152/peft-0.18.0.tar.gz", hash = "sha256:c81c80b2056ab40c23d58ef25f74daab417ac653970718589a11a8af28218588", size = 634141, upload-time = "2025-11-13T11:13:06.603Z" } wheels = [ @@ -3324,8 +3365,8 @@ dependencies = [ { name = "lightning-utilities", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "packaging", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "pyyaml", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "torchmetrics", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "tqdm", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "typing-extensions", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, @@ -3864,12 +3905,12 @@ dependencies = [ { name = "numpy" }, { name = "openai-whisper" }, { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, { name = "torchaudio", version = "2.2.2", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, { name = "torchaudio", version = "2.8.0", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'" }, - { name = "torchaudio", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torchaudio", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64' and sys_platform == 'darwin') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "torchaudio", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torchaudio", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, { name = "tqdm" }, ] sdist = { url = "https://files.pythonhosted.org/packages/94/d9/d326f9dbbb7da6806aa8cfc080342e5f78dc33552f4339bdc8a6251d11a3/stable_ts-2.19.1.tar.gz", hash = "sha256:0ecaf1ed93e029839569618d2da9a57b883ad04db21f0680146e0650caaf4f52", size = 189132, upload-time = "2025-08-16T16:53:48.811Z" } @@ -4112,15 +4153,16 @@ version = "2.8.0" source = { registry = "https://pypi.org/simple/" } resolution-markers = [ "platform_machine == 'arm64' and sys_platform == 'darwin'", + "platform_machine != 'arm64' and platform_machine != 'x86_64' and sys_platform == 'darwin'", ] dependencies = [ - { name = "filelock", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "fsspec", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "jinja2", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "networkx", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "setuptools", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "sympy", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "typing-extensions", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "filelock", marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "fsspec", marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "jinja2", marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "networkx", marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "setuptools", marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "sympy", marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "typing-extensions", marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/be/66/5c9a321b325aaecb92d4d1855421e3a055abd77903b7dab6575ca07796db/torch-2.8.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:619c2869db3ada2c0105487ba21b5008defcc472d23f8b80ed91ac4a380283b0", size = 73630478, upload-time = "2025-08-06T14:53:57.144Z" }, @@ -4134,13 +4176,12 @@ resolution-markers = [ "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux')", "sys_platform != 'darwin' and sys_platform != 'linux'", "platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", - "platform_machine != 'arm64' and platform_machine != 'x86_64' and sys_platform == 'darwin'", ] dependencies = [ - { name = "filelock", marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, - { name = "fsspec", marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, - { name = "jinja2", marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, - { name = "networkx", marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "filelock", marker = "sys_platform != 'darwin'" }, + { name = "fsspec", marker = "sys_platform != 'darwin'" }, + { name = "jinja2", marker = "sys_platform != 'darwin'" }, + { name = "networkx", marker = "sys_platform != 'darwin'" }, { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, @@ -4155,10 +4196,10 @@ dependencies = [ { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "setuptools", marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, - { name = "sympy", marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "setuptools", marker = "sys_platform != 'darwin'" }, + { name = "sympy", marker = "sys_platform != 'darwin'" }, { name = "triton", marker = "sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "typing-extensions", marker = "sys_platform != 'darwin'" }, ] wheels = [ { url = "https://download.pytorch.org/whl/cu129/torch-2.8.0%2Bcu129-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:692fe6e513b667f789a543fa9b1baba58e77a46d5c8629764ca0c00a56823e1f" }, @@ -4200,9 +4241,10 @@ version = "2.8.0" source = { registry = "https://pypi.org/simple/" } resolution-markers = [ "platform_machine == 'arm64' and sys_platform == 'darwin'", + "platform_machine != 'arm64' and platform_machine != 'x86_64' and sys_platform == 'darwin'", ] dependencies = [ - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ac/cc/c2e2a3eb6ee956f73c68541e439916f8146170ea9cc61e72adea5c995312/torchaudio-2.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ddef94bf181e6447cbb05f38beaca8f6c5bb8d2b9ddced1aa3452025b9fc70d3", size = 1856736, upload-time = "2025-08-06T14:58:36.3Z" }, @@ -4215,10 +4257,9 @@ source = { registry = "https://download.pytorch.org/whl/cu129" } resolution-markers = [ "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux')", "sys_platform != 'darwin' and sys_platform != 'linux'", - "platform_machine != 'arm64' and platform_machine != 'x86_64' and sys_platform == 'darwin'", ] dependencies = [ - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64' and sys_platform == 'darwin') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, ] wheels = [ { url = "https://download.pytorch.org/whl/cu129/torchaudio-2.8.0%2Bcu129-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:40df9011972519120f284f56e5e7d131d4250ea69653499028d1d30b353f932e" }, @@ -4243,8 +4284,8 @@ dependencies = [ { name = "lightning-utilities", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "numpy", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "packaging", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" }, - { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "(platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "torch", version = "2.8.0", source = { registry = "https://pypi.org/simple/" }, marker = "platform_machine != 'x86_64' and sys_platform == 'darwin'" }, + { name = "torch", version = "2.8.0+cu129", source = { registry = "https://download.pytorch.org/whl/cu129" }, marker = "sys_platform != 'darwin'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/85/2e/48a887a59ecc4a10ce9e8b35b3e3c5cef29d902c4eac143378526e7485cb/torchmetrics-1.8.2.tar.gz", hash = "sha256:cf64a901036bf107f17a524009eea7781c9c5315d130713aeca5747a686fe7a5", size = 580679, upload-time = "2025-09-03T14:00:54.077Z" } wheels = [ @@ -4578,9 +4619,9 @@ name = "yarl" version = "1.22.0" source = { registry = "https://pypi.org/simple/" } dependencies = [ - { name = "idna", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "multidict", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "propcache", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, ] sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } wheels = [