From 85d70c1e6435b12214f5b01d9ac7528dd23a59f2 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sat, 3 Jan 2026 22:16:34 +0200 Subject: [PATCH 01/37] Fix wheels (#1336) --- .github/workflows/ci.yml | 2 + Makefile | 2 +- README.md | 15 ++-- buzz/__version__.py | 2 +- docs/docs/index.md | 3 - .../current/index.md | 5 -- .../current/installation.md | 5 +- hatch_build.py | 24 +++--- pyproject.toml | 14 ++-- readme/README.zh_CN.md | 9 +-- .../io.github.chidiwilliams.Buzz.metainfo.xml | 4 +- uv.lock | 77 ++----------------- 12 files changed, 41 insertions(+), 121 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fe24f1b4..a6a28976 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -183,6 +183,8 @@ jobs: run: | if [ "$RUNNER_OS" == "Windows" ]; then uv add msvc-runtime + uv pip install -U torch==2.8.0+cu129 torchaudio==2.8.0+cu129 --index-url https://download.pytorch.org/whl/cu129 + uv pip install nvidia-cublas-cu12==12.9.1.4 nvidia-cuda-cupti-cu12==12.9.79 nvidia-cuda-runtime-cu12==12.9.79 --extra-index-url https://pypi.ngc.nvidia.com uv cache clean uv run pip cache purge diff --git a/Makefile b/Makefile index 0067e477..5c485607 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Change also in pyproject.toml and buzz/__version__.py -version := 1.4.1 +version := 1.4.2 mac_app_path := ./dist/Buzz.app mac_zip_path := ./dist/Buzz-${version}-mac.zip diff --git a/README.md b/README.md index 7b5db725..17d5de58 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Buzz -[Documentation](https://chidiwilliams.github.io/buzz/) | [Buzz Captions on the App Store](https://apps.apple.com/us/app/buzz-captions/id6446018936?mt=12&itsct=apps_box_badge&itscg=30200) +[Documentation](https://chidiwilliams.github.io/buzz/) Transcribe and translate audio offline on your personal computer. Powered by OpenAI's [Whisper](https://github.com/openai/whisper). @@ -13,13 +13,6 @@ OpenAI's [Whisper](https://github.com/openai/whisper). ![GitHub release (latest by date)](https://img.shields.io/github/v/release/chidiwilliams/buzz) [![Github all releases](https://img.shields.io/github/downloads/chidiwilliams/buzz/total.svg)](https://GitHub.com/chidiwilliams/buzz/releases/) -
-

An older version of Buzz available on the App Store. Get a Mac-native version of Buzz with a cleaner look, audio playback, drag-and-drop import, transcript editing, search, and much more.

-Download on the Mac App Store -
- -![Buzz](./buzz/assets/buzz-banner.jpg) - ## Installation ### macOS @@ -58,6 +51,8 @@ sudo snap connect buzz:password-manager-service Install [ffmpeg](https://www.ffmpeg.org/download.html) +Ensure you use Python 3.12 environment. + Install Buzz ```shell @@ -70,8 +65,8 @@ python -m buzz To have GPU support for Nvidia GPUS on Windows, for PyPI installed version ensure, CUDA support for [torch](https://pytorch.org/get-started/locally/) ``` -pip3 install -U torch==2.7.1+cu128 torchaudio==2.7.1+cu128 --index-url https://download.pytorch.org/whl/cu128 -pip3 install nvidia-cublas-cu12==12.8.3.14 nvidia-cuda-cupti-cu12==12.8.57 nvidia-cuda-nvrtc-cu12==12.8.61 nvidia-cuda-runtime-cu12==12.8.57 nvidia-cudnn-cu12==9.7.1.26 nvidia-cufft-cu12==11.3.3.41 nvidia-curand-cu12==10.3.9.55 nvidia-cusolver-cu12==11.7.2.55 nvidia-cusparse-cu12==12.5.4.2 nvidia-cusparselt-cu12==0.6.3 nvidia-nvjitlink-cu12==12.8.61 nvidia-nvtx-cu12==12.8.55 --extra-index-url https://pypi.ngc.nvidia.com +pip3 install -U torch==2.8.0+cu129 torchaudio==2.8.0+cu129 --index-url https://download.pytorch.org/whl/cu129 +pip3 install nvidia-cublas-cu12==12.9.1.4 nvidia-cuda-cupti-cu12==12.9.79 nvidia-cuda-runtime-cu12==12.9.79 --extra-index-url https://pypi.ngc.nvidia.com ``` ### Latest development version diff --git a/buzz/__version__.py b/buzz/__version__.py index bababb5b..94dc0808 100644 --- a/buzz/__version__.py +++ b/buzz/__version__.py @@ -1 +1 @@ -VERSION = "1.4.1" +VERSION = "1.4.2" diff --git a/docs/docs/index.md b/docs/docs/index.md index a03d4efe..7634aa44 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -12,9 +12,6 @@ OpenAI's [Whisper](https://github.com/openai/whisper). ![GitHub release (latest by date)](https://img.shields.io/github/v/release/chidiwilliams/buzz) [![Github all releases](https://img.shields.io/github/downloads/chidiwilliams/buzz/total.svg)](https://GitHub.com/chidiwilliams/buzz/releases/) -> Buzz is better on the App Store. Get a Mac-native version of Buzz with a cleaner look, audio playback, drag-and-drop import, transcript editing, search, and much more. -> Download on the Mac App Store - ## Features - Import audio and video files and export transcripts to TXT, SRT, and diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/index.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/index.md index 61267e8c..86967bbb 100644 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/index.md +++ b/docs/i18n/zh/docusaurus-plugin-content-docs/current/index.md @@ -11,11 +11,6 @@ sidebar_position: 1 ![GitHub release (latest by date)](https://img.shields.io/github/v/release/chidiwilliams/buzz) [![Github all releases](https://img.shields.io/github/downloads/chidiwilliams/buzz/total.svg)](https://GitHub.com/chidiwilliams/buzz/releases/) -
-

在 App Store 下载运行的性能更佳。 获得外观更整洁、音频播放、拖放导入、转录编辑、搜索等功能的原生Mac版本。

-在 Mac App Store 下载 -
- ## 功能 - 导入音频和视频文件,并将转录内容导出为 TXT、SRT 和 VTT 格式([演示](https://www.loom.com/share/cf263b099ac3481082bb56d19b7c87fe)) diff --git a/docs/i18n/zh/docusaurus-plugin-content-docs/current/installation.md b/docs/i18n/zh/docusaurus-plugin-content-docs/current/installation.md index 2ce56a94..b3bbc7c1 100644 --- a/docs/i18n/zh/docusaurus-plugin-content-docs/current/installation.md +++ b/docs/i18n/zh/docusaurus-plugin-content-docs/current/installation.md @@ -3,7 +3,7 @@ title: 安装 sidebar_position: 2 --- -要安装 Buzz,请下载适用于您操作系统的[最新版本](https://github.com/chidiwilliams/buzz/releases/latest)。Buzz 支持 **Mac**(Intel)、**Windows** 和 **Linux** 系统。(对于 Apple Silicon 用户,请参阅 [App Store 版本](https://apps.apple.com/us/app/buzz-captions/id6446018936?mt=12&itsct=apps_box_badge&itscg=30200)。) +要安装 Buzz,请下载适用于您操作系统的[最新版本](https://github.com/chidiwilliams/buzz/releases/latest)。Buzz 支持 **Mac**(Intel)、**Windows** 和 **Linux** 系统。 ## macOS(Intel,macOS 11.7 及更高版本) @@ -15,8 +15,7 @@ brew install --cask buzz 或者,下载并运行 `Buzz-x.y.z.dmg` 文件。 -对于 Mac Silicon 用户(以及希望在 Mac Intel 上获得更好体验的用户), -请从 App Store 下载 [Buzz Captions](https://apps.apple.com/us/app/buzz-captions/id6446018936?mt=12&itsct=apps_box_badge&itscg=30200)。 +对于 Mac Silicon 用户(以及希望在 Mac Intel 上获得更好体验的用户)。 ## Windows(Windows 10 及更高版本) diff --git a/hatch_build.py b/hatch_build.py index b070d9d9..c94968fe 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -116,27 +116,29 @@ class CustomBuildHook(BuildHookInterface): else: print(f"Warning: {whisper_cpp_dir} does not exist after build", file=sys.stderr) - # Force include all files in demucs directory - demucs_dir = project_root / "demucs_repo" - if demucs_dir.exists(): - # Get all files in the demucs directory - demucs_files = glob.glob(str(demucs_dir / "**" / "*"), recursive=True) + # Force include demucs package at top level (demucs_repo/demucs -> demucs/) + demucs_pkg_dir = project_root / "demucs_repo" / "demucs" + if demucs_pkg_dir.exists(): + # Get all files in the demucs package directory + demucs_files = glob.glob(str(demucs_pkg_dir / "**" / "*"), recursive=True) # Filter only files (not directories) demucs_files = [f for f in demucs_files if Path(f).is_file()] - # Add them to force_include + # Add them to force_include, mapping to top-level demucs/ if 'force_include' not in build_data: build_data['force_include'] = {} for file_path in demucs_files: - # Convert to relative path from project root - rel_path = Path(file_path).relative_to(project_root) - build_data['force_include'][str(rel_path)] = str(rel_path) + # Convert to relative path from demucs package dir + rel_from_pkg = Path(file_path).relative_to(demucs_pkg_dir) + # Target path is demucs/ + target_path = Path("demucs") / rel_from_pkg + build_data['force_include'][str(file_path)] = str(target_path) - print(f"Force including {len(demucs_files)} files from demucs_repo/") + print(f"Force including {len(demucs_files)} files from demucs_repo/demucs/ -> demucs/") else: - print(f"Warning: {demucs_dir} does not exist", file=sys.stderr) + print(f"Warning: {demucs_pkg_dir} does not exist", file=sys.stderr) # Force include all .mo files from buzz/locale directory locale_dir = project_root / "buzz" / "locale" diff --git a/pyproject.toml b/pyproject.toml index 8a76b455..57fb6afd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "buzz-captions" # Change also in Makefile and buzz/__version__.py -version = "1.4.1" +version = "1.4.2" description = "" authors = [{ name = "Chidi Williams", email = "williamschidi1@gmail.com" }] requires-python = ">=3.12,<3.13" @@ -45,10 +45,7 @@ dependencies = [ "ctranslate2>=4.6.2,<5; sys_platform != 'darwin'", # faster whisper need cudnn 9 "nvidia-cudnn-cu12>=9,<10; sys_platform != 'darwin'", - # CUDA runtime libraries for Windows (Linux gets them via torch dependencies) - "nvidia-cuda-runtime-cu12>=12.9,<13; sys_platform == 'win32'", - "nvidia-cublas-cu12>=12.9,<13; sys_platform == 'win32'", - "nvidia-cuda-nvrtc-cu12>=12.9,<13; sys_platform == 'win32'", + # CUDA runtime libraries are provided by torch dependencies, no need to specify explicitly "darkdetect>=0.8.0,<0.9", "dora-search>=0.1.12,<0.2", "diffq>=0.2.4,<0.3", @@ -70,6 +67,7 @@ dependencies = [ "posthog>=3.23.0,<4", # This version works, newer have issues on Windows "onnxruntime==1.18.1", + "onnx>=1.20.0", # Required for nemo-toolkit, ensures ml-dtypes is installed "vulkan>=1.3.275.1,<2", "hf-xet>=1.1.5,<2", "hatchling>=1.28.0", @@ -80,7 +78,7 @@ dependencies = [ "uroman>=1.3.1.1", "lhotse==1.32.1", "coverage==7.12.0", - "demucs", + # demucs is bundled directly in the wheel from demucs_repo/, not installed as a dependency "certifi==2025.11.12", "torchcodec>=0.9.0; sys_platform != 'darwin' or platform_machine != 'x86_64'", "torch>=2.2.2", @@ -131,7 +129,6 @@ override-dependencies = [ ] [tool.uv.sources] -demucs = { path = "demucs_repo", editable = true } torch = [ { index = "PyPI", marker = "sys_platform == 'darwin'" }, { index = "pytorch-cu129", marker = "sys_platform != 'darwin'" }, @@ -173,11 +170,12 @@ include = [ "buzz", "buzz/whisper_cpp/*", "buzz/locale/*/LC_MESSAGES/buzz.mo", - "demucs_repo", "whisper_diarization", "deepmultilingualpunctuation", "ctc_forced_aligner", ] +# Map demucs_repo/demucs to top-level demucs/ so 'import demucs' works +sources = {"demucs_repo/demucs" = "demucs"} [tool.hatch.build.hooks.custom] diff --git a/readme/README.zh_CN.md b/readme/README.zh_CN.md index a36d9f31..7c0292ba 100644 --- a/readme/README.zh_CN.md +++ b/readme/README.zh_CN.md @@ -2,7 +2,7 @@ # Buzz -[项目文档](https://chidiwilliams.github.io/buzz/zh/docs) | [苹果应用商店的 Buzz Captions 页面](https://apps.apple.com/us/app/buzz-captions/id6446018936?mt=12&itsct=apps_box_badge&itscg=30200) +[项目文档](https://chidiwilliams.github.io/buzz/zh/docs) 在个人电脑上离线转录和翻译音频。技术模型来源 OpenAI [Whisper](https://github.com/openai/whisper). @@ -12,13 +12,6 @@ ![GitHub release (latest by date)](https://img.shields.io/github/v/release/chidiwilliams/buzz) [![Github all releases](https://img.shields.io/github/downloads/chidiwilliams/buzz/total.svg)](https://GitHub.com/chidiwilliams/buzz/releases/) -
-

在 App Store 下载运行的性能更佳。 获得外观更整洁、音频播放、拖放导入、转录编辑、搜索等功能的原生Mac版本。

-Download on the Mac App Store -
- -![Buzz](../buzz/assets/buzz-banner.jpg) - ## 安装 **PyPI**: diff --git a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml index 22c2e7b7..f2d17304 100644 --- a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml +++ b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml @@ -64,8 +64,8 @@ - - https://github.com/chidiwilliams/buzz/releases/tag/v1.4.1 + + https://github.com/chidiwilliams/buzz/releases/tag/v1.4.2

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 as well as separate window to show live transcripts on a projector.

Release details:

diff --git a/uv.lock b/uv.lock index 4c2c6ff8..e6f1d26d 100644 --- a/uv.lock +++ b/uv.lock @@ -274,7 +274,7 @@ wheels = [ [[package]] name = "buzz-captions" -version = "1.4.1" +version = "1.4.2" source = { editable = "." } dependencies = [ { name = "accelerate" }, @@ -288,7 +288,6 @@ dependencies = [ { name = "darkdetect" }, { name = "dataclasses-json" }, { name = "datasets" }, - { name = "demucs" }, { name = "diffq" }, { name = "dora-search" }, { name = "einops" }, @@ -308,10 +307,8 @@ dependencies = [ { name = "nemo-toolkit", extra = ["asr"], marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "nltk" }, { name = "numpy" }, - { name = "nvidia-cublas-cu12", marker = "sys_platform == 'win32'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "sys_platform == 'win32'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "sys_platform == 'win32'" }, { name = "nvidia-cudnn-cu12", marker = "sys_platform != 'darwin'" }, + { name = "onnx" }, { name = "onnxruntime" }, { name = "openai" }, { name = "openai-whisper" }, @@ -382,7 +379,6 @@ requires-dist = [ { 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" }, { name = "einops", specifier = ">=0.8.1,<0.9" }, @@ -402,10 +398,8 @@ requires-dist = [ { name = "nemo-toolkit", extras = ["asr"], marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'", specifier = "==2.5.3" }, { name = "nltk", specifier = ">=3.9.2" }, { name = "numpy", specifier = ">=1.21.2,<2" }, - { name = "nvidia-cublas-cu12", marker = "sys_platform == 'win32'", specifier = ">=12.9,<13" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "sys_platform == 'win32'", specifier = ">=12.9,<13" }, - { name = "nvidia-cuda-runtime-cu12", marker = "sys_platform == 'win32'", specifier = ">=12.9,<13" }, { name = "nvidia-cudnn-cu12", marker = "sys_platform != 'darwin'", specifier = ">=9,<10" }, + { name = "onnx", specifier = ">=1.20.0" }, { name = "onnxruntime", specifier = "==1.18.1" }, { name = "openai", specifier = ">=1.14.2,<2" }, { name = "openai-whisper", specifier = "==20250625" }, @@ -857,59 +851,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] -[[package]] -name = "demucs" -version = "4.1.0a3" -source = { editable = "demucs_repo" } -dependencies = [ - { name = "dora-search" }, - { name = "einops" }, - { name = "julius" }, - { name = "lameenc" }, - { 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 != '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 != '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" }, -] - -[package.metadata] -requires-dist = [ - { name = "diffq", marker = "extra == 'dev'", specifier = ">=0.2.1" }, - { name = "dora-search" }, - { name = "dora-search", marker = "extra == 'dev'", specifier = ">=0.1.12" }, - { name = "einops" }, - { name = "einops", marker = "extra == 'dev'" }, - { name = "flake8", marker = "extra == 'dev'" }, - { name = "hydra-colorlog", marker = "extra == 'dev'", specifier = ">=1.1" }, - { name = "hydra-core", marker = "extra == 'dev'", specifier = ">=1.1" }, - { name = "julius", specifier = ">=0.2.3" }, - { name = "julius", marker = "extra == 'dev'", specifier = ">=0.2.3" }, - { name = "lameenc", specifier = ">=1.2" }, - { name = "lameenc", marker = "extra == 'dev'", specifier = ">=1.2" }, - { name = "museval", marker = "extra == 'dev'" }, - { name = "mypy", marker = "extra == 'dev'" }, - { name = "openunmix" }, - { name = "openunmix", marker = "extra == 'dev'" }, - { name = "pyyaml" }, - { name = "pyyaml", marker = "extra == 'dev'" }, - { name = "soundfile", marker = "extra == 'dev'", specifier = ">=0.10.3" }, - { name = "submitit", marker = "extra == 'dev'" }, - { name = "torch", specifier = ">=1.8.1" }, - { name = "torch", marker = "extra == 'dev'", specifier = ">=1.8.1" }, - { name = "torchaudio", specifier = ">=0.8" }, - { name = "torchaudio", marker = "extra == 'dev'", specifier = ">=0.8" }, - { name = "tqdm" }, - { name = "tqdm", marker = "extra == 'dev'" }, - { name = "treetable", marker = "extra == 'dev'" }, -] -provides-extras = ["dev"] - [[package]] name = "diffq" version = "0.2.4" @@ -2027,7 +1968,7 @@ name = "ml-dtypes" version = "0.5.4" source = { registry = "https://pypi.org/simple/" } dependencies = [ - { name = "numpy", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } wheels = [ @@ -2413,7 +2354,6 @@ version = "12.9.86" source = { registry = "https://download.pytorch.org/whl/cu129" } wheels = [ { url = "https://pypi.nvidia.com/nvidia-cuda-nvrtc-cu12/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:210cf05005a447e29214e9ce50851e83fc5f4358df8b453155d5e1918094dcb4" }, - { url = "https://pypi.nvidia.com/nvidia-cuda-nvrtc-cu12/nvidia_cuda_nvrtc_cu12-12.9.86-py3-none-win_amd64.whl", hash = "sha256:72972ebdcf504d69462d3bcd67e7b81edd25d0fb85a2c46d3ea3517666636349" }, ] [[package]] @@ -2422,7 +2362,6 @@ version = "12.9.79" source = { registry = "https://download.pytorch.org/whl/cu129" } wheels = [ { url = "https://pypi.nvidia.com/nvidia-cuda-runtime-cu12/nvidia_cuda_runtime_cu12-12.9.79-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25bba2dfb01d48a9b59ca474a1ac43c6ebf7011f1b0b8cc44f54eb6ac48a96c3" }, - { url = "https://pypi.nvidia.com/nvidia-cuda-runtime-cu12/nvidia_cuda_runtime_cu12-12.9.79-py3-none-win_amd64.whl", hash = "sha256:8e018af8fa02363876860388bd10ccb89eb9ab8fb0aa749aaf58430a9f7c4891" }, ] [[package]] @@ -2539,10 +2478,10 @@ name = "onnx" version = "1.20.0" source = { registry = "https://pypi.org/simple/" } dependencies = [ - { name = "ml-dtypes", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "numpy", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "protobuf", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, - { name = "typing-extensions", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "protobuf" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/bd/bf/824b13b7ea14c2d374b48a296cfa412442e5559326fbab5441a4fcb68924/onnx-1.20.0.tar.gz", hash = "sha256:1a93ec69996b4556062d552ed1aa0671978cfd3c17a40bf4c89a1ae169c6a4ad", size = 12049527, upload-time = "2025-12-01T18:14:34.679Z" } wheels = [ From 43214f5c3dfd0f8f1f871fc436e568392754410c Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Mon, 5 Jan 2026 08:37:30 +0200 Subject: [PATCH 02/37] Update documentation (#1337) --- CONTRIBUTING.md | 1 + README.md | 23 ++++++++++++++++++- buzz/cuda_setup.py | 7 ++---- buzz/file_transcriber_queue_worker.py | 11 +++++++++ buzz/transcriber/recording_transcriber.py | 3 +++ buzz/transcriber/whisper_file_transcriber.py | 8 +++---- buzz/transformers_whisper.py | 6 ++++- docs/docs/faq.md | 6 ++--- docs/docs/index.md | 22 ++++++------------ docs/docs/installation.md | 18 ++++++++------- docs/docs/usage/2_live_recording.md | 2 ++ pyproject.toml | 3 ++- readme/README.zh_CN.md | 1 - .../io.github.chidiwilliams.Buzz.metainfo.xml | 1 + 14 files changed, 72 insertions(+), 40 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3b2fddf4..abb1a73c 100755 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,6 +52,7 @@ Linux versions get also pushed to the snap. To install latest development versio sudo apt-get install --no-install-recommends libyaml-dev libtbb-dev libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-shape0 libxcb-cursor0 libportaudio2 gettext libpulse0 ffmpeg ``` On versions prior to Ubuntu 24.04 install `sudo apt-get install --no-install-recommends libegl1-mesa` + 5. Install the dependencies `uv sync` 6. Run Buzz `uv run buzz` diff --git a/README.md b/README.md index 17d5de58..17abf7c5 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,24 @@ OpenAI's [Whisper](https://github.com/openai/whisper). ![GitHub release (latest by date)](https://img.shields.io/github/v/release/chidiwilliams/buzz) [![Github all releases](https://img.shields.io/github/downloads/chidiwilliams/buzz/total.svg)](https://GitHub.com/chidiwilliams/buzz/releases/) +![Buzz](./buzz/assets/buzz-banner.jpg) + +## Features +- Transcribe audio and video files or Youtube links +- Live realtime audio transcription from microphone + - Presentation window for easy accessibility during events and presentations +- Speech separation before transcription for better accuracy on noisy audio +- Speaker identification in transcribed media +- Multiple whisper backend support + - CUDA acceleration support for Nvidia GPUs + - Apple Silicon support for Macs + - Vulkan acceleration support for Whisper.cpp on most GPUs, including integrated GPUs +- Export transcripts to TXT, SRT, and VTT +- Advanced Transcription Viewer with search, playback controls, and speed adjustment +- Keyboard shortcuts for efficient navigation +- Watch folder for automatic transcription of new files +- Command-Line Interface for scripting and automation + ## Installation ### macOS @@ -40,13 +58,16 @@ To install flatpak, run: flatpak install flathub io.github.chidiwilliams.Buzz ``` +[![Download on Flathub](https://flathub.org/api/badge?svg&locale=en)](https://flathub.org/en/apps/io.github.chidiwilliams.Buzz) + To install snap, run: ```shell sudo apt-get install libportaudio2 libcanberra-gtk-module libcanberra-gtk3-module sudo snap install buzz -sudo snap connect buzz:password-manager-service ``` +[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/buzz) + ### PyPI Install [ffmpeg](https://www.ffmpeg.org/download.html) diff --git a/buzz/cuda_setup.py b/buzz/cuda_setup.py index 09ba0731..d99b402e 100644 --- a/buzz/cuda_setup.py +++ b/buzz/cuda_setup.py @@ -70,9 +70,8 @@ def _setup_windows_dll_directories(): 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}") + pass def _preload_linux_libraries(): @@ -101,17 +100,15 @@ def _preload_linux_libraries(): # 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}") + pass def setup_cuda_libraries(): diff --git a/buzz/file_transcriber_queue_worker.py b/buzz/file_transcriber_queue_worker.py index de059635..9776efd4 100644 --- a/buzz/file_transcriber_queue_worker.py +++ b/buzz/file_transcriber_queue_worker.py @@ -123,6 +123,8 @@ class FileTranscriberQueueWorker(QObject): def separator_progress_callback(progress): self.task_progress.emit(self.current_task, int(progress["segment_offset"] * 100) / int(progress["audio_length"] * 100)) + separator = None + separated = None try: separator = demucsApi.Separator( progress=True, @@ -137,6 +139,15 @@ class FileTranscriberQueueWorker(QObject): self.current_task.file_path = str(self.speech_path) except Exception as e: logging.error(f"Error during speech extraction: {e}", exc_info=True) + finally: + # Release memory used by speech extractor + del separator, separated + try: + import torch + if torch.cuda.is_available(): + torch.cuda.empty_cache() + except Exception: + pass logging.debug("Starting next transcription task") self.task_progress.emit(self.current_task, 0) diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index e4f5a850..4985b1b8 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -11,6 +11,9 @@ import subprocess from typing import Optional from platformdirs import user_cache_dir +# Preload CUDA libraries before importing torch +from buzz import cuda_setup # noqa: F401 + import torch import numpy as np import sounddevice diff --git a/buzz/transcriber/whisper_file_transcriber.py b/buzz/transcriber/whisper_file_transcriber.py index a0882a7d..0badcdbf 100644 --- a/buzz/transcriber/whisper_file_transcriber.py +++ b/buzz/transcriber/whisper_file_transcriber.py @@ -5,6 +5,10 @@ import multiprocessing import re import os import sys + +# Preload CUDA libraries before importing torch - required for subprocess contexts +from buzz import cuda_setup # noqa: F401 + import torch import platform import subprocess @@ -123,10 +127,6 @@ 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": diff --git a/buzz/transformers_whisper.py b/buzz/transformers_whisper.py index 96ee0f47..d9995d5a 100644 --- a/buzz/transformers_whisper.py +++ b/buzz/transformers_whisper.py @@ -3,6 +3,10 @@ import sys import logging import platform import numpy as np + +# Preload CUDA libraries before importing torch +from buzz import cuda_setup # noqa: F401 + import torch import requests from typing import Union @@ -225,7 +229,7 @@ class TransformersTranscriber: model, processor, use_8bit = self._load_peft_model(device, torch_dtype) else: use_safetensors = True - if os.path.exists(self.model_id): + if os.path.isdir(self.model_id): safetensors_files = [f for f in os.listdir(self.model_id) if f.endswith(".safetensors")] use_safetensors = len(safetensors_files) > 0 diff --git a/docs/docs/faq.md b/docs/docs/faq.md index 1eb3207e..d1f91af8 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -11,9 +11,7 @@ The models are stored: - Mac OS: `~/Library/Caches/Buzz` - Windows: `%USERPROFILE%\AppData\Local\Buzz\Buzz\Cache` -Paste the location in your file manager to access the models. - -Since Version `1.3.4`, to get to the logs folder go to `Help -> About Buzz` and click on `Show logs` button. +Paste the location in your file manager to access the models or go to `Help -> Preferences -> Models` and click on `Show file location` button after downloading some model. ### 2. What can I try if the transcription runs too slowly? @@ -67,7 +65,7 @@ Yes, Buzz can be used without internet connection if you download the necessary If a model download was incomplete or corrupted, Buzz may crash. Try to delete the downloaded model files in `Help -> Preferences -> Models` and re-download them. -If that does not help, check the log file for errors and [report the issue](https://github.com/chidiwilliams/buzz/issues) so we can fix it. The log file is located in `~/Library/Logs/Buzz` (Mac OS) or `%USERPROFILE%\AppData\Local\Buzz\Buzz\Logs` (Windows). On Linux run the Buzz from the command line to see the relevant messages. +If that does not help, check the log file for errors and [report the issue](https://github.com/chidiwilliams/buzz/issues) so we can fix it. If possible attach the log file to the issue. Since Version `1.3.4`, to get to the logs folder go to `Help -> About Buzz` and click on `Show logs` button. ### 9. Where can I get latest development version? diff --git a/docs/docs/index.md b/docs/docs/index.md index 7634aa44..adfa1920 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -18,24 +18,16 @@ OpenAI's [Whisper](https://github.com/openai/whisper). VTT ([Demo](https://www.loom.com/share/cf263b099ac3481082bb56d19b7c87fe)) - Transcription and translation from your computer's microphones to text (Resource-intensive and may not be real-time, [Demo](https://www.loom.com/share/564b753eb4d44b55b985b8abd26b55f7)) -- **Advanced Transcription Viewer** with search, playback controls, and speed adjustment + - Presentation window for easy accessibility during events and presentations + - [Realtime translation](https://chidiwilliams.github.io/buzz/docs/usage/translations) with OpenAI API compatible AI +- [Advanced Transcription Viewer](https://chidiwilliams.github.io/buzz/docs/usage/transcription_viewer)** with search, playback controls, and speed adjustment - **Smart Interface** with conditional visibility and state persistence - **Professional Controls** including loop segments, follow audio, and keyboard shortcuts - Supports [Whisper](https://github.com/openai/whisper#available-models-and-languages), - [Whisper.cpp](https://github.com/ggerganov/whisper.cpp), [Faster Whisper](https://github.com/guillaumekln/faster-whisper), + [Whisper.cpp](https://github.com/ggerganov/whisper.cpp) (with Vulkan GPU acceleration), [Faster Whisper](https://github.com/guillaumekln/faster-whisper), [Whisper-compatible Hugging Face models](https://huggingface.co/models?other=whisper), and the [OpenAI Whisper API](https://platform.openai.com/docs/api-reference/introduction) - [Command-Line Interface](#command-line-interface) -- Available on Mac, Windows, and Linux - -## Transcription Viewer - -Buzz features a powerful transcription viewer that makes it easy to work with your transcriptions: - -- **🔍 Smart Search**: Find text quickly with real-time search and navigation -- **🎵 Playback Controls**: Loop segments, follow audio, and adjust playback speed -- **⌨️ Keyboard Shortcuts**: Efficient navigation with Ctrl+F, Ctrl+L, and more -- **🎨 Clean Interface**: Conditional visibility keeps the interface uncluttered -- **💾 State Persistence**: Remembers your preferences between sessions - -[Learn more about the Transcription Viewer →](https://chidiwilliams.github.io/buzz/docs/usage/transcription_viewer) +- Speech separation before transcription for better accuracy on noisy audio +- [Speaker identification](https://chidiwilliams.github.io/buzz/docs/usage/speaker_identification) in transcribed media +- Available on Mac, Windows, and Linux \ No newline at end of file diff --git a/docs/docs/installation.md b/docs/docs/installation.md index 633ea9cd..259bf329 100644 --- a/docs/docs/installation.md +++ b/docs/docs/installation.md @@ -3,8 +3,8 @@ title: Installation 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**. +To install Buzz, download the latest version for your operating +system. Buzz is available on **Mac** (Intel and Apple silicon), **Windows**, and **Linux**. ### macOS @@ -25,6 +25,8 @@ To install flatpak, run: flatpak install flathub io.github.chidiwilliams.Buzz ``` +[![Download on Flathub](https://flathub.org/api/badge?svg&locale=en)](https://flathub.org/en/apps/io.github.chidiwilliams.Buzz) + To install snap, run: ```shell sudo apt-get install libportaudio2 libcanberra-gtk-module libcanberra-gtk3-module @@ -34,15 +36,15 @@ sudo snap connect buzz:password-manager-service [![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/buzz) -Alternatively, on Ubuntu 20.04 and later, install the dependencies: - -```shell -sudo apt-get install libportaudio2 -``` - ## PyPI ```shell pip install buzz-captions python -m buzz ``` + +On Linux install system dependencies you may be missing +``` +sudo apt-get install --no-install-recommends libyaml-dev libtbb-dev libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-shape0 libxcb-cursor0 libportaudio2 gettext libpulse0 ffmpeg +``` +On versions prior to Ubuntu 24.04 install `sudo apt-get install --no-install-recommends libegl1-mesa` diff --git a/docs/docs/usage/2_live_recording.md b/docs/docs/usage/2_live_recording.md index 83c567d1..83cac40e 100644 --- a/docs/docs/usage/2_live_recording.md +++ b/docs/docs/usage/2_live_recording.md @@ -18,6 +18,8 @@ To start a live recording: [![Live Recording on Buzz](https://cdn.loom.com/sessions/thumbnails/564b753eb4d44b55b985b8abd26b55f7-with-play.gif)](https://www.loom.com/share/564b753eb4d44b55b985b8abd26b55f7 "Live Recording on Buzz") +**Presentation Window** Since 1.4.2 Buzz has an easy to use presentation window you can use to show live transcriptions during events and presentations. To open it start the recording and new options for the `Presentation window` will appear. + ### Record audio playing from computer (macOS) To record audio playing from an application on your computer, you may install an audio loopback driver (a program that diff --git a/pyproject.toml b/pyproject.toml index 57fb6afd..737a587e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,7 @@ description = "" authors = [{ name = "Chidi Williams", email = "williamschidi1@gmail.com" }] requires-python = ">=3.12,<3.13" readme = "README.md" +# License format change to remove warning in PyPI will cause snap not to build license = { text = "MIT" } dependencies = [ "sounddevice>=0.5.3,<0.6", @@ -180,7 +181,7 @@ sources = {"demucs_repo/demucs" = "demucs"} [tool.hatch.build.hooks.custom] [build-system] -requires = ["hatchling", "cmake>=4.2.0,<5", "polib>=1.2.0,<2", "pybind11", "setuptools>=42"] +requires = ["hatchling", "cmake>=4.2.0,<5", "polib>=1.2.0,<2", "pybind11", "setuptools>=80.9.0"] build-backend = "hatchling.build" [tool.ruff] diff --git a/readme/README.zh_CN.md b/readme/README.zh_CN.md index 7c0292ba..49a37e40 100644 --- a/readme/README.zh_CN.md +++ b/readme/README.zh_CN.md @@ -46,7 +46,6 @@ brew install --cask buzz ```shell sudo apt-get install libportaudio2 libcanberra-gtk-module libcanberra-gtk3-module sudo snap install buzz -sudo snap connect buzz:password-manager-service ``` ### 最新开发者版本 diff --git a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml index f2d17304..58f5ddb2 100644 --- a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml +++ b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml @@ -27,6 +27,7 @@ https://github.com/chidiwilliams/buzz/issues https://github.com/chidiwilliams/buzz https://chidiwilliams.github.io/buzz/docs + https://github.com/chidiwilliams/buzz #f66151 From f1bc725e2b26e41ddedbb440b35cb27b3351fb5b Mon Sep 17 00:00:00 2001 From: Rob Siera Date: Sat, 10 Jan 2026 10:38:55 +0100 Subject: [PATCH 03/37] Fix speaker identification chunk size error for long transcriptions (#1342) Co-authored-by: Robrecht Siera --- .../speaker_identification_widget.py | 66 ++++++++++++++- .../speaker_identification_widget_test.py | 80 +++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) diff --git a/buzz/widgets/transcription_viewer/speaker_identification_widget.py b/buzz/widgets/transcription_viewer/speaker_identification_widget.py index 6ea6eec1..cc794419 100644 --- a/buzz/widgets/transcription_viewer/speaker_identification_widget.py +++ b/buzz/widgets/transcription_viewer/speaker_identification_widget.py @@ -62,6 +62,63 @@ from whisper_diarization.helpers import ( from deepmultilingualpunctuation.deepmultilingualpunctuation import PunctuationModel from whisper_diarization.diarization import MSDDDiarizer + +def process_in_batches( + items, + process_func, + batch_size=200, + chunk_size=230, + smaller_batch_size=100, + exception_types=(AssertionError,), + **process_func_kwargs +): + """ + Process items in batches with automatic fallback to smaller batches on errors. + + This is a generic batch processing function that can be used with any processing + function that has chunk size limitations. It automatically retries with smaller + batches when specified exceptions occur. + + Args: + items: List of items to process + process_func: Callable that processes a batch. Should accept (batch, chunk_size, **kwargs) + and return a list of results + batch_size: Initial batch size (default: 200) + chunk_size: Maximum chunk size for the processing function (default: 230) + smaller_batch_size: Fallback batch size when errors occur (default: 100) + exception_types: Tuple of exception types to catch and retry with smaller batches + (default: (AssertionError,)) + **process_func_kwargs: Additional keyword arguments to pass to process_func + + Returns: + List of processed results (concatenated from all batches) + + Example: + >>> def my_predict(batch, chunk_size): + ... return [f"processed_{item}" for item in batch] + >>> results = process_in_batches( + ... items=["a", "b", "c"], + ... process_func=my_predict, + ... batch_size=2 + ... ) + """ + all_results = [] + + for i in range(0, len(items), batch_size): + batch = items[i:i + batch_size] + try: + batch_results = process_func(batch, chunk_size=min(chunk_size, len(batch)), **process_func_kwargs) + all_results.extend(batch_results) + except exception_types as e: + # If batch still fails, try with even smaller chunks + logging.warning(f"Batch processing failed, trying smaller chunks: {e}") + for j in range(0, len(batch), smaller_batch_size): + smaller_batch = batch[j:j + smaller_batch_size] + smaller_results = process_func(smaller_batch, chunk_size=min(chunk_size, len(smaller_batch)), **process_func_kwargs) + all_results.extend(smaller_results) + + return all_results + SENTENCE_END = re.compile(r'.*[.!?。!?]') class IdentificationWorker(QObject): @@ -267,7 +324,14 @@ class IdentificationWorker(QObject): words_list = list(map(lambda x: x["word"], wsm)) - labled_words = punct_model.predict(words_list, chunk_size=230) + # Process in batches to avoid chunk size errors + def predict_wrapper(batch, chunk_size, **kwargs): + return punct_model.predict(batch, chunk_size=chunk_size) + + labled_words = process_in_batches( + items=words_list, + process_func=predict_wrapper + ) ending_puncts = ".?!。!?" model_puncts = ".,;:!?。!?" diff --git a/tests/widgets/speaker_identification_widget_test.py b/tests/widgets/speaker_identification_widget_test.py index 946948dc..5f10e6ce 100644 --- a/tests/widgets/speaker_identification_widget_test.py +++ b/tests/widgets/speaker_identification_widget_test.py @@ -14,6 +14,7 @@ if not (platform.system() == "Darwin" and platform.machine() == "x86_64"): from buzz.widgets.transcription_viewer.speaker_identification_widget import ( SpeakerIdentificationWidget, IdentificationWorker, + process_in_batches, ) from tests.audio import test_audio_path @@ -88,3 +89,82 @@ class TestSpeakerIdentificationWidget: assert isinstance(result[0], list) assert result == [[{'end_time': 8904, 'speaker': 'Speaker 0', 'start_time': 140, 'text': 'Bienvenue dans. '}]] + def test_batch_processing_with_many_words(self): + """Test batch processing when there are more than 200 words.""" + # Create mock punctuation model + mock_punct_model = MagicMock() + mock_punct_model.predict.side_effect = lambda batch, chunk_size: [ + (word.strip(), ".") for word in batch + ] + + # Create words list with 201 words (just enough to trigger batch processing) + words_list = [f"word{i}" for i in range(201)] + + # Wrap predict method to match the expected signature + def predict_wrapper(batch, chunk_size, **kwargs): + return mock_punct_model.predict(batch, chunk_size=chunk_size) + + # Call the generic batch processing function + result = process_in_batches( + items=words_list, + process_func=predict_wrapper + ) + + # Verify that predict was called multiple times (for batches) + assert mock_punct_model.predict.call_count >= 2, "Batch processing should split into multiple calls" + + # Verify that each batch was processed with correct chunk_size + for call in mock_punct_model.predict.call_args_list: + args, kwargs = call + batch = args[0] + chunk_size = kwargs.get('chunk_size') + assert chunk_size <= 230, "Chunk size should not exceed 230" + assert len(batch) <= 200, "Batch size should not exceed 200" + + # Verify result contains all words + assert len(result) == 201, "Result should contain all words" + + def test_batch_processing_with_assertion_error_fallback(self): + """Test error handling when AssertionError occurs during batch processing.""" + # Create mock punctuation model - raise AssertionError on first batch, then succeed + mock_punct_model = MagicMock() + call_count = [0] + + def predict_side_effect(batch, chunk_size): + call_count[0] += 1 + # Raise AssertionError on first call (first batch) + if call_count[0] == 1: + raise AssertionError("Chunk size too large") + # Succeed on subsequent calls (smaller batches) + return [(word.strip(), ".") for word in batch] + + mock_punct_model.predict.side_effect = predict_side_effect + + # Create words list with 201 words (enough to trigger batch processing) + words_list = [f"word{i}" for i in range(201)] + + # Wrap predict method to match the expected signature + def predict_wrapper(batch, chunk_size, **kwargs): + return mock_punct_model.predict(batch, chunk_size=chunk_size) + + # Call the generic batch processing function + result = process_in_batches( + items=words_list, + process_func=predict_wrapper + ) + + # Verify that predict was called multiple times + # First call fails, then smaller batches succeed + assert mock_punct_model.predict.call_count > 1, "Should retry with smaller batches after AssertionError" + + # Verify that smaller batches were used after the error + call_args_list = mock_punct_model.predict.call_args_list + # After the first failed call, subsequent calls should have smaller batches + for i, call in enumerate(call_args_list[1:], start=1): # Skip first failed call + args, kwargs = call + batch = args[0] + assert len(batch) <= 100, f"After AssertionError, batch size should be <= 100, got {len(batch)}" + + # Verify result contains all words + assert len(result) == 201, "Result should contain all words" + From dc27281e34bf3cd6b73c356a458a1bc61efb207d Mon Sep 17 00:00:00 2001 From: Rob Siera Date: Sat, 10 Jan 2026 17:58:27 +0100 Subject: [PATCH 04/37] Fix missing spaces after punctuation in speaker identification (#1344) Co-authored-by: Robrecht Siera --- .../transcription_viewer/speaker_identification_widget.py | 3 ++- tests/widgets/speaker_identification_widget_test.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/buzz/widgets/transcription_viewer/speaker_identification_widget.py b/buzz/widgets/transcription_viewer/speaker_identification_widget.py index cc794419..67408256 100644 --- a/buzz/widgets/transcription_viewer/speaker_identification_widget.py +++ b/buzz/widgets/transcription_viewer/speaker_identification_widget.py @@ -187,7 +187,8 @@ class IdentificationWorker(QObject): transcription_id=self.transcription.id_as_uuid ) - full_transcript = "".join(segment.text for segment in segments) + full_transcript = " ".join(segment.text for segment in segments) + full_transcript = re.sub(r' {2,}', ' ', full_transcript) if self._is_cancelled: logging.debug("Speaker identification worker: Cancelled at step 2") diff --git a/tests/widgets/speaker_identification_widget_test.py b/tests/widgets/speaker_identification_widget_test.py index 5f10e6ce..54dc4071 100644 --- a/tests/widgets/speaker_identification_widget_test.py +++ b/tests/widgets/speaker_identification_widget_test.py @@ -87,7 +87,8 @@ class TestSpeakerIdentificationWidget: assert worker.transcription == transcription assert len(result) == 1 assert isinstance(result[0], list) - assert result == [[{'end_time': 8904, 'speaker': 'Speaker 0', 'start_time': 140, 'text': 'Bienvenue dans. '}]] + assert (result == [[{'end_time': 8904, 'speaker': 'Speaker 0', 'start_time': 140, 'text': 'Bien venue dans. '}]] + or result == [[{'end_time': 8904, 'speaker': 'Speaker 0', 'start_time': 140, 'text': 'Bienvenue dans. '}]]) def test_batch_processing_with_many_words(self): """Test batch processing when there are more than 200 words.""" From e9502881fc736c9ed0d1dd54c1181a84bbe674ac Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Fri, 16 Jan 2026 17:22:08 +0900 Subject: [PATCH 05/37] docs: add Japanese README (#1352) --- README.ja_JP.md | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 README.ja_JP.md diff --git a/README.ja_JP.md b/README.ja_JP.md new file mode 100644 index 00000000..6ef46be9 --- /dev/null +++ b/README.ja_JP.md @@ -0,0 +1,104 @@ +# Buzz + +[ドキュメント](https://chidiwilliams.github.io/buzz/) + +パソコン上でオフラインで音声の文字起こしと翻訳を行います。OpenAIの[Whisper](https://github.com/openai/whisper)を使用しています。 + +![MIT License](https://img.shields.io/badge/license-MIT-green) +[![CI](https://github.com/chidiwilliams/buzz/actions/workflows/ci.yml/badge.svg)](https://github.com/chidiwilliams/buzz/actions/workflows/ci.yml) +[![codecov](https://codecov.io/github/chidiwilliams/buzz/branch/main/graph/badge.svg?token=YJSB8S2VEP)](https://codecov.io/github/chidiwilliams/buzz) +![GitHub release (latest by date)](https://img.shields.io/github/v/release/chidiwilliams/buzz) +[![Github all releases](https://img.shields.io/github/downloads/chidiwilliams/buzz/total.svg)](https://GitHub.com/chidiwilliams/buzz/releases/) + +![Buzz](./buzz/assets/buzz-banner.jpg) + +## 機能 +- 音声・動画ファイルまたはYouTubeリンクの文字起こし +- マイクからのリアルタイム音声文字起こし + - イベントやプレゼンテーション中に便利なプレゼンテーションウィンドウ +- ノイズの多い音声でより高い精度を得るための、文字起こし前の話者分離 +- 文字起こしメディアでの話者識別 +- 複数のWhisperバックエンドをサポート + - Nvidia GPU向けCUDAアクセラレーション対応 + - Mac向けApple Silicon対応 + - Whisper.cppでのVulkanアクセラレーション対応(統合GPUを含むほとんどのGPUで利用可能) +- TXT、SRT、VTT形式での文字起こしエクスポート +- 検索、再生コントロール、速度調整機能を備えた高度な文字起こしビューア +- 効率的なナビゲーションのためのキーボードショートカット +- 新しいファイルの自動文字起こしのための監視フォルダ +- スクリプトや自動化のためのコマンドラインインターフェース + +## インストール + +### macOS + +[SourceForge](https://sourceforge.net/projects/buzz-captions/files/)から`.dmg`ファイルをダウンロードしてください。 + +### Windows + +[SourceForge](https://sourceforge.net/projects/buzz-captions/files/)からインストールファイルを入手してください。 + +アプリは署名されていないため、インストール時に警告が表示されます。`詳細情報` -> `実行`を選択してください。 + +**または、[winget](https://learn.microsoft.com/ja-jp/windows/package-manager/winget/)でインストール** + +```shell +winget install ChidiWilliams.Buzz +``` + +### Linux + +Buzzは[Flatpak](https://flathub.org/apps/io.github.chidiwilliams.Buzz)または[Snap](https://snapcraft.io/buzz)として利用可能です。 + +Flatpakをインストールするには、以下を実行してください: +```shell +flatpak install flathub io.github.chidiwilliams.Buzz +``` + +[![Download on Flathub](https://flathub.org/api/badge?svg&locale=en)](https://flathub.org/en/apps/io.github.chidiwilliams.Buzz) + +Snapをインストールするには、以下を実行してください: +```shell +sudo apt-get install libportaudio2 libcanberra-gtk-module libcanberra-gtk3-module +sudo snap install buzz +``` + +[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/buzz) + +### PyPI + +[ffmpeg](https://www.ffmpeg.org/download.html)をインストールしてください。 + +Python 3.12環境を使用していることを確認してください。 + +Buzzをインストール + +```shell +pip install buzz-captions +python -m buzz +``` + +**PyPIでのGPUサポート** + +PyPIでインストールしたバージョンでWindows上のNvidia GPUのGPUサポートを有効にするには、[torch](https://pytorch.org/get-started/locally/)のCUDAサポートを確認してください。 + +``` +pip3 install -U torch==2.8.0+cu129 torchaudio==2.8.0+cu129 --index-url https://download.pytorch.org/whl/cu129 +pip3 install nvidia-cublas-cu12==12.9.1.4 nvidia-cuda-cupti-cu12==12.9.79 nvidia-cuda-runtime-cu12==12.9.79 --extra-index-url https://pypi.ngc.nvidia.com +``` + +### 最新開発版 + +最新の機能やバグ修正を含む最新開発版の入手方法については、[FAQ](https://chidiwilliams.github.io/buzz/docs/faq#9-where-can-i-get-latest-development-version)をご覧ください。 + +### スクリーンショット + +
+ ファイルインポート + メイン画面 + 設定 + モデル設定 + 文字起こし + ライブ録音 + リサイズ +
From 08ae8ba43f82a665c37f0292123bc88c9784d030 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 16 Jan 2026 11:18:27 +0200 Subject: [PATCH 06/37] Fix for HF hub download certificates (#1353) --- README.ja_JP.md | 6 ------ README.md | 6 ------ buzz/file_transcriber_queue_worker.py | 1 + buzz/model_loader.py | 14 ++++++++++++++ .../speaker_identification_widget.py | 1 + docs/docs/index.md | 2 +- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/README.ja_JP.md b/README.ja_JP.md index 6ef46be9..9990e5e6 100644 --- a/README.ja_JP.md +++ b/README.ja_JP.md @@ -40,12 +40,6 @@ アプリは署名されていないため、インストール時に警告が表示されます。`詳細情報` -> `実行`を選択してください。 -**または、[winget](https://learn.microsoft.com/ja-jp/windows/package-manager/winget/)でインストール** - -```shell -winget install ChidiWilliams.Buzz -``` - ### Linux Buzzは[Flatpak](https://flathub.org/apps/io.github.chidiwilliams.Buzz)または[Snap](https://snapcraft.io/buzz)として利用可能です。 diff --git a/README.md b/README.md index 17abf7c5..bf2498b1 100644 --- a/README.md +++ b/README.md @@ -43,12 +43,6 @@ Get the installation files from the [SourceForge](https://sourceforge.net/projec App is not signed, you will get a warning when you install it. Select `More info` -> `Run anyway`. -**Alternatively, install with [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/)** - -```shell -winget install ChidiWilliams.Buzz -``` - ### Linux Buzz is available as a [Flatpak](https://flathub.org/apps/io.github.chidiwilliams.Buzz) or a [Snap](https://snapcraft.io/buzz). diff --git a/buzz/file_transcriber_queue_worker.py b/buzz/file_transcriber_queue_worker.py index 9776efd4..1babc641 100644 --- a/buzz/file_transcriber_queue_worker.py +++ b/buzz/file_transcriber_queue_worker.py @@ -12,6 +12,7 @@ from uuid import UUID # This must be done before importing demucs which uses torch.hub with urllib try: import certifi + os.environ.setdefault('REQUESTS_CA_BUNDLE', certifi.where()) os.environ.setdefault('SSL_CERT_FILE', certifi.where()) os.environ.setdefault('SSL_CERT_DIR', os.path.dirname(certifi.where())) # Also update the default SSL context for urllib diff --git a/buzz/model_loader.py b/buzz/model_loader.py index 4cf4d0d0..6f41b0e3 100644 --- a/buzz/model_loader.py +++ b/buzz/model_loader.py @@ -7,8 +7,22 @@ import threading import shutil import subprocess import sys +import ssl import warnings import platform + +# Fix SSL certificate verification for bundled applications (macOS, Windows). +# This must be done before importing libraries that make HTTPS requests. +try: + import certifi + os.environ.setdefault("REQUESTS_CA_BUNDLE", certifi.where()) + os.environ.setdefault("SSL_CERT_FILE", certifi.where()) + os.environ.setdefault("SSL_CERT_DIR", os.path.dirname(certifi.where())) + # Also update the default SSL context for urllib + ssl._create_default_https_context = lambda: ssl.create_default_context(cafile=certifi.where()) +except ImportError: + pass + import requests import whisper import huggingface_hub diff --git a/buzz/widgets/transcription_viewer/speaker_identification_widget.py b/buzz/widgets/transcription_viewer/speaker_identification_widget.py index 67408256..bd179a5d 100644 --- a/buzz/widgets/transcription_viewer/speaker_identification_widget.py +++ b/buzz/widgets/transcription_viewer/speaker_identification_widget.py @@ -10,6 +10,7 @@ from typing import Optional # This must be done before importing libraries that download from Hugging Face try: import certifi + os.environ.setdefault('REQUESTS_CA_BUNDLE', certifi.where()) os.environ.setdefault('SSL_CERT_FILE', certifi.where()) os.environ.setdefault('SSL_CERT_DIR', os.path.dirname(certifi.where())) # Also update the default SSL context for urllib diff --git a/docs/docs/index.md b/docs/docs/index.md index adfa1920..27600e0a 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -20,7 +20,7 @@ OpenAI's [Whisper](https://github.com/openai/whisper). real-time, [Demo](https://www.loom.com/share/564b753eb4d44b55b985b8abd26b55f7)) - Presentation window for easy accessibility during events and presentations - [Realtime translation](https://chidiwilliams.github.io/buzz/docs/usage/translations) with OpenAI API compatible AI -- [Advanced Transcription Viewer](https://chidiwilliams.github.io/buzz/docs/usage/transcription_viewer)** with search, playback controls, and speed adjustment +- [Advanced Transcription Viewer](https://chidiwilliams.github.io/buzz/docs/usage/transcription_viewer) with search, playback controls, and speed adjustment - **Smart Interface** with conditional visibility and state persistence - **Professional Controls** including loop segments, follow audio, and keyboard shortcuts - Supports [Whisper](https://github.com/openai/whisper#available-models-and-languages), From 92fc405c4a061bb60c8665734e8b57acee5e0b62 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 16 Jan 2026 12:23:48 +0200 Subject: [PATCH 07/37] 1347 add ending extender (#1354) --- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/en_US/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 142 ++++++++++-------- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 126 +++++++++------- buzz/locale/nl/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 124 ++++++++------- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 124 ++++++++------- .../transcription_resizer_widget.py | 78 +++++++++- tests/widgets/transcription_viewer_test.py | 65 ++++++++ 16 files changed, 1160 insertions(+), 739 deletions(-) diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 27186e5c..d669c47f 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -335,8 +335,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Error" @@ -583,75 +583,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Enregistrament en directe" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Feu clic a Enregistra per a començar..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "Esperant la traducció de la IA..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Micròfon:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "Fitxers de text" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "Fitxers de text" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "Selecciona la carpeta d'exportació" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "Selecciona un fitxer d'àudio" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "S'ha produït un error en iniciar un enregistrament nou:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -709,7 +709,7 @@ msgid "Translate" msgstr "Traduir" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "Redimensionar" @@ -812,110 +812,130 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "Introduïu la clau API d'OpenAI a les preferències" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 msgid "Resize Options" msgstr "Opcions de redimensionament" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "Longitud desitjada dels subtítols" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "Opcions de fusió" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "Fusiona per buit" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "Divideix per puntuació" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "Divideix per la longitud màxima" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "Fusiona" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Cancel·la la transcripció" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "Desa el fitxer" @@ -977,14 +997,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1358,15 +1378,15 @@ msgstr "Sundanès" msgid "Cantonese" msgstr "Cantonès" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "S'ha produït un error de connexió" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "Començant Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 b04893ac..98f3e484 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -334,8 +334,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Fejl" @@ -580,75 +580,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Live optagelse" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Klik Optage for at begynde..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "Venter på AI oversættelse..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "Tekst filer" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "Tekst filer" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "Vælg eksport-mappe" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "Vælg audio-fil" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "Der skete en fejl ved opstart af en ny optagelse:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -706,7 +706,7 @@ msgid "Translate" msgstr "Oversæt" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "Behandel størrelse" @@ -806,110 +806,130 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "Indtast venligst OpenAI API-nøgle i indstillinger" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 msgid "Resize Options" msgstr "Størrelsesindstillinger" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "Ønskede undertekst længde" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "Sammenfletningsindstillinger" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "Sammenflet ved hul" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "Split ved punktum" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "Split ved max længde" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "Sammenflet" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Afbryd transkription" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "Gem fil" @@ -971,12 +991,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1348,15 +1368,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "Der er opstået en forbindelsesfejl" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 339f7279..ce47c410 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -334,8 +334,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Fehler" @@ -581,75 +581,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Live-Aufnahme" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Auf „Aufnehmen“ klicken um zu beginnen …" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "Warten auf KI-Übersetzung..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "Textdateien" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "Textdateien" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "Exportordner auswählen" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "Audiodatei auswählen" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "Beim Starten einer neuen Aufnahme ist ein Fehler aufgetreten:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -707,7 +707,7 @@ msgid "Translate" msgstr "Übersetzen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "Größe ändern" @@ -807,110 +807,130 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "Bitte geben Sie den OpenAI-API-Schlüssel in den Einstellungen ein" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 msgid "Resize Options" msgstr "Größenänderungsoptionen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "Gewünschte Untertitellänge" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "Zusammenführungsoptionen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "Nach Abstand zusammenführen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "Durch Satzzeichen getrennt" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "Aufgeteilt nach maximaler Länge" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "Vereinigen" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Transkription abbrechen" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "Datei speichern" @@ -973,12 +993,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1350,15 +1370,15 @@ msgstr "Sundanesisch" msgid "Cantonese" msgstr "Kantonesisch" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "Ein Verbindungsfehler ist aufgetreten" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 803dbab9..01a94a62 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -324,8 +324,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "" @@ -565,71 +565,71 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 msgid "Text Size:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 msgid "Text Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 msgid "Select Text Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 msgid "Select Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -685,7 +685,7 @@ msgid "Translate" msgstr "" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "" @@ -785,109 +785,129 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 -msgid "Resize Options" +msgid "Extend end time" msgstr "" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +msgid "Resize Options" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 msgid "5/8 Preparing transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 msgid "Save" msgstr "" @@ -946,12 +966,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1322,15 +1342,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 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 e272d88c..fa930688 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -342,8 +342,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Error" @@ -615,80 +615,80 @@ msgid "Could not restart transcription: transcriber worker not found." msgstr "" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Grabación en vivo" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Pulse en Grabar para comenzar..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "A la espera de la traducción de la IA..." # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Micrófono:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "Archivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "Archivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "Seleccione Exportar carpeta" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "Seleccionar archivo de audio" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "Se produjo un error al iniciar una grabación nueva:" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -749,7 +749,7 @@ msgid "Translate" msgstr "Traducir" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "Cambiar el tamaño" @@ -855,112 +855,132 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "Ingrese la clave API de OpenAI en las preferencias" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 msgid "Resize Options" msgstr "Opciones de cambio de tamaño" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "Longitud deseada de los subtítulos" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "Opciones de fusión" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "Fusión por hueco" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "Dividido por puntuación" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "Dividido por la longitud máxima" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "Fusión" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" # automatic translation -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Cancelar transcripción" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" # automatic translation -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "Guardar archivo" @@ -1030,14 +1050,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1412,16 +1432,16 @@ msgstr "Sundanés" msgid "Cantonese" msgstr "Cantonés" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "Se ha producido un error de conexión" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." # automatic translation -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 aa1d03f6..47b4438f 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: 2026-01-03 10:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -179,15 +179,16 @@ 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 "Utilizzare la quantizzazione a 8 bit per ridurre l'utilizzo della memoria" +msgstr "" +"Utilizzare la quantizzazione a 8 bit per ridurre l'utilizzo della memoria" #: 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 "" -"Si applica ai modelli Huggingface e Faster Whisper. Riduce l'utilizzo della memoria GPU " -"ma potrebbe ridurre leggermente la qualità della trascrizione." +"Si applica ai modelli Huggingface e Faster Whisper. Riduce l'utilizzo della " +"memoria GPU ma potrebbe ridurre leggermente la qualità della trascrizione." #: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 msgid "Reduce GPU RAM" @@ -334,8 +335,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Errore" @@ -577,78 +578,78 @@ msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -"Impossibile riavviare la trascrizione: il modello non è disponibile e non può essere " -"scaricato." +"Impossibile riavviare la trascrizione: il modello non è disponibile e non " +"può essere scaricato." #: buzz/widgets/transcription_tasks_table_widget.py:806 msgid "Could not restart transcription: transcriber worker not found." msgstr "Impossibile riavviare la trascrizione: trascrittore non trovato." -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Registrazione in diretta" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Fai clic su Registra per iniziare..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "In attesa della traduzione AI..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Microfono:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "Mostra in una nuova finestra" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 msgid "Text Size:" msgstr "Dimensione testo:" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "Tema" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "Chiaro" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "Scuro" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "Personalizzato" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 msgid "Text Color" msgstr "Colore del testo" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "Colore dello sfondo" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "Schermo intero" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 msgid "Select Text Color" msgstr "Seleziona il colore del testo" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 msgid "Select Background Color" msgstr "Seleziona il colore di sfondo" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "Si è verificato un errore durante l'avvio della nuova registrazione:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -706,7 +707,7 @@ msgid "Translate" msgstr "Tradurre" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "Ridimensionare" @@ -810,111 +811,132 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "Inserisci la chiave API OpenAI nelle preferenze" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 msgid "Resize Options" msgstr "Opzioni di ridimensionamento" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "Lunghezza desiderata dei sottotitoli" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "Opzioni di unione" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "Unito per spazio" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "Diviso per punteggiatura" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "Diviso per lunghezza massima" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "Unione" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "1/8 Raccolta delle trascrizioni" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "2/8 Caricamento audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "3/8 Modello di allineamento del carico" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "3/8 Caricamento del modello di allineamento (nuovo tentativo con la cache...)" +msgstr "" +"3/8 Caricamento del modello di allineamento (nuovo tentativo con la cache...)" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -"Impossibile caricare il modello di allineamento. Controlla la tua connessione Internet e " -"riprova." +"Impossibile caricare il modello di allineamento. Controlla la tua " +"connessione Internet e riprova." -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "4/8 Elaborazione audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 msgid "5/8 Preparing transcripts" msgstr "5/8 Preparazione delle trascrizioni" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "6/8 Identificazione dei parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "7/8 Mappatura dei parlanti sulle trascrizioni" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "8/8 Identificazione effettuata" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "0/0 Errore nell'identificazione dei parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "Fase 1: identificare i parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "Identificare" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "Pronto a identificare i parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "File audio non trovato" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "Fase 2: nomi dei parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "Ascolta il campione" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "Unisci le frasi del parlante" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 msgid "Save" msgstr "Salva" @@ -975,13 +997,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1355,15 +1377,15 @@ msgstr "Sundanese" msgid "Cantonese" msgstr "Cantonese" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "Si è verificato un errore di connessione" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "Avvio di Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 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 6116f6e1..0ecc8bd8 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -330,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "エラー" @@ -576,75 +576,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "ライブ録音" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "クリックで録音を開始..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "AI翻訳を待っています..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "マイク:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "テキストファイル" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "テキストファイル" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "出力フォルダを選択" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "音声ファイルを選択" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "新規録音開始時にエラーが発生しました:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -702,7 +702,7 @@ msgid "Translate" msgstr "翻訳" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "リサイズ" @@ -802,111 +802,131 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "設定画面でOpenAI APIキーを入力してください" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 #, fuzzy msgid "Resize Options" msgstr "リサイズ" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "希望する字幕の長さ" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "文字起こしをキャンセルする" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "ファイルを保存" @@ -966,12 +986,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1343,15 +1363,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "接続エラーが発生しました" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 83df9b2a..390346ce 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-23 19:21+0200\n" -"PO-Revision-Date: 2025-12-23 19:24+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" +"PO-Revision-Date: 2026-01-16 11:30+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -337,8 +337,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Kļūda" @@ -586,71 +586,71 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "Neizdevās sākt atpazīšanu: Kļūda lietotnē, pārstartējiet." -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Dzīvā ierakstīšana" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Klikšķiniet Ierakstīt, lai sāktu..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "Gaida MI tulkojumu..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Mikrofons:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "Rādīt jaunā logā" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 msgid "Text Size:" msgstr "Teksta izmērs:" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "Stils" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "Gaišais" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "Tumšais" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "Pielāgots" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 msgid "Text Color" msgstr "Teksta krāsa" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "Fona krāsa" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "Pilnekrāns" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 msgid "Select Text Color" msgstr "Izvēlieties teksta krāsu" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 msgid "Select Background Color" msgstr "Izvēlieties fona krāsu" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "Sākot jaunu ierakstu notikusi kļūda:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -708,7 +708,7 @@ msgid "Translate" msgstr "Tulkot" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "Mainīt garumu" @@ -810,50 +810,70 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "Lūdzu ievadiet OpenAI API atslēgu iestatījumos" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "Pagarināt beigu laiku" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "Palielināt beigu laiku par (sekundes)" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "Palielināt" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 msgid "Resize Options" msgstr "Garuma maiņas iestatījumi" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "Vēlamais teksta garums" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "Pieejami tikai, ierakstiem, kas atpazīti bez dalīšanas pa vārdiem" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "Apvienošanas iestatījumi" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "Apvienot pēc attāluma" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "Dalīt pie pieturzīmēm" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "Dalīt pie maksimālā garuma" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "Apvienot" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "Pieejami tikai, ierakstiem, kas atpazīti ar dalīšanu pa vārdiem" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "1/8 Apkopo transkripcijas" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "2/8 Ielādē audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "3/8 Ielādē identifikācijas modeli" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "3/8 Ielādē identifikācijas modeli (atkārto...)" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." @@ -861,60 +881,60 @@ msgstr "" "Neizdevās ielādēt modeli. Lūdzu pārbaidiet savu interneta savienojumu un " "mēģiniet vēlreiz." -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "4/8 Apstrādā audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 msgid "5/8 Preparing transcripts" msgstr "5/8 Sagatavo transkripcijas" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "6/8 Nosaka runātājus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "7/8 Marķē runātāju teikumus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "8/8 Runātāju noteikšana pabeigta" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "0/0 Kļūda nosakot runātājus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "1. solis: Runātāju noteikšana" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "Noteikt" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "Gatavs noteikt runātājus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "Audio datne nav atrasta" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "2. solis: Runātāju identifikācija" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "Atskaņot paraugu" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "Apvienot secīgus runātāja teikumus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 msgid "Save" msgstr "Saglabāt" @@ -975,14 +995,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1356,15 +1376,15 @@ msgstr "Sundāņu" msgid "Cantonese" msgstr "Kantonas" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "Notika savienojuma kļūda" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "Palaiž Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 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 32ceab84..66d641e5 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -336,8 +336,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Foutmelding" @@ -583,75 +583,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Live-opname" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Klik op de opnameknop om te beginnen…" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "Bezig met wachten op AI-vertaling…" -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Microfoon:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "Tekstbestanden" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "Tekstbestanden" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "Kies een exportmap" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "Kies een audiobestand" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "Er is een fout opgetreden tijdens het starten van de opname:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -707,7 +707,7 @@ msgid "Translate" msgstr "Vertalen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "Grootte" @@ -807,110 +807,130 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "Voer de OpenAI-api-sleutel in in de instellingen" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 msgid "Resize Options" msgstr "Grootteopties" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "Voorkeurslengte van ondertiteling" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "Samenvoegopties" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "Samenvoegen op basis van tussenruimte" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "Splitsen op basis van leestekens" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "Splitsen op basis van max. lengte" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "Samenvoegen" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Transcriptie wissen" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "Bestand opslaan" @@ -972,12 +992,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1349,15 +1369,15 @@ msgstr "Soedanees" msgid "Cantonese" msgstr "Kantonees" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "Er is een verbindingsfout opgetreden" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 f4e08020..d1299e84 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -337,8 +337,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Błąd" @@ -588,75 +588,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Nagrywanie na żywo" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Naciśnij Nagraj, aby zacząć..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "Pliki tekstowe" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "Pliki tekstowe" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "Wybierz plik audio" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "Wybierz plik audio" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "Wystąpił błąd podczas rozpoczęcia nowego nagrania:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -715,7 +715,7 @@ msgid "Translate" msgstr "" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "" @@ -815,110 +815,130 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 -msgid "Resize Options" +msgid "Extend end time" msgstr "" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +msgid "Resize Options" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Anuluj transkrypcję" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "Zapisz plik" @@ -984,12 +1004,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1362,15 +1382,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 e22b0210..67def215 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -334,8 +334,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Erro" @@ -581,75 +581,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Gravação ao Vivo" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Clique em Gravar para começar..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "Aguardando tradução da IA..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Microfone:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "Arquivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "Arquivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "Selecionar Pasta de Exportação" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "Selecionar arquivo de áudio" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "Ocorreu um erro ao iniciar uma nova gravação:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -707,7 +707,7 @@ msgid "Translate" msgstr "Traduzir" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "Redimensionar" @@ -810,110 +810,130 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "Insira a chave API OpenAI nas preferências" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 msgid "Resize Options" msgstr "Opções de Redimensionamento" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "Duração desejada da legenda" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "Opções de Mesclagem" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "Mesclar por intervalo" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "Dividir por pontuação" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "Dividir por tamanho máximo" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "Mesclar" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Iniciando transcrição..." -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "Salvar Arquivo" @@ -975,12 +995,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1354,15 +1374,15 @@ msgstr "Sundanês" msgid "Cantonese" msgstr "Cantonês" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "Ocorreu um erro de conexão" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 6a0b21ab..e5851b17 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -332,8 +332,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "Помилка" @@ -578,75 +578,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "Живий запис" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "Натисніть на Запис, щоб розпочати..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "Очікування перекладу від ШІ..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "Мікрофон:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "Текстові файли" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "Текстові файли" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "Виберіть теку для експорту" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "Вибрати аудіофайл" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "При старті нового запису виникла помилка:" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -704,7 +704,7 @@ msgid "Translate" msgstr "Перекласти" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "" @@ -804,110 +804,130 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "Будь ласка, введіть API-ключ OpenAI в налаштуваннях" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 -msgid "Resize Options" +msgid "Extend end time" msgstr "" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +msgid "Resize Options" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Скасувати транскрипцію" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "Зберегти файл" @@ -968,12 +988,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1345,15 +1365,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "Виникла помилка зʼєднання" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 352cec0b..5db229a2 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -340,8 +340,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "错误" @@ -591,75 +591,75 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "实时录制" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "点击开始录制" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "等待AI翻译..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "麦克风:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 #, fuzzy msgid "Text Size:" msgstr "文本文件" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 #, fuzzy msgid "Text Color" msgstr "文本文件" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "选择输出文件夹" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "选择音频文件" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "开始新录制时出错" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -716,7 +716,7 @@ msgid "Translate" msgstr "翻译" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "调整大小" @@ -816,111 +816,131 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "请在偏好设置中输入OpenAI API Key" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +msgid "Extend end time" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 #, fuzzy msgid "Resize Options" msgstr "调整大小" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "所需字幕长度" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "合并选项" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "按间隔合并" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "按标点符号拆分" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "按最大长度拆分" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "合并" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "取消识别" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "保存文件" @@ -984,12 +1004,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1362,15 +1382,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "连接发生错误" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, 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 f8db1a27..2561e52f 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-23 19:21+0200\n" +"POT-Creation-Date: 2026-01-16 11:27+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -335,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:727 -#: buzz/model_loader.py:741 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:741 +#: buzz/model_loader.py:755 msgid "Error" msgstr "" @@ -586,73 +586,73 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py:96 msgid "Live Recording" msgstr "現場錄製" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py:162 msgid "Click Record to begin..." msgstr "點擊開始錄製" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py:165 msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py:177 msgid "Microphone:" msgstr "麥克風:" -#: buzz/widgets/recording_transcriber_widget.py:225 +#: buzz/widgets/recording_transcriber_widget.py:223 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:231 +#: buzz/widgets/recording_transcriber_widget.py:229 msgid "Text Size:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:247 +#: buzz/widgets/recording_transcriber_widget.py:245 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:251 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:265 +#: buzz/widgets/recording_transcriber_widget.py:263 msgid "Text Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:275 +#: buzz/widgets/recording_transcriber_widget.py:273 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:284 +#: buzz/widgets/recording_transcriber_widget.py:282 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:355 +#: buzz/widgets/recording_transcriber_widget.py:351 #, fuzzy msgid "Select Text Color" msgstr "選擇聲音檔案" -#: buzz/widgets/recording_transcriber_widget.py:373 +#: buzz/widgets/recording_transcriber_widget.py:368 #, fuzzy msgid "Select Background Color" msgstr "選擇聲音檔案" -#: buzz/widgets/recording_transcriber_widget.py:788 +#: buzz/widgets/recording_transcriber_widget.py:779 msgid "An error occurred while starting a new recording:" msgstr "開始新錄製出錯" -#: buzz/widgets/recording_transcriber_widget.py:792 +#: buzz/widgets/recording_transcriber_widget.py:783 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -709,7 +709,7 @@ msgid "Translate" msgstr "" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:175 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 msgid "Resize" msgstr "" @@ -809,110 +809,130 @@ msgid "Please enter OpenAI API Key in preferences" msgstr "" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 -msgid "Resize Options" +msgid "Extend end time" msgstr "" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +msgid "Extend endings by up to (seconds)" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +msgid "Extend endings" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +msgid "Resize Options" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:193 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +msgid "Available only if word level timings were disabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:204 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:212 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:220 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:232 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:104 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +msgid "Available only if word level timings were enabled during transcription" +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:126 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:141 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:167 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:172 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:180 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "取消錄製" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:220 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:247 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:287 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:352 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:364 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:373 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:375 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:399 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:414 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:529 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:429 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:434 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 #, fuzzy msgid "Save" msgstr "檔案" @@ -976,12 +996,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:427 +#: buzz/transcriber/recording_transcriber.py:430 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:431 +#: buzz/transcriber/recording_transcriber.py:434 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 " @@ -1354,15 +1374,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:244 buzz/model_loader.py:760 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:358 +#: buzz/transcriber/recording_transcriber.py:361 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:418 +#: buzz/transcriber/recording_transcriber.py:421 #, fuzzy msgid "Starting transcription..." msgstr "取消錄製" diff --git a/buzz/widgets/transcription_viewer/transcription_resizer_widget.py b/buzz/widgets/transcription_viewer/transcription_resizer_widget.py index cb8dfcfc..8760cdf8 100644 --- a/buzz/widgets/transcription_viewer/transcription_resizer_widget.py +++ b/buzz/widgets/transcription_viewer/transcription_resizer_widget.py @@ -153,6 +153,38 @@ class TranscriptionResizerWidget(QWidget): layout = QFormLayout(self) + # Extend segment endings + extend_label = QLabel(_("Extend end time"), self) + font = extend_label.font() + font.setWeight(QFont.Weight.Bold) + extend_label.setFont(font) + layout.addRow(extend_label) + + extend_group_box = QGroupBox(self) + extend_layout = QVBoxLayout(extend_group_box) + + self.extend_row = QHBoxLayout() + + self.extend_amount_label = QLabel(_("Extend endings by up to (seconds)"), self) + + self.extend_amount_input = LineEdit("0.2", self) + self.extend_amount_input.setMaximumWidth(60) + + self.extend_button = QPushButton(_("Extend endings")) + self.extend_button.clicked.connect(self.on_extend_button_clicked) + + self.extend_row.addWidget(self.extend_amount_label) + self.extend_row.addWidget(self.extend_amount_input) + self.extend_row.addWidget(self.extend_button) + + extend_layout.addLayout(self.extend_row) + + layout.addRow(extend_group_box) + + # Spacer + spacer1 = QSpacerItem(0, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + layout.addItem(spacer1) + # Resize longer subtitles resize_label = QLabel(_("Resize Options"), self) font = resize_label.font() @@ -182,12 +214,14 @@ class TranscriptionResizerWidget(QWidget): resize_layout.addLayout(self.resize_row) resize_group_box.setEnabled(self.transcription.word_level_timings != 1) + if self.transcription.word_level_timings == 1: + resize_group_box.setToolTip(_("Available only if word level timings were disabled during transcription")) layout.addRow(resize_group_box) # Spacer - spacer = QSpacerItem(0, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) - layout.addItem(spacer) + spacer2 = QSpacerItem(0, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) + layout.addItem(spacer2) # Merge words into subtitles merge_options_label = QLabel(_("Merge Options"), self) @@ -237,6 +271,8 @@ class TranscriptionResizerWidget(QWidget): merge_options_layout.addLayout(self.merge_options_row) merge_options_group_box.setEnabled(self.transcription.word_level_timings == 1) + if self.transcription.word_level_timings != 1: + merge_options_group_box.setToolTip(_("Available only if word level timings were enabled during transcription")) layout.addRow(merge_options_group_box) @@ -292,6 +328,44 @@ class TranscriptionResizerWidget(QWidget): if self.transcriptions_updated_signal: self.transcriptions_updated_signal.emit(new_transcript_id) + def on_extend_button_clicked(self): + try: + extend_amount_seconds = float(self.extend_amount_input.text()) + except ValueError: + extend_amount_seconds = 0.2 + + # Convert seconds to milliseconds (internal time unit) + extend_amount = int(extend_amount_seconds * 1000) + + segments = self.transcription_service.get_transcription_segments( + transcription_id=self.transcription.id_as_uuid + ) + + extended_segments = [] + for i, segment in enumerate(segments): + new_end = segment.end_time + extend_amount + + # Ensure segment end doesn't exceed start of next segment + if i < len(segments) - 1: + next_start = segments[i + 1].start_time + new_end = min(new_end, next_start) + + extended_segments.append( + Segment( + start=segment.start_time, + end=new_end, + text=segment.text + ) + ) + + new_transcript_id = self.transcription_service.copy_transcription( + self.transcription.id_as_uuid + ) + self.transcription_service.update_transcription_as_completed(new_transcript_id, extended_segments) + + if self.transcriptions_updated_signal: + self.transcriptions_updated_signal.emit(new_transcript_id) + def on_merge_button_clicked(self): self.new_transcript_id = self.transcription_service.copy_transcription( self.transcription.id_as_uuid diff --git a/tests/widgets/transcription_viewer_test.py b/tests/widgets/transcription_viewer_test.py index c948dede..fdf989f2 100644 --- a/tests/widgets/transcription_viewer_test.py +++ b/tests/widgets/transcription_viewer_test.py @@ -98,6 +98,71 @@ class TestTranscriptionViewerWidget: widget.close() + def test_should_extend_segment_endings(self, qtbot, transcription, transcription_service): + transcription_service.update_transcription_as_completed = MagicMock() + transcription_service.copy_transcription = MagicMock(return_value=uuid.uuid4()) + + mock_signal = MagicMock() + + widget = TranscriptionResizerWidget( + transcription=transcription, + transcription_service=transcription_service, + transcriptions_updated_signal=mock_signal + ) + widget.extend_amount_input.setText("0.2") + + qtbot.add_widget(widget) + + widget.on_extend_button_clicked() + + # Verify a new transcription is created + transcription_service.copy_transcription.assert_called_once_with(transcription.id_as_uuid) + + # Verify segments are updated + transcription_service.update_transcription_as_completed.assert_called_once() + + # Verify signal is emitted + mock_signal.emit.assert_called_once() + + # Verify segments are extended correctly + call_args = transcription_service.update_transcription_as_completed.call_args + new_transcript_id, segments = call_args[0] + + # Original segments: (40, 299, "Bien"), (299, 329, "venue dans") + # With 0.2s (200ms) extension: + # First segment: end should be min(299 + 200, 299) = 299 (capped by next segment start) + # Second segment: end should be 329 + 200 = 529 + assert len(segments) == 2 + assert segments[0].start == 40 + assert segments[0].end == 299 # Capped by next segment start + assert segments[1].start == 299 + assert segments[1].end == 529 # Extended by 200ms + + widget.close() + + def test_extend_with_invalid_input_uses_default(self, qtbot, transcription, transcription_service): + transcription_service.update_transcription_as_completed = MagicMock() + transcription_service.copy_transcription = MagicMock(return_value=uuid.uuid4()) + + widget = TranscriptionResizerWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + widget.extend_amount_input.setText("invalid") + + qtbot.add_widget(widget) + + widget.on_extend_button_clicked() + + # Should use default 0.2 seconds (200ms) + call_args = transcription_service.update_transcription_as_completed.call_args + new_transcript_id, segments = call_args[0] + + # Second segment should be extended by default 200ms + assert segments[1].end == 529 # 329 + 200 + + widget.close() + def test_on_merge_button_clicked(self, qtbot: QtBot, transcription, transcription_service): # Prerequisite: Merge button is only enabled if word_level_timings is True transcription.word_level_timings = True From 97b161990265b9d4b54979b58431008d8a9b3617 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 16 Jan 2026 14:31:48 +0200 Subject: [PATCH 08/37] Fix chinease word level timestamps (#1355) --- CLAUDE.md | 1 + Makefile | 2 +- buzz/__version__.py | 2 +- buzz/db/db.py | 1 - buzz/transcriber/whisper_cpp.py | 219 ++++++++++++------ buzz/widgets/main_window.py | 2 - .../transcriber/languages_combo_box.py | 8 +- .../transcription_resizer_widget.py | 21 +- docs/docs/usage/4_edit_and_resize.md | 4 +- pyproject.toml | 2 +- tests/transcriber/whisper_cpp_test.py | 180 +++++++++++++- uv.lock | 3 +- 12 files changed, 363 insertions(+), 82 deletions(-) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..1d471238 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +- Use uv to run tests and any scripts \ No newline at end of file diff --git a/Makefile b/Makefile index 5c485607..6b6db352 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Change also in pyproject.toml and buzz/__version__.py -version := 1.4.2 +version := 1.5.0 mac_app_path := ./dist/Buzz.app mac_zip_path := ./dist/Buzz-${version}-mac.zip diff --git a/buzz/__version__.py b/buzz/__version__.py index 94dc0808..177b9352 100644 --- a/buzz/__version__.py +++ b/buzz/__version__.py @@ -1 +1 @@ -VERSION = "1.4.2" +VERSION = "1.5.0" diff --git a/buzz/db/db.py b/buzz/db/db.py index 692e25c9..0abd40f8 100644 --- a/buzz/db/db.py +++ b/buzz/db/db.py @@ -49,5 +49,4 @@ def close_app_db(): return if db.isOpen(): - logging.debug("Closing database connection: %s", db.connectionName()) db.close() \ No newline at end of file diff --git a/buzz/transcriber/whisper_cpp.py b/buzz/transcriber/whisper_cpp.py index 3b609e6d..d5fa1775 100644 --- a/buzz/transcriber/whisper_cpp.py +++ b/buzz/transcriber/whisper_cpp.py @@ -180,79 +180,160 @@ class WhisperCpp: # Extract word-level timestamps from tokens array # Combine tokens into words using similar logic as whisper_cpp.py transcription = result.get("transcription", []) + + # Languages that don't use spaces between words + # For these, each token is treated as a separate word + non_space_languages = {"zh", "ja", "th", "lo", "km", "my"} + is_non_space_language = language in non_space_languages + for segment_data in transcription: tokens = segment_data.get("tokens", []) - - # Accumulate tokens into words - word_buffer = b"" - word_start = 0 - word_end = 0 - - def append_word(buffer: bytes, start: int, end: int): - """Try to decode and append a word segment, handling multi-byte UTF-8""" - if not buffer: - return True - - # Try to decode as UTF-8 - # https://github.com/ggerganov/whisper.cpp/issues/1798 - try: - text = buffer.decode("utf-8").strip() - if text: - segments.append( - Segment( - start=start, - end=end, - text=text, - translation="" + + if is_non_space_language: + # For languages without spaces (Chinese, Japanese, etc.), + # each complete UTF-8 character is treated as a separate word. + # Some characters may be split across multiple tokens as raw bytes. + char_buffer = b"" + char_start = 0 + char_end = 0 + + def flush_complete_chars(buffer: bytes, start: int, end: int): + """Extract and output all complete UTF-8 characters from buffer. + Returns any remaining incomplete bytes.""" + nonlocal segments + remaining = buffer + pos = 0 + + while pos < len(remaining): + # Try to decode one character at a time + for char_len in range(1, min(5, len(remaining) - pos + 1)): + try: + char = remaining[pos:pos + char_len].decode("utf-8") + # Successfully decoded a character + if char.strip(): + segments.append( + Segment( + start=start, + end=end, + text=char, + translation="" + ) + ) + pos += char_len + break + except UnicodeDecodeError: + if char_len == 4 or pos + char_len >= len(remaining): + # Incomplete character at end - return as remaining + return remaining[pos:] + else: + # Couldn't decode, might be incomplete at end + return remaining[pos:] + + return b"" + + for token_data in tokens: + token_text = token_data.get("text", "") + + # Skip special tokens like [_TT_], [_BEG_] + if token_text.startswith("[_"): + continue + + if not token_text: + continue + + token_start = int(token_data.get("offsets", {}).get("from", 0)) + token_end = int(token_data.get("offsets", {}).get("to", 0)) + + # Convert latin-1 string back to original bytes + token_bytes = token_text.encode("latin-1") + + if not char_buffer: + char_start = token_start + + char_buffer += token_bytes + char_end = token_end + + # Try to flush complete characters + char_buffer = flush_complete_chars(char_buffer, char_start, char_end) + + # If buffer was fully flushed, reset start time for next char + if not char_buffer: + char_start = token_end + + # Flush any remaining buffer at end of segment + if char_buffer: + flush_complete_chars(char_buffer, char_start, char_end) + else: + # For space-separated languages, accumulate tokens into words + word_buffer = b"" + word_start = 0 + word_end = 0 + + def append_word(buffer: bytes, start: int, end: int): + """Try to decode and append a word segment, handling multi-byte UTF-8""" + if not buffer: + return True + + # Try to decode as UTF-8 + # https://github.com/ggerganov/whisper.cpp/issues/1798 + try: + text = buffer.decode("utf-8").strip() + if text: + segments.append( + Segment( + start=start, + end=end, + text=text, + translation="" + ) ) - ) - return True - except UnicodeDecodeError: - # Multi-byte character is split, continue accumulating - return False - - for token_data in tokens: - # Token text is read as latin-1, need to convert to bytes to get original data - token_text = token_data.get("text", "") - - # Skip special tokens like [_TT_], [_BEG_] - if token_text.startswith("[_"): - continue - - if not token_text: - continue - - token_start = int(token_data.get("offsets", {}).get("from", 0)) - token_end = int(token_data.get("offsets", {}).get("to", 0)) - - # Convert latin-1 string back to original bytes - # (latin-1 preserves byte values as code points) - token_bytes = token_text.encode("latin-1") - - # Check if token starts with space - indicates new word - if token_bytes.startswith(b" ") and word_buffer: - # Save previous word - append_word(word_buffer, word_start, word_end) - # Start new word - word_buffer = token_bytes - word_start = token_start - word_end = token_end - elif token_bytes.startswith(b", "): - # Handle comma - save word with comma, then start new word - word_buffer += b"," - append_word(word_buffer, word_start, word_end) - word_buffer = token_bytes.lstrip(b",") - word_start = token_start - word_end = token_end - else: - # Accumulate token into current word - if not word_buffer: + return True + except UnicodeDecodeError: + # Multi-byte character is split, continue accumulating + return False + + for token_data in tokens: + # Token text is read as latin-1, need to convert to bytes to get original data + token_text = token_data.get("text", "") + + # Skip special tokens like [_TT_], [_BEG_] + if token_text.startswith("[_"): + continue + + if not token_text: + continue + + token_start = int(token_data.get("offsets", {}).get("from", 0)) + token_end = int(token_data.get("offsets", {}).get("to", 0)) + + # Convert latin-1 string back to original bytes + # (latin-1 preserves byte values as code points) + token_bytes = token_text.encode("latin-1") + + # Check if token starts with space - indicates new word + if token_bytes.startswith(b" ") and word_buffer: + # Save previous word + append_word(word_buffer, word_start, word_end) + # Start new word + word_buffer = token_bytes word_start = token_start - word_buffer += token_bytes - word_end = token_end - - # Add the last word - append_word(word_buffer, word_start, word_end) + word_end = token_end + elif token_bytes.startswith(b", "): + # Handle comma - save word with comma, then start new word + word_buffer += b"," + append_word(word_buffer, word_start, word_end) + word_buffer = token_bytes.lstrip(b",") + word_start = token_start + word_end = token_end + else: + # Accumulate token into current word + if not word_buffer: + word_start = token_start + word_buffer += token_bytes + word_end = token_end + + # Add the last word + append_word(word_buffer, word_start, word_end) else: # Use segment-level timestamps transcription = result.get("transcription", []) diff --git a/buzz/widgets/main_window.py b/buzz/widgets/main_window.py index eda7c7d6..a5914702 100644 --- a/buzz/widgets/main_window.py +++ b/buzz/widgets/main_window.py @@ -417,8 +417,6 @@ class MainWindow(QMainWindow): self.save_geometry() def closeEvent(self, event: QtGui.QCloseEvent) -> None: - logging.debug("Starting MainWindow closeEvent") - self.save_geometry() self.settings.settings.sync() diff --git a/buzz/widgets/transcriber/languages_combo_box.py b/buzz/widgets/transcriber/languages_combo_box.py index 7ab6c5b0..8ebc0e32 100644 --- a/buzz/widgets/transcriber/languages_combo_box.py +++ b/buzz/widgets/transcriber/languages_combo_box.py @@ -2,7 +2,7 @@ from typing import Optional import os from PyQt6.QtCore import pyqtSignal, Qt -from PyQt6.QtWidgets import QComboBox, QWidget +from PyQt6.QtWidgets import QComboBox, QWidget, QFrame from PyQt6.QtGui import QStandardItem, QStandardItemModel from buzz.locale import _ @@ -51,3 +51,9 @@ class LanguagesComboBox(QComboBox): def on_index_changed(self, index: int): self.languageChanged.emit(self.languages[index][0]) + + def showPopup(self): + super().showPopup() + popup = self.findChild(QFrame) + if popup and popup.height() > 400: + popup.setFixedHeight(400) diff --git a/buzz/widgets/transcription_viewer/transcription_resizer_widget.py b/buzz/widgets/transcription_viewer/transcription_resizer_widget.py index 8760cdf8..08f3cb48 100644 --- a/buzz/widgets/transcription_viewer/transcription_resizer_widget.py +++ b/buzz/widgets/transcription_viewer/transcription_resizer_widget.py @@ -36,6 +36,9 @@ from buzz.widgets.preferences_dialog.models.file_transcription_preferences impor SENTENCE_END = re.compile(r'.*[.!?。!?]') +# Languages that don't use spaces between words +NON_SPACE_LANGUAGES = {"zh", "ja", "th", "lo", "km", "my"} + class TranscriptionWorker(QObject): finished = pyqtSignal(list) @@ -51,16 +54,23 @@ class TranscriptionWorker(QObject): transcription_id=self.transcription.id_as_uuid ) + # Check if the language uses spaces between words + language = self.transcription.language or "" + is_non_space_language = language in NON_SPACE_LANGUAGES + + # For non-space languages, don't add spaces between words + separator = "" if is_non_space_language else " " + segments = [] words = [] text = "" for buzz_segment in buzz_segments: words.append({ - 'word': buzz_segment.text + " ", + 'word': buzz_segment.text + separator, 'start': buzz_segment.start_time / 100, 'end': buzz_segment.end_time / 100, }) - text += buzz_segment.text + " " + text += buzz_segment.text + separator if SENTENCE_END.match(buzz_segment.text): segments.append({ @@ -70,6 +80,13 @@ class TranscriptionWorker(QObject): words = [] text = "" + # Add any remaining words that weren't terminated by sentence-ending punctuation + if words: + segments.append({ + 'text': text, + 'words': words + }) + return { 'language': self.transcription.language, 'segments': segments diff --git a/docs/docs/usage/4_edit_and_resize.md b/docs/docs/usage/4_edit_and_resize.md index 8b51cc3f..cb79f482 100644 --- a/docs/docs/usage/4_edit_and_resize.md +++ b/docs/docs/usage/4_edit_and_resize.md @@ -8,4 +8,6 @@ When transcript of some audio or video file is generated you can edit it and exp Transcription view screen has option to resize the transcripts. Click on the "Resize" button so see available options. Transcripts that have been generated **with word-level timings** setting enabled can be combined into subtitles specifying different options, like maximum length of a subtitle and if subtitles should be split on punctuation. For transcripts that have been generated **without word-level timings** setting enabled can only be recombined specifying desired max length of a subtitle. -If audio file is still present on the system word-level timing merge will also analyze the audio for silences to improve subtitle accuracy. Subtitle generation from transcripts with word-level timings is available since version 1.3.0. \ No newline at end of file +If audio file is still present on the system word-level timing merge will also analyze the audio for silences to improve subtitle accuracy. Subtitle generation from transcripts with word-level timings is available since version 1.3.0. + +The resize tool also has an option to extend end time of segments if you want the subtitles to be on the screen for longer. You can specify the amount of time in seconds to extend each subtitle segment. Buzz will add this amount of time to the end of each subtitle segment making sure that the end of a segment does not go over start of the next segment. This feature is available since 1.5.0. \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 737a587e..7ada3306 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "buzz-captions" # Change also in Makefile and buzz/__version__.py -version = "1.4.2" +version = "1.5.0" description = "" authors = [{ name = "Chidi Williams", email = "williamschidi1@gmail.com" }] requires-python = ">=3.12,<3.13" diff --git a/tests/transcriber/whisper_cpp_test.py b/tests/transcriber/whisper_cpp_test.py index 203421fc..310f5f1d 100644 --- a/tests/transcriber/whisper_cpp_test.py +++ b/tests/transcriber/whisper_cpp_test.py @@ -1,3 +1,6 @@ +from unittest.mock import patch, MagicMock, mock_open +import json + from buzz.model_loader import TranscriptionModel, ModelType, WhisperModelSize from buzz.transcriber.transcriber import ( TranscriptionOptions, @@ -59,4 +62,179 @@ class TestWhisperCpp: assert "Mani" in segments[0].text assert "uzstrau" or "ustrau" in segments[1].text - assert "laikabstāk" in segments[2].text \ No newline at end of file + assert "laikabstāk" in segments[2].text + + def test_transcribe_chinese_multibyte_word_level_timestamps(self): + """Test that Chinese characters split across multiple tokens are properly combined. + + Chinese character 闻 (U+95FB) is encoded as UTF-8 bytes E9 97 BB. + Whisper.cpp may split this into separate tokens, e.g.: + - Token 1: bytes E9 97 (incomplete) + - Token 2: byte BB (completes the character) + + The code should combine these bytes and output 闻 as a single segment. + """ + # Mock JSON data simulating whisper.cpp output with split Chinese characters + # The character 闻 is split into two tokens: \xe9\x97 and \xbb + # The character 新 is a complete token + # Together they form 新闻 (news) + mock_json_data = { + "transcription": [ + { + "offsets": {"from": 0, "to": 5000}, + "text": "", # Not used in word-level processing + "tokens": [ + { + "text": "[_BEG_]", + "offsets": {"from": 0, "to": 0}, + }, + { + # 新 - complete character (UTF-8: E6 96 B0) + # When read as latin-1: \xe6\x96\xb0 + "text": "\xe6\x96\xb0", + "offsets": {"from": 100, "to": 200}, + }, + { + # First two bytes of 闻 (UTF-8: E9 97 BB) + # When read as latin-1: \xe9\x97 + "text": "\xe9\x97", + "offsets": {"from": 200, "to": 300}, + }, + { + # Last byte of 闻 + # When read as latin-1: \xbb + "text": "\xbb", + "offsets": {"from": 300, "to": 400}, + }, + { + "text": "[_TT_500]", + "offsets": {"from": 500, "to": 500}, + }, + ], + } + ] + } + + # Convert to JSON string using latin-1 compatible encoding + # We write bytes directly since the real file is read with latin-1 + json_bytes = json.dumps(mock_json_data, ensure_ascii=False).encode("latin-1") + + transcription_options = TranscriptionOptions( + language="zh", + task=Task.TRANSCRIBE, + word_level_timings=True, + model=TranscriptionModel( + model_type=ModelType.WHISPER_CPP, + whisper_model_size=WhisperModelSize.TINY, + ), + ) + + task = FileTranscriptionTask( + transcription_options=transcription_options, + file_transcription_options=FileTranscriptionOptions(), + model_path="/fake/model/path", + file_path="/fake/audio.wav", + ) + + # Mock subprocess.Popen to simulate whisper-cli execution + mock_process = MagicMock() + mock_process.stderr.readline.side_effect = [""] + mock_process.wait.return_value = None + mock_process.returncode = 0 + + with patch("buzz.transcriber.whisper_cpp.subprocess.Popen", return_value=mock_process): + with patch("buzz.transcriber.whisper_cpp.os.path.exists", return_value=True): + with patch("builtins.open", mock_open(read_data=json_bytes.decode("latin-1"))): + segments = WhisperCpp.transcribe(task=task) + + # Should have 2 segments: 新 and 闻 (each character separate) + assert len(segments) == 2 + assert segments[0].text == "新" + assert segments[1].text == "闻" + + # Verify timestamps + assert segments[0].start == 100 + assert segments[0].end == 200 + # 闻 spans from token at 200 to token ending at 400 + assert segments[1].start == 200 + assert segments[1].end == 400 + + def test_transcribe_chinese_mixed_complete_and_split_chars(self): + """Test a mix of complete and split Chinese characters.""" + # 大家好 - "Hello everyone" + # 大 (E5 A4 A7) - complete token + # 家 (E5 AE B6) - split into E5 AE and B6 + # 好 (E5 A5 BD) - complete token + mock_json_data = { + "transcription": [ + { + "offsets": {"from": 0, "to": 5000}, + "text": "", # Not used in word-level processing + "tokens": [ + { + "text": "[_BEG_]", + "offsets": {"from": 0, "to": 0}, + }, + { + # 大 - complete + "text": "\xe5\xa4\xa7", + "offsets": {"from": 100, "to": 200}, + }, + { + # First two bytes of 家 + "text": "\xe5\xae", + "offsets": {"from": 200, "to": 250}, + }, + { + # Last byte of 家 + "text": "\xb6", + "offsets": {"from": 250, "to": 300}, + }, + { + # 好 - complete + "text": "\xe5\xa5\xbd", + "offsets": {"from": 300, "to": 400}, + }, + ], + } + ] + } + + json_bytes = json.dumps(mock_json_data, ensure_ascii=False).encode("latin-1") + + transcription_options = TranscriptionOptions( + language="zh", + task=Task.TRANSCRIBE, + word_level_timings=True, + model=TranscriptionModel( + model_type=ModelType.WHISPER_CPP, + whisper_model_size=WhisperModelSize.TINY, + ), + ) + + task = FileTranscriptionTask( + transcription_options=transcription_options, + file_transcription_options=FileTranscriptionOptions(), + model_path="/fake/model/path", + file_path="/fake/audio.wav", + ) + + mock_process = MagicMock() + mock_process.stderr.readline.side_effect = [""] + mock_process.wait.return_value = None + mock_process.returncode = 0 + + with patch("buzz.transcriber.whisper_cpp.subprocess.Popen", return_value=mock_process): + with patch("buzz.transcriber.whisper_cpp.os.path.exists", return_value=True): + with patch("builtins.open", mock_open(read_data=json_bytes.decode("latin-1"))): + segments = WhisperCpp.transcribe(task=task) + + # Should have 3 segments: 大, 家, 好 + assert len(segments) == 3 + assert segments[0].text == "大" + assert segments[1].text == "家" + assert segments[2].text == "好" + + # Combined text + full_text = "".join(s.text for s in segments) + assert full_text == "大家好" \ No newline at end of file diff --git a/uv.lock b/uv.lock index e6f1d26d..f1dd4b56 100644 --- a/uv.lock +++ b/uv.lock @@ -274,7 +274,7 @@ wheels = [ [[package]] name = "buzz-captions" -version = "1.4.2" +version = "1.5.0" source = { editable = "." } dependencies = [ { name = "accelerate" }, @@ -1132,7 +1132,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/0a/a3871375c7b9727edaeeea994bfff7c63ff7804c9829c19309ba2e058807/greenlet-3.3.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:b01548f6e0b9e9784a2c99c5651e5dc89ffcbe870bc5fb2e5ef864e9cc6b5dcb", size = 276379, upload-time = "2025-12-04T14:23:30.498Z" }, { url = "https://files.pythonhosted.org/packages/43/ab/7ebfe34dce8b87be0d11dae91acbf76f7b8246bf9d6b319c741f99fa59c6/greenlet-3.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:349345b770dc88f81506c6861d22a6ccd422207829d2c854ae2af8025af303e3", size = 597294, upload-time = "2025-12-04T14:50:06.847Z" }, { url = "https://files.pythonhosted.org/packages/a4/39/f1c8da50024feecd0793dbd5e08f526809b8ab5609224a2da40aad3a7641/greenlet-3.3.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e8e18ed6995e9e2c0b4ed264d2cf89260ab3ac7e13555b8032b25a74c6d18655", size = 607742, upload-time = "2025-12-04T14:57:42.349Z" }, - { url = "https://files.pythonhosted.org/packages/77/cb/43692bcd5f7a0da6ec0ec6d58ee7cddb606d055ce94a62ac9b1aa481e969/greenlet-3.3.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c024b1e5696626890038e34f76140ed1daf858e37496d33f2af57f06189e70d7", size = 622297, upload-time = "2025-12-04T15:07:13.552Z" }, { url = "https://files.pythonhosted.org/packages/75/b0/6bde0b1011a60782108c01de5913c588cf51a839174538d266de15e4bf4d/greenlet-3.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:047ab3df20ede6a57c35c14bf5200fcf04039d50f908270d3f9a7a82064f543b", size = 609885, upload-time = "2025-12-04T14:26:02.368Z" }, { url = "https://files.pythonhosted.org/packages/49/0e/49b46ac39f931f59f987b7cd9f34bfec8ef81d2a1e6e00682f55be5de9f4/greenlet-3.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d9ad37fc657b1102ec880e637cccf20191581f75c64087a549e66c57e1ceb53", size = 1567424, upload-time = "2025-12-04T15:04:23.757Z" }, { url = "https://files.pythonhosted.org/packages/05/f5/49a9ac2dff7f10091935def9165c90236d8f175afb27cbed38fb1d61ab6b/greenlet-3.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83cd0e36932e0e7f36a64b732a6f60c2fc2df28c351bae79fbaf4f8092fe7614", size = 1636017, upload-time = "2025-12-04T14:27:29.688Z" }, From b14cf0e38679a86f0fc335169a1b85f3069ec0b9 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sat, 17 Jan 2026 07:59:27 +0200 Subject: [PATCH 09/37] Fix for HF hub SSL sertificate validation on Windows 10 (#1356) --- buzz/model_loader.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/buzz/model_loader.py b/buzz/model_loader.py index 6f41b0e3..2d28ebdd 100644 --- a/buzz/model_loader.py +++ b/buzz/model_loader.py @@ -15,13 +15,14 @@ import platform # This must be done before importing libraries that make HTTPS requests. try: import certifi - os.environ.setdefault("REQUESTS_CA_BUNDLE", certifi.where()) - os.environ.setdefault("SSL_CERT_FILE", certifi.where()) - os.environ.setdefault("SSL_CERT_DIR", os.path.dirname(certifi.where())) + _certifi_ca_bundle = certifi.where() + os.environ.setdefault("REQUESTS_CA_BUNDLE", _certifi_ca_bundle) + os.environ.setdefault("SSL_CERT_FILE", _certifi_ca_bundle) + os.environ.setdefault("SSL_CERT_DIR", os.path.dirname(_certifi_ca_bundle)) # Also update the default SSL context for urllib - ssl._create_default_https_context = lambda: ssl.create_default_context(cafile=certifi.where()) + ssl._create_default_https_context = lambda: ssl.create_default_context(cafile=_certifi_ca_bundle) except ImportError: - pass + _certifi_ca_bundle = None import requests import whisper @@ -36,6 +37,25 @@ from huggingface_hub.errors import LocalEntryNotFoundError from buzz.locale import _ +# Configure huggingface_hub to use certifi certificates directly. +# This is more reliable than environment variables for frozen apps. +if _certifi_ca_bundle is not None: + try: + from huggingface_hub import configure_http_backend + + def _hf_session_factory() -> requests.Session: + session = requests.Session() + session.verify = _certifi_ca_bundle + return session + + configure_http_backend(backend_factory=_hf_session_factory) + logging.debug(f"Configured huggingface_hub to use certifi CA bundle: {_certifi_ca_bundle}") + except ImportError: + # configure_http_backend not available in older huggingface_hub versions + pass + except Exception as e: + logging.debug(f"Failed to configure huggingface_hub HTTP backend: {e}") + # On Windows, creating symlinks requires special privileges (Developer Mode or # SeCreateSymbolicLinkPrivilege). Monkey-patch huggingface_hub to use file # copying instead of symlinks to avoid [WinError 1314] errors. From 759476315478c4a058d6cc2920ec0c816bd2ee32 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sat, 24 Jan 2026 20:30:15 +0200 Subject: [PATCH 10/37] Fix for gpt-4o models (#1361) --- .../openai_whisper_api_file_transcriber.py | 20 ++++++++++++------- docs/docs/faq.md | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/buzz/transcriber/openai_whisper_api_file_transcriber.py b/buzz/transcriber/openai_whisper_api_file_transcriber.py index 0413f7e4..b86b51ba 100644 --- a/buzz/transcriber/openai_whisper_api_file_transcriber.py +++ b/buzz/transcriber/openai_whisper_api_file_transcriber.py @@ -183,17 +183,22 @@ class OpenAIWhisperAPIFileTranscriber(FileTranscriber): return segments @staticmethod - def get_value(segment, key): + def get_value(segment, key, default=None): if hasattr(segment, key): return getattr(segment, key) - return segment[key] + if isinstance(segment, dict): + return segment.get(key, default) + return default def get_segments_for_file(self, file: str, offset_ms: int = 0): with open(file, "rb") as file: + # gpt-4o models don't support verbose_json format + response_format = "json" if self.whisper_api_model.startswith("gpt-4o") else "verbose_json" + options = { "model": self.whisper_api_model, "file": file, - "response_format": "verbose_json", + "response_format": response_format, "prompt": self.transcription_task.transcription_options.initial_prompt, } @@ -219,7 +224,8 @@ class OpenAIWhisperAPIFileTranscriber(FileTranscriber): if "segments" in transcript.model_extra: segments = transcript.model_extra["segments"] else: - segments = [{"words": words}] + # gpt-4o models return only text without segments/timestamps + segments = [{"text": transcript.text, "start": 0, "end": 0, "words": words}] result_segments = [] if self.word_level_timings: @@ -274,9 +280,9 @@ class OpenAIWhisperAPIFileTranscriber(FileTranscriber): else: result_segments = [ Segment( - int(self.get_value(segment, "start") * 1000 + offset_ms), - int(self.get_value(segment,"end") * 1000 + offset_ms), - self.get_value(segment,"text"), + int(self.get_value(segment, "start", 0) * 1000 + offset_ms), + int(self.get_value(segment, "end", 0) * 1000 + offset_ms), + self.get_value(segment, "text", ""), ) for segment in segments ] diff --git a/docs/docs/faq.md b/docs/docs/faq.md index d1f91af8..88723b7f 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -37,7 +37,7 @@ When choosing among large models consider the following. "Large" is the first re 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. +- **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. From 6f6bc53c5408a420febb7bebe707e08aa8e4478a Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 25 Jan 2026 11:42:09 +0200 Subject: [PATCH 11/37] Fix for whisper.cpp on older cpus (#1362) --- Makefile | 9 ++++++--- buzz/__version__.py | 2 +- buzz/model_loader.py | 1 - docs/docs/usage/4_edit_and_resize.md | 2 +- pyproject.toml | 2 +- share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml | 6 ++++++ uv.lock | 7 ++++--- 7 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 6b6db352..e8a20d32 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Change also in pyproject.toml and buzz/__version__.py -version := 1.5.0 +version := 1.4.3 mac_app_path := ./dist/Buzz.app mac_zip_path := ./dist/Buzz-${version}-mac.zip @@ -52,7 +52,8 @@ ifeq ($(OS), Windows_NT) # The _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR is needed to prevent mutex lock issues on Windows # https://github.com/actions/runner-images/issues/10004#issuecomment-2156109231 # -DCMAKE_[C|CXX]_COMPILER_WORKS=TRUE is used to prevent issue in building test program that fails on CI - cmake -S whisper.cpp -B whisper.cpp/build/ -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_RPATH='$$ORIGIN' -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DCMAKE_C_FLAGS="-D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR" -DCMAKE_CXX_FLAGS="-D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR" -DCMAKE_C_COMPILER_WORKS=TRUE -DCMAKE_CXX_COMPILER_WORKS=TRUE -DGGML_VULKAN=1 + # GGML_NATIVE=OFF ensures we don't use -march=native (which would target the build machine's CPU) + cmake -S whisper.cpp -B whisper.cpp/build/ -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_RPATH='$$ORIGIN' -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DCMAKE_C_FLAGS="-D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR" -DCMAKE_CXX_FLAGS="-D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR" -DCMAKE_C_COMPILER_WORKS=TRUE -DCMAKE_CXX_COMPILER_WORKS=TRUE -DGGML_VULKAN=1 -DGGML_NATIVE=OFF cmake --build whisper.cpp/build -j --config Release --verbose -mkdir buzz/whisper_cpp @@ -63,9 +64,11 @@ endif ifeq ($(shell uname -s), Linux) # Build Whisper with Vulkan support + # GGML_NATIVE=OFF ensures we don't use -march=native (which would target the build machine's CPU) + # This enables portable SSE4.2/AVX/AVX2 optimizations that work on most x86_64 CPUs rm -rf whisper.cpp/build || true -mkdir -p buzz/whisper_cpp - cmake -S whisper.cpp -B whisper.cpp/build/ -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_RPATH='$$ORIGIN' -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DGGML_VULKAN=1 + cmake -S whisper.cpp -B whisper.cpp/build/ -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_RPATH='$$ORIGIN' -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DGGML_VULKAN=1 -DGGML_NATIVE=OFF cmake --build whisper.cpp/build -j --config Release --verbose cp whisper.cpp/build/bin/whisper-cli buzz/whisper_cpp/ || true cp whisper.cpp/build/bin/whisper-server buzz/whisper_cpp/ || true diff --git a/buzz/__version__.py b/buzz/__version__.py index 177b9352..fd870296 100644 --- a/buzz/__version__.py +++ b/buzz/__version__.py @@ -1 +1 @@ -VERSION = "1.5.0" +VERSION = "1.4.3" diff --git a/buzz/model_loader.py b/buzz/model_loader.py index 2d28ebdd..224bd6d3 100644 --- a/buzz/model_loader.py +++ b/buzz/model_loader.py @@ -49,7 +49,6 @@ if _certifi_ca_bundle is not None: return session configure_http_backend(backend_factory=_hf_session_factory) - logging.debug(f"Configured huggingface_hub to use certifi CA bundle: {_certifi_ca_bundle}") except ImportError: # configure_http_backend not available in older huggingface_hub versions pass diff --git a/docs/docs/usage/4_edit_and_resize.md b/docs/docs/usage/4_edit_and_resize.md index cb79f482..7bdf92bb 100644 --- a/docs/docs/usage/4_edit_and_resize.md +++ b/docs/docs/usage/4_edit_and_resize.md @@ -10,4 +10,4 @@ Transcription view screen has option to resize the transcripts. Click on the "Re If audio file is still present on the system word-level timing merge will also analyze the audio for silences to improve subtitle accuracy. Subtitle generation from transcripts with word-level timings is available since version 1.3.0. -The resize tool also has an option to extend end time of segments if you want the subtitles to be on the screen for longer. You can specify the amount of time in seconds to extend each subtitle segment. Buzz will add this amount of time to the end of each subtitle segment making sure that the end of a segment does not go over start of the next segment. This feature is available since 1.5.0. \ No newline at end of file +The resize tool also has an option to extend end time of segments if you want the subtitles to be on the screen for longer. You can specify the amount of time in seconds to extend each subtitle segment. Buzz will add this amount of time to the end of each subtitle segment making sure that the end of a segment does not go over start of the next segment. This feature is available since 1.4.3. \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 7ada3306..8f26e4ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "buzz-captions" # Change also in Makefile and buzz/__version__.py -version = "1.5.0" +version = "1.4.3" description = "" authors = [{ name = "Chidi Williams", email = "williamschidi1@gmail.com" }] requires-python = ">=3.12,<3.13" diff --git a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml index 58f5ddb2..2b7bd1ab 100644 --- a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml +++ b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml @@ -65,6 +65,12 @@ + + https://github.com/chidiwilliams/buzz/releases/tag/v1.4.3 + +

Fixed support for whisper.cpp on older CPUs and issues in speaker identification.

+
+
https://github.com/chidiwilliams/buzz/releases/tag/v1.4.2 diff --git a/uv.lock b/uv.lock index f1dd4b56..674b0ef3 100644 --- a/uv.lock +++ b/uv.lock @@ -274,7 +274,7 @@ wheels = [ [[package]] name = "buzz-captions" -version = "1.5.0" +version = "1.4.3" source = { editable = "." } dependencies = [ { name = "accelerate" }, @@ -1132,6 +1132,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/0a/a3871375c7b9727edaeeea994bfff7c63ff7804c9829c19309ba2e058807/greenlet-3.3.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:b01548f6e0b9e9784a2c99c5651e5dc89ffcbe870bc5fb2e5ef864e9cc6b5dcb", size = 276379, upload-time = "2025-12-04T14:23:30.498Z" }, { url = "https://files.pythonhosted.org/packages/43/ab/7ebfe34dce8b87be0d11dae91acbf76f7b8246bf9d6b319c741f99fa59c6/greenlet-3.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:349345b770dc88f81506c6861d22a6ccd422207829d2c854ae2af8025af303e3", size = 597294, upload-time = "2025-12-04T14:50:06.847Z" }, { url = "https://files.pythonhosted.org/packages/a4/39/f1c8da50024feecd0793dbd5e08f526809b8ab5609224a2da40aad3a7641/greenlet-3.3.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e8e18ed6995e9e2c0b4ed264d2cf89260ab3ac7e13555b8032b25a74c6d18655", size = 607742, upload-time = "2025-12-04T14:57:42.349Z" }, + { url = "https://files.pythonhosted.org/packages/77/cb/43692bcd5f7a0da6ec0ec6d58ee7cddb606d055ce94a62ac9b1aa481e969/greenlet-3.3.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c024b1e5696626890038e34f76140ed1daf858e37496d33f2af57f06189e70d7", size = 622297, upload-time = "2025-12-04T15:07:13.552Z" }, { url = "https://files.pythonhosted.org/packages/75/b0/6bde0b1011a60782108c01de5913c588cf51a839174538d266de15e4bf4d/greenlet-3.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:047ab3df20ede6a57c35c14bf5200fcf04039d50f908270d3f9a7a82064f543b", size = 609885, upload-time = "2025-12-04T14:26:02.368Z" }, { url = "https://files.pythonhosted.org/packages/49/0e/49b46ac39f931f59f987b7cd9f34bfec8ef81d2a1e6e00682f55be5de9f4/greenlet-3.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d9ad37fc657b1102ec880e637cccf20191581f75c64087a549e66c57e1ceb53", size = 1567424, upload-time = "2025-12-04T15:04:23.757Z" }, { url = "https://files.pythonhosted.org/packages/05/f5/49a9ac2dff7f10091935def9165c90236d8f175afb27cbed38fb1d61ab6b/greenlet-3.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83cd0e36932e0e7f36a64b732a6f60c2fc2df28c351bae79fbaf4f8092fe7614", size = 1636017, upload-time = "2025-12-04T14:27:29.688Z" }, @@ -4289,8 +4290,8 @@ dependencies = [ { name = "setuptools", marker = "sys_platform != 'darwin'" }, ] wheels = [ - { url = "https://download.pytorch.org/whl/triton-3.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl" }, - { url = "https://download.pytorch.org/whl/triton-3.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/triton-3.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ea4a1c15f079bbf49ff02c312210fdb8ff05b1503ea30812610e2a3b171f3b" }, + { url = "https://download.pytorch.org/whl/triton-3.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8550672b1184f05187f4140db32e33e61b592046fd3e1eb907e3b7db5321b750" }, ] [[package]] From 0d446a996476e889ff4ba8b47d41a915a8a34491 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 25 Jan 2026 13:37:52 +0200 Subject: [PATCH 12/37] Will increase build workflow timeout (#1363) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a6a28976..e85b2b63 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,7 +105,7 @@ jobs: build: runs-on: ${{ matrix.os }} - timeout-minutes: 60 + timeout-minutes: 90 env: BUZZ_DISABLE_TELEMETRY: true strategy: From a94d8fbd0d0a8f8a859e40e4caa202391135d079 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 25 Jan 2026 20:44:49 +0200 Subject: [PATCH 13/37] Will validate audio before transcribing (#1364) --- README.md | 16 ++--- buzz/transcriber/whisper_file_transcriber.py | 71 ++++++++++++++------ 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index bf2498b1..58327510 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ OpenAI's [Whisper](https://github.com/openai/whisper). ![GitHub release (latest by date)](https://img.shields.io/github/v/release/chidiwilliams/buzz) [![Github all releases](https://img.shields.io/github/downloads/chidiwilliams/buzz/total.svg)](https://GitHub.com/chidiwilliams/buzz/releases/) -![Buzz](./buzz/assets/buzz-banner.jpg) +![Buzz](https://raw.githubusercontent.com/chidiwilliams/buzz/refs/heads/main/buzz/assets/buzz-banner.jpg) ## Features - Transcribe audio and video files or Youtube links @@ -91,12 +91,12 @@ For info on how to get latest development version with latest features and bug f ### Screenshots
- File import - Main screen - Preferences - Model preferences - Transcript - Live recording - Resize + File import + Main screen + Preferences + Model preferences + Transcript + Live recording + Resize
diff --git a/buzz/transcriber/whisper_file_transcriber.py b/buzz/transcriber/whisper_file_transcriber.py index 0badcdbf..ef75885f 100644 --- a/buzz/transcriber/whisper_file_transcriber.py +++ b/buzz/transcriber/whisper_file_transcriber.py @@ -28,6 +28,7 @@ from buzz.transcriber.file_transcriber import FileTranscriber from buzz.transcriber.transcriber import FileTranscriptionTask, Segment, Task from buzz.transcriber.whisper_cpp import WhisperCpp +import av import faster_whisper import whisper import stable_whisper @@ -36,6 +37,22 @@ from stable_whisper import WhisperResult PROGRESS_REGEX = re.compile(r"\d+(\.\d+)?%") +def check_file_has_audio_stream(file_path: str) -> None: + """Check if a media file has at least one audio stream. + + Raises: + ValueError: If the file has no audio streams. + """ + try: + with av.open(file_path) as container: + if len(container.streams.audio) == 0: + raise ValueError("No audio streams found") + except av.error.InvalidDataError as e: + raise ValueError(f"Invalid media file: {e}") + except av.error.FileNotFoundError: + raise ValueError("File not found") + + class WhisperFileTranscriber(FileTranscriber): """WhisperFileTranscriber transcribes an audio file to text, writes the text to a file, and then opens the file using the default program for opening txt files.""" @@ -54,6 +71,7 @@ class WhisperFileTranscriber(FileTranscriber): self.stopped = False self.recv_pipe = None self.send_pipe = None + self.error_message = None def transcribe(self) -> List[Segment]: time_started = datetime.datetime.now() @@ -119,7 +137,7 @@ class WhisperFileTranscriber(FileTranscriber): logging.debug("Whisper process was terminated (exit code: %s), treating as cancellation", self.current_process.exitcode) raise Exception("Transcription was canceled") else: - raise Exception("Unknown error") + raise Exception(self.error_message or "Unknown error") return self.segments @@ -158,27 +176,36 @@ class WhisperFileTranscriber(FileTranscriber): subprocess.run = _patched_run subprocess.Popen = _PatchedPopen - with pipe_stderr(stderr_conn): - if task.transcription_options.model.model_type == ModelType.WHISPER_CPP: - segments = cls.transcribe_whisper_cpp(task) - elif task.transcription_options.model.model_type == ModelType.HUGGING_FACE: - sys.stderr.write("0%\n") - segments = cls.transcribe_hugging_face(task) - sys.stderr.write("100%\n") - elif ( - task.transcription_options.model.model_type == ModelType.FASTER_WHISPER - ): - segments = cls.transcribe_faster_whisper(task) - elif task.transcription_options.model.model_type == ModelType.WHISPER: - segments = cls.transcribe_openai_whisper(task) - else: - raise Exception( - f"Invalid model type: {task.transcription_options.model.model_type}" - ) + try: + # Check if the file has audio streams before processing + check_file_has_audio_stream(task.file_path) - segments_json = json.dumps(segments, ensure_ascii=True, default=vars) - sys.stderr.write(f"segments = {segments_json}\n") - sys.stderr.write(WhisperFileTranscriber.READ_LINE_THREAD_STOP_TOKEN + "\n") + with pipe_stderr(stderr_conn): + if task.transcription_options.model.model_type == ModelType.WHISPER_CPP: + segments = cls.transcribe_whisper_cpp(task) + elif task.transcription_options.model.model_type == ModelType.HUGGING_FACE: + sys.stderr.write("0%\n") + segments = cls.transcribe_hugging_face(task) + sys.stderr.write("100%\n") + elif ( + task.transcription_options.model.model_type == ModelType.FASTER_WHISPER + ): + segments = cls.transcribe_faster_whisper(task) + elif task.transcription_options.model.model_type == ModelType.WHISPER: + segments = cls.transcribe_openai_whisper(task) + else: + raise Exception( + f"Invalid model type: {task.transcription_options.model.model_type}" + ) + + segments_json = json.dumps(segments, ensure_ascii=True, default=vars) + sys.stderr.write(f"segments = {segments_json}\n") + sys.stderr.write(WhisperFileTranscriber.READ_LINE_THREAD_STOP_TOKEN + "\n") + except Exception as e: + # Send error message back to the parent process + stderr_conn.send(f"error = {str(e)}\n") + stderr_conn.send(WhisperFileTranscriber.READ_LINE_THREAD_STOP_TOKEN + "\n") + raise @classmethod def transcribe_whisper_cpp(cls, task: FileTranscriptionTask) -> List[Segment]: @@ -415,6 +442,8 @@ class WhisperFileTranscriber(FileTranscriber): for segment in segments_dict ] self.segments = segments + elif line.startswith("error = "): + self.error_message = line[8:] else: try: match = PROGRESS_REGEX.search(line) From 7f14fbe576ed15879670856877292a8279631ed5 Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Mon, 26 Jan 2026 09:13:14 +0100 Subject: [PATCH 14/37] Update Italian translations in buzz.po (#1365) --- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 47b4438f..7a3178e8 100644 --- a/buzz/locale/it_IT/LC_MESSAGES/buzz.po +++ b/buzz/locale/it_IT/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: buzz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-16 11:27+0200\n" -"PO-Revision-Date: 2026-01-03 10:42+0200\n" +"PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" "MIME-Version: 1.0\n" @@ -812,15 +812,15 @@ msgstr "Inserisci la chiave API OpenAI nelle preferenze" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 msgid "Extend end time" -msgstr "" +msgstr "Estendi l'orario di fine" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "Estendi le terminazioni fino a (secondi)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 msgid "Extend endings" -msgstr "" +msgstr "Estendere i finali" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 msgid "Resize Options" @@ -832,7 +832,7 @@ msgstr "Lunghezza desiderata dei sottotitoli" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "Disponibile solo se i tempi a livello di parola sono stati disabilitati durante la trascrizione" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 msgid "Merge Options" @@ -856,7 +856,7 @@ msgstr "Unione" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "Disponibile solo se i tempi a livello di parola sono stati abilitati durante la trascrizione" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" From 37f5628c49ceae20eb93d7d4dbbf9e23f2f63a90 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 6 Feb 2026 10:42:08 +0200 Subject: [PATCH 15/37] Speaker identification improvements (#1372) --- .github/workflows/snapcraft.yml | 38 ++++++++- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/en_US/LC_MESSAGES/buzz.po | 71 +++++++++------- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 81 +++++++++++-------- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 73 +++++++++-------- buzz/locale/nl/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 73 ++++++++++------- buzz/transcriber/recording_transcriber.py | 4 +- .../speaker_identification_widget.py | 42 +++++++++- 17 files changed, 666 insertions(+), 446 deletions(-) diff --git a/.github/workflows/snapcraft.yml b/.github/workflows/snapcraft.yml index 286fe59c..2224688f 100644 --- a/.github/workflows/snapcraft.yml +++ b/.github/workflows/snapcraft.yml @@ -14,7 +14,7 @@ concurrency: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 90 env: BUZZ_DISABLE_TELEMETRY: true @@ -34,18 +34,50 @@ jobs: - name: Maximize build space uses: easimon/maximize-build-space@master with: - root-reserve-mb: 26000 + root-reserve-mb: 45000 swap-size-mb: 1024 remove-dotnet: 'true' remove-android: 'true' remove-haskell: 'true' remove-codeql: 'true' remove-docker-images: 'true' + - name: Check available disk space + run: | + echo "=== Disk space ===" + df -h + echo "=== Memory ===" + free -h - uses: actions/checkout@v4 with: submodules: recursive - - uses: snapcore/action-build@v1.3.0 + - name: Install Snapcraft and dependencies + run: | + set -x + # Ensure snapd is ready + sudo systemctl start snapd.socket + sudo snap wait system seed.loaded + + echo "=== Installing snapcraft ===" + sudo snap install --classic snapcraft + + echo "=== Installing gnome extension dependencies ===" + sudo snap install gnome-46-2404 || { echo "Failed to install gnome-46-2404"; sudo journalctl -u snapd --no-pager -n 50; exit 1; } + sudo snap install gnome-46-2404-sdk || { echo "Failed to install gnome-46-2404-sdk"; sudo journalctl -u snapd --no-pager -n 50; exit 1; } + + echo "=== Installing build-snaps ===" + sudo snap install --classic astral-uv || { echo "Failed to install astral-uv"; sudo journalctl -u snapd --no-pager -n 50; exit 1; } + + echo "=== Installed snaps ===" + snap list + - name: Check disk space before build + run: df -h + - name: Build snap id: snapcraft + env: + SNAPCRAFT_BUILD_ENVIRONMENT: host + run: | + sudo -E snapcraft pack --verbose --destructive-mode + echo "snap=$(ls *.snap)" >> $GITHUB_OUTPUT - run: | sudo apt-get update sudo apt-get install libportaudio2 libtbb-dev diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index d669c47f..679658da 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -36,6 +36,7 @@ msgstr "D’acord" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -335,8 +336,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Error" @@ -709,7 +710,7 @@ msgid "Translate" msgstr "Traduir" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "Redimensionar" @@ -811,51 +812,51 @@ msgstr "Clau API necessària" msgid "Please enter OpenAI API Key in preferences" msgstr "Introduïu la clau API d'OpenAI a les preferències" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "Opcions de redimensionament" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "Longitud desitjada dels subtítols" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "Opcions de fusió" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "Fusiona per buit" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "Divideix per puntuació" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "Divideix per la longitud màxima" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "Fusiona" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -885,61 +886,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Cancel·la la transcripció" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "Desa el fitxer" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "Cancel·lar" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "Cancel·lat" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "Desa el fitxer" @@ -1378,7 +1389,7 @@ msgstr "Sundanès" msgid "Cantonese" msgstr "Cantonès" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "S'ha produït un error de connexió" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index 98f3e484..f916fc62 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -33,6 +33,7 @@ msgstr "OK" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -334,8 +335,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Fejl" @@ -706,7 +707,7 @@ msgid "Translate" msgstr "Oversæt" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "Behandel størrelse" @@ -805,51 +806,51 @@ msgstr "API-nøgle påkrævet" msgid "Please enter OpenAI API Key in preferences" msgstr "Indtast venligst OpenAI API-nøgle i indstillinger" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "Størrelsesindstillinger" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "Ønskede undertekst længde" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "Sammenfletningsindstillinger" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "Sammenflet ved hul" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "Split ved punktum" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "Split ved max længde" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "Sammenflet" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -879,61 +880,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Afbryd transkription" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "Gem fil" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "Afbryd" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "Afbrudt" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "Gem fil" @@ -1368,7 +1379,7 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Der er opstået en forbindelsesfejl" diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index ce47c410..c7ea808f 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -35,6 +35,7 @@ msgstr "OK" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -334,8 +335,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Fehler" @@ -707,7 +708,7 @@ msgid "Translate" msgstr "Übersetzen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "Größe ändern" @@ -806,51 +807,51 @@ msgstr "API-Schlüssel erforderlich" msgid "Please enter OpenAI API Key in preferences" msgstr "Bitte geben Sie den OpenAI-API-Schlüssel in den Einstellungen ein" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "Größenänderungsoptionen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "Gewünschte Untertitellänge" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "Zusammenführungsoptionen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "Nach Abstand zusammenführen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "Durch Satzzeichen getrennt" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "Aufgeteilt nach maximaler Länge" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "Vereinigen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -880,61 +881,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Transkription abbrechen" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "Datei speichern" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "Abbrechen" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "Abgebrochen" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "Datei speichern" @@ -1370,7 +1381,7 @@ msgstr "Sundanesisch" msgid "Cantonese" msgstr "Kantonesisch" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Ein Verbindungsfehler ist aufgetreten" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index 01a94a62..d6d7e1a0 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -36,6 +36,7 @@ msgstr "" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -324,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "" @@ -685,7 +686,7 @@ msgid "Translate" msgstr "" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "" @@ -784,51 +785,51 @@ msgstr "" msgid "Please enter OpenAI API Key in preferences" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -858,59 +859,67 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 msgid "5/8 Preparing transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 msgid "Save" msgstr "" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +msgid "Cancelling..." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +msgid "Cancelled" +msgstr "" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "" @@ -1342,7 +1351,7 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "" diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index fa930688..c9e05f66 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -36,6 +36,7 @@ msgstr "Ok" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -342,8 +343,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Error" @@ -749,7 +750,7 @@ msgid "Translate" msgstr "Traducir" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "Cambiar el tamaño" @@ -854,51 +855,51 @@ msgstr "Clave de API requerida" msgid "Please enter OpenAI API Key in preferences" msgstr "Ingrese la clave API de OpenAI en las preferencias" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "Opciones de cambio de tamaño" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "Longitud deseada de los subtítulos" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "Opciones de fusión" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "Fusión por hueco" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "Dividido por puntuación" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "Dividido por la longitud máxima" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "Fusión" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -929,62 +930,72 @@ msgid "4/8 Processing audio" msgstr "" # automatic translation -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Cancelar transcripción" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" # automatic translation -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "Guardar archivo" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "Cancelar" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "Cancelado" + # automatic translation #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" @@ -1432,7 +1443,7 @@ msgstr "Sundanés" msgid "Cantonese" msgstr "Cantonés" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Se ha producido un error de conexión" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 7a3178e8..4853a48e 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -35,6 +35,7 @@ msgstr "Ok" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -335,8 +336,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Errore" @@ -707,7 +708,7 @@ msgid "Translate" msgstr "Tradurre" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "Ridimensionare" @@ -810,53 +811,57 @@ msgstr "Chiave API richiesta" msgid "Please enter OpenAI API Key in preferences" msgstr "Inserisci la chiave API OpenAI nelle preferenze" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "Estendi l'orario di fine" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "Estendi le terminazioni fino a (secondi)" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "Estendere i finali" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "Opzioni di ridimensionamento" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "Lunghezza desiderata dei sottotitoli" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" -msgstr "Disponibile solo se i tempi a livello di parola sono stati disabilitati durante la trascrizione" +msgstr "" +"Disponibile solo se i tempi a livello di parola sono stati disabilitati " +"durante la trascrizione" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "Opzioni di unione" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "Unito per spazio" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "Diviso per punteggiatura" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "Diviso per lunghezza massima" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "Unione" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" -msgstr "Disponibile solo se i tempi a livello di parola sono stati abilitati durante la trascrizione" +msgstr "" +"Disponibile solo se i tempi a livello di parola sono stati abilitati durante " +"la trascrizione" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 msgid "1/8 Collecting transcripts" @@ -887,59 +892,69 @@ msgstr "" msgid "4/8 Processing audio" msgstr "4/8 Elaborazione audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 msgid "5/8 Preparing transcripts" msgstr "5/8 Preparazione delle trascrizioni" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "6/8 Identificazione dei parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "7/8 Mappatura dei parlanti sulle trascrizioni" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "8/8 Identificazione effettuata" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "0/0 Errore nell'identificazione dei parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "Fase 1: identificare i parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "Identificare" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "Pronto a identificare i parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "File audio non trovato" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "Fase 2: nomi dei parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "Ascolta il campione" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "Unisci le frasi del parlante" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 msgid "Save" msgstr "Salva" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "Annulla" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "Annullato" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "Salva file" @@ -1377,7 +1392,7 @@ msgstr "Sundanese" msgid "Cantonese" msgstr "Cantonese" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Si è verificato un errore di connessione" diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 0ecc8bd8..e5e67066 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -31,6 +31,7 @@ msgstr "Ok" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -330,8 +331,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "エラー" @@ -702,7 +703,7 @@ msgid "Translate" msgstr "翻訳" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "リサイズ" @@ -801,52 +802,52 @@ msgstr "APIキーが必要" msgid "Please enter OpenAI API Key in preferences" msgstr "設定画面でOpenAI APIキーを入力してください" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 #, fuzzy msgid "Resize Options" msgstr "リサイズ" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "希望する字幕の長さ" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -876,61 +877,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "文字起こしをキャンセルする" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "ファイルを保存" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "キャンセル" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "キャンセル済み" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "ファイルを保存" @@ -1363,7 +1374,7 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "接続エラーが発生しました" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 390346ce..1dc854bb 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: 2026-01-16 11:27+0200\n" -"PO-Revision-Date: 2026-01-16 11:30+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" +"PO-Revision-Date: 2026-02-01 11:54+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -36,6 +36,7 @@ msgstr "Labi" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -337,8 +338,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Kļūda" @@ -708,7 +709,7 @@ msgid "Translate" msgstr "Tulkot" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "Mainīt garumu" @@ -809,51 +810,51 @@ msgstr "API atslēgas kļūda" msgid "Please enter OpenAI API Key in preferences" msgstr "Lūdzu ievadiet OpenAI API atslēgu iestatījumos" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "Pagarināt beigu laiku" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "Palielināt beigu laiku par (sekundes)" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "Palielināt" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "Garuma maiņas iestatījumi" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "Vēlamais teksta garums" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "Pieejami tikai, ierakstiem, kas atpazīti bez dalīšanas pa vārdiem" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "Apvienošanas iestatījumi" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "Apvienot pēc attāluma" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "Dalīt pie pieturzīmēm" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "Dalīt pie maksimālā garuma" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "Apvienot" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "Pieejami tikai, ierakstiem, kas atpazīti ar dalīšanu pa vārdiem" @@ -885,59 +886,67 @@ msgstr "" msgid "4/8 Processing audio" msgstr "4/8 Apstrādā audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 msgid "5/8 Preparing transcripts" msgstr "5/8 Sagatavo transkripcijas" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "6/8 Nosaka runātājus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "7/8 Marķē runātāju teikumus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "8/8 Runātāju noteikšana pabeigta" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "0/0 Kļūda nosakot runātājus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "1. solis: Runātāju noteikšana" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "Noteikt" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "Gatavs noteikt runātājus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "Audio datne nav atrasta" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "2. solis: Runātāju identifikācija" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "Atskaņot paraugu" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "Apvienot secīgus runātāja teikumus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 msgid "Save" msgstr "Saglabāt" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +msgid "Cancelling..." +msgstr "Atceļ..." + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +msgid "Cancelled" +msgstr "Atcelts" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "Saglabāt failu" @@ -1376,7 +1385,7 @@ msgstr "Sundāņu" msgid "Cantonese" msgstr "Kantonas" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Notika savienojuma kļūda" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 66d641e5..745ffb9b 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -38,6 +38,7 @@ msgstr "Oké" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -336,8 +337,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Foutmelding" @@ -707,7 +708,7 @@ msgid "Translate" msgstr "Vertalen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "Grootte" @@ -806,51 +807,51 @@ msgstr "Api-sleutel vereist" msgid "Please enter OpenAI API Key in preferences" msgstr "Voer de OpenAI-api-sleutel in in de instellingen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "Grootteopties" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "Voorkeurslengte van ondertiteling" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "Samenvoegopties" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "Samenvoegen op basis van tussenruimte" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "Splitsen op basis van leestekens" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "Splitsen op basis van max. lengte" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "Samenvoegen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -880,61 +881,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Transcriptie wissen" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "Bestand opslaan" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "Annuleren" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "Afgebroken" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "Bestand opslaan" @@ -1369,7 +1380,7 @@ msgstr "Soedanees" msgid "Cantonese" msgstr "Kantonees" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Er is een verbindingsfout opgetreden" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index d1299e84..380ad41e 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -36,6 +36,7 @@ msgstr "" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -337,8 +338,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Błąd" @@ -715,7 +716,7 @@ msgid "Translate" msgstr "" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "" @@ -814,51 +815,51 @@ msgstr "" msgid "Please enter OpenAI API Key in preferences" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -888,61 +889,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Anuluj transkrypcję" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "Zapisz plik" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "Anuluj" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "Anulowano" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 #, fuzzy msgid "Save File" @@ -1382,7 +1393,7 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index 67def215..db6d0fbe 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -36,6 +36,7 @@ msgstr "Ok" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -334,8 +335,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Erro" @@ -707,7 +708,7 @@ msgid "Translate" msgstr "Traduzir" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "Redimensionar" @@ -809,51 +810,51 @@ msgstr "Chave API Necessária" msgid "Please enter OpenAI API Key in preferences" msgstr "Insira a chave API OpenAI nas preferências" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "Opções de Redimensionamento" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "Duração desejada da legenda" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "Opções de Mesclagem" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "Mesclar por intervalo" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "Dividir por pontuação" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "Dividir por tamanho máximo" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "Mesclar" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -883,61 +884,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Iniciando transcrição..." -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "Salvar Arquivo" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "Cancelar" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "Cancelado" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "Salvar Arquivo" @@ -1374,7 +1385,7 @@ msgstr "Sundanês" msgid "Cantonese" msgstr "Cantonês" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Ocorreu um erro de conexão" diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index e5851b17..597c47ef 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -33,6 +33,7 @@ msgstr "Гаразд" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -332,8 +333,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "Помилка" @@ -704,7 +705,7 @@ msgid "Translate" msgstr "Перекласти" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "" @@ -803,51 +804,51 @@ msgstr "Потрібен API-ключ" msgid "Please enter OpenAI API Key in preferences" msgstr "Будь ласка, введіть API-ключ OpenAI в налаштуваннях" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -877,61 +878,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Скасувати транскрипцію" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "Зберегти файл" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "Скасувати" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "Скасовано" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 msgid "Save File" msgstr "Зберегти файл" @@ -1365,7 +1376,7 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Виникла помилка зʼєднання" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 5db229a2..773cbbe6 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -36,6 +36,7 @@ msgstr "Ok" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -340,8 +341,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "错误" @@ -716,7 +717,7 @@ msgid "Translate" msgstr "翻译" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "调整大小" @@ -815,52 +816,52 @@ msgstr "需要API Key" msgid "Please enter OpenAI API Key in preferences" msgstr "请在偏好设置中输入OpenAI API Key" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 #, fuzzy msgid "Resize Options" msgstr "调整大小" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "所需字幕长度" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "合并选项" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "按间隔合并" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "按标点符号拆分" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "按最大长度拆分" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "合并" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -890,61 +891,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "取消识别" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "保存文件" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "取消" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "取消" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 #, fuzzy msgid "Save File" @@ -1382,7 +1393,7 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "连接发生错误" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index 2561e52f..52c19593 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: 2026-01-16 11:27+0200\n" +"POT-Creation-Date: 2026-02-01 11:53+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -36,6 +36,7 @@ msgstr "" #: buzz/widgets/import_url_dialog.py:29 #: buzz/widgets/preferences_dialog/preferences_dialog.py:70 #: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 #: buzz/widgets/model_download_progress_dialog.py:30 #: buzz/widgets/main_window.py:227 msgid "Cancel" @@ -335,8 +336,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:741 -#: buzz/model_loader.py:755 +#: buzz/widgets/main_window.py:283 buzz/model_loader.py:760 +#: buzz/model_loader.py:774 msgid "Error" msgstr "" @@ -709,7 +710,7 @@ msgid "Translate" msgstr "" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:207 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 msgid "Resize" msgstr "" @@ -808,51 +809,51 @@ msgstr "" msgid "Please enter OpenAI API Key in preferences" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:157 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:168 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:173 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:189 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 msgid "Resize Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:200 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:218 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:227 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:238 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:246 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:254 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:266 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:275 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 msgid "Available only if word level timings were enabled during transcription" msgstr "" @@ -882,61 +883,71 @@ msgstr "" msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:270 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 #, fuzzy msgid "5/8 Preparing transcripts" msgstr "取消錄製" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:292 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:319 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:366 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:371 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:431 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:443 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:452 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:454 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:478 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:493 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:608 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:508 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:513 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 #, fuzzy msgid "Save" msgstr "檔案" +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#, fuzzy +msgid "Cancelling..." +msgstr "取消" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#, fuzzy +msgid "Cancelled" +msgstr "取消" + #: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 #, fuzzy msgid "Save File" @@ -1374,7 +1385,7 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:774 +#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "" diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index 4985b1b8..2b161d67 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -350,7 +350,7 @@ class RecordingTranscriber(QObject): self.is_running = False if self.process and self.process.poll() is None: self.process.terminate() - self.process.wait(5000) + self.process.wait(timeout=5) def start_local_whisper_server(self): # Reduce verbose HTTP client logging from OpenAI/httpx @@ -450,4 +450,4 @@ class RecordingTranscriber(QObject): def __del__(self): if self.process and self.process.poll() is None: self.process.terminate() - self.process.wait(5000) \ No newline at end of file + self.process.wait(timeout=5) \ No newline at end of file diff --git a/buzz/widgets/transcription_viewer/speaker_identification_widget.py b/buzz/widgets/transcription_viewer/speaker_identification_widget.py index bd179a5d..c87f8b0f 100644 --- a/buzz/widgets/transcription_viewer/speaker_identification_widget.py +++ b/buzz/widgets/transcription_viewer/speaker_identification_widget.py @@ -250,13 +250,15 @@ class IdentificationWorker(QObject): return self.progress_update.emit(_("4/8 Processing audio")) + logging.debug("Speaker identification worker: Generating emissions") emissions, stride = generate_emissions( alignment_model, torch.from_numpy(audio_waveform) .to(alignment_model.dtype) .to(alignment_model.device), - batch_size=8, + batch_size=1 if device == "cpu" else 8, ) + logging.debug("Speaker identification worker: Emissions generated") # Clean up alignment model del alignment_model @@ -302,10 +304,14 @@ class IdentificationWorker(QObject): logging.debug("Speaker identification worker: Creating diarizer model") diarizer_model = MSDDDiarizer(device) - logging.debug("Speaker identification worker: Running diarization") + logging.debug("Speaker identification worker: Running diarization (this may take a while on CPU)") speaker_ts = diarizer_model.diarize(torch.from_numpy(audio_waveform).unsqueeze(0)) logging.debug("Speaker identification worker: Diarization complete") + if self._is_cancelled: + logging.debug("Speaker identification worker: Cancelled after diarization") + return + # Clean up diarizer model immediately after use del diarizer_model diarizer_model = None @@ -444,6 +450,11 @@ class SpeakerIdentificationWidget(QWidget): self.step_1_button.setMinimumWidth(200) self.step_1_button.clicked.connect(self.on_identify_button_clicked) + self.cancel_button = QPushButton(_("Cancel")) + self.cancel_button.setMinimumWidth(200) + self.cancel_button.setVisible(False) + self.cancel_button.clicked.connect(self.on_cancel_button_clicked) + # Progress container with label and bar progress_container = QVBoxLayout() @@ -464,7 +475,10 @@ class SpeakerIdentificationWidget(QWidget): self.step_1_row.addLayout(progress_container) - self.step_1_row.addWidget(self.step_1_button, alignment=Qt.AlignmentFlag.AlignTop) + button_container = QVBoxLayout() + button_container.addWidget(self.step_1_button) + button_container.addWidget(self.cancel_button) + self.step_1_row.addLayout(button_container) step_1_layout.addLayout(self.step_1_row) @@ -529,6 +543,8 @@ class SpeakerIdentificationWidget(QWidget): def on_identify_button_clicked(self): self.step_1_button.setEnabled(False) + self.step_1_button.setVisible(False) + self.cancel_button.setVisible(True) # Clean up any existing thread before starting a new one self._cleanup_thread() @@ -548,18 +564,36 @@ class SpeakerIdentificationWidget(QWidget): self.thread.start() + def on_cancel_button_clicked(self): + """Handle cancel button click.""" + logging.debug("Speaker identification: Cancel requested by user") + self.cancel_button.setEnabled(False) + self.progress_label.setText(_("Cancelling...")) + self._cleanup_thread() + self._reset_buttons() + self.progress_label.setText(_("Cancelled")) + self.progress_bar.setValue(0) + + def _reset_buttons(self): + """Reset identify/cancel buttons to initial state.""" + self.step_1_button.setVisible(True) + self.step_1_button.setEnabled(True) + self.cancel_button.setVisible(False) + self.cancel_button.setEnabled(True) + def _on_thread_finished(self, result): """Handle thread completion and cleanup.""" logging.debug("Speaker identification: Thread finished") if self.thread is not None: self.thread.quit() self.thread.wait(5000) + self._reset_buttons() self.on_identification_finished(result) def on_identification_error(self, error_message): """Handle identification error.""" logging.error(f"Speaker identification error: {error_message}") - self.step_1_button.setEnabled(True) + self._reset_buttons() self.progress_bar.setValue(0) def on_progress_update(self, progress): From c4d7971e0440d3aa4a67e3671f2f1632df73eb92 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 6 Feb 2026 14:38:28 +0200 Subject: [PATCH 16/37] Fix for speech separation error (#1371) --- buzz/buzz.py | 7 +++++-- buzz/file_transcriber_queue_worker.py | 17 ++++++++++++++++- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/da_DK/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/de_DE/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/en_US/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/es_ES/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/it_IT/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 8 ++++++++ buzz/locale/nl/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 6 ++++++ buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 6 ++++++ 16 files changed, 107 insertions(+), 3 deletions(-) diff --git a/buzz/buzz.py b/buzz/buzz.py index d4a7a34b..6f434353 100644 --- a/buzz/buzz.py +++ b/buzz/buzz.py @@ -25,8 +25,11 @@ from buzz.assets import APP_BASE_DIR if getattr(sys, "frozen", False) is False and platform.system() != "Windows": faulthandler.enable() -# Sets stderr to no-op TextIO when None (run as Windows GUI). -# Resolves https://github.com/chidiwilliams/buzz/issues/221 +# Sets stdout/stderr to no-op TextIO when None (run as Windows GUI with --noconsole). +# stdout fix: torch.hub uses sys.stdout.write() for download progress and crashes if None. +# stderr fix: Resolves https://github.com/chidiwilliams/buzz/issues/221 +if sys.stdout is None: + sys.stdout = TextIO() if sys.stderr is None: sys.stderr = TextIO() diff --git a/buzz/file_transcriber_queue_worker.py b/buzz/file_transcriber_queue_worker.py index 1babc641..8e5cf1a8 100644 --- a/buzz/file_transcriber_queue_worker.py +++ b/buzz/file_transcriber_queue_worker.py @@ -53,6 +53,7 @@ if sys.platform == "win32": from demucs import api as demucsApi +from buzz.locale import _ from buzz.model_loader import ModelType from buzz.transcriber.file_transcriber import FileTranscriber from buzz.transcriber.openai_whisper_api_file_transcriber import ( @@ -127,11 +128,19 @@ class FileTranscriberQueueWorker(QObject): separator = None separated = None try: + # Force CPU if specified, otherwise use CUDA if available + force_cpu = os.getenv("BUZZ_FORCE_CPU", "false").lower() == "true" + if force_cpu: + device = "cpu" + else: + import torch + device = "cuda" if torch.cuda.is_available() else "cpu" separator = demucsApi.Separator( + device=device, progress=True, callback=separator_progress_callback, ) - _, separated = separator.separate_audio_file(Path(self.current_task.file_path)) + _origin, separated = separator.separate_audio_file(Path(self.current_task.file_path)) task_file_path = Path(self.current_task.file_path) self.speech_path = task_file_path.with_name(f"{task_file_path.stem}_speech.mp3") @@ -140,6 +149,12 @@ class FileTranscriberQueueWorker(QObject): self.current_task.file_path = str(self.speech_path) except Exception as e: logging.error(f"Error during speech extraction: {e}", exc_info=True) + self.task_error.emit( + self.current_task, + _("Speech extraction failed! Check your internet connection — a model may need to be downloaded."), + ) + self.is_running = False + return finally: # Release memory used by speech extractor del separator, separated diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 679658da..802fbed5 100644 --- a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po +++ b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po @@ -1482,6 +1482,12 @@ msgstr "Afegeix a sobre" msgid "Append and correct" msgstr "Afegeix i corregeix" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "Avís de permís d'ajust" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index f916fc62..957c2c1a 100644 --- a/buzz/locale/da_DK/LC_MESSAGES/buzz.po +++ b/buzz/locale/da_DK/LC_MESSAGES/buzz.po @@ -1473,6 +1473,12 @@ msgstr "Tilføj herover" msgid "Append and correct" msgstr "Tilføj og ret" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "Snap tilladelse notifikationer" diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index c7ea808f..d7f2fc6d 100644 --- a/buzz/locale/de_DE/LC_MESSAGES/buzz.po +++ b/buzz/locale/de_DE/LC_MESSAGES/buzz.po @@ -1475,6 +1475,12 @@ msgstr "Oben anhängen" msgid "Append and correct" msgstr "Anhängen und korrigieren" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "Snap-Berechtigungsmitteilung" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index d6d7e1a0..f614c61b 100644 --- a/buzz/locale/en_US/LC_MESSAGES/buzz.po +++ b/buzz/locale/en_US/LC_MESSAGES/buzz.po @@ -1442,3 +1442,9 @@ msgstr "" #: buzz/settings/recording_transcriber_mode.py:7 msgid "Append and correct" msgstr "" + +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index c9e05f66..fb146e67 100644 --- a/buzz/locale/es_ES/LC_MESSAGES/buzz.po +++ b/buzz/locale/es_ES/LC_MESSAGES/buzz.po @@ -1543,6 +1543,12 @@ msgstr "Añadir arriba" msgid "Append and correct" msgstr "Añadir y corregir" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "Aviso de permiso Snap" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 4853a48e..26134032 100644 --- a/buzz/locale/it_IT/LC_MESSAGES/buzz.po +++ b/buzz/locale/it_IT/LC_MESSAGES/buzz.po @@ -1484,6 +1484,12 @@ msgstr "Aggiungere sopra" msgid "Append and correct" msgstr "Aggiungere e correggere" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "Avviso di autorizzazione Snap" diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index e5e67066..4d6e8424 100644 --- a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po +++ b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po @@ -1468,6 +1468,12 @@ msgstr "" msgid "Append and correct" msgstr "" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "Snap権限通知" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 1dc854bb..d3902732 100644 --- a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po +++ b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po @@ -1477,6 +1477,14 @@ msgstr "Jaunie teikumi augšā" msgid "Append and correct" msgstr "Papildināt un labot esošo" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" +"Runas atdalīšana neizdevās! Pārbaudiet interneta savienojumu, iespējams " +"jālejupielādē modelis." + #~ msgid "Snap permission notice" #~ msgstr "Snap atļauju piezīme" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 745ffb9b..724904af 100644 --- a/buzz/locale/nl/LC_MESSAGES/buzz.po +++ b/buzz/locale/nl/LC_MESSAGES/buzz.po @@ -1474,6 +1474,12 @@ msgstr "Bovenaan toevoegen" msgid "Append and correct" msgstr "Toevoegen en corrigeren" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "Snap-rechten" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index 380ad41e..f79442bb 100644 --- a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po +++ b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po @@ -1492,6 +1492,12 @@ msgstr "" msgid "Append and correct" msgstr "" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "ID" #~ msgstr "ID" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index db6d0fbe..1e37df69 100644 --- a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po +++ b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po @@ -1478,6 +1478,12 @@ msgstr "Acrescentar acima" msgid "Append and correct" msgstr "Acrescentar e corrigir" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "Aviso de permissão do Snap" diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 597c47ef..f12ab79c 100644 --- a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po +++ b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po @@ -1470,6 +1470,12 @@ msgstr "" msgid "Append and correct" msgstr "" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "Попередження щодо дозволів Snap" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 773cbbe6..27ce95c6 100644 --- a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po +++ b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po @@ -1492,6 +1492,12 @@ msgstr "增加上方" msgid "Append and correct" msgstr "增加并纠正" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "Snap permission notice" #~ msgstr "快照权限通知" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index 52c19593..a1d78091 100644 --- a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po +++ b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po @@ -1484,6 +1484,12 @@ msgstr "" msgid "Append and correct" msgstr "" +#: buzz/file_transcriber_queue_worker.py:161 +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" + #~ msgid "ID" #~ msgstr "ID" From 156ec35246e5c280b390fb6a9c727c49883629f6 Mon Sep 17 00:00:00 2001 From: Anantharaman R <90021026+CrazyCyberbug@users.noreply.github.com> Date: Fri, 6 Feb 2026 23:59:58 +0530 Subject: [PATCH 17/37] Added copy-to-clipboard button in recording transcribe widget (#1370) --- buzz/widgets/recording_transcriber_widget.py | 57 +++++++++++++ .../recording_transcriber_widget_test.py | 83 +++++++++++++++++++ 2 files changed, 140 insertions(+) diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index 7a35a06c..1df5f149 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -16,6 +16,7 @@ from PyQt6.QtWidgets import ( QFormLayout, QHBoxLayout, QMessageBox, + QApplication, QPushButton, QComboBox, QLabel, @@ -209,6 +210,9 @@ class RecordingTranscriberWidget(QWidget): self.presentation_options_bar = self.create_presentation_options_bar() layout.insertWidget(3, self.presentation_options_bar) self.presentation_options_bar.hide() + self.copy_actions_bar = self.create_copy_actions_bar() + layout.addWidget(self.copy_actions_bar) # Add at the bottom + self.copy_actions_bar.hide() def create_presentation_options_bar(self) -> QWidget: """Crete the presentation options bar widget""" @@ -286,6 +290,56 @@ class RecordingTranscriberWidget(QWidget): return bar + def create_copy_actions_bar(self) -> QWidget: + """Create the copy actions bar widget""" + bar = QWidget(self) + layout = QHBoxLayout(bar) + layout.setContentsMargins(5, 5, 5, 5) + layout.setSpacing(10) + + layout.addStretch() # Push button to the right + + self.copy_transcript_button = QPushButton(_("Copy"), bar) + self.copy_transcript_button.setToolTip(_("Copy transcription to clipboard")) + self.copy_transcript_button.clicked.connect(self.on_copy_transcript_clicked) + layout.addWidget(self.copy_transcript_button) + + return bar + + def on_copy_transcript_clicked(self): + """Handle copy transcript button click""" + transcript_text = self.transcription_text_box.toPlainText().strip() + + if not transcript_text: + self.copy_transcript_button.setText(_("Nothing to copy!")) + QTimer.singleShot(1500, lambda: self.copy_transcript_button.setText(_("Copy"))) + return + + app = QApplication.instance() + if app is None: + logging.warning("QApplication instance not available; clipboard disabled") + self.copy_transcript_button.setText(_("Copy failed")) + QTimer.singleShot(1500, lambda: self.copy_transcript_button.setText(_("Copy"))) + return + + clipboard = app.clipboard() + if clipboard is None: + logging.warning("Clipboard not available") + self.copy_transcript_button.setText(_("Copy failed")) + QTimer.singleShot(1500, lambda: self.copy_transcript_button.setText(_("Copy"))) + return + + try: + clipboard.setText(transcript_text) + except Exception as e: + logging.warning("Clipboard error: %s", e) + self.copy_transcript_button.setText(_("Copy failed")) + QTimer.singleShot(1500, lambda: self.copy_transcript_button.setText(_("Copy"))) + return + + self.copy_transcript_button.setText(_("Copied!")) + QTimer.singleShot(2000, lambda: self.copy_transcript_button.setText(_("Copy"))) + def on_show_presentation_clicked(self): """Handle click on 'Show in new window' button""" if self.presentation_window is None or not self.presentation_window.isVisible(): @@ -464,6 +518,8 @@ class RecordingTranscriberWidget(QWidget): self.transcription_options_group_box.setEnabled(False) self.audio_devices_combo_box.setEnabled(False) self.presentation_options_bar.show() + self.copy_actions_bar.hide() + else: # RecordingStatus.RECORDING self.stop_recording() self.set_recording_status_stopped() @@ -574,6 +630,7 @@ class RecordingTranscriberWidget(QWidget): self.transcription_options_group_box.setEnabled(True) self.audio_devices_combo_box.setEnabled(True) self.presentation_options_bar.hide() + self.copy_actions_bar.show() #added this here def on_download_model_error(self, error: str): self.reset_model_download() diff --git a/tests/widgets/recording_transcriber_widget_test.py b/tests/widgets/recording_transcriber_widget_test.py index 42baa148..4e43357b 100644 --- a/tests/widgets/recording_transcriber_widget_test.py +++ b/tests/widgets/recording_transcriber_widget_test.py @@ -470,6 +470,89 @@ class TestRecordingTranscriberWidgetPresentation: time.sleep(0.5) widget.close() + @pytest.mark.timeout(60) + def test_on_copy_transcript_clicked_with_text(self, qtbot: QtBot): + with ( + patch("sounddevice.InputStream", side_effect=MockInputStream), + patch("sounddevice.check_input_settings"), + patch( + "buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate", + return_value=16_000, + ), + ): + mock_clipboard = MagicMock() + mock_app = MagicMock() + mock_app.clipboard.return_value = mock_clipboard + + widget = RecordingTranscriberWidget(custom_sounddevice=MockSoundDevice()) + qtbot.add_widget(widget) + + widget.transcription_text_box.setPlainText("Hello world") + widget.copy_actions_bar.show() + + with patch("buzz.widgets.recording_transcriber_widget.QApplication.instance", + return_value=mock_app): + widget.on_copy_transcript_clicked() + + mock_clipboard.setText.assert_called_once_with("Hello world") + assert widget.copy_transcript_button.text() == _("Copied!") + + time.sleep(0.5) + widget.close() + + @pytest.mark.timeout(60) + def test_on_copy_transcript_clicked_without_text(self, qtbot: QtBot): + """Test that copy button handles empty transcript gracefully""" + with ( + patch("sounddevice.InputStream", side_effect=MockInputStream), + patch("sounddevice.check_input_settings"), + patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate", + return_value=16_000), + ): + widget = RecordingTranscriberWidget( + custom_sounddevice=MockSoundDevice() + ) + qtbot.add_widget(widget) + + widget.transcription_text_box.setPlainText("") + widget.copy_actions_bar.show() + + widget.on_copy_transcript_clicked() + + assert widget.copy_transcript_button.text() == _("Nothing to copy!") + + time.sleep(0.5) + widget.close() + + @pytest.mark.timeout(60) + def test_copy_actions_bar_hidden_when_recording_starts(self, qtbot: QtBot): + """Test that copy actions bar hides when recording starts""" + with ( + patch("sounddevice.InputStream", side_effect=MockInputStream), + patch("sounddevice.check_input_settings"), + patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate", + return_value=16_000), + ): + widget = RecordingTranscriberWidget( + custom_sounddevice=MockSoundDevice() + ) + widget.device_sample_rate = 16_000 + qtbot.add_widget(widget) + + widget.copy_actions_bar.show() + assert not widget.copy_actions_bar.isHidden() + + # Mock start_recording to prevent actual recording threads from starting + widget.current_status = widget.RecordingStatus.STOPPED + with patch.object(widget, 'start_recording'): + widget.on_record_button_clicked() + + assert widget.copy_actions_bar.isHidden() + + time.sleep(0.5) + widget.close() + + @pytest.mark.timeout(60) def test_on_bg_color_clicked(self, qtbot: QtBot): """Test that background color button opens color dialog and saves selection""" From 125e924613b22a6a4293dade29638b552b12a050 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 6 Feb 2026 22:50:19 +0200 Subject: [PATCH 18/37] Fix recording transcriber (#1377) --- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/da_DK/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/de_DE/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/en_US/LC_MESSAGES/buzz.po | 65 +++++++++++++------ buzz/locale/es_ES/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/it_IT/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 67 ++++++++++++++------ buzz/locale/nl/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 66 +++++++++++++------ buzz/transcriber/recording_transcriber.py | 24 +++++-- buzz/widgets/recording_transcriber_widget.py | 10 ++- tests/mock_sounddevice.py | 16 +++-- 17 files changed, 693 insertions(+), 281 deletions(-) diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 802fbed5..b6498b7b 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -584,75 +584,103 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Enregistrament en directe" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Feu clic a Enregistra per a començar..." -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Esperant la traducció de la IA..." -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Micròfon:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "Fitxers de text" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "Fitxers de text" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "Descàrrega fallida" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "Selecciona la carpeta d'exportació" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "Selecciona un fitxer d'àudio" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "S'ha produït un error en iniciar un enregistrament nou:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1482,7 +1510,7 @@ msgstr "Afegeix a sobre" msgid "Append and correct" msgstr "Afegeix i corregeix" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index 957c2c1a..7cbf1529 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -581,75 +581,103 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Live optagelse" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Klik Optage for at begynde..." -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Venter på AI oversættelse..." -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "Tekst filer" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "Tekst filer" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "Download mislykkedes" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "Vælg eksport-mappe" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "Vælg audio-fil" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "Der skete en fejl ved opstart af en ny optagelse:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1473,7 +1501,7 @@ msgstr "Tilføj herover" msgid "Append and correct" msgstr "Tilføj og ret" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index d7f2fc6d..d4532a26 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -582,75 +582,103 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Live-Aufnahme" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Auf „Aufnehmen“ klicken um zu beginnen …" -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Warten auf KI-Übersetzung..." -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "Textdateien" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "Textdateien" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "Der Download ist fehlgeschlagen" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "Exportordner auswählen" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "Audiodatei auswählen" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "Beim Starten einer neuen Aufnahme ist ein Fehler aufgetreten:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1475,7 +1503,7 @@ msgstr "Oben anhängen" msgid "Append and correct" msgstr "Anhängen und korrigieren" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index f614c61b..d0ccc1eb 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -566,71 +566,98 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 msgid "Text Size:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 msgid "Text Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +msgid "Copy failed" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 msgid "Select Text Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 msgid "Select Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1443,7 +1470,7 @@ msgstr "" msgid "Append and correct" msgstr "" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index fb146e67..3d1f1f74 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -616,80 +616,108 @@ msgid "Could not restart transcription: transcriber worker not found." msgstr "" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Grabación en vivo" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Pulse en Grabar para comenzar..." -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "A la espera de la traducción de la IA..." # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Micrófono:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "Archivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "Archivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "Descarga fallida" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "Seleccione Exportar carpeta" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "Seleccionar archivo de audio" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "Se produjo un error al iniciar una grabación nueva:" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1543,7 +1571,7 @@ msgstr "Añadir arriba" msgid "Append and correct" msgstr "Añadir y corregir" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 26134032..0501335a 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -586,71 +586,99 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "Impossibile riavviare la trascrizione: trascrittore non trovato." -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Registrazione in diretta" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Fai clic su Registra per iniziare..." -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "In attesa della traduzione AI..." -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Microfono:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "Mostra in una nuova finestra" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 msgid "Text Size:" msgstr "Dimensione testo:" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "Tema" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "Chiaro" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "Scuro" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "Personalizzato" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 msgid "Text Color" msgstr "Colore del testo" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "Colore dello sfondo" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "Schermo intero" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "Download non riuscito" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 msgid "Select Text Color" msgstr "Seleziona il colore del testo" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 msgid "Select Background Color" msgstr "Seleziona il colore di sfondo" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "Si è verificato un errore durante l'avvio della nuova registrazione:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1484,7 +1512,7 @@ msgstr "Aggiungere sopra" msgid "Append and correct" msgstr "Aggiungere e correggere" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 4d6e8424..7b9e3597 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -577,75 +577,103 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "ライブ録音" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "クリックで録音を開始..." -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "AI翻訳を待っています..." -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "マイク:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "テキストファイル" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "テキストファイル" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "ダウンロード失敗" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "出力フォルダを選択" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "音声ファイルを選択" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "新規録音開始時にエラーが発生しました:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1468,7 +1496,7 @@ msgstr "" msgid "Append and correct" msgstr "" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index d3902732..2e801682 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: 2026-02-01 11:53+0200\n" -"PO-Revision-Date: 2026-02-01 11:54+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" +"PO-Revision-Date: 2026-02-06 20:32+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -587,71 +587,98 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "Neizdevās sākt atpazīšanu: Kļūda lietotnē, pārstartējiet." -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Dzīvā ierakstīšana" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Klikšķiniet Ierakstīt, lai sāktu..." -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Gaida MI tulkojumu..." -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Mikrofons:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "Rādīt jaunā logā" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 msgid "Text Size:" msgstr "Teksta izmērs:" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "Stils" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "Gaišais" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "Tumšais" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "Pielāgots" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 msgid "Text Color" msgstr "Teksta krāsa" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "Fona krāsa" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "Pilnekrāns" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "Kopēt" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "Kopēt tekstu starpliktuvē" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "Nav nekā ko kopēt!" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +msgid "Copy failed" +msgstr "Kopešana neizdevās" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "Nokopēts!" + +#: buzz/widgets/recording_transcriber_widget.py:405 msgid "Select Text Color" msgstr "Izvēlieties teksta krāsu" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 msgid "Select Background Color" msgstr "Izvēlieties fona krāsu" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "Sākot jaunu ierakstu notikusi kļūda:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1477,7 +1504,7 @@ msgstr "Jaunie teikumi augšā" msgid "Append and correct" msgstr "Papildināt un labot esošo" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 724904af..23a1ff39 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -584,75 +584,103 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Live-opname" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Klik op de opnameknop om te beginnen…" -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Bezig met wachten op AI-vertaling…" -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Microfoon:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "Tekstbestanden" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "Tekstbestanden" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "Het downloaden is mislukt" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "Kies een exportmap" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "Kies een audiobestand" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "Er is een fout opgetreden tijdens het starten van de opname:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1474,7 +1502,7 @@ msgstr "Bovenaan toevoegen" msgid "Append and correct" msgstr "Toevoegen en corrigeren" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index f79442bb..d1b969c3 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -589,75 +589,103 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Nagrywanie na żywo" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Naciśnij Nagraj, aby zacząć..." -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "Pliki tekstowe" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "Pliki tekstowe" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "Pobrany" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "Wybierz plik audio" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "Wybierz plik audio" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "Wystąpił błąd podczas rozpoczęcia nowego nagrania:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1492,7 +1520,7 @@ msgstr "" msgid "Append and correct" msgstr "" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index 1e37df69..04955f0f 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -582,75 +582,103 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Gravação ao Vivo" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Clique em Gravar para começar..." -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Aguardando tradução da IA..." -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Microfone:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "Arquivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "Arquivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "Falha ao baixar" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "Selecionar Pasta de Exportação" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "Selecionar arquivo de áudio" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "Ocorreu um erro ao iniciar uma nova gravação:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1478,7 +1506,7 @@ msgstr "Acrescentar acima" msgid "Append and correct" msgstr "Acrescentar e corrigir" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index f12ab79c..20c151a8 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -579,75 +579,103 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "Живий запис" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "Натисніть на Запис, щоб розпочати..." -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "Очікування перекладу від ШІ..." -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "Мікрофон:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "Текстові файли" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "Текстові файли" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "Невдале завантаження" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "Виберіть теку для експорту" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "Вибрати аудіофайл" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "При старті нового запису виникла помилка:" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1470,7 +1498,7 @@ msgstr "" msgid "Append and correct" msgstr "" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 27ce95c6..d401bf20 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -592,75 +592,103 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "实时录制" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "点击开始录制" -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "等待AI翻译..." -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "麦克风:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 #, fuzzy msgid "Text Size:" msgstr "文本文件" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 #, fuzzy msgid "Text Color" msgstr "文本文件" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "下载模型失败" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "选择输出文件夹" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "选择音频文件" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "开始新录制时出错" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1492,7 +1520,7 @@ msgstr "增加上方" msgid "Append and correct" msgstr "增加并纠正" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index a1d78091..5e586d24 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: 2026-02-01 11:53+0200\n" +"POT-Creation-Date: 2026-02-06 20:31+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -587,73 +587,101 @@ msgstr "" msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:96 +#: buzz/widgets/recording_transcriber_widget.py:97 msgid "Live Recording" msgstr "現場錄製" -#: buzz/widgets/recording_transcriber_widget.py:162 +#: buzz/widgets/recording_transcriber_widget.py:163 msgid "Click Record to begin..." msgstr "點擊開始錄製" -#: buzz/widgets/recording_transcriber_widget.py:165 +#: buzz/widgets/recording_transcriber_widget.py:166 msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:177 +#: buzz/widgets/recording_transcriber_widget.py:178 msgid "Microphone:" msgstr "麥克風:" -#: buzz/widgets/recording_transcriber_widget.py:223 +#: buzz/widgets/recording_transcriber_widget.py:227 msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:229 +#: buzz/widgets/recording_transcriber_widget.py:233 msgid "Text Size:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:245 +#: buzz/widgets/recording_transcriber_widget.py:249 msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py:253 msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:263 +#: buzz/widgets/recording_transcriber_widget.py:267 msgid "Text Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:273 +#: buzz/widgets/recording_transcriber_widget.py:277 msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:282 +#: buzz/widgets/recording_transcriber_widget.py:286 msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:351 +#: buzz/widgets/recording_transcriber_widget.py:302 +#: buzz/widgets/recording_transcriber_widget.py:315 +#: buzz/widgets/recording_transcriber_widget.py:322 +#: buzz/widgets/recording_transcriber_widget.py:329 +#: buzz/widgets/recording_transcriber_widget.py:337 +#: buzz/widgets/recording_transcriber_widget.py:341 +msgid "Copy" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:303 +msgid "Copy transcription to clipboard" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:314 +msgid "Nothing to copy!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:321 +#: buzz/widgets/recording_transcriber_widget.py:328 +#: buzz/widgets/recording_transcriber_widget.py:336 +#, fuzzy +msgid "Copy failed" +msgstr "下載模型" + +#: buzz/widgets/recording_transcriber_widget.py:340 +msgid "Copied!" +msgstr "" + +#: buzz/widgets/recording_transcriber_widget.py:405 #, fuzzy msgid "Select Text Color" msgstr "選擇聲音檔案" -#: buzz/widgets/recording_transcriber_widget.py:368 +#: buzz/widgets/recording_transcriber_widget.py:422 #, fuzzy msgid "Select Background Color" msgstr "選擇聲音檔案" -#: buzz/widgets/recording_transcriber_widget.py:779 +#: buzz/widgets/recording_transcriber_widget.py:836 msgid "An error occurred while starting a new recording:" msgstr "開始新錄製出錯" -#: buzz/widgets/recording_transcriber_widget.py:783 +#: buzz/widgets/recording_transcriber_widget.py:840 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1484,7 +1512,7 @@ msgstr "" msgid "Append and correct" msgstr "" -#: buzz/file_transcriber_queue_worker.py:161 +#: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index 2b161d67..a2d60e99 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -38,6 +38,7 @@ class RecordingTranscriber(QObject): transcription = pyqtSignal(str) finished = pyqtSignal() error = pyqtSignal(str) + amplitude_changed = pyqtSignal(float) is_running = False SAMPLE_RATE = whisper_audio.SAMPLE_RATE @@ -76,6 +77,7 @@ class RecordingTranscriber(QObject): self.process = None def start(self): + self.is_running = True model = None model_path = self.model_path keep_samples = int(self.keep_sample_seconds * self.sample_rate) @@ -91,6 +93,12 @@ class RecordingTranscriber(QObject): model = whisper.load_model(model_path, device=device) elif self.transcription_options.model.model_type == ModelType.WHISPER_CPP: self.start_local_whisper_server() + if self.openai_client is None: + if not self.is_running: + self.finished.emit() + else: + self.error.emit(_("Whisper server failed to start. Check logs for details.")) + return elif self.transcription_options.model.model_type == ModelType.FASTER_WHISPER: model_root_dir = user_cache_dir("Buzz") model_root_dir = os.path.join(model_root_dir, "models") @@ -155,7 +163,6 @@ class RecordingTranscriber(QObject): self.input_device_index, ) - self.is_running = True try: with self.sounddevice.InputStream( samplerate=self.sample_rate, @@ -244,8 +251,7 @@ class RecordingTranscriber(QObject): ) else: # OPEN_AI_WHISPER_API, also used for WHISPER_CPP if self.openai_client is None: - self.transcription.emit(_("A connection error occurred")) - self.stop_recording() + self.error.emit(_("A connection error occurred")) return # scale samples to 16-bit PCM @@ -338,6 +344,10 @@ class RecordingTranscriber(QObject): def stream_callback(self, in_data: np.ndarray, frame_count, time_info, status): # Try to enqueue the next block. If the queue is already full, drop the block. chunk: np.ndarray = in_data.ravel() + + amplitude = float(np.sqrt(np.mean(chunk**2))) + self.amplitude_changed.emit(amplitude) + with self.mutex: if self.queue.size < self.max_queue_size: self.queue = np.append(self.queue, chunk) @@ -411,11 +421,13 @@ class RecordingTranscriber(QObject): except Exception as e: error_msg = f"Failed to start whisper-server subprocess: {str(e)}" logging.error(error_msg) - self.error.emit(error_msg) return - # Wait for server to start and load model - time.sleep(10) + # Wait for server to start and load model, checking periodically + for i in range(100): # 10 seconds total, in 0.1s increments + if not self.is_running or self.process.poll() is not None: + break + time.sleep(0.1) if self.process is not None and self.process.poll() is None: self.transcription.emit(_("Starting transcription...")) diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index 1df5f149..63f19296 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -558,7 +558,6 @@ class RecordingTranscriberWidget(QWidget): self.transcription_thread = QThread() - # TODO: make runnable self.transcriber = RecordingTranscriber( input_device_index=self.selected_device_id, sample_rate=self.device_sample_rate, @@ -575,6 +574,13 @@ class RecordingTranscriberWidget(QWidget): ) self.transcriber.transcription.connect(self.on_next_transcription) + self.transcriber.amplitude_changed.connect( + self.on_recording_amplitude_changed, Qt.ConnectionType.QueuedConnection + ) + + # Stop the separate amplitude listener to avoid two streams on the same device + if self.recording_amplitude_listener is not None: + self.recording_amplitude_listener.stop_recording() self.transcriber.finished.connect(self.on_transcriber_finished) self.transcriber.finished.connect(self.transcription_thread.quit) @@ -826,10 +832,12 @@ class RecordingTranscriberWidget(QWidget): def on_transcriber_finished(self): self.reset_record_button() + self.reset_recording_amplitude_listener() def on_transcriber_error(self, error: str): self.reset_record_button() self.set_recording_status_stopped() + self.reset_recording_amplitude_listener() QMessageBox.critical( self, "", diff --git a/tests/mock_sounddevice.py b/tests/mock_sounddevice.py index 85bf4a14..72ca7f22 100644 --- a/tests/mock_sounddevice.py +++ b/tests/mock_sounddevice.py @@ -1,7 +1,7 @@ import os import time import logging -from threading import Thread +from threading import Thread, Event from typing import Callable, Any from unittest.mock import MagicMock @@ -99,7 +99,6 @@ mock_query_devices = [ class MockInputStream: - running = False thread: Thread def __init__( @@ -108,6 +107,7 @@ class MockInputStream: *args, **kwargs, ): + self._stop_event = Event() self.thread = Thread(target=self.target) self.callback = callback @@ -123,12 +123,13 @@ class MockInputStream: chunk_duration_secs = 1 - self.running = True seek = 0 num_samples_in_chunk = chunk_duration_secs * sample_rate - while self.running: - time.sleep(chunk_duration_secs) + while not self._stop_event.is_set(): + self._stop_event.wait(timeout=chunk_duration_secs) + if self._stop_event.is_set(): + break chunk = audio[seek : seek + num_samples_in_chunk] self.callback(chunk, 0, None, sounddevice.CallbackFlags()) seek += num_samples_in_chunk @@ -138,8 +139,9 @@ class MockInputStream: seek = 0 def stop(self): - self.running = False - self.thread.join() + self._stop_event.set() + if self.thread.is_alive(): + self.thread.join(timeout=5) def close(self): self.stop() From 749d9e6e4da239f57a67b5061bb60966a63faa15 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sat, 7 Feb 2026 12:40:40 +0200 Subject: [PATCH 19/37] UI glitch fixes for recording transcriber (#1379) --- buzz/transcriber/recording_transcriber.py | 3 +++ buzz/widgets/audio_meter_widget.py | 4 ++++ buzz/widgets/recording_transcriber_widget.py | 13 ++++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index a2d60e99..43e36fa4 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -370,6 +370,9 @@ class RecordingTranscriber(QObject): self.transcription.emit(_("Starting Whisper.cpp...")) + if platform.system() == "Darwin" and platform.machine() == "arm64": + self.transcription.emit(_("First time use of a model may take up to several minutest to load.")) + self.process = None server_executable = "whisper-server.exe" if sys.platform == "win32" else "whisper-server" diff --git a/buzz/widgets/audio_meter_widget.py b/buzz/widgets/audio_meter_widget.py index 11afa5f6..fff4e9d3 100644 --- a/buzz/widgets/audio_meter_widget.py +++ b/buzz/widgets/audio_meter_widget.py @@ -68,6 +68,10 @@ class AudioMeterWidget(QWidget): rect.height() - self.PADDING_TOP, ) + def reset_amplitude(self): + self.current_amplitude = 0.0 + self.repaint() + def update_amplitude(self, amplitude: float): self.current_amplitude = max( amplitude, self.current_amplitude * self.SMOOTHING_FACTOR diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index 63f19296..26cb92c0 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -193,7 +193,7 @@ class RecordingTranscriberWidget(QWidget): self.translation_text_box.hide() self.setLayout(layout) - self.resize(450, 500) + self.resize(550, 500) self.reset_recording_amplitude_listener() @@ -512,6 +512,15 @@ class RecordingTranscriberWidget(QWidget): def on_record_button_clicked(self): if self.current_status == self.RecordingStatus.STOPPED: + # Stop amplitude listener and disconnect its signal before resetting + # to prevent queued amplitude events from overriding the reset + if self.recording_amplitude_listener is not None: + self.recording_amplitude_listener.amplitude_changed.disconnect( + self.on_recording_amplitude_changed + ) + self.recording_amplitude_listener.stop_recording() + self.recording_amplitude_listener = None + self.audio_meter_widget.reset_amplitude() self.start_recording() self.current_status = self.RecordingStatus.RECORDING self.record_button.set_recording() @@ -643,6 +652,7 @@ class RecordingTranscriberWidget(QWidget): show_model_download_error_dialog(self, error) self.stop_recording() self.set_recording_status_stopped() + self.reset_recording_amplitude_listener() self.record_button.setDisabled(False) @staticmethod @@ -854,6 +864,7 @@ class RecordingTranscriberWidget(QWidget): self.model_loader.cancel() self.reset_model_download() self.set_recording_status_stopped() + self.reset_recording_amplitude_listener() self.record_button.setDisabled(False) def reset_model_download(self): From 795da67f205f9f8fe8b3d4c3b5de10a6a195795d Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 8 Feb 2026 15:13:21 +0200 Subject: [PATCH 20/37] 1026 translation improvements (#1380) --- Makefile | 2 +- buzz/__version__.py | 2 +- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 24 +- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 24 +- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 24 +- buzz/locale/en_US/LC_MESSAGES/buzz.po | 23 +- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 24 +- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 24 +- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 24 +- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 25 +- buzz/locale/nl/LC_MESSAGES/buzz.po | 24 +- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 23 +- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 24 +- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 24 +- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 24 +- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 23 +- buzz/translator.py | 136 ++++- pyproject.toml | 2 +- tests/model_loader_test.py | 184 ++++++- .../file_transcriber_queue_worker_test.py | 103 +++- ...penai_whisper_api_file_transcriber_test.py | 62 +++ .../transcriber/recording_transcriber_test.py | 463 +++++++++++++++++- .../transcriber/transformers_whisper_test.py | 62 ++- .../whisper_file_transcriber_test.py | 50 +- tests/translator_test.py | 55 +++ ...scription_viewer_widget_additional_test.py | 8 +- uv.lock | 3 +- 27 files changed, 1318 insertions(+), 148 deletions(-) diff --git a/Makefile b/Makefile index e8a20d32..185345d3 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Change also in pyproject.toml and buzz/__version__.py -version := 1.4.3 +version := 1.4.4 mac_app_path := ./dist/Buzz.app mac_zip_path := ./dist/Buzz-${version}-mac.zip diff --git a/buzz/__version__.py b/buzz/__version__.py index fd870296..8f8e75e9 100644 --- a/buzz/__version__.py +++ b/buzz/__version__.py @@ -1 +1 @@ -VERSION = "1.4.3" +VERSION = "1.4.4" diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index b6498b7b..cdbf52bc 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -375,6 +375,7 @@ msgid "Model:" msgstr "Model:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 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." @@ -676,11 +677,11 @@ msgstr "Selecciona la carpeta d'exportació" msgid "Select Background Color" msgstr "Selecciona un fitxer d'àudio" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "S'ha produït un error en iniciar un enregistrament nou:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1036,14 +1037,15 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1417,15 +1419,15 @@ msgstr "Sundanès" msgid "Cantonese" msgstr "Cantonès" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "S'ha produït un error de connexió" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "Començant Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "Cancel·la la transcripció" @@ -1510,6 +1512,12 @@ msgstr "Afegeix a sobre" msgid "Append and correct" msgstr "Afegeix i corregeix" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "Configuració de la traducció" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index 7cbf1529..dadfd150 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -374,6 +374,7 @@ msgid "Model:" msgstr "Model:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 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." @@ -673,11 +674,11 @@ msgstr "Vælg eksport-mappe" msgid "Select Background Color" msgstr "Vælg audio-fil" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "Der skete en fejl ved opstart af en ny optagelse:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1030,12 +1031,13 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1407,15 +1409,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Der er opstået en forbindelsesfejl" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "Afbryd transkription" @@ -1501,6 +1503,12 @@ msgstr "Tilføj herover" msgid "Append and correct" msgstr "Tilføj og ret" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "Oversættelsesindstillinger" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index d4532a26..d5376bf3 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -374,6 +374,7 @@ msgid "Model:" msgstr "Modell:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 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 " @@ -674,11 +675,11 @@ msgstr "Exportordner auswählen" msgid "Select Background Color" msgstr "Audiodatei auswählen" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "Beim Starten einer neuen Aufnahme ist ein Fehler aufgetreten:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1032,12 +1033,13 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1409,15 +1411,15 @@ msgstr "Sundanesisch" msgid "Cantonese" msgstr "Kantonesisch" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Ein Verbindungsfehler ist aufgetreten" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "Transkription abbrechen" @@ -1503,6 +1505,12 @@ msgstr "Oben anhängen" msgid "Append and correct" msgstr "Anhängen und korrigieren" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "Übersetzungseinstellungen" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index d0ccc1eb..d425ef4f 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -364,6 +364,7 @@ msgid "Model:" msgstr "" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 msgid "First time use of a model may take up to several minutest to load." msgstr "" @@ -653,11 +654,11 @@ msgstr "" msgid "Select Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1002,12 +1003,13 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1378,15 +1380,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 msgid "Starting transcription..." msgstr "" @@ -1470,6 +1472,11 @@ msgstr "" msgid "Append and correct" msgstr "" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +msgid "Translation error, see logs!" +msgstr "" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 3d1f1f74..8e982361 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -387,6 +387,7 @@ msgid "Model:" msgstr "Modelo:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 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." @@ -712,12 +713,12 @@ msgid "Select Background Color" msgstr "Seleccionar archivo de audio" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "Se produjo un error al iniciar una grabación nueva:" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1089,14 +1090,15 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1471,16 +1473,16 @@ msgstr "Sundanés" msgid "Cantonese" msgstr "Cantonés" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Se ha producido un error de conexión" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." # automatic translation -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "Cancelar transcripción" @@ -1571,6 +1573,12 @@ msgstr "Añadir arriba" msgid "Append and correct" msgstr "Añadir y corregir" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "Ajustes de traducción" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 0501335a..cdbb6116 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -378,6 +378,7 @@ msgid "Model:" msgstr "Modello:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 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 " @@ -674,11 +675,11 @@ msgstr "Seleziona il colore del testo" msgid "Select Background Color" msgstr "Seleziona il colore di sfondo" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "Si è verificato un errore durante l'avvio della nuova registrazione:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1040,13 +1041,14 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1420,15 +1422,15 @@ msgstr "Sundanese" msgid "Cantonese" msgstr "Cantonese" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Si è verificato un errore di connessione" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "Avvio di Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 msgid "Starting transcription..." msgstr "Inizio trascrizione..." @@ -1512,6 +1514,12 @@ msgstr "Aggiungere sopra" msgid "Append and correct" msgstr "Aggiungere e correggere" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "Impostazioni di traduzione" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 7b9e3597..148ac4f2 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -370,6 +370,7 @@ msgid "Model:" msgstr "モデル:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 msgid "First time use of a model may take up to several minutest to load." msgstr "" @@ -669,11 +670,11 @@ msgstr "出力フォルダを選択" msgid "Select Background Color" msgstr "音声ファイルを選択" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "新規録音開始時にエラーが発生しました:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1025,12 +1026,13 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1402,15 +1404,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "接続エラーが発生しました" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "文字起こしをキャンセルする" @@ -1496,6 +1498,12 @@ msgstr "" msgid "Append and correct" msgstr "" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "翻訳設定" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 2e801682..bf28ffc4 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: 2026-02-06 20:31+0200\n" -"PO-Revision-Date: 2026-02-06 20:32+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" +"PO-Revision-Date: 2026-02-08 13:58+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -380,6 +380,7 @@ msgid "Model:" msgstr "Modelis:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 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." @@ -674,11 +675,11 @@ msgstr "Izvēlieties teksta krāsu" msgid "Select Background Color" msgstr "Izvēlieties fona krāsu" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "Sākot jaunu ierakstu notikusi kļūda:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1031,14 +1032,15 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1412,15 +1414,15 @@ msgstr "Sundāņu" msgid "Cantonese" msgstr "Kantonas" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Notika savienojuma kļūda" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "Palaiž Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 msgid "Starting transcription..." msgstr "Sāk atpazīšanu..." @@ -1504,6 +1506,11 @@ msgstr "Jaunie teikumi augšā" msgid "Append and correct" msgstr "Papildināt un labot esošo" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +msgid "Translation error, see logs!" +msgstr "Kļūda tulkojot, skatiet sistēmas žurnālu!" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 23a1ff39..4cd0b875 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -376,6 +376,7 @@ msgid "Model:" msgstr "Model:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 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 " @@ -676,11 +677,11 @@ msgstr "Kies een exportmap" msgid "Select Background Color" msgstr "Kies een audiobestand" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "Er is een fout opgetreden tijdens het starten van de opname:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1031,12 +1032,13 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1408,15 +1410,15 @@ msgstr "Soedanees" msgid "Cantonese" msgstr "Kantonees" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Er is een verbindingsfout opgetreden" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "Transcriptie wissen" @@ -1502,6 +1504,12 @@ msgstr "Bovenaan toevoegen" msgid "Append and correct" msgstr "Toevoegen en corrigeren" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "Vertaalinstellingen" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index d1b969c3..ba033595 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -377,6 +377,7 @@ msgid "Model:" msgstr "Model:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 msgid "First time use of a model may take up to several minutest to load." msgstr "" @@ -681,11 +682,11 @@ msgstr "Wybierz plik audio" msgid "Select Background Color" msgstr "Wybierz plik audio" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "Wystąpił błąd podczas rozpoczęcia nowego nagrania:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1043,12 +1044,13 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1421,15 +1423,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "Anuluj transkrypcję" @@ -1520,6 +1522,11 @@ msgstr "" msgid "Append and correct" msgstr "" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +msgid "Translation error, see logs!" +msgstr "" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index 04955f0f..136ac525 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -374,6 +374,7 @@ msgid "Model:" msgstr "Modelo:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 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." @@ -674,11 +675,11 @@ msgstr "Selecionar Pasta de Exportação" msgid "Select Background Color" msgstr "Selecionar arquivo de áudio" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "Ocorreu um erro ao iniciar uma nova gravação:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1034,12 +1035,13 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1413,15 +1415,15 @@ msgstr "Sundanês" msgid "Cantonese" msgstr "Cantonês" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Ocorreu um erro de conexão" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "Iniciando transcrição..." @@ -1506,6 +1508,12 @@ msgstr "Acrescentar acima" msgid "Append and correct" msgstr "Acrescentar e corrigir" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "Configurações de tradução" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 20c151a8..cf1b6762 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -372,6 +372,7 @@ msgid "Model:" msgstr "Модель:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 msgid "First time use of a model may take up to several minutest to load." msgstr "" @@ -671,11 +672,11 @@ msgstr "Виберіть теку для експорту" msgid "Select Background Color" msgstr "Вибрати аудіофайл" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "При старті нового запису виникла помилка:" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1027,12 +1028,13 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1404,15 +1406,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "Виникла помилка зʼєднання" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "Скасувати транскрипцію" @@ -1498,6 +1500,12 @@ msgstr "" msgid "Append and correct" msgstr "" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "Налаштування перекладу" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index d401bf20..7d5f52d8 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -380,6 +380,7 @@ msgid "Model:" msgstr "模型:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 msgid "First time use of a model may take up to several minutest to load." msgstr "首次使用模型可能需要几分钟的时间才能加载" @@ -684,11 +685,11 @@ msgstr "选择输出文件夹" msgid "Select Background Color" msgstr "选择音频文件" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "开始新录制时出错" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1043,12 +1044,13 @@ 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:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1421,15 +1423,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "连接发生错误" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "取消识别" @@ -1520,6 +1522,12 @@ msgstr "增加上方" msgid "Append and correct" msgstr "增加并纠正" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +#, fuzzy +msgid "Translation error, see logs!" +msgstr "翻译设置" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index 5e586d24..ac2ae1c9 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: 2026-02-06 20:31+0200\n" +"POT-Creation-Date: 2026-02-08 13:57+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -375,6 +375,7 @@ msgid "Model:" msgstr "模型:" #: buzz/widgets/transcriber/transcription_options_group_box.py:113 +#: buzz/transcriber/recording_transcriber.py:374 msgid "First time use of a model may take up to several minutest to load." msgstr "" @@ -677,11 +678,11 @@ msgstr "選擇聲音檔案" msgid "Select Background Color" msgstr "選擇聲音檔案" -#: buzz/widgets/recording_transcriber_widget.py:836 +#: buzz/widgets/recording_transcriber_widget.py:854 msgid "An error occurred while starting a new recording:" msgstr "開始新錄製出錯" -#: buzz/widgets/recording_transcriber_widget.py:840 +#: buzz/widgets/recording_transcriber_widget.py:858 msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -1035,12 +1036,13 @@ msgid "Unable to save OpenAI API key to keyring" msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:430 +#: buzz/transcriber/recording_transcriber.py:100 +#: buzz/transcriber/recording_transcriber.py:445 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:434 +#: buzz/transcriber/recording_transcriber.py:449 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 " @@ -1413,15 +1415,15 @@ msgstr "" msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:247 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:361 +#: buzz/transcriber/recording_transcriber.py:371 msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:421 +#: buzz/transcriber/recording_transcriber.py:436 #, fuzzy msgid "Starting transcription..." msgstr "取消錄製" @@ -1512,6 +1514,11 @@ msgstr "" msgid "Append and correct" msgstr "" +#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 +#: buzz/translator.py:140 +msgid "Translation error, see logs!" +msgstr "" + #: buzz/file_transcriber_queue_worker.py:154 msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/translator.py b/buzz/translator.py index ffeecf7b..0a16bd72 100644 --- a/buzz/translator.py +++ b/buzz/translator.py @@ -1,17 +1,22 @@ import os +import re import logging import queue -from typing import Optional +from typing import Optional, List, Tuple from openai import OpenAI, max_retries from PyQt6.QtCore import QObject, pyqtSignal +from buzz.locale import _ from buzz.settings.settings import Settings from buzz.store.keyring_store import get_password, Key from buzz.transcriber.transcriber import TranscriptionOptions from buzz.widgets.transcriber.advanced_settings_dialog import AdvancedSettingsDialog +BATCH_SIZE = 10 + + class Translator(QObject): translation = pyqtSignal(str, int) finished = pyqtSignal() @@ -51,6 +56,91 @@ class Translator(QObject): max_retries=0 ) + def _translate_single(self, transcript: str, transcript_id: int) -> Tuple[str, int]: + """Translate a single transcript via the API. Returns (translation, transcript_id).""" + try: + completion = self.openai_client.chat.completions.create( + model=self.transcription_options.llm_model, + messages=[ + {"role": "system", "content": self.transcription_options.llm_prompt}, + {"role": "user", "content": transcript} + ], + timeout=60.0, + ) + except Exception as e: + completion = None + logging.error(f"Translation error! Server response: {e}") + + if completion and completion.choices and completion.choices[0].message: + logging.debug(f"Received translation response: {completion}") + return completion.choices[0].message.content, transcript_id + else: + logging.error(f"Translation error! Server response: {completion}") + return _("Translation error, see logs!"), transcript_id + + def _translate_batch(self, items: List[Tuple[str, int]]) -> List[Tuple[str, int]]: + """Translate multiple transcripts in a single API call. + Returns list of (translation, transcript_id) in the same order as input.""" + numbered_parts = [] + for i, (transcript, _) in enumerate(items, 1): + numbered_parts.append(f"[{i}] {transcript}") + combined = "\n".join(numbered_parts) + + batch_prompt = ( + f"{self.transcription_options.llm_prompt}\n\n" + f"You will receive {len(items)} numbered texts. " + f"Process each one separately according to the instruction above " + f"and return them in the exact same numbered format, e.g.:\n" + f"[1] processed text\n[2] processed text" + ) + + try: + completion = self.openai_client.chat.completions.create( + model=self.transcription_options.llm_model, + messages=[ + {"role": "system", "content": batch_prompt}, + {"role": "user", "content": combined} + ], + timeout=60.0, + ) + except Exception as e: + completion = None + logging.error(f"Batch translation error! Server response: {e}") + + if not (completion and completion.choices and completion.choices[0].message): + logging.error(f"Batch translation error! Server response: {completion}") + return [(_("Translation error, see logs!"), tid) for _, tid in items] + + response_text = completion.choices[0].message.content + logging.debug(f"Received batch translation response: {response_text}") + + translations = self._parse_batch_response(response_text, len(items)) + + results = [] + for i, (_, transcript_id) in enumerate(items): + if i < len(translations): + results.append((translations[i], transcript_id)) + else: + results.append((_("Translation error, see logs!"), transcript_id)) + return results + + @staticmethod + def _parse_batch_response(response: str, expected_count: int) -> List[str]: + """Parse a numbered batch response like '[1] text\\n[2] text' into a list of strings.""" + # Split on [N] markers — re.split with a group returns: [before, group1, after1, group2, after2, ...] + parts = re.split(r'\[(\d+)\]\s*', response) + + translations = {} + for i in range(1, len(parts) - 1, 2): + num = int(parts[i]) + text = parts[i + 1].strip() + translations[num] = text + + return [ + translations.get(i, _("Translation error, see logs!")) + for i in range(1, expected_count + 1) + ] + def start(self): logging.debug("Starting translation queue") @@ -62,30 +152,32 @@ class Translator(QObject): logging.debug("Translation queue received stop signal") break - transcript, transcript_id = item + # Collect a batch: start with the first item, then drain more + batch = [item] + stop_after_batch = False + while len(batch) < BATCH_SIZE: + try: + next_item = self.queue.get_nowait() + if next_item is None: + stop_after_batch = True + break + batch.append(next_item) + except queue.Empty: + break - try: - completion = self.openai_client.chat.completions.create( - model=self.transcription_options.llm_model, - messages=[ - {"role": "system", "content": self.transcription_options.llm_prompt}, - {"role": "user", "content": transcript} - ], - timeout=30.0, - - ) - except Exception as e: - completion = None - logging.error(f"Translation error! Server response: {e}") - - if completion and completion.choices and completion.choices[0].message: - logging.debug(f"Received translation response: {completion}") - next_translation = completion.choices[0].message.content + if len(batch) == 1: + transcript, transcript_id = batch[0] + translation, tid = self._translate_single(transcript, transcript_id) + self.translation.emit(translation, tid) else: - logging.error(f"Translation error! Server response: {completion}") - next_translation = "Translation error, see logs!" + logging.debug(f"Translating batch of {len(batch)} in single request") + results = self._translate_batch(batch) + for translation, tid in results: + self.translation.emit(translation, tid) - self.translation.emit(next_translation, transcript_id) + if stop_after_batch: + logging.debug("Translation queue received stop signal") + break logging.debug("Translation queue stopped") self.finished.emit() diff --git a/pyproject.toml b/pyproject.toml index 8f26e4ed..7e0fc933 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "buzz-captions" # Change also in Makefile and buzz/__version__.py -version = "1.4.3" +version = "1.4.4" description = "" authors = [{ name = "Chidi Williams", email = "williamschidi1@gmail.com" }] requires-python = ">=3.12,<3.13" diff --git a/tests/model_loader_test.py b/tests/model_loader_test.py index d1c9d638..e6cee71a 100644 --- a/tests/model_loader_test.py +++ b/tests/model_loader_test.py @@ -1,7 +1,18 @@ import os import pytest +from unittest.mock import patch -from buzz.model_loader import ModelDownloader,TranscriptionModel, ModelType, WhisperModelSize +from buzz.model_loader import ( + ModelDownloader, + TranscriptionModel, + ModelType, + WhisperModelSize, + map_language_to_mms, + is_mms_model, + get_expected_whisper_model_size, + get_whisper_file_path, + WHISPER_MODEL_SIZES, +) class TestModelLoader: @@ -23,3 +34,174 @@ class TestModelLoader: assert model_path is not None, "Model path is None" assert os.path.isdir(model_path), "Model path is not a directory" assert len(os.listdir(model_path)) > 0, "Model directory is empty" + + +class TestMapLanguageToMms: + def test_empty_returns_english(self): + assert map_language_to_mms("") == "eng" + + def test_two_letter_known_code(self): + assert map_language_to_mms("en") == "eng" + assert map_language_to_mms("fr") == "fra" + assert map_language_to_mms("lv") == "lav" + + def test_three_letter_code_returned_as_is(self): + assert map_language_to_mms("eng") == "eng" + assert map_language_to_mms("fra") == "fra" + + def test_unknown_two_letter_code_returned_as_is(self): + assert map_language_to_mms("xx") == "xx" + + @pytest.mark.parametrize( + "code,expected", + [ + ("de", "deu"), + ("es", "spa"), + ("ja", "jpn"), + ("zh", "cmn"), + ("ar", "ara"), + ], + ) + def test_various_language_codes(self, code, expected): + assert map_language_to_mms(code) == expected + + +class TestIsMmsModel: + def test_empty_string(self): + assert is_mms_model("") is False + + def test_mms_in_model_id(self): + assert is_mms_model("facebook/mms-1b-all") is True + + def test_mms_case_insensitive(self): + assert is_mms_model("facebook/MMS-1b-all") is True + + def test_non_mms_model(self): + assert is_mms_model("openai/whisper-tiny") is False + + +class TestWhisperModelSize: + def test_to_faster_whisper_model_size_large(self): + assert WhisperModelSize.LARGE.to_faster_whisper_model_size() == "large-v1" + + def test_to_faster_whisper_model_size_tiny(self): + assert WhisperModelSize.TINY.to_faster_whisper_model_size() == "tiny" + + def test_to_faster_whisper_model_size_largev3(self): + assert WhisperModelSize.LARGEV3.to_faster_whisper_model_size() == "large-v3" + + def test_to_whisper_cpp_model_size_large(self): + assert WhisperModelSize.LARGE.to_whisper_cpp_model_size() == "large-v1" + + def test_to_whisper_cpp_model_size_tiny(self): + assert WhisperModelSize.TINY.to_whisper_cpp_model_size() == "tiny" + + def test_str(self): + assert str(WhisperModelSize.TINY) == "Tiny" + assert str(WhisperModelSize.LARGE) == "Large" + assert str(WhisperModelSize.LARGEV3TURBO) == "Large-v3-turbo" + assert str(WhisperModelSize.CUSTOM) == "Custom" + + +class TestModelType: + def test_supports_initial_prompt(self): + assert ModelType.WHISPER.supports_initial_prompt is True + assert ModelType.WHISPER_CPP.supports_initial_prompt is True + assert ModelType.OPEN_AI_WHISPER_API.supports_initial_prompt is True + assert ModelType.FASTER_WHISPER.supports_initial_prompt is True + assert ModelType.HUGGING_FACE.supports_initial_prompt is False + + @pytest.mark.parametrize( + "platform_system,platform_machine,expected_faster_whisper", + [ + ("Linux", "x86_64", True), + ("Windows", "AMD64", True), + ("Darwin", "arm64", True), + ("Darwin", "x86_64", False), # Faster Whisper not available on macOS x86_64 + ], + ) + def test_is_available(self, platform_system, platform_machine, expected_faster_whisper): + with patch("platform.system", return_value=platform_system), \ + patch("platform.machine", return_value=platform_machine): + # These should always be available + assert ModelType.WHISPER.is_available() is True + assert ModelType.HUGGING_FACE.is_available() is True + assert ModelType.OPEN_AI_WHISPER_API.is_available() is True + assert ModelType.WHISPER_CPP.is_available() is True + + # Faster Whisper depends on platform + assert ModelType.FASTER_WHISPER.is_available() == expected_faster_whisper + + def test_is_manually_downloadable(self): + assert ModelType.WHISPER.is_manually_downloadable() is True + assert ModelType.WHISPER_CPP.is_manually_downloadable() is True + assert ModelType.FASTER_WHISPER.is_manually_downloadable() is True + assert ModelType.HUGGING_FACE.is_manually_downloadable() is False + assert ModelType.OPEN_AI_WHISPER_API.is_manually_downloadable() is False + + +class TestTranscriptionModel: + def test_str_whisper(self): + model = TranscriptionModel( + model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY + ) + assert str(model) == "Whisper (Tiny)" + + def test_str_whisper_cpp(self): + model = TranscriptionModel( + model_type=ModelType.WHISPER_CPP, whisper_model_size=WhisperModelSize.BASE + ) + assert str(model) == "Whisper.cpp (Base)" + + def test_str_hugging_face(self): + model = TranscriptionModel( + model_type=ModelType.HUGGING_FACE, + hugging_face_model_id="openai/whisper-tiny", + ) + assert str(model) == "Hugging Face (openai/whisper-tiny)" + + def test_str_faster_whisper(self): + model = TranscriptionModel( + model_type=ModelType.FASTER_WHISPER, + whisper_model_size=WhisperModelSize.SMALL, + ) + assert str(model) == "Faster Whisper (Small)" + + def test_str_openai_api(self): + model = TranscriptionModel(model_type=ModelType.OPEN_AI_WHISPER_API) + assert str(model) == "OpenAI Whisper API" + + def test_default(self): + model = TranscriptionModel.default() + assert model.model_type in list(ModelType) + assert model.model_type.is_available() is True + + def test_get_local_model_path_openai_api(self): + model = TranscriptionModel(model_type=ModelType.OPEN_AI_WHISPER_API) + assert model.get_local_model_path() == "" + + +class TestGetExpectedWhisperModelSize: + def test_known_sizes(self): + assert get_expected_whisper_model_size(WhisperModelSize.TINY) == 72 * 1024 * 1024 + assert get_expected_whisper_model_size(WhisperModelSize.LARGE) == 2870 * 1024 * 1024 + + def test_unknown_size_returns_none(self): + assert get_expected_whisper_model_size(WhisperModelSize.CUSTOM) is None + assert get_expected_whisper_model_size(WhisperModelSize.LUMII) is None + + def test_all_defined_sizes_have_values(self): + for size in WHISPER_MODEL_SIZES: + assert WHISPER_MODEL_SIZES[size] > 0 + + +class TestGetWhisperFilePath: + def test_custom_size(self): + path = get_whisper_file_path(WhisperModelSize.CUSTOM) + assert path.endswith("custom") + assert "whisper" in path + + def test_tiny_size(self): + path = get_whisper_file_path(WhisperModelSize.TINY) + assert "whisper" in path + assert path.endswith(".pt") diff --git a/tests/transcriber/file_transcriber_queue_worker_test.py b/tests/transcriber/file_transcriber_queue_worker_test.py index e48bccb9..323109c8 100644 --- a/tests/transcriber/file_transcriber_queue_worker_test.py +++ b/tests/transcriber/file_transcriber_queue_worker_test.py @@ -1,9 +1,10 @@ import pytest import unittest.mock +import uuid from PyQt6.QtCore import QCoreApplication, QThread from buzz.file_transcriber_queue_worker import FileTranscriberQueueWorker from buzz.model_loader import ModelType, TranscriptionModel, WhisperModelSize -from buzz.transcriber.transcriber import FileTranscriptionTask, TranscriptionOptions, FileTranscriptionOptions +from buzz.transcriber.transcriber import FileTranscriptionTask, TranscriptionOptions, FileTranscriptionOptions, Segment from buzz.transcriber.whisper_file_transcriber import WhisperFileTranscriber from tests.audio import test_multibyte_utf8_audio_path import time @@ -31,6 +32,106 @@ def worker(qapp): thread.wait() +@pytest.fixture +def simple_worker(qapp): + """A non-threaded worker for unit tests that only test individual methods.""" + worker = FileTranscriberQueueWorker() + yield worker + + +class TestFileTranscriberQueueWorker: + def test_cancel_task_adds_to_canceled_set(self, simple_worker): + task_id = uuid.uuid4() + simple_worker.cancel_task(task_id) + assert task_id in simple_worker.canceled_tasks + + def test_add_task_removes_from_canceled(self, simple_worker): + options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP, whisper_model_size=WhisperModelSize.TINY), + extract_speech=False + ) + task = FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + + # First cancel it + simple_worker.cancel_task(task.uid) + assert task.uid in simple_worker.canceled_tasks + + # Prevent trigger_run from starting the run loop + simple_worker.is_running = True + # Then add it back + simple_worker.add_task(task) + assert task.uid not in simple_worker.canceled_tasks + + def test_on_task_error_with_cancellation(self, simple_worker): + options = TranscriptionOptions() + task = FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + simple_worker.current_task = task + + error_spy = unittest.mock.Mock() + simple_worker.task_error.connect(error_spy) + + simple_worker.on_task_error("Transcription was canceled") + + error_spy.assert_called_once() + assert task.status == FileTranscriptionTask.Status.CANCELED + assert "canceled" in task.error.lower() + + def test_on_task_error_with_regular_error(self, simple_worker): + options = TranscriptionOptions() + task = FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + simple_worker.current_task = task + + error_spy = unittest.mock.Mock() + simple_worker.task_error.connect(error_spy) + + simple_worker.on_task_error("Some error occurred") + + error_spy.assert_called_once() + assert task.status == FileTranscriptionTask.Status.FAILED + assert task.error == "Some error occurred" + + def test_on_task_progress_conversion(self, simple_worker): + options = TranscriptionOptions() + task = FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + simple_worker.current_task = task + + progress_spy = unittest.mock.Mock() + simple_worker.task_progress.connect(progress_spy) + + simple_worker.on_task_progress((50, 100)) + + progress_spy.assert_called_once() + args = progress_spy.call_args[0] + assert args[0] == task + assert args[1] == 0.5 + + def test_stop_puts_sentinel_in_queue(self, simple_worker): + initial_size = simple_worker.tasks_queue.qsize() + simple_worker.stop() + # Sentinel (None) should be added to queue + assert simple_worker.tasks_queue.qsize() == initial_size + 1 + + def test_transcription_with_whisper_cpp_tiny_no_speech_extraction(worker): options = TranscriptionOptions( model=TranscriptionModel(model_type=ModelType.WHISPER_CPP, whisper_model_size=WhisperModelSize.TINY), diff --git a/tests/transcriber/openai_whisper_api_file_transcriber_test.py b/tests/transcriber/openai_whisper_api_file_transcriber_test.py index 187ef1fe..44168466 100644 --- a/tests/transcriber/openai_whisper_api_file_transcriber_test.py +++ b/tests/transcriber/openai_whisper_api_file_transcriber_test.py @@ -5,16 +5,78 @@ import pytest from buzz.transcriber.openai_whisper_api_file_transcriber import ( OpenAIWhisperAPIFileTranscriber, + append_segment, ) from buzz.transcriber.transcriber import ( FileTranscriptionTask, TranscriptionOptions, FileTranscriptionOptions, + Segment, ) from openai.types.audio import Transcription, Translation +class TestAppendSegment: + def test_valid_utf8(self): + result = [] + success = append_segment(result, b"Hello world", 100, 200) + assert success is True + assert len(result) == 1 + assert result[0].start == 1000 # 100 centiseconds to ms + assert result[0].end == 2000 # 200 centiseconds to ms + assert result[0].text == "Hello world" + + def test_empty_bytes(self): + result = [] + success = append_segment(result, b"", 100, 200) + assert success is True + assert len(result) == 0 + + def test_invalid_utf8(self): + result = [] + # Invalid UTF-8 sequence + success = append_segment(result, b"\xff\xfe", 100, 200) + assert success is False + assert len(result) == 0 + + def test_multibyte_utf8(self): + result = [] + success = append_segment(result, "Привет".encode("utf-8"), 50, 150) + assert success is True + assert len(result) == 1 + assert result[0].text == "Привет" + + +class TestGetValue: + def test_get_value_from_dict(self): + obj = {"key": "value", "number": 42} + assert OpenAIWhisperAPIFileTranscriber.get_value(obj, "key") == "value" + assert OpenAIWhisperAPIFileTranscriber.get_value(obj, "number") == 42 + + def test_get_value_from_object(self): + class TestObj: + key = "value" + number = 42 + + obj = TestObj() + assert OpenAIWhisperAPIFileTranscriber.get_value(obj, "key") == "value" + assert OpenAIWhisperAPIFileTranscriber.get_value(obj, "number") == 42 + + def test_get_value_missing_key_dict(self): + obj = {"key": "value"} + assert OpenAIWhisperAPIFileTranscriber.get_value(obj, "missing") is None + assert OpenAIWhisperAPIFileTranscriber.get_value(obj, "missing", "default") == "default" + + def test_get_value_missing_attribute_object(self): + class TestObj: + key = "value" + + obj = TestObj() + assert OpenAIWhisperAPIFileTranscriber.get_value(obj, "missing") is None + assert OpenAIWhisperAPIFileTranscriber.get_value(obj, "missing", "default") == "default" + + class TestOpenAIWhisperAPIFileTranscriber: @pytest.fixture def mock_openai_client(self): diff --git a/tests/transcriber/recording_transcriber_test.py b/tests/transcriber/recording_transcriber_test.py index b0c06a72..fde018f1 100644 --- a/tests/transcriber/recording_transcriber_test.py +++ b/tests/transcriber/recording_transcriber_test.py @@ -1,7 +1,8 @@ import os import sys import time -from unittest.mock import Mock, patch +import numpy as np +from unittest.mock import Mock, patch, MagicMock from PyQt6.QtCore import QThread @@ -10,10 +11,72 @@ from buzz.assets import APP_BASE_DIR from buzz.model_loader import TranscriptionModel, ModelType, WhisperModelSize from buzz.transcriber.recording_transcriber import RecordingTranscriber from buzz.transcriber.transcriber import TranscriptionOptions, Task +from buzz.settings.recording_transcriber_mode import RecordingTranscriberMode from tests.mock_sounddevice import MockSoundDevice from tests.model_loader import get_model_path +class TestAmplitude: + def test_symmetric_array(self): + arr = np.array([1.0, -1.0, 2.0, -2.0]) + amplitude = RecordingTranscriber.amplitude(arr) + assert amplitude == 2.0 + + def test_asymmetric_array(self): + arr = np.array([1.0, 2.0, 3.0, -1.0]) + amplitude = RecordingTranscriber.amplitude(arr) + # (abs(3.0) + abs(-1.0)) / 2 = (3.0 + 1.0) / 2 = 2.0 + assert amplitude == 2.0 + + def test_all_zeros(self): + arr = np.array([0.0, 0.0, 0.0]) + amplitude = RecordingTranscriber.amplitude(arr) + assert amplitude == 0.0 + + def test_all_positive(self): + arr = np.array([1.0, 2.0, 3.0, 4.0]) + amplitude = RecordingTranscriber.amplitude(arr) + # (abs(4.0) + abs(1.0)) / 2 = (4.0 + 1.0) / 2 = 2.5 + assert amplitude == 2.5 + + def test_all_negative(self): + arr = np.array([-1.0, -2.0, -3.0, -4.0]) + amplitude = RecordingTranscriber.amplitude(arr) + # (abs(-1.0) + abs(-4.0)) / 2 = (1.0 + 4.0) / 2 = 2.5 + assert amplitude == 2.5 + + +class TestGetDeviceSampleRate: + def test_returns_default_16khz_when_supported(self): + with patch("sounddevice.check_input_settings"): + rate = RecordingTranscriber.get_device_sample_rate(None) + assert rate == 16000 + + def test_falls_back_to_device_default(self): + import sounddevice + from sounddevice import PortAudioError + + def raise_error(*args, **kwargs): + raise PortAudioError("Device doesn't support 16000") + + device_info = {"default_samplerate": 44100} + with patch("sounddevice.check_input_settings", side_effect=raise_error), \ + patch("sounddevice.query_devices", return_value=device_info): + rate = RecordingTranscriber.get_device_sample_rate(0) + assert rate == 44100 + + def test_returns_default_when_query_fails(self): + from sounddevice import PortAudioError + + def raise_error(*args, **kwargs): + raise PortAudioError("Device doesn't support 16000") + + with patch("sounddevice.check_input_settings", side_effect=raise_error), \ + patch("sounddevice.query_devices", return_value=None): + rate = RecordingTranscriber.get_device_sample_rate(0) + assert rate == 16000 + + class TestRecordingTranscriber: def test_should_transcribe(self, qtbot): @@ -63,4 +126,400 @@ class TestRecordingTranscriber: thread.quit() thread.wait() - time.sleep(3) + + # Ensure process is cleaned up + if transcriber.process and transcriber.process.poll() is None: + transcriber.process.terminate() + try: + transcriber.process.wait(timeout=2) + except: + pass + + # Process pending events to ensure cleanup + from PyQt6.QtCore import QCoreApplication + QCoreApplication.processEvents() + time.sleep(0.1) + + +class TestRecordingTranscriberInit: + def test_init_default_mode(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"): + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + assert transcriber.transcription_options == transcription_options + assert transcriber.input_device_index == 0 + assert transcriber.sample_rate == 16000 + assert transcriber.model_path == "/fake/path" + assert transcriber.n_batch_samples == 5 * 16000 + assert transcriber.keep_sample_seconds == 0.15 + assert transcriber.is_running is False + assert transcriber.openai_client is None + + def test_init_append_and_correct_mode(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"), \ + patch("buzz.transcriber.recording_transcriber.Settings") as mock_settings_class: + # Mock settings to return APPEND_AND_CORRECT mode (index 2 in the enum) + mock_settings_instance = MagicMock() + mock_settings_class.return_value = mock_settings_instance + # Return 2 for APPEND_AND_CORRECT mode (it's the third item in the enum) + mock_settings_instance.value.return_value = 2 + + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + # APPEND_AND_CORRECT mode should use smaller batch size and longer keep duration + assert transcriber.n_batch_samples == 3 * 16000 + assert transcriber.keep_sample_seconds == 1.5 + + def test_init_uses_default_sample_rate_when_none(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"): + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=None, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + # Should use default whisper sample rate + assert transcriber.sample_rate == 16000 + + +class TestStreamCallback: + def test_stream_callback_adds_to_queue(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"): + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + # Create test audio data + in_data = np.array([[0.1], [0.2], [0.3], [0.4]], dtype=np.float32) + + initial_size = transcriber.queue.size + transcriber.stream_callback(in_data, 4, None, None) + + # Queue should have grown by 4 samples + assert transcriber.queue.size == initial_size + 4 + + def test_stream_callback_emits_amplitude_changed(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"): + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + # Mock the amplitude_changed signal + amplitude_values = [] + transcriber.amplitude_changed.connect(lambda amp: amplitude_values.append(amp)) + + # Create test audio data + in_data = np.array([[0.1], [0.2], [0.3], [0.4]], dtype=np.float32) + transcriber.stream_callback(in_data, 4, None, None) + + # Should have emitted one amplitude value + assert len(amplitude_values) == 1 + assert amplitude_values[0] > 0 + + def test_stream_callback_drops_data_when_queue_full(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"): + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + # Fill the queue beyond max_queue_size + transcriber.queue = np.ones(transcriber.max_queue_size, dtype=np.float32) + initial_size = transcriber.queue.size + + # Try to add more data + in_data = np.array([[0.1], [0.2]], dtype=np.float32) + transcriber.stream_callback(in_data, 2, None, None) + + # Queue should not have grown (data was dropped) + assert transcriber.queue.size == initial_size + + +class TestStopRecording: + def test_stop_recording_sets_is_running_false(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"): + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + transcriber.is_running = True + transcriber.stop_recording() + + assert transcriber.is_running is False + + def test_stop_recording_terminates_process(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"): + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + # Mock a running process + mock_process = MagicMock() + mock_process.poll.return_value = None # Process is running + transcriber.process = mock_process + + transcriber.stop_recording() + + # Process should have been terminated and waited + mock_process.terminate.assert_called_once() + mock_process.wait.assert_called_once_with(timeout=5) + + def test_stop_recording_skips_terminated_process(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"): + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + # Mock an already terminated process + mock_process = MagicMock() + mock_process.poll.return_value = 0 # Process already terminated + transcriber.process = mock_process + + transcriber.stop_recording() + + # terminate and wait should not be called + mock_process.terminate.assert_not_called() + mock_process.wait.assert_not_called() + + +class TestStartLocalWhisperServer: + def test_start_local_whisper_server_creates_openai_client(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"), \ + patch("subprocess.Popen") as mock_popen, \ + patch("time.sleep"): + + # Mock a successful process + mock_process = MagicMock() + mock_process.poll.return_value = None # Process is running + mock_popen.return_value = mock_process + + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + try: + transcriber.is_running = True + transcriber.start_local_whisper_server() + + # Should have created an OpenAI client + assert transcriber.openai_client is not None + assert transcriber.process is not None + finally: + # Clean up to prevent QThread warnings + transcriber.is_running = False + transcriber.process = None + + def test_start_local_whisper_server_with_language(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="fr", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"), \ + patch("subprocess.Popen") as mock_popen, \ + patch("time.sleep"): + + mock_process = MagicMock() + mock_process.poll.return_value = None + mock_popen.return_value = mock_process + + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + try: + transcriber.is_running = True + transcriber.start_local_whisper_server() + + # Check that the language was passed to the command + call_args = mock_popen.call_args + cmd = call_args[0][0] + assert "--language" in cmd + assert "fr" in cmd + finally: + transcriber.is_running = False + transcriber.process = None + + def test_start_local_whisper_server_auto_language(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language=None, + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"), \ + patch("subprocess.Popen") as mock_popen, \ + patch("time.sleep"): + + mock_process = MagicMock() + mock_process.poll.return_value = None + mock_popen.return_value = mock_process + + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + try: + transcriber.is_running = True + transcriber.start_local_whisper_server() + + # Check that auto language was used + call_args = mock_popen.call_args + cmd = call_args[0][0] + assert "--language" in cmd + assert "auto" in cmd + finally: + transcriber.is_running = False + transcriber.process = None + + def test_start_local_whisper_server_handles_failure(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + ) + + with patch("sounddevice.check_input_settings"), \ + patch("subprocess.Popen") as mock_popen, \ + patch("time.sleep"): + + # Mock a failed process + mock_process = MagicMock() + mock_process.poll.return_value = 1 # Process terminated with error + mock_process.stderr.read.return_value = b"Error loading model" + mock_popen.return_value = mock_process + + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + transcriptions = [] + transcriber.transcription.connect(lambda text: transcriptions.append(text)) + + try: + transcriber.is_running = True + transcriber.start_local_whisper_server() + + # Should not have created a client when server failed + assert transcriber.openai_client is None + # Should have emitted starting and error messages + assert len(transcriptions) >= 1 + # First message should be about starting Whisper.cpp + assert "Whisper" in transcriptions[0] + finally: + transcriber.is_running = False + transcriber.process = None diff --git a/tests/transcriber/transformers_whisper_test.py b/tests/transcriber/transformers_whisper_test.py index 69c72705..ec09034e 100644 --- a/tests/transcriber/transformers_whisper_test.py +++ b/tests/transcriber/transformers_whisper_test.py @@ -1,9 +1,69 @@ import os +import sys +import platform from unittest.mock import patch import pytest -from buzz.transformers_whisper import TransformersTranscriber +from buzz.transformers_whisper import TransformersTranscriber, is_intel_mac, is_peft_model + + +class TestIsIntelMac: + @pytest.mark.parametrize( + "sys_platform,machine,expected", + [ + ("linux", "x86_64", False), + ("win32", "x86_64", False), + ("darwin", "arm64", False), + ("darwin", "x86_64", True), + ("darwin", "i386", False), + ], + ) + def test_is_intel_mac(self, sys_platform, machine, expected): + with patch("buzz.transformers_whisper.sys.platform", sys_platform), \ + patch("buzz.transformers_whisper.platform.machine", return_value=machine): + assert is_intel_mac() == expected + + +class TestIsPeftModel: + @pytest.mark.parametrize( + "model_id,expected", + [ + ("openai/whisper-tiny-peft", True), + ("user/model-PEFT", True), + ("openai/whisper-tiny", False), + ("facebook/mms-1b-all", False), + ("", False), + ], + ) + def test_peft_detection(self, model_id, expected): + assert is_peft_model(model_id) == expected + + +class TestGetPeftRepoId: + def test_repo_id_returned_as_is(self): + transcriber = TransformersTranscriber("user/whisper-tiny-peft") + with patch("os.path.exists", return_value=False): + assert transcriber._get_peft_repo_id() == "user/whisper-tiny-peft" + + def test_linux_cache_path(self): + linux_path = "/home/user/.cache/Buzz/models/models--user--whisper-peft/snapshots/abc123" + transcriber = TransformersTranscriber(linux_path) + with patch("os.path.exists", return_value=True), \ + patch("buzz.transformers_whisper.os.sep", "/"): + assert transcriber._get_peft_repo_id() == "user/whisper-peft" + + def test_windows_cache_path(self): + windows_path = r"C:\Users\user\.cache\Buzz\models\models--user--whisper-peft\snapshots\abc123" + transcriber = TransformersTranscriber(windows_path) + with patch("os.path.exists", return_value=True), \ + patch("buzz.transformers_whisper.os.sep", "\\"): + assert transcriber._get_peft_repo_id() == "user/whisper-peft" + + def test_fallback_returns_model_id(self): + transcriber = TransformersTranscriber("some-local-model") + with patch("os.path.exists", return_value=True): + assert transcriber._get_peft_repo_id() == "some-local-model" class TestGetMmsRepoId: diff --git a/tests/transcriber/whisper_file_transcriber_test.py b/tests/transcriber/whisper_file_transcriber_test.py index e4041edf..18a032b6 100644 --- a/tests/transcriber/whisper_file_transcriber_test.py +++ b/tests/transcriber/whisper_file_transcriber_test.py @@ -21,11 +21,59 @@ from buzz.transcriber.transcriber import ( FileTranscriptionOptions, Segment, ) -from buzz.transcriber.whisper_file_transcriber import WhisperFileTranscriber +from buzz.transcriber.whisper_file_transcriber import ( + WhisperFileTranscriber, + check_file_has_audio_stream, + PROGRESS_REGEX, +) from tests.audio import test_audio_path from tests.model_loader import get_model_path +class TestCheckFileHasAudioStream: + def test_valid_audio_file(self): + # Should not raise exception for valid audio file + check_file_has_audio_stream(test_audio_path) + + def test_missing_file(self): + with pytest.raises(ValueError, match="File not found"): + check_file_has_audio_stream("/nonexistent/path/to/file.mp3") + + def test_invalid_media_file(self): + # Create a temporary text file (not a valid media file) + temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") + try: + temp_file.write(b"This is not a valid media file") + temp_file.close() + with pytest.raises(ValueError, match="Invalid media file"): + check_file_has_audio_stream(temp_file.name) + finally: + os.unlink(temp_file.name) + + +class TestProgressRegex: + def test_integer_percentage(self): + match = PROGRESS_REGEX.search("Progress: 50%") + assert match is not None + assert match.group() == "50%" + + def test_decimal_percentage(self): + match = PROGRESS_REGEX.search("Progress: 75.5%") + assert match is not None + assert match.group() == "75.5%" + + def test_no_match(self): + match = PROGRESS_REGEX.search("No percentage here") + assert match is None + + def test_extract_percentage_value(self): + line = "Transcription progress: 85%" + match = PROGRESS_REGEX.search(line) + assert match is not None + percentage = int(match.group().strip("%")) + assert percentage == 85 + + class TestWhisperFileTranscriber: @pytest.mark.parametrize( "file_path,output_format,expected_file_path", diff --git a/tests/translator_test.py b/tests/translator_test.py index c9b4d8e3..4cfc54f1 100644 --- a/tests/translator_test.py +++ b/tests/translator_test.py @@ -8,6 +8,56 @@ from PyQt6.QtCore import QThread from buzz.translator import Translator from buzz.transcriber.transcriber import TranscriptionOptions from buzz.widgets.transcriber.advanced_settings_dialog import AdvancedSettingsDialog +from buzz.locale import _ + + +class TestParseBatchResponse: + def test_simple_batch(self): + response = "[1] Hello\n[2] World" + result = Translator._parse_batch_response(response, 2) + assert len(result) == 2 + assert result[0] == "Hello" + assert result[1] == "World" + + def test_missing_entries_fallback(self): + response = "[1] Hello\n[3] World" + result = Translator._parse_batch_response(response, 3) + assert len(result) == 3 + assert result[0] == "Hello" + assert result[1] == _("Translation error, see logs!") + assert result[2] == "World" + + def test_multiline_entries(self): + response = "[1] This is a long\nmultiline translation\n[2] Short" + result = Translator._parse_batch_response(response, 2) + assert len(result) == 2 + assert "multiline" in result[0] + assert result[1] == "Short" + + def test_single_item_batch(self): + response = "[1] Single translation" + result = Translator._parse_batch_response(response, 1) + assert len(result) == 1 + assert result[0] == "Single translation" + + def test_empty_response(self): + response = "" + result = Translator._parse_batch_response(response, 2) + assert len(result) == 2 + assert result[0] == _("Translation error, see logs!") + assert result[1] == _("Translation error, see logs!") + + def test_whitespace_handling(self): + response = "[1] Hello with spaces \n[2] World " + result = Translator._parse_batch_response(response, 2) + assert result[0] == "Hello with spaces" + assert result[1] == "World" + + def test_out_of_order_entries(self): + response = "[2] Second\n[1] First" + result = Translator._parse_batch_response(response, 2) + assert result[0] == "First" + assert result[1] == "Second" class TestTranslator: @@ -25,6 +75,7 @@ class TestTranslator: side_effect.call_count = 0 mock_queue.get.side_effect = side_effect + mock_queue.get_nowait.side_effect = Empty mock_chat = Mock() mock_openai.return_value.chat = mock_chat mock_chat.completions.create.return_value = Mock( @@ -110,6 +161,10 @@ class TestTranslator: self.translation_thread.quit() # Wait for the thread to actually finish before cleanup self.translation_thread.wait() + # Process pending events to ensure deleteLater() is handled + from PyQt6.QtCore import QCoreApplication + QCoreApplication.processEvents() + time.sleep(0.1) # Give time for cleanup # Note: translator and translation_thread will be automatically deleted # via the deleteLater() connections set up earlier diff --git a/tests/widgets/transcription_viewer/transcription_viewer_widget_additional_test.py b/tests/widgets/transcription_viewer/transcription_viewer_widget_additional_test.py index 9e716e7a..124f3541 100644 --- a/tests/widgets/transcription_viewer/transcription_viewer_widget_additional_test.py +++ b/tests/widgets/transcription_viewer/transcription_viewer_widget_additional_test.py @@ -778,9 +778,13 @@ class TestTranscriptionViewerWidgetAdditional: widget.close() - # TODO - it is sending actual requests, should mock - def test_run_translation(self, qtbot: QtBot, transcription, transcription_service, shortcuts): + @patch('buzz.translator.OpenAI') + def test_run_translation(self, mock_openai, qtbot: QtBot, transcription, transcription_service, shortcuts): """Test run_translation method""" + mock_openai.return_value.chat.completions.create.return_value = MagicMock( + choices=[MagicMock(message=MagicMock(content="Translated text"))] + ) + widget = TranscriptionViewerWidget( transcription, transcription_service, shortcuts ) diff --git a/uv.lock b/uv.lock index 674b0ef3..5b51fac1 100644 --- a/uv.lock +++ b/uv.lock @@ -274,7 +274,7 @@ wheels = [ [[package]] name = "buzz-captions" -version = "1.4.3" +version = "1.4.4" source = { editable = "." } dependencies = [ { name = "accelerate" }, @@ -1132,7 +1132,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/0a/a3871375c7b9727edaeeea994bfff7c63ff7804c9829c19309ba2e058807/greenlet-3.3.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:b01548f6e0b9e9784a2c99c5651e5dc89ffcbe870bc5fb2e5ef864e9cc6b5dcb", size = 276379, upload-time = "2025-12-04T14:23:30.498Z" }, { url = "https://files.pythonhosted.org/packages/43/ab/7ebfe34dce8b87be0d11dae91acbf76f7b8246bf9d6b319c741f99fa59c6/greenlet-3.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:349345b770dc88f81506c6861d22a6ccd422207829d2c854ae2af8025af303e3", size = 597294, upload-time = "2025-12-04T14:50:06.847Z" }, { url = "https://files.pythonhosted.org/packages/a4/39/f1c8da50024feecd0793dbd5e08f526809b8ab5609224a2da40aad3a7641/greenlet-3.3.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e8e18ed6995e9e2c0b4ed264d2cf89260ab3ac7e13555b8032b25a74c6d18655", size = 607742, upload-time = "2025-12-04T14:57:42.349Z" }, - { url = "https://files.pythonhosted.org/packages/77/cb/43692bcd5f7a0da6ec0ec6d58ee7cddb606d055ce94a62ac9b1aa481e969/greenlet-3.3.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c024b1e5696626890038e34f76140ed1daf858e37496d33f2af57f06189e70d7", size = 622297, upload-time = "2025-12-04T15:07:13.552Z" }, { url = "https://files.pythonhosted.org/packages/75/b0/6bde0b1011a60782108c01de5913c588cf51a839174538d266de15e4bf4d/greenlet-3.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:047ab3df20ede6a57c35c14bf5200fcf04039d50f908270d3f9a7a82064f543b", size = 609885, upload-time = "2025-12-04T14:26:02.368Z" }, { url = "https://files.pythonhosted.org/packages/49/0e/49b46ac39f931f59f987b7cd9f34bfec8ef81d2a1e6e00682f55be5de9f4/greenlet-3.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d9ad37fc657b1102ec880e637cccf20191581f75c64087a549e66c57e1ceb53", size = 1567424, upload-time = "2025-12-04T15:04:23.757Z" }, { url = "https://files.pythonhosted.org/packages/05/f5/49a9ac2dff7f10091935def9165c90236d8f175afb27cbed38fb1d61ab6b/greenlet-3.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83cd0e36932e0e7f36a64b732a6f60c2fc2df28c351bae79fbaf4f8092fe7614", size = 1636017, upload-time = "2025-12-04T14:27:29.688Z" }, From ca8b7876fd7eac60733fe2d26049dc4c96f1e2eb Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 8 Feb 2026 18:26:55 +0200 Subject: [PATCH 21/37] Adding translations (#1382) --- buzz/transcriber/recording_transcriber.py | 3 ++- buzz/transcriber/whisper_file_transcriber.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index 43e36fa4..fda4d56e 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -204,7 +204,8 @@ class RecordingTranscriber(QObject): task=self.transcription_options.task.value, initial_prompt=initial_prompt, temperature=self.transcription_options.temperature, - no_speech_threshold=0.4 + no_speech_threshold=0.4, + fp16=False, ) elif ( self.transcription_options.model.model_type diff --git a/buzz/transcriber/whisper_file_transcriber.py b/buzz/transcriber/whisper_file_transcriber.py index ef75885f..3c337d42 100644 --- a/buzz/transcriber/whisper_file_transcriber.py +++ b/buzz/transcriber/whisper_file_transcriber.py @@ -352,6 +352,7 @@ class WhisperFileTranscriber(FileTranscriber): temperature=task.transcription_options.temperature, initial_prompt=task.transcription_options.initial_prompt, no_speech_threshold=0.4, + fp16=False, ) return [ Segment( @@ -371,6 +372,7 @@ class WhisperFileTranscriber(FileTranscriber): temperature=task.transcription_options.temperature, initial_prompt=task.transcription_options.initial_prompt, verbose=False, + fp16=False, ) segments = result.get("segments") return [ From bb546acbf985b0130ff7215e18282970bad0ef13 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 20 Feb 2026 15:47:13 +0200 Subject: [PATCH 22/37] Fix for windows crashes (#1387) --- .github/workflows/ci.yml | 6 +- .github/workflows/snapcraft.yml | 12 --- buzz/recording.py | 4 +- buzz/transcriber/recording_transcriber.py | 19 +++- buzz/widgets/audio_meter_widget.py | 2 +- buzz/widgets/recording_transcriber_widget.py | 91 +++++++++++++------ .../speaker_identification_widget.py | 43 +++++---- hatch_build.py | 36 ++++++++ .../ctc_forced_aligner_windows_mutex.patch | 16 ++++ tests/mock_sounddevice.py | 8 +- .../speaker_identification_widget_test.py | 8 +- 11 files changed, 171 insertions(+), 74 deletions(-) create mode 100644 patches/ctc_forced_aligner_windows_mutex.patch diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e85b2b63..43cf1cef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -94,6 +94,8 @@ jobs: run: | uv run make test shell: bash + env: + PYTHONFAULTHANDLER: "1" - name: Upload coverage reports to Codecov with GitHub Action uses: codecov/codecov-action@v4 @@ -174,10 +176,10 @@ jobs: - name: Install dependencies run: uv sync - - uses: AnimMouse/setup-ffmpeg@v1.2.1 + - uses: AnimMouse/setup-ffmpeg@v1 id: setup-ffmpeg with: - version: ${{ matrix.os == 'macos-15-intel' && '7.1.1' || matrix.os == 'macos-latest' && '71' || '7.1' }} + version: ${{ matrix.os == 'macos-15-intel' && '7.1.1' || matrix.os == 'macos-latest' && '80' || '8.0' }} - name: Install MSVC for Windows run: | diff --git a/.github/workflows/snapcraft.yml b/.github/workflows/snapcraft.yml index 2224688f..a2c8c63c 100644 --- a/.github/workflows/snapcraft.yml +++ b/.github/workflows/snapcraft.yml @@ -24,23 +24,11 @@ jobs: # Ideas from https://github.com/orgs/community/discussions/25678 - name: Remove unused build tools run: | - sudo apt-get remove -y '^llvm-.*' - sudo apt-get remove -y 'php.*' sudo apt-get remove -y azure-cli google-cloud-sdk hhvm google-chrome-stable firefox powershell mono-devel || true sudo apt-get autoremove -y sudo apt-get clean python -m pip cache purge rm -rf /opt/hostedtoolcache || true - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 45000 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - remove-codeql: 'true' - remove-docker-images: 'true' - name: Check available disk space run: | echo "=== Disk space ===" diff --git a/buzz/recording.py b/buzz/recording.py index 598fc561..db77fc52 100644 --- a/buzz/recording.py +++ b/buzz/recording.py @@ -27,9 +27,9 @@ class RecordingAmplitudeListener(QObject): callback=self.stream_callback, ) self.stream.start() - except sounddevice.PortAudioError: + except Exception as e: self.stop_recording() - logging.exception("") + logging.exception("Failed to start audio stream on device %s: %s", self.input_device_index, e) def stop_recording(self): if self.stream is not None: diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index fda4d56e..dec3f3dd 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -302,7 +302,7 @@ class RecordingTranscriber(QObject): next_text: str = result.get("text") # Update initial prompt between successive recording chunks - initial_prompt += next_text + initial_prompt = next_text logging.debug( "Received next result, length = %s, time taken = %s", @@ -315,7 +315,11 @@ class RecordingTranscriber(QObject): except PortAudioError as exc: self.error.emit(str(exc)) - logging.exception("") + logging.exception("PortAudio error during recording") + return + except Exception as exc: + logging.exception("Unexpected error during recording") + self.error.emit(str(exc)) return self.finished.emit() @@ -361,7 +365,11 @@ class RecordingTranscriber(QObject): self.is_running = False if self.process and self.process.poll() is None: self.process.terminate() - self.process.wait(timeout=5) + try: + self.process.wait(timeout=5) + except subprocess.TimeoutExpired: + self.process.kill() + logging.warning("Whisper server process had to be killed after timeout") def start_local_whisper_server(self): # Reduce verbose HTTP client logging from OpenAI/httpx @@ -466,4 +474,7 @@ class RecordingTranscriber(QObject): def __del__(self): if self.process and self.process.poll() is None: self.process.terminate() - self.process.wait(timeout=5) \ No newline at end of file + try: + self.process.wait(timeout=5) + except subprocess.TimeoutExpired: + self.process.kill() \ No newline at end of file diff --git a/buzz/widgets/audio_meter_widget.py b/buzz/widgets/audio_meter_widget.py index fff4e9d3..0329a25a 100644 --- a/buzz/widgets/audio_meter_widget.py +++ b/buzz/widgets/audio_meter_widget.py @@ -76,4 +76,4 @@ class AudioMeterWidget(QWidget): self.current_amplitude = max( amplitude, self.current_amplitude * self.SMOOTHING_FACTOR ) - self.repaint() + self.update() diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index 26cb92c0..a4b82cdb 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -1,6 +1,7 @@ import os import re import enum +import time import requests import logging import datetime @@ -212,7 +213,7 @@ class RecordingTranscriberWidget(QWidget): self.presentation_options_bar.hide() self.copy_actions_bar = self.create_copy_actions_bar() layout.addWidget(self.copy_actions_bar) # Add at the bottom - self.copy_actions_bar.hide() + self.copy_actions_bar.hide() def create_presentation_options_bar(self) -> QWidget: """Crete the presentation options bar widget""" @@ -296,15 +297,15 @@ class RecordingTranscriberWidget(QWidget): layout = QHBoxLayout(bar) layout.setContentsMargins(5, 5, 5, 5) layout.setSpacing(10) - + layout.addStretch() # Push button to the right - + self.copy_transcript_button = QPushButton(_("Copy"), bar) self.copy_transcript_button.setToolTip(_("Copy transcription to clipboard")) self.copy_transcript_button.clicked.connect(self.on_copy_transcript_clicked) layout.addWidget(self.copy_transcript_button) - - return bar + + return bar def on_copy_transcript_clicked(self): """Handle copy transcript button click""" @@ -339,7 +340,7 @@ class RecordingTranscriberWidget(QWidget): self.copy_transcript_button.setText(_("Copied!")) QTimer.singleShot(2000, lambda: self.copy_transcript_button.setText(_("Copy"))) - + def on_show_presentation_clicked(self): """Handle click on 'Show in new window' button""" if self.presentation_window is None or not self.presentation_window.isVisible(): @@ -668,6 +669,40 @@ class RecordingTranscriberWidget(QWidget): return text + @staticmethod + def write_to_export_file(file_path: str, content: str, mode: str = "a", retries: int = 5, delay: float = 0.2): + """Write to an export file with retry logic for Windows file locking.""" + for attempt in range(retries): + try: + with open(file_path, mode, encoding='utf-8') as f: + f.write(content) + return + except PermissionError: + if attempt < retries - 1: + time.sleep(delay) + else: + logging.warning("Export write failed after %d retries: %s", retries, file_path) + except OSError as e: + logging.warning("Export write failed: %s", e) + return + + @staticmethod + def read_export_file(file_path: str, retries: int = 5, delay: float = 0.2) -> str: + """Read an export file with retry logic for Windows file locking.""" + for attempt in range(retries): + try: + with open(file_path, "r", encoding='utf-8') as f: + return f.read() + except PermissionError: + if attempt < retries - 1: + time.sleep(delay) + else: + logging.warning("Export read failed after %d retries: %s", retries, file_path) + except OSError as e: + logging.warning("Export read failed: %s", e) + return "" + return "" + # Copilot magic implementation of a sliding window approach to find the longest common substring between two texts, # ignoring the initial differences. @staticmethod @@ -722,8 +757,7 @@ class RecordingTranscriberWidget(QWidget): text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and export_file: - with open(export_file, "w") as f: - f.write(merged_texts) + self.write_to_export_file(export_file, merged_texts, mode="w") def on_next_transcription(self, text: str): text = self.filter_text(text) @@ -742,8 +776,7 @@ class RecordingTranscriberWidget(QWidget): self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and self.transcript_export_file: - with open(self.transcript_export_file, "a") as f: - f.write(text + "\n\n") + self.write_to_export_file(self.transcript_export_file, text + "\n\n") elif self.transcriber_mode == RecordingTranscriberMode.APPEND_ABOVE: self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.Start) @@ -752,13 +785,11 @@ class RecordingTranscriberWidget(QWidget): self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.Start) if self.export_enabled and self.transcript_export_file: - with open(self.transcript_export_file, "r") as f: - existing_content = f.read() - + existing_content = "" + if os.path.isfile(self.transcript_export_file): + existing_content = self.read_export_file(self.transcript_export_file) new_content = text + "\n\n" + existing_content - - with open(self.transcript_export_file, "w") as f: - f.write(new_content) + self.write_to_export_file(self.transcript_export_file, new_content, mode="w") elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: self.process_transcription_merge(text, self.transcripts, self.transcription_text_box, self.transcript_export_file) @@ -792,9 +823,8 @@ class RecordingTranscriberWidget(QWidget): self.translation_text_box.insertPlainText(self.strip_newlines(text)) self.translation_text_box.moveCursor(QTextCursor.MoveOperation.End) - if self.export_enabled: - with open(self.translation_export_file, "a") as f: - f.write(text + "\n\n") + if self.export_enabled and self.translation_export_file: + self.write_to_export_file(self.translation_export_file, text + "\n\n") elif self.transcriber_mode == RecordingTranscriberMode.APPEND_ABOVE: self.translation_text_box.moveCursor(QTextCursor.MoveOperation.Start) @@ -802,14 +832,12 @@ class RecordingTranscriberWidget(QWidget): self.translation_text_box.insertPlainText("\n\n") self.translation_text_box.moveCursor(QTextCursor.MoveOperation.Start) - if self.export_enabled: - with open(self.translation_export_file, "r") as f: - existing_content = f.read() - + if self.export_enabled and self.translation_export_file: + existing_content = "" + if os.path.isfile(self.translation_export_file): + existing_content = self.read_export_file(self.translation_export_file) new_content = text + "\n\n" + existing_content - - with open(self.translation_export_file, "w") as f: - f.write(new_content) + self.write_to_export_file(self.translation_export_file, new_content, mode="w") elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: self.process_transcription_merge(text, self.translations, self.translation_text_box, self.translation_export_file) @@ -842,6 +870,7 @@ class RecordingTranscriberWidget(QWidget): def on_transcriber_finished(self): self.reset_record_button() + # Restart amplitude listener now that the transcription stream is closed self.reset_recording_amplitude_listener() def on_transcriber_error(self, error: str): @@ -899,6 +928,16 @@ class RecordingTranscriberWidget(QWidget): self.model_loader.cancel() self.stop_recording() + if self.transcription_thread is not None: + try: + if self.transcription_thread.isRunning(): + if not self.transcription_thread.wait(15_000): + logging.warning("Transcription thread did not finish within timeout") + except RuntimeError: + # The underlying C++ QThread was already deleted via deleteLater() + pass + self.transcription_thread = None + if self.recording_amplitude_listener is not None: self.recording_amplitude_listener.stop_recording() self.recording_amplitude_listener.deleteLater() diff --git a/buzz/widgets/transcription_viewer/speaker_identification_widget.py b/buzz/widgets/transcription_viewer/speaker_identification_widget.py index c87f8b0f..94368d0e 100644 --- a/buzz/widgets/transcription_viewer/speaker_identification_widget.py +++ b/buzz/widgets/transcription_viewer/speaker_identification_widget.py @@ -45,23 +45,6 @@ from buzz.settings.settings import Settings from buzz.widgets.line_edit import LineEdit from buzz.transcriber.transcriber import Segment -from ctc_forced_aligner.ctc_forced_aligner import ( - generate_emissions, - get_alignments, - get_spans, - load_alignment_model, - postprocess_results, - preprocess_text, -) -from whisper_diarization.helpers import ( - get_realigned_ws_mapping_with_punctuation, - get_sentences_speaker_mapping, - get_words_speaker_mapping, - langs_to_iso, - punct_model_langs, -) -from deepmultilingualpunctuation.deepmultilingualpunctuation import PunctuationModel -from whisper_diarization.diarization import MSDDDiarizer def process_in_batches( @@ -167,6 +150,32 @@ class IdentificationWorker(QObject): } def run(self): + try: + from ctc_forced_aligner.ctc_forced_aligner import ( + generate_emissions, + get_alignments, + get_spans, + load_alignment_model, + postprocess_results, + preprocess_text, + ) + from whisper_diarization.helpers import ( + get_realigned_ws_mapping_with_punctuation, + get_sentences_speaker_mapping, + get_words_speaker_mapping, + langs_to_iso, + punct_model_langs, + ) + from deepmultilingualpunctuation.deepmultilingualpunctuation import PunctuationModel + from whisper_diarization.diarization import MSDDDiarizer + except ImportError as e: + logging.exception("Failed to import speaker identification libraries: %s", e) + self.error.emit( + _("Speaker identification is not available: failed to load required libraries.") + + f"\n\n{e}" + ) + return + diarizer_model = None alignment_model = None diff --git a/hatch_build.py b/hatch_build.py index c94968fe..0aeeab4c 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -82,6 +82,42 @@ class CustomBuildHook(BuildHookInterface): # Build ctc_forced_aligner C++ extension in-place print("Building ctc_forced_aligner C++ extension...") ctc_aligner_dir = project_root / "ctc_forced_aligner" + + # Apply local patches before building. + # Uses --check first to avoid touching the working tree unnecessarily, + # which is safer in a detached-HEAD submodule. + patches_dir = project_root / "patches" + for patch_file in sorted(patches_dir.glob("ctc_forced_aligner_*.patch")): + # Dry-run forward: succeeds only if patch is NOT yet applied. + check_forward = subprocess.run( + ["git", "apply", "--check", "--ignore-whitespace", str(patch_file)], + cwd=ctc_aligner_dir, + capture_output=True, + text=True, + ) + if check_forward.returncode == 0: + # Patch can be applied — do it for real. + subprocess.run( + ["git", "apply", "--ignore-whitespace", str(patch_file)], + cwd=ctc_aligner_dir, + check=True, + capture_output=True, + text=True, + ) + print(f"Applied patch: {patch_file.name}") + else: + # Dry-run failed — either already applied or genuinely broken. + check_reverse = subprocess.run( + ["git", "apply", "--check", "--reverse", "--ignore-whitespace", str(patch_file)], + cwd=ctc_aligner_dir, + capture_output=True, + text=True, + ) + if check_reverse.returncode == 0: + print(f"Patch already applied (skipping): {patch_file.name}") + else: + print(f"WARNING: could not apply patch {patch_file.name}: {check_forward.stderr}", file=sys.stderr) + result = subprocess.run( [sys.executable, "setup.py", "build_ext", "--inplace"], cwd=ctc_aligner_dir, diff --git a/patches/ctc_forced_aligner_windows_mutex.patch b/patches/ctc_forced_aligner_windows_mutex.patch new file mode 100644 index 00000000..2940c9ab --- /dev/null +++ b/patches/ctc_forced_aligner_windows_mutex.patch @@ -0,0 +1,16 @@ +diff --git a/setup.py b/setup.py +index de84a25..386f662 100644 +--- a/setup.py ++++ b/setup.py +@@ -6,7 +6,10 @@ ext_modules = [ + Pybind11Extension( + "ctc_forced_aligner.ctc_forced_aligner", + ["ctc_forced_aligner/forced_align_impl.cpp"], +- extra_compile_args=["/O2"] if sys.platform == "win32" else ["-O3"], ++ # /D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR prevents MSVC runtime mutex ++ # static-initializer crash on newer GitHub Actions Windows runners. ++ # See: https://github.com/actions/runner-images/issues/10004 ++ extra_compile_args=["/O2", "/D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR"] if sys.platform == "win32" else ["-O3"], + ) + ] + diff --git a/tests/mock_sounddevice.py b/tests/mock_sounddevice.py index 72ca7f22..5914e21d 100644 --- a/tests/mock_sounddevice.py +++ b/tests/mock_sounddevice.py @@ -1,12 +1,8 @@ import os -import time -import logging from threading import Thread, Event from typing import Callable, Any -from unittest.mock import MagicMock import numpy as np -import sounddevice from buzz import whisper_audio @@ -103,7 +99,7 @@ class MockInputStream: def __init__( self, - callback: Callable[[np.ndarray, int, Any, sounddevice.CallbackFlags], None], + callback: Callable[[np.ndarray, int, Any, Any], None], *args, **kwargs, ): @@ -131,7 +127,7 @@ class MockInputStream: if self._stop_event.is_set(): break chunk = audio[seek : seek + num_samples_in_chunk] - self.callback(chunk, 0, None, sounddevice.CallbackFlags()) + self.callback(chunk, 0, None, None) seek += num_samples_in_chunk # loop back around diff --git a/tests/widgets/speaker_identification_widget_test.py b/tests/widgets/speaker_identification_widget_test.py index 54dc4071..5b65514d 100644 --- a/tests/widgets/speaker_identification_widget_test.py +++ b/tests/widgets/speaker_identification_widget_test.py @@ -9,8 +9,8 @@ from buzz.db.entity.transcription import Transcription from buzz.db.entity.transcription_segment import TranscriptionSegment from buzz.model_loader import ModelType, WhisperModelSize from buzz.transcriber.transcriber import Task -# Underlying libs do not support intel Macs -if not (platform.system() == "Darwin" and platform.machine() == "x86_64"): +# Underlying libs do not support intel Macs or Windows (nemo C extensions crash on Windows CI) +if not (platform.system() == "Darwin" and platform.machine() == "x86_64") and platform.system() != "Windows": from buzz.widgets.transcription_viewer.speaker_identification_widget import ( SpeakerIdentificationWidget, IdentificationWorker, @@ -19,8 +19,8 @@ if not (platform.system() == "Darwin" and platform.machine() == "x86_64"): from tests.audio import test_audio_path @pytest.mark.skipif( - platform.system() == "Darwin" and platform.machine() == "x86_64", - reason="Skip speaker identification tests on macOS x86_64" + (platform.system() == "Darwin" and platform.machine() == "x86_64") or platform.system() == "Windows", + reason="Speaker identification dependencies (nemo/texterrors C extensions) crash on Windows and are unsupported on Intel Mac" ) class TestSpeakerIdentificationWidget: @pytest.fixture() From 4c9b249c50c0865609c64671b600a6e18af61f1e Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 22 Feb 2026 17:46:20 +0200 Subject: [PATCH 23/37] Recordint transcriber improvements (#1392) --- Makefile | 2 +- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/en_US/LC_MESSAGES/buzz.po | 800 ++++++++--------- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 804 +++++++++--------- buzz/locale/nl/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 800 ++++++++--------- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 801 ++++++++--------- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 800 ++++++++--------- buzz/recording.py | 14 +- buzz/settings/settings.py | 2 + buzz/transcriber/recording_transcriber.py | 25 +- buzz/transcriber/transcriber.py | 2 + buzz/widgets/audio_meter_widget.py | 25 +- buzz/widgets/recording_transcriber_widget.py | 113 ++- .../transcriber/advanced_settings_dialog.py | 48 +- .../transcription_options_group_box.py | 5 +- docs/docs/usage/2_live_recording.md | 11 +- tests/gui_test.py | 4 +- tests/mock_sounddevice.py | 1 + tests/model_loader_test.py | 99 +++ tests/recording_test.py | 115 +++ tests/recording_transcriber_test.py | 298 +++++++ .../file_transcriber_queue_worker_test.py | 110 +++ .../transcriber/recording_transcriber_test.py | 39 +- .../widgets/advanced_settings_dialog_test.py | 153 ++++ tests/widgets/audio_meter_widget_test.py | 56 ++ tests/widgets/conftest.py | 14 + .../recording_transcriber_widget_test.py | 477 +++++++++++ ...scription_viewer_widget_additional_test.py | 114 +++ 36 files changed, 7275 insertions(+), 5666 deletions(-) create mode 100644 tests/recording_test.py create mode 100644 tests/recording_transcriber_test.py create mode 100644 tests/widgets/advanced_settings_dialog_test.py create mode 100644 tests/widgets/audio_meter_widget_test.py diff --git a/Makefile b/Makefile index 185345d3..aebe6c28 100644 --- a/Makefile +++ b/Makefile @@ -209,7 +209,7 @@ TMP_POT_FILE_PATH := $(shell mktemp) PO_FILE_PATH := buzz/locale/${locale}/LC_MESSAGES/buzz.po translation_po: mkdir -p buzz/locale/${locale}/LC_MESSAGES - xgettext --from-code=UTF-8 -o "${TMP_POT_FILE_PATH}" -l python $(shell find buzz -name '*.py') + xgettext --from-code=UTF-8 --add-location=file -o "${TMP_POT_FILE_PATH}" -l python $(shell find buzz -name '*.py') sed -i.bak 's/CHARSET/UTF-8/' ${TMP_POT_FILE_PATH} if [ ! -f ${PO_FILE_PATH} ]; then \ msginit --no-translator --input=${TMP_POT_FILE_PATH} --output-file=${PO_FILE_PATH}; \ diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index cdbf52bc..7619f108 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -17,204 +17,201 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.7\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "URL d'importació" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://exemple.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "D’acord" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Cancel·lar" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "URL:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "URL no vàlida" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "L'URL que heu introduït no és vàlid." -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "Veure la traducció de transcripció" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "Restableix als valors predeterminats" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "Anglès" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "Català" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "Danès" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "Holandès" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "Alemany" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "Castellà" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "Italià" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "Japonès" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "Letó" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "Polonès" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "Portuguès (Brasil)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "Ucraïnès" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "Xinès (simplificat)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "Xinès (Tradicional)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "Cal reiniciar!" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Ui Language" msgstr "Idioma UI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "Mida de la lletra" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "Prova" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "Clau de l'API d'OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "URL base d'OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "Clau de l'API d'OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "Nom del fitxer d'exportació per defecte" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "Activa l'exportació de transcripcions en directe" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "Navega" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "Exporta la carpeta" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Live recording mode" msgstr "Mode d'enregistrament en directe" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "Desactiva la GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "Prova de clau OpenAI API" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -222,11 +219,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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "Clau API no vàlida" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -234,11 +231,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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "Selecciona la carpeta d'exportació" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -248,188 +245,183 @@ msgstr "" "o la vostra clau. La transcripció i la traducció encara poden funcionar si " "l'API no admet la validació de claus." -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Habilita el seguiment de carpetes" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Carpeta d'entrada" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "Carpeta de sortida" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "Selecciona la carpeta d'entrada" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "Selecciona la carpeta de sortida" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "Preferències" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "General" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "Models" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Dreceres" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Vigila la carpeta" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "Grup" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "ID de la cara oculta d'un model de whisper més ràpid" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "Descàrrega" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Mostra la ubicació del fitxer" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Suprimeix" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "Descarregat" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Disponible per descarregar" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Enllaç de descàrrega a Whisper.cpp fitxer de model ggml" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Suprimeix el model" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "Esteu segur que voleu suprimir el model seleccionat?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "Descàrrega fallida" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Error" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Enregistra" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Atura" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Detecta l'idioma" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Executa" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Model:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py 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:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "Clau API:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Tasca:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Idioma:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "Introduïu el prompt..." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Configuració avançada" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "Configuració del reconeixement de veu" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Separat per comes, p. ex. «0.0, 0.2, 0.4, 0.6, 0.8, 1.0»" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Temperatura:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Pregunta inicial:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "Configuració de la traducció" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "Habilita la traducció de la IA" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "Model d'IA:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" @@ -437,251 +429,256 @@ msgstr "" "Introdueix instruccions per a la IA sobre com traduir, per exemple 'Si us " "plau, tradueix cada text que t'hagi enviat de l'anglès al castellà'." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Instruccions per a la IA:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "Configuració de la traducció" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Temps amb granularitat de paraula" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "Extreu la veu" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "Exporta:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "ID de la cara oculta d'un model" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "Avançat..." -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py msgid "New File Transcription" msgstr "Nova transcripció de fitxers" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py msgid "New URL Transcription" msgstr "Nova transcripció d'URL" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Obre una transcripció" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Cancel·la la transcripció" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Neteja l'historial" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "En progrés" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Completat" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "Ha fallat" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Cancel·lat" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "A la cua" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "Nom del fitxer / URL" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "Model" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "Tasca" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Estat" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "Data de finalització" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "Data d'addició" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "Cancel·la la transcripció" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename" msgstr "Vietnamita" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "Cancel·la la transcripció" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "Cancel·la la transcripció" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Enregistrament en directe" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Feu clic a Enregistra per a començar..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "Esperant la traducció de la IA..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Micròfon:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "Fitxers de text" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "Fitxers de text" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "Descàrrega fallida" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "Selecciona la carpeta d'exportació" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "Selecciona un fitxer d'àudio" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "S'ha produït un error en iniciar un enregistrament nou:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -689,110 +686,113 @@ msgstr "" "Comproveu els vostres dispositius d'àudio o els registres de l'aplicació per " "a més informació." -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Comprova si hi ha actualitzacions" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "Estàs al dia!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Inicia" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "Finalitza" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Text" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Traducció" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "Veure" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "Marqua de temps" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "Exporta" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "Traduir" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Redimensionar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "Cerca" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "Mostra/amaga la barra de cerca (Ctrl+F)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "Cerca:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "Introduïu el text a cercar..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "Coincidència anterior (Maj+Retorn)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py #, fuzzy msgid "Next match (Ctrl+Enter)" msgstr "Coincidència següent (retorn)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "Neteja" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "Controls de reproducció:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "Segment de bucle" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "Segueix l'àudio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -800,227 +800,230 @@ 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "Desplaça't fins a l'actual" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "1 de més de 100 coincidències" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "1 de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr " coincidències" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "No s'ha trobat cap coincidència" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr " de més de 100 coincidències" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr " de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "Clau API necessària" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "Introduïu la clau API d'OpenAI a les preferències" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "Opcions de redimensionament" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "Longitud desitjada dels subtítols" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "Opcions de fusió" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "Fusiona per buit" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "Divideix per puntuació" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "Divideix per la longitud màxima" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "Fusiona" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Cancel·la la transcripció" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "Desa el fitxer" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "Cancel·lar" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "Cancel·lat" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "Desa el fitxer" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "Fitxers de text" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "Descarregant el model" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "restant" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "Importa fitxer..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "Importa l'URL..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "Quant a" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Preferències..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Ajuda" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "Fitxer" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." @@ -1028,24 +1031,23 @@ msgstr "" "Esteu segur que voleu suprimir les transcripcions seleccionades? Aquesta " "acció no es pot desfer." -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Selecciona un fitxer d'àudio" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " @@ -1055,470 +1057,469 @@ msgstr "" "Si us plau, torneu-ho a provar amb un model més petit. Per forçar el mode " "CPU, utilitzeu la variable d'entorn BUZZ_FORCE_CPU=TRUE." -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py msgid "Translate to English" msgstr "Traduir a l'anglès" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "Transcriure" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "Xinès" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "Rus" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "Coreà" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "Francés" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "Portuguès" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "Turc" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "Àrab" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "Suec" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "Indonesi" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "Hindi" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "Finès" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "Vietnamita" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "Hebreu" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "Grec" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "Malai" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "Txec" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "Romanès" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "Hongarès" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "Tàmil" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "Noruec" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "Tailandès" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "Urdú" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "Croata" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "Bùlgar" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "Lituà" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "Llatí" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "Maori" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "Malaiàlam" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "Gal·lès" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "Eslovac" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "Telugu" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "Persa" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "Bengalí" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "Serbi" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "Àzeri" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "Eslovè" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "Kannada" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "Estònia" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "Macedoni" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "Breton" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "Basc" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "Islandès" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "Armeni" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "Nepalès" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "Mongol" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "Bosnià" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "Kazakh" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "Albanès" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "Suahili" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "Gallec" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "Marathi" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "Panjabi" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "Singalès" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "Khmer" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "Shona" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "Ioruba" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "Somali" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "Afrikaans" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "Occità" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "Georgià" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "Bielorús" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "Tadjik" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "Sindhi" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "Gujarati" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "Amhàric" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "Yiddish" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "Lao" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "Uzbek" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "Feroès" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "Crioll d'Haití" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "Paixtu" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "Turcomans" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "Nynorsk" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "Maltès" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "Sànscrit" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "Luxemburguès" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "Myanmar" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "Tibetà" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "Tagàlog" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "Malgaix" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "Assamès" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "Tàtar" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "Hawaià" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "Lingala" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "Hausa" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "Bashkir" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "Javanès" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "Sundanès" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "Cantonès" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "S'ha produït un error de connexió" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "Començant Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "Cancel·la la transcripció" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "Obre la finestra de registre" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "Importar arxiu" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "Obre la finestra de preferències" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "Veure el text de la transcripció" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "Veure la traducció de transcripció" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Veure les marques de temps de la transcripció" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py msgid "Search Transcript" msgstr "Cerca una transcripció" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "Desplaça't fins al text actual" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "Reproduir/posar en pausa l'àudio" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "Reprodueix el segment actual" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "Commuta els controls de reproducció" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "Disminuir l'hora d'inici del segment" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "Augmenta l'hora d'inici del segment" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "Disminueix l'hora de finalització del segment" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "Augmenta l'hora de finalització del segment" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "Afegeix a sota" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "Afegeix a sobre" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "Afegeix i corregeix" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "Configuració de la traducció" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index dadfd150..b96091ff 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -14,205 +14,202 @@ msgstr "" "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" # "X-Generator: Poedit 3.4.4\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "Importer fra URL" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://example.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "OK" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Afbryd" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "URL:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "Ugyldig URL" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "Den URL du har angivet er ikke gyldig." -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "Vis transkriberede oversættelse" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "Gendan standard-indstillinger" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Ukrainian" msgstr "tilbageværende" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Ui Language" msgstr "Sprog:" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "Skriftypestørrelse" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "Test" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "OpenAI API-nøgle" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "OpenAI base-URL" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "OpenAI API-nøgle" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "Standard eksport filnavn" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "Slå transkription af live optagelse eksport til" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "Gennemse" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "Eksportmappe" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Live recording mode" msgstr "Live optagelsesmode" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "OpenAI API Nøgle test" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -220,12 +217,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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Invalid API key" msgstr "Ugyldig API-nøgle" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -233,11 +230,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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "Vælg eksport-mappe" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -247,438 +244,438 @@ msgstr "" "Transkription og oversættelse virker måske stadig, selvom API'et ikke " "understøtter nøgle validering." -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Aktiver mappeovervågning" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Inputmappe" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "Outputmappe" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "Vælg inputmappe" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "Vælg outputmappe" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "Indstillinger" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "Generelt" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "Modeller" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Genveje" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Mappeovervågning" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "Grupper" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "Huggingface ID af Faster Whisper model" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "Download" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Vis fil-lokation" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Slet" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "Downloadded" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Tilgængelige til download" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Download link til Whisper.cpp ggml model-fil" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Slet model" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "Er du sikker på at du vil slette den valgte model?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "Download mislykkedes" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Fejl" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Optag" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Stop" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Detekter sprog" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Kør" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Model:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py 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:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "API-nøgle:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Opgave:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Sprog:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "Input tekst..." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Advancerede indstillinger" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "Talegenkendelsesindstillinger" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Komma-separerede, fx., \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Temperatur:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Start prompt:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "Oversættelsesindstillinger" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "Brug AI oversættelse" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "AI model:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Instruktioner for AI:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "Oversættelsesindstillinger" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Ord tidsniveau" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "Eksakt tale" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "Eksporter:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "Huggingface ID til en model" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "Advanceret..." -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New File Transcription" msgstr "Ny fil transkription" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New URL Transcription" msgstr "Ny URL transkription" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Åben transkription" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Afbryd transkription" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Ryd historik" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "Arbejder" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Færdig" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "Mislykkedes" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Afbrudt" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "Sat i kø" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "Filnavn / URL" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "Model" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "Opgave" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Status" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "Dato for færdiggørelse" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "Dato for tilføjelse" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "Afbryd transkription" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "Afbryd transkription" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "Afbryd transkription" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Live optagelse" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Klik Optage for at begynde..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "Venter på AI oversættelse..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "Tekst filer" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "Tekst filer" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "Download mislykkedes" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "Vælg eksport-mappe" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "Vælg audio-fil" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "Der skete en fejl ved opstart af en ny optagelse:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -686,335 +683,341 @@ msgstr "" "Tjek venligst dine audioenheder eller tjek applikationens logs for " "mereinformation." -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Tjek for opdateringer" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "Du er opdateret!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Start" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "Slut" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Tekst" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Oversættelse" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "Vis" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "Tidsstempler" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "Eksporter" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "Oversæt" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Behandel størrelse" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "API-nøgle påkrævet" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "Indtast venligst OpenAI API-nøgle i indstillinger" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "Størrelsesindstillinger" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "Ønskede undertekst længde" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "Sammenfletningsindstillinger" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "Sammenflet ved hul" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "Split ved punktum" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "Split ved max længde" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "Sammenflet" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Afbryd transkription" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "Gem fil" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "Afbryd" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "Afbrudt" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "Gem fil" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "Tekst filer" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "Downloader model" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "tilbageværende" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "Importer Fil..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "Importer URL..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "Om" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Indstillinger..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Hjælp" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "Fil" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." @@ -1022,494 +1025,492 @@ msgstr "" "Er du sikker på at du vil slette den valgte transkription? Denne handling " "kan ikke fortrydes." -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Vælg audio-fil" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " "variable." msgstr "" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Translate to English" msgstr "Oversættelsesindstillinger" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "Transkriber" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "Der er opstået en forbindelsesfejl" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "Afbryd transkription" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "Åben optagevinduet" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "Import fil" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "Åben indstillingsvinduet" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "Vis transkriberede tekst" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "Vis transkriberede oversættelse" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Vis transkriptionstidstempler " -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py #, fuzzy msgid "Search Transcript" msgstr "Åben transkription" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "tilføj herunder" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "Tilføj herover" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "Tilføj og ret" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "Oversættelsesindstillinger" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index d5376bf3..b437accb 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -16,203 +16,200 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.5\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "URL importieren" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://example.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "OK" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Abbrechen" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "URL:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "Ungültige URL" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "Die von Ihnen eingegebene URL ist ungültig." -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "Übersetzung des Transkripts anzeigen" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "Auf Standardeinstellungen zurücksetzen" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "Englisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "Katalanisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "Dänisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "Niederländisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "Deutsch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "Spanisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "Italienisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "Japanisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "Lettisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "Polnisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Portuguese (Brazil)" msgstr "Portugiesisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "Ukrainisch" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "Chinesisch (vereinfacht)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "Chinesisch (traditionell)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "Neustart erforderlich!" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Ui Language" msgstr "Sprache der Benutzeroberfläche" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "Schriftgröße" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "Test" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "OpenAI-API-Schlüssel" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "OpenAI-Basis-URL" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "OpenAI-API-Schlüssel" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "Standardname der Exportdatei" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "Export von Live-Aufnahmetranskriptionen aktivieren" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "Durchsuchen" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "Exportordner" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Live recording mode" msgstr "Live-Aufnahmemodus" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "OpenAI-API-Schlüssel Test" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -220,11 +217,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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "Ungültiger API-Schlüssel" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -232,11 +229,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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "Exportordner auswählen" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -247,439 +244,439 @@ msgstr "" "funktionieren möglicherweise weiterhin, wenn die API keine " "Schlüsselvalidierung unterstützt." -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Ordner überwachen aktivieren" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Eingabeordner" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "Ausgabeordner" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "Eingabeordner auswählen" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "Ausgabeordner auswählen" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "Einstellungen" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "Allgemein" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "Modelle" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Tastenkombinationen" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Ordner überwachen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "Gruppe" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "Huggingface-ID eines Faster Whisper-Modells" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "Herunterladen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Dateispeicherort anzeigen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Löschen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "Heruntergeladen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Zum Herunterladen verfügbar" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Laden Sie den Link zur ggml-Modelldatei Whisper.cpp herunter" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Modell löschen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "Sind Sie sicher, dass Sie das ausgewählte Modell löschen möchten?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "Der Download ist fehlgeschlagen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Fehler" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Aufnehmen" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Stoppen" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Sprache erkennen" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Ausführen" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Modell:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py 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:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "API-Schlüssel:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Aufgabe:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Sprache:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "Anweisung eingeben..." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Erweiterte Einstellungen" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "Einstellungen für die Spracherkennung" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Durch Kommas getrennt, z.B. „0,0, 0,2, 0,4, 0,6, 0,8, 1,0“" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Temperatur:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Erste Anweisung:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "Übersetzungseinstellungen" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "KI-Übersetzung aktivieren" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "KI-Modell:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Anweisung zur KI:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "Übersetzungseinstellungen" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Zeitangaben auf Wortebene" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "Sprache extrahieren" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "Export:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "Huggingface-ID eines Models" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "Erweitert..." -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py msgid "New File Transcription" msgstr "Neue Dateitranskription" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py msgid "New URL Transcription" msgstr "Neue URL-Transkription" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Transkript öffnen" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Transkription abbrechen" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Verlauf löschen" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "Im Gange" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Fertiggestellt" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "Fehlgeschlagen" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Abgebrochen" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "In der Warteschlange" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "Dateiname/URL" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "Modell" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "Aufgabe" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Status" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "Datum abgeschlossen" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "Datum hinzugefügt" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "Transkription abbrechen" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename" msgstr "Vietnamesisch" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "Transkription abbrechen" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "Transkription abbrechen" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Live-Aufnahme" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Auf „Aufnehmen“ klicken um zu beginnen …" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "Warten auf KI-Übersetzung..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "Textdateien" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "Textdateien" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "Der Download ist fehlgeschlagen" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "Exportordner auswählen" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "Audiodatei auswählen" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "Beim Starten einer neuen Aufnahme ist ein Fehler aufgetreten:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -687,335 +684,341 @@ msgstr "" "Bitte überprüfen Sie Ihre Audiogeräte oder prüfen Sie die " "Anwendungsprotokolle für weitere Informationen." -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Nach Updates suchen" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "Sie sind auf dem Laufenden!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Start" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "Ende" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Text" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Übersetzung" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "Anzeigen" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "Zeitstempel" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "Export" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "Übersetzen" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Größe ändern" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "API-Schlüssel erforderlich" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "Bitte geben Sie den OpenAI-API-Schlüssel in den Einstellungen ein" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "Größenänderungsoptionen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "Gewünschte Untertitellänge" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "Zusammenführungsoptionen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "Nach Abstand zusammenführen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "Durch Satzzeichen getrennt" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "Aufgeteilt nach maximaler Länge" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "Vereinigen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Transkription abbrechen" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "Datei speichern" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "Abbrechen" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "Abgebrochen" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "Datei speichern" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "Textdateien" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "Modell wird heruntergeladen" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "verbleibend" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "Datei importieren..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "URL importieren..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "Über" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Einstellungen..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Hilfe" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "Datei" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." @@ -1023,495 +1026,493 @@ msgstr "" "Sind Sie sicher, dass Sie die ausgewählte(n) Transkription(en) löschen " "möchten? Diese Aktion kann nicht rückgängig gemacht werden." -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Audiodatei auswählen" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " "variable." msgstr "" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Translate to English" msgstr "Übersetzungseinstellungen" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "Transkribieren" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "Chinesisch" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "Russisch" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "Koreanisch" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "Französisch" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "Portugiesisch" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "Türkisch" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "Arabisch" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "Schwedisch" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "Indonesisch" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "Hindi" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "Finnisch" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "Vietnamesisch" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "Hebräisch" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "Griechisch" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "Malaiisch" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "Tschechisch" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "Rumänisch" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "Ungarisch" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "Tamilisch" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "Norwegisch" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "Thailändisch" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "Urdu" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "Kroatisch" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "Bulgarisch" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "Litauisch" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "Latein" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "Maori" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "Malayalam" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "Walisisch" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "Slowakisch" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "Telugu" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "Persisch" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "Bengalisch" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "Serbisch" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "Aserbaidschanisch" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "Slowenisch" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "Kannada" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "Estnisch" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "Mazedonisch" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "Bretonisch" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "Baskisch" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "Isländisch" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "Armenisch" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "Nepali" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "Mongolisch" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "Bosnisch" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "Kasachisch" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "Albanisch" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "Suaheli" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "Galizisch" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "Marathi" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "Punjabi" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "Singhalesisch" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "Khmer" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "Schona" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "Yoruba" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "Somali" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "Afrikanisch" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "Okzitanisch" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "Georgisch" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "Belarussisch" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "Tadschikisch" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "Sindhi" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "Gujarati" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "Amharisch" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "Jiddisch" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "Lao" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "Usbekisch" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "Färöisch" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "Haitianisch-Kreolisch" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "Paschtu" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "Turkmenisch" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "Nynorsk" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "Maltesisch" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "Sanskrit" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "Luxemburgisch" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "Myanmar" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "Tibetisch" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "Tagalog" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "Madagassisch" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "Assamisch" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "Tatar" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "Hawaiianisch" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "Lingala" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "Hausa" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "Baschkirisch" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "Javanisch" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "Sundanesisch" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "Kantonesisch" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "Ein Verbindungsfehler ist aufgetreten" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "Transkription abbrechen" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "Aufnahmefenster öffnen" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "Datei importieren" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "Einstellungsfenster öffnen" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "Transkriptionstext anzeigen" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "Übersetzung des Transkripts anzeigen" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Zeitstempel des Transkripts anzeigen" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py #, fuzzy msgid "Search Transcript" msgstr "Transkript öffnen" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "Unten anhängen" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "Oben anhängen" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "Anhängen und korrigieren" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "Übersetzungseinstellungen" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index d425ef4f..50dee5de 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,1467 +17,1467 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "" -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py msgid "Live Transcript Presentation" msgstr "" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Ui Language" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API model" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Live recording mode" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " "validation." msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Recording settings" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "" -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py msgid "New File Transcription" msgstr "" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py msgid "New URL Transcription" msgstr "" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Restart Transcription" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename Transcription" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed to restart transcription: {}" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py msgid "Text Size:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py msgid "Text Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy failed" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py msgid "Select Text Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py msgid "Select Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." msgstr "" -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "5/8 Preparing transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Save" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Cancelling..." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Cancelled" msgstr "" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "" -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "" -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "" -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." msgstr "" -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "" -#: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " "variable." msgstr "" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py msgid "Translate to English" msgstr "" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py msgid "Starting transcription..." msgstr "" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py msgid "Search Transcript" msgstr "" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py msgid "Translation error, see logs!" msgstr "" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 8e982361..0e2f8404 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -17,207 +17,204 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.7\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "URL de importación" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://ejemplo.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "Ok" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Cancelar" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "URL:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "URL inválido" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "La URL que has introducido no es válida." # automatic translation -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "Ver la traducción de la transcripción" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "Reestablecer los Valores por Defecto" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "Inglés" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "Catalán" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "Danés" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "Holandés" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "Alemán" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "Español" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "Italiano" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "Japonés" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "Letón" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "Polaco" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "Portugués (Brasil)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "Ucraniano" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "Chino (simplificado)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "Chino (tradicional)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "¡Es necesario reiniciar!" # automatic translation -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Ui Language" msgstr "Lenguaje de interfaz de usuario" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "Tamaño de fuente" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "Prueba" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "Clave API de OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "URL base de OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "Clave API de OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "Nombre de archivo de exportación predeterminado" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "Habilitar la exportación de transcripción de grabación en vivo" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "Navegar" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "Carpeta de exportación" # automatic translation -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Live recording mode" msgstr "Modo de grabación en directo" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "Desactivar GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "Prueba de la clave API de OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -225,11 +222,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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "Clave API no válida" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -237,11 +234,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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "Seleccione Exportar carpeta" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -251,125 +248,121 @@ msgstr "" "API o su clave. Es posible que la transcripción y la traducción sigan " "funcionando si la API no admite la validación de claves." -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Habilitar la inspección de carpetas" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Carpeta de entrada" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "Carpeta de salida" # automatic translation -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "Seleccione la carpeta de entrada" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "Seleccione la carpeta de salida" # automatic translation -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "Preferencias" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "General" # automatic translation -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "Modelos" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Atajos" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Vigilancia de carpetas" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "Grupo" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "Identificación de un modelo Más rápido whisper" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "Descargar" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Mostrar ubicación de archivo" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Eliminar" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "Descargado" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Disponible para descarga" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Enlace de descarga a Whisper.cpp archivo de modelo ggml" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Eliminar modelo" # automatic translation -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "¿Confirma que quiere eliminar el modelo seleccionado?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "Descarga fallida" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Error" # automatic translation -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Grabar" # automatic translation -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Detener" # automatic translation -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Detectar idioma" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" "Enter an ISO 639-3 language code (3 letters).\n" "Examples: eng (English), fra (French), deu (German),\n" @@ -377,78 +370,77 @@ msgid "" msgstr "" # automatic translation -#: buzz/widgets/transcriber/file_transcriber_widget.py:84 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Ejecutar" # automatic translation -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Modelo:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py 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:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "Clave API:" # automatic translation -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Tarea:" # automatic translation -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Idioma:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "Introducir prompt..." # automatic translation -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Configuración avanzada" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "Configuración de reconocimiento de voz" # automatic translation -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Separados por comas, p. ej., «0.0, 0.2, 0.4, 0.6, 0.8, 1.0»" # automatic translation -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Temperatura:" # automatic translation -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Indicación inicial:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "Ajustes de traducción" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "Habilite la traducción con IA" # automatic translation -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "Modelo de IA:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" @@ -456,269 +448,274 @@ msgstr "" "Introduce instrucciones para la IA sobre cómo traducir, por ejemplo, " "'Traduzca cada texto que se le envíe del inglés al español'." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Instrucciones para la IA:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "Ajustes de traducción" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + # automatic translation -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Tiempos a nivel de palabra" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "Extraer voz" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "Exportar:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "Huggingface ID de un modelo" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "Avanzado..." # automatic translation -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py msgid "New File Transcription" msgstr "Nueva transcripción de archivos" # automatic translation -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py msgid "New URL Transcription" msgstr "Nueva transcripción de URL" # automatic translation -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Abrir transcripción" # automatic translation -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Cancelar transcripción" # automatic translation -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Vaciar historial" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "En Progreso" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Completado" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "Fallido" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Cancelado" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "En cola" # automatic translation -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "Nombre de archivo / URL" # automatic translation -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "Modelo" # automatic translation -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "Tarea" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Estado" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "Fecha de finalización" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "Fecha de adición" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" # automatic translation -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "Cancelar transcripción" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename" msgstr "Vietnamita" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" # automatic translation -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "Cancelar transcripción" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" # automatic translation -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "Cancelar transcripción" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Grabación en vivo" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Pulse en Grabar para comenzar..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "A la espera de la traducción de la IA..." # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Micrófono:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "Archivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "Archivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "Descarga fallida" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "Seleccione Exportar carpeta" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "Seleccionar archivo de audio" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "Se produjo un error al iniciar una grabación nueva:" # automatic translation -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -727,114 +724,117 @@ msgstr "" "aplicación para obtener más información." # automatic translation -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Buscar actualizaciones" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" # automatic translation -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "¡Estás al día!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Inicio" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "Fin" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py 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:50 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:33 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:53 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Traducción" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "Ver" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "Marcas de tiempo" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "Exportar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "Traducir" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Cambiar el tamaño" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "Buscar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "Mostrar/Ocultar barra de búsqueda (Ctrl+F)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "Encontrar:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "Introducir texto para encontrar..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "Coincidencia anterior (Mayús+Intro)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py #, fuzzy msgid "Next match (Ctrl+Enter)" msgstr "Siguiente coincidencia (Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "Limpiar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "Controles de reproducción:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "Segmento de bucle" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "Seguir audio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -843,236 +843,239 @@ msgstr "" "transcripción. Cuando está activado, se desplaza automáticamente al texto " "actual." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "Desplácese hasta Actual" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "Desplazarse hasta el texto hablado actualmente" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "1 de 100+ coincidencias" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "1 de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr " coincidencias" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "No se encontraron coincidencias" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr " de 100+ coincidencias" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr " de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "Clave de API requerida" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "Ingrese la clave API de OpenAI en las preferencias" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "Opciones de cambio de tamaño" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "Longitud deseada de los subtítulos" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "Opciones de fusión" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "Fusión por hueco" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "Dividido por puntuación" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "Dividido por la longitud máxima" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "Fusión" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" # automatic translation -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Cancelar transcripción" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" # automatic translation -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "Guardar archivo" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "Cancelar" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "Cancelado" # automatic translation -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "Guardar archivo" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "Archivos de texto" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "Descargando modelo" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "restantes" # automatic translation -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "Importar archivo..." # automatic translation -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "Importar URL..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "Acerca de" # automatic translation -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Preferencias..." # automatic translation -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Ayuda" # automatic translation -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "Archivo" # automatic translation -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." @@ -1081,24 +1084,23 @@ msgstr "" "no se puede deshacer." # automatic translation -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Seleccionar archivo de audio" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " @@ -1108,478 +1110,477 @@ msgstr "" "Vuelva a intentarlo con un modelo más pequeño. Para forzar el modo de CPU, " "use la variable de entorno BUZZ_FORCE_CPU=TRUE." -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py msgid "Translate to English" msgstr "Traducir al Inglés" # automatic translation -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "Transcribir" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "China" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "Ruso" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "Coreano" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "Francés" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "Portugués" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "Turco" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "Árabe" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "Sueco" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "Indones" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "Hindi" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "Finlandés" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "Vietnamita" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "Hebreo" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "Griego" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "Malayo" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "República Checa" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "Rumano" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "Húngaro" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "Tamil" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "Noruego" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "Tailandés" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "Urdu" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "Croata" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "Búlgaro" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "Lituano" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "Latin" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "Maori" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "Malayo" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "Galés" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "Eslovaco" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "Telugu" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "Persa" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "Bengalí" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "Serbian" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "Azerbaiyano" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "Esloveno" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "Kannada" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "Estonio" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "Macedonio" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "Breton" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "Vasco" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "Islandés" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "Ermeni" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "Nepalí" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "Mongol" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "Bosnio" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "Kazako" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "Arnavut" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "Suahili" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "Gallego" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "Maratí" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "Punjabi" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "Cingalés" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "Khmer" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "Shona" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "Yoruba" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "Somalí" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "Africaans" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "Occitano" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "Georgiano" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "Belorusia" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "Tajik" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "Sindhi" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "Gujarati" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "Amharca" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "Yiddish" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "República Popular Democrática de Laos" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "Uzbeko" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "Faroe" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "Haitian Creole" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "Pastún" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "Turcomano" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "Nynorsk" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "Maltés" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "Sánscrito" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "Luxemburgo" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "Myanmar" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "Tibetano" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "Tagalog" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "Madagascar" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "Asamés" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "Tátaro" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "Hawaiano" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "Lingala" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "Hausa" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "Baskir" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "Javanés" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "Sundanés" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "Cantonés" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "Se ha producido un error de conexión" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." # automatic translation -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "Cancelar transcripción" # automatic translation -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "Abrir ventana de grabación" # automatic translation -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "Importar archivo" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "Abrir ventana de preferencias" # automatic translation -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "Ver el texto de la transcripción" # automatic translation -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "Ver la traducción de la transcripción" # automatic translation -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Ver marcas de tiempo de la transcripción" # automatic translation -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py msgid "Search Transcript" msgstr "Buscar transcripción" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "Desplazarse al texto actual" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "Alternar controles de reproducción" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "Añadir a continuación" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "Añadir arriba" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "Añadir y corregir" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "Ajustes de traducción" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index cdbb6116..eeb07a25 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -16,174 +16,172 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "Importa URL" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://esempio.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "Ok" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Annulla" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "URL:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "URL non valido" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "L'URL inserito non è valido." -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py msgid "Live Transcript Presentation" msgstr "Presentazione con trascrizione in diretta" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "Ripristina impostazioni predefinite" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "Inglese" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "Catalano" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "Danese" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "Olandese" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "Tedesco" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "Spagnolo" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "Italiano" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "Giapponese" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "Lettone" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "Polacco" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "Portoghese (Brasiliano)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "Ucraino" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "Cinese (semplificato)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "Cinese (tradizionale)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "Riavvio richiesto!" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Ui Language" msgstr "Lingua UI:" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "Dimensione del carattere" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "Test" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "Chiave API OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "URL di base di OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API model" msgstr "Modello API OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "Nome file di esportazione predefinito" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "Abilita l'esportazione della trascrizione della registrazione live" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "Sfoglia" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "Esporta cartella" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Live recording mode" msgstr "Modalità di registrazione in diretta" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" "Utilizzare la quantizzazione a 8 bit per ridurre l'utilizzo della memoria" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." @@ -191,30 +189,29 @@ msgstr "" "Si applica ai modelli Huggingface e Faster Whisper. Riduce l'utilizzo della " "memoria GPU ma potrebbe ridurre leggermente la qualità della trascrizione." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:203 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "Ridurre la RAM della GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "Disabilita GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "Test della chiave API OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -222,11 +219,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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "Chiave API non valida" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -234,11 +231,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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "Seleziona la cartella di esportazione" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -248,118 +245,114 @@ msgstr "" "o la tua chiave.La trascrizione e la traduzione potrebbero comunque " "funzionare se l'API non supporta la convalida della chiave." -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Abilita controllo cartelle" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Cartella di input" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "Cartella di output" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "Seleziona cartella di input" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "Seleziona cartella di output" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "Preferenze" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "Generale" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "Modelli" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Scorciatoie" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Guarda cartella" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "Gruppo" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "ID Huggingface di un modello Whisper più veloce" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "Download" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Mostra la posizione del file" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Elimina" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "Scaricato" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Disponibile per il download" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Link per scaricare il file modello ggml Whisper.cpp" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Elimina modello" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "Sei sicuro di voler eliminare il modello selezionato?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "Download non riuscito" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Errore" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Registra" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Arresta" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Rileva la lingua" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "ad es., eng, fra, deu" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" "Enter an ISO 639-3 language code (3 letters).\n" "Examples: eng (English), fra (French), deu (German),\n" @@ -369,71 +362,70 @@ msgstr "" "Esempi: eng (inglese), fra (francese), deu (tedesco),\n" "spa (spagnolo), lav (lettone)" -#: buzz/widgets/transcriber/file_transcriber_widget.py:84 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Avvia" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Modello:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py 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:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "Chiave API:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Compito:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Lingua:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "Inserisci richiesta..." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Impostazion avanzate" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "Impostazioni di riconoscimento vocale" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Separate da virgola, esempio: \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Temperatura:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Domanda iniziale:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "Impostazioni di traduzione" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "Abilita la traduzione AI" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "Modello AI:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" @@ -441,141 +433,153 @@ msgstr "" "Inserisci le istruzioni per l'IA su come tradurre, ad esempio 'Per favore, " "traduci ogni testo che ti viene inviato dall'inglese allo spagnolo.'" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Istruzioni per l'AI:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "Impostazioni di traduzione" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Tempistiche a livello di parola" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "Estrai il parlato" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "Esporta:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "ID Huggingface di un modello" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "Avanzate..." -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py msgid "New File Transcription" msgstr "Nuova trascrizione del file" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py msgid "New URL Transcription" msgstr "Nuova trascrizione URL" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Apri trascrizione" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Annulla trascrizione" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Elimina la cronologia" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "In corso" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Completato" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "Non riuscito" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Annullato" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "In coda" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "Nome file / URL" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "Modello" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "Compito" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Stato" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "Data completata" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "Data aggiunta" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "Note" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "Ripristina ordine colonne" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Restart Transcription" msgstr "Riavvia trascrizione" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" msgstr "Rinomina" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "Aggiungi/modifica note" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename Transcription" msgstr "Rinomina trascrizione" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "Inserisci nuovo nome:" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "Inserisci alcune note rilevanti per questa trascrizione:" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "Impossibile riavviare" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "È possibile riavviare solo le trascrizioni non riuscite o annullate." -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed to restart transcription: {}" msgstr "Impossibile riavviare la trascrizione: {}" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." @@ -583,103 +587,96 @@ msgstr "" "Impossibile riavviare la trascrizione: il modello non è disponibile e non " "può essere scaricato." -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "Impossibile riavviare la trascrizione: trascrittore non trovato." -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Registrazione in diretta" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Fai clic su Registra per iniziare..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "In attesa della traduzione AI..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Microfono:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "Mostra in una nuova finestra" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py msgid "Text Size:" msgstr "Dimensione testo:" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "Tema" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "Chiaro" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "Scuro" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "Personalizzato" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py msgid "Text Color" msgstr "Colore del testo" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "Colore dello sfondo" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "Schermo intero" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "Download non riuscito" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py msgid "Select Text Color" msgstr "Seleziona il colore del testo" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py msgid "Select Background Color" msgstr "Seleziona il colore di sfondo" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "Si è verificato un errore durante l'avvio della nuova registrazione:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -687,110 +684,113 @@ msgstr "" "Controlla i tuoi dispositivi audio o i registri dell'applicazione per " "maggiori informazioni." -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Controlla gli aggiornamenti" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "Mostra log" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "Il programma è aggiornato!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Inizio" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "Fine" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Testo" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Traduzione" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "Visualizza" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "Timestamp" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "Esporta" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "Tradurre" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Ridimensionare" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "Identificare i relatori" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "Trova" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "Mostra/Nascondi barra di ricerca (Ctrl+F)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "Trova:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "Inserisci il testo per trovare..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "Corrispondenza precedente (Maiusc+Invio)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "Prossima corrispondenza (Ctrl+Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "Elimina" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "Controlli di riproduzione:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "Ciclo di segmento" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "Segui Audio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -799,117 +799,121 @@ msgstr "" "trascrizione. Quando abilitato, scorre automaticamente fino al testo " "corrente." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "Scorri fino al Corrente" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "Scorrere fino al testo attualmente pronunciato" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "1 di 100+ corrispondenze" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "1 di" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "corrispondenze" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "Nessuna corrispondenza trovata" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr " di oltre 100 corrispondenze" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr " di " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "Chiave API richiesta" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "Inserisci la chiave API OpenAI nelle preferenze" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "Estendi l'orario di fine" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "Estendi le terminazioni fino a (secondi)" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "Estendere i finali" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "Opzioni di ridimensionamento" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "Lunghezza desiderata dei sottotitoli" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" "Disponibile solo se i tempi a livello di parola sono stati disabilitati " "durante la trascrizione" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "Opzioni di unione" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "Unito per spazio" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "Diviso per punteggiatura" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "Diviso per lunghezza massima" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "Unione" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" "Disponibile solo se i tempi a livello di parola sono stati abilitati durante " "la trascrizione" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "1/8 Raccolta delle trascrizioni" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "2/8 Caricamento audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "3/8 Modello di allineamento del carico" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" "3/8 Caricamento del modello di allineamento (nuovo tentativo con la cache...)" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." @@ -917,114 +921,113 @@ msgstr "" "Impossibile caricare il modello di allineamento. Controlla la tua " "connessione Internet e riprova." -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "4/8 Elaborazione audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "5/8 Preparing transcripts" msgstr "5/8 Preparazione delle trascrizioni" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "6/8 Identificazione dei parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "7/8 Mappatura dei parlanti sulle trascrizioni" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "8/8 Identificazione effettuata" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "0/0 Errore nell'identificazione dei parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "Fase 1: identificare i parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "Identificare" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "Pronto a identificare i parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "File audio non trovato" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "Fase 2: nomi dei parlanti" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "Ascolta il campione" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "Unisci le frasi del parlante" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Save" msgstr "Salva" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "Annulla" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "Annullato" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "Salva file" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "File di testo" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "Download del modello" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "rimanente" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "Importa file.." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "Importa URL..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "Informazioni" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Preferenze..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Aiuto" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "File" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." @@ -1032,23 +1035,22 @@ msgstr "" "Sei certo di voler eliminare le trascrizioni selezionate? Questa azione non " "può essere annullata." -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Seleziona file audio" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " @@ -1058,469 +1060,468 @@ msgstr "" "Riprovare con un modello più piccolo. Per forzare la modalità CPU, " "utilizzare la variabile d'ambiente BUZZ_FORCE_CPU=TRUE" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py msgid "Translate to English" msgstr "Traduci in inglese" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "Trascrivere" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "Cinese" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "Russo" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "Coreano" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "Francese" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "Portoghese" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "Turco" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "Arabo" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "Svedese" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "Indonesiano" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "Hindi" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "Finlandese" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "Vietnamita" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "Ebraico" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "Greco" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "Malese" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "Ceco" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "Rumeno" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "Ungherese" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "Tamil" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "Norvegese" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "Tailandese" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "Urdu" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "Croato" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "Bulgaro" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "Lituano" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "Latino" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "Maori" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "Malayalam" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "Gallese" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "Slovacco" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "Telugu" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "Persiano" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "Bengalese" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "Serbo" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "Azerbaijani" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "Sloveno" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "Kannada" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "Estone" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "Macedone" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "Bretone" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "Basco" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "Islandese" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "Armeno" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "Nepalese" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "Mongola" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "Bosniaco" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "kazako" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "Albanese" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "Swahili" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "Galiziano" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "Marathi" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "Punjabi" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "Singalese" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "Khmer" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "Shona" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "Yoruba" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "Somalo" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "Afrikaans" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "Occitano" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "Georgiano" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "Biellorusso" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "Tagiko" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "Sindhi" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "Gujarati" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "Amarico" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "Yiddish" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "Lao" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "Uzbeko" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "Faroese" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "Creolo haitiano" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "Pashtu" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "Turkmen" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "Nynorsk" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "Maltese" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "Sanscrito" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "Lussemburghese" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "Birmano" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "Tibetano" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "Tagalog" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "Malgascio" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "Assamese" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "Tartaro" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "Hawaiano" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "Lingala" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "Hausa" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "Baschiro" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "Giavanese" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "Sundanese" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "Cantonese" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "Si è verificato un errore di connessione" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "Avvio di Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py msgid "Starting transcription..." msgstr "Inizio trascrizione..." -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "Apri finestra di registrazione" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "Importa file" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "Apri la finestra delle preferenze" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "Visualizza il testo della trascrizione" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "Visualizza la trascrizione della traduzione" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Visualizza i timestamp della trascrizione" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py msgid "Search Transcript" msgstr "Cerca trascrizione" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "Vai al risultato della ricerca della trascrizione successiva" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "Vai al risultato della ricerca della trascrizione precedente" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "Scorri fino al testo corrente" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "Riproduci/Pausa audio" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "Riproduci il segmento corrente" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "Attiva/disattiva i controlli di riproduzione" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "Riduci l'ora di inizio del segmento" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "Aumenta l'ora di inizio del segmento" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "Diminuisci l'ora di fine del segmento" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "Aumenta l'ora di fine del segmento" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "Aggiungere sotto" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "Aggiungere sopra" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "Aggiungere e correggere" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "Impostazioni di traduzione" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 148ac4f2..0178568d 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -12,205 +12,202 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.5\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "URLをインポートする" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://example.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "Ok" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "キャンセル" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "URL:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "無効なURL" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "入力されたURLは無効です。" -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "文字起こしの翻訳を表示する" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "デフォルトに戻す" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Ukrainian" msgstr "残り" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Ui Language" msgstr "言語:" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "フォントサイズ" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "テスト" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "OpenAI APIキー" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "OpenAI ベースURL" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "OpenAI APIキー" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "デフォルトの出力ファイル名" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "ライブ録音書き起こしの出力を有効にする" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "参照" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "出力フォルダ" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Live recording mode" msgstr "ライブ録音" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "OpenAI APIキー テスト" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -218,22 +215,22 @@ msgstr "" "あなたのAPIキーは有効です。Buzzはこのキーを使ってWhisper APIの書き起こしとAI" "翻訳を行います。" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Invalid API key" msgstr "OpenAI APIキー" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "出力フォルダを選択" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -243,438 +240,438 @@ msgstr "" "がキーの検証をサポートしていない場合でも、文字起こしや翻訳は動作する場合があ" "ります。" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "フォルダ監視を有効にする" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "入力フォルダ" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "出力フォルダ" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "入力フォルダを選択" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "出力フォルダを選択" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "設定" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "一般" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "モデル" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "ショートカット" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "フォルダ監視" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "グループ" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "Faster whisperモデルのHuggingface ID" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "ダウンロード" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "ファイルの場所を表示" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "削除" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "ダウンロード済み" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "ダウンロード可能" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Whisper.cpp ggmlモデルファイルのダウンロードリンク" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "モデルを削除" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "選択したモデルを本当に削除しますか?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "ダウンロード失敗" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "エラー" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "録音する" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "停止する" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "自動検出" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "実行" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "モデル:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "APIキー:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "タスク:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "言語:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "プロンプトを入力..." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "高度な設定" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "音声認識設定" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "コンマ区切り、例: \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "サンプリング温度:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "プロンプト:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "翻訳設定" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "AIによる翻訳を有効にする" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "AIのモデル:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "AIへの指示:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "翻訳設定" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "単語レベルでのタイミング" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "出力形式:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "モデルのHuggingface ID" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "高度な設定..." -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New File Transcription" msgstr "新しい文字起こし" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New URL Transcription" msgstr "新しい文字起こし" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "文字起こしを開く" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "文字起こしをキャンセルする" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "履歴を削除する" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "進行中" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "完了" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "失敗" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "キャンセル済み" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "キュー済み" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "ファイル名 / URL" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "モデル" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "タスク" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "ステータス" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "完了日" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "追加日" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "文字起こしをキャンセルする" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "文字起こしをキャンセルする" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "文字起こしをキャンセルする" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "ライブ録音" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "クリックで録音を開始..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "AI翻訳を待っています..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "マイク:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "テキストファイル" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "テキストファイル" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "ダウンロード失敗" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "出力フォルダを選択" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "音声ファイルを選択" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "新規録音開始時にエラーが発生しました:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -682,829 +679,833 @@ msgstr "" "オーディオデバイスを確認するか、詳細をアプリケーションのログで確認してくださ" "い。" -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "アップデートを確認する" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "最新の状態です!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "開始" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "終了" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "テキスト" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "翻訳" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "表示" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "タイムスタンプ" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "出力" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "翻訳" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "リサイズ" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "APIキーが必要" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "設定画面でOpenAI APIキーを入力してください" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py #, fuzzy msgid "Resize Options" msgstr "リサイズ" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "希望する字幕の長さ" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "文字起こしをキャンセルする" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "ファイルを保存" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "キャンセル" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "キャンセル済み" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "ファイルを保存" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "テキストファイル" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "モデルをダウンロード中" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "残り" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "ファイルをインポートする..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "URLをインポートする..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "About" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "設定..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "ヘルプ" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "ファイル" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." msgstr "本当に選択された文字起こしを削除しますか? この操作は元に戻せません。" -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "音声ファイルを選択" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " "variable." msgstr "" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Translate to English" msgstr "翻訳設定" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "文字起こし" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "接続エラーが発生しました" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "文字起こしをキャンセルする" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "録音画面を開く" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "ファイルをインポートする" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "設定画面を開く" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "文字起こしを表示する" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "文字起こしの翻訳を表示する" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "文字起こしのタイムスタンプを表示する" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py #, fuzzy msgid "Search Transcript" msgstr "文字起こしを開く" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "翻訳設定" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index bf28ffc4..545a4641 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: 2026-02-08 13:57+0200\n" -"PO-Revision-Date: 2026-02-08 13:58+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" +"PO-Revision-Date: 2026-02-22 15:21+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -17,175 +17,173 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.2\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "Importēt URL" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://example.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "Labi" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Atcelt" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "URL:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "Adrese nav derīga" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "Jūsu ievadītā URL adrese nav derīga." -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py msgid "Live Transcript Presentation" msgstr "Dzīvais ieraksts" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "Atjaunot noklusētos" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "Angļu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "Katalāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "Dāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "Holandiešu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "Vācu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "Spāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "Itāļu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "Japāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "Latviešu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "Poļu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "Portugāļu (Brazīlijas)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "Ukraiņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "Ķīniešu (vienkāršotā)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "Ķīniešu (tradicionālā)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "Jāpārstartē!" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Ui Language" msgstr "Programmas valoda" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "Fonta izmērs" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "Pārbaudīt" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "OpenAI API atslēga" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "OpenAI adrese" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API model" msgstr "OpenAI modelis" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "Eksporta fails" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "Eksportēt dzīvā ieraksta transkriptus" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "Izvēlēties" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "Eksportēt mapē" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Live recording mode" msgstr "" "Dzīvā ieraksta\n" "režīms" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." @@ -193,30 +191,29 @@ 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "Optimizēt GPU atmiņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "Deaktivēt GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "OpenAI API atslēgas pārbaude" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -224,11 +221,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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "Nederīga API atslēga" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -236,11 +233,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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "Izvēlieties mapi kurā eksportēt" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -250,118 +247,114 @@ msgstr "" "Atpazīšana un tulkošana joprojām var strādāt, ja API neatbalsta atslēgu " "pārbaudi." -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Ieslēgt mapes vērošanu" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Vērojamā mape" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "Rezultātu mape" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "Izvēlieties vērojamo mapi" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "Izvēlieties rezultātu mapi" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "Iestatījumi" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "Vispārīgi" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "Modeļi" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Īsinājumi" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Mapes vērošana" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "Veids" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "Faster whisper modeļa Huggingface ID" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "Lejupielādēt" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Rādīt faila atrašanās vietu" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Dzēst" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "Lejupielādēts" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Pieejams lejupielādei" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Whisper.cpp ggml modeļa datnes lejupielādes saite" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Dzēst modeli" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "Vai tiešām dzēst izvēlēto modeli?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "Lejupielāde neizdevās" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Kļūda" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Ierakstīt" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Apturēt" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Noteikt valodu" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "piem. eng, fra, deu" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" "Enter an ISO 639-3 language code (3 letters).\n" "Examples: eng (English), fra (French), deu (German),\n" @@ -371,71 +364,70 @@ msgstr "" "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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Apstrādāt" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Modelis:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py 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:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "API atslēga:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Uzdevums:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Valoda:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "Ievadiet vaicājumu..." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Papildu iestatījumi" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "Runas atpazīšanas iestatījumi" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Atdalīti ar komatu, piemēram, \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Temperatūra:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "" "Sākotnējais\n" "vaicājums:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "Tulkojuma iestatījumi" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "Tulkot ar MI" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "AI modelis:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" @@ -443,243 +435,247 @@ msgstr "" "Ievadiet instrukcijas mākslīgajam intelektam, piemēram, 'Lūdzu, iztulko " "katru tev atsūtīto tekstu no angļu valodas latviski'" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Norādes MI:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Recording settings" +msgstr "Dzīvā ieraksta iestatījumi" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "Klusuma slieksnis:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "Rindiņu atdalītājs:" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Dalīt pa vārdiem" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "Atdalīt runu" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "Eksportēt:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "Modeļa Huggingface ID" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "Papildu iestatījumi..." -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py msgid "New File Transcription" msgstr "Jauna faila atpazīšana" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py msgid "New URL Transcription" msgstr "Jauna saites atpazīšana" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Atvērt transkriptu" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Atcelt atpazīšanu" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Notīrīt vēsturi" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "Apstrādā" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Pabeigts" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "Neizdevās" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Atcelts" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "Ierindots" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "Fails / URL" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "Modelis" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "Uzdevums" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Statuss" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "Pabeigts" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "Pievienots" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "Piezīmes" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "Atjaunot kolonas" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Restart Transcription" msgstr "Sāk atpazīšanu" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" msgstr "Pārddēvēt" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "Rediģēt piezīmes" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename Transcription" msgstr "Pārdēvēt" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "Ievadiet jauno nosaukumu šim atpazīšanas ierakstam:" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "Ievadiet noderīgas piezīmēs par šo ierakstu:" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "Neizdodas sākt" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "Atkārtoti sākt var tikai kļūdainus vai atceltus ierakstus." -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed to restart transcription: {}" msgstr "Neizdevās sākt atpazīšanu: {}" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" "Neizdevās sākt atpazīšanu: modelis nav pieejams un to nevar lejupielādēt." -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "Neizdevās sākt atpazīšanu: Kļūda lietotnē, pārstartējiet." -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Dzīvā ierakstīšana" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Klikšķiniet Ierakstīt, lai sāktu..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "Gaida MI tulkojumu..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Mikrofons:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "Rādīt jaunā logā" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py msgid "Text Size:" msgstr "Teksta izmērs:" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "Stils" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "Gaišais" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "Tumšais" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "Pielāgots" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py msgid "Text Color" msgstr "Teksta krāsa" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "Fona krāsa" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "Pilnekrāns" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "Kopēt" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "Kopēt tekstu starpliktuvē" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "Nav nekā ko kopēt!" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy failed" msgstr "Kopešana neizdevās" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "Nokopēts!" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py msgid "Select Text Color" msgstr "Izvēlieties teksta krāsu" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py msgid "Select Background Color" msgstr "Izvēlieties fona krāsu" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "Sākot jaunu ierakstu notikusi kļūda:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -687,109 +683,112 @@ msgstr "" "Lūdzu pārbaudiet savas audio ierīces vai pārbaudiet lietotnes ziņojumu " "žurnālus, lai iegūtu papildu informāciju." -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Pārbaudīt atjauninājumus" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "Parādīt sistēmas žurnālu" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "Jums ir jaunākā versija!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "Vidējais skaļums" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Sākums" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "Beigas" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Teksts" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Tulkojums" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "Skats" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "Laiks" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "Eksportēt" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "Tulkot" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Mainīt garumu" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "Noteikt runātājus" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "Meklēt" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "Meklēt:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "Ievadiet meklējamo..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "Iepriekšējais rezultāts (Shift+Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "Nākamais rezultāts (Ctrl+Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "Notīrīt" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "Atskaņošana:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "Atkārtot segmentu" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "Sekot audio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -797,112 +796,118 @@ 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "Pāriet uz tekošo" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "Pāriet uz šobrīd atskaņojamo tesktu" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "1 no 100+ " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "1 no " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr " " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "Nekas nav atrasts" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr " no 100+" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr " no " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "API atslēgas kļūda" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "Lūdzu ievadiet OpenAI API atslēgu iestatījumos" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "Pagarināt beigu laiku" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "Palielināt beigu laiku par (sekundes)" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "Palielināt" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "Garuma maiņas iestatījumi" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "Vēlamais teksta garums" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "Pieejami tikai, ierakstiem, kas atpazīti bez dalīšanas pa vārdiem" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "Apvienošanas iestatījumi" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "Apvienot pēc attāluma" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "Dalīt pie pieturzīmēm" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "Dalīt pie maksimālā garuma" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "Apvienot" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "Pieejami tikai, ierakstiem, kas atpazīti ar dalīšanu pa vārdiem" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" +"Runātāju noteikšana nav pieejama, neizdevās ielādēt nepieciešamās " +"bibliotēkas." + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "1/8 Apkopo transkripcijas" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "2/8 Ielādē audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "3/8 Ielādē identifikācijas modeli" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "3/8 Ielādē identifikācijas modeli (atkārto...)" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." @@ -910,112 +915,111 @@ msgstr "" "Neizdevās ielādēt modeli. Lūdzu pārbaidiet savu interneta savienojumu un " "mēģiniet vēlreiz." -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "4/8 Apstrādā audio" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "5/8 Preparing transcripts" msgstr "5/8 Sagatavo transkripcijas" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "6/8 Nosaka runātājus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "7/8 Marķē runātāju teikumus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "8/8 Runātāju noteikšana pabeigta" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "0/0 Kļūda nosakot runātājus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "1. solis: Runātāju noteikšana" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "Noteikt" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "Gatavs noteikt runātājus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "Audio datne nav atrasta" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "2. solis: Runātāju identifikācija" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "Atskaņot paraugu" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "Apvienot secīgus runātāja teikumus" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Save" msgstr "Saglabāt" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Cancelling..." msgstr "Atceļ..." -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Cancelled" msgstr "Atcelts" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "Saglabāt failu" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "Teksta faili" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "Lejupielādē modeli" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "..." -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "Importēt failu..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "Importēt URL..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "Par" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Iestatījumi..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Palīdzība" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "Fails" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." @@ -1023,24 +1027,23 @@ msgstr "" "Vai tiešām vēlaties dzēst izvēlētos transkriptus? Šī ir neatgriezeniska " "darbība." -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Izvēlieties audio failu" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " @@ -1050,468 +1053,467 @@ msgstr "" "vēlreiz ar mazāku modeli. Lai izmantotu tikai CPU iestatiet " "BUZZ_FORCE_CPU=TRUE vides mainīgo." -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py msgid "Translate to English" msgstr "Tulkot angliski" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "Atpazīt" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "Ķīniešu" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "Krievu" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "Korejiešu" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "Franču" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "Portugāļu" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "Turku" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "Arābu" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "Zviedru" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "Indonēziešu" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "Hindi" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "Somu" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "Vjetnamiešu" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "Ebreju" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "Grieķu" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "Malajiešu" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "Čehu" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "Rumāņu" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "Ungāru" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "Tamilu" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "Norvēģu" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "Taju" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "Urdu" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "Horvātu" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "Bulgāru" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "Lietuviešu" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "Latīņu" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "Maori" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "Malajalu" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "Velsiešu" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "Slovāku" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "Telugu" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "Persiešu" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "Bengāļu" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "Serbu" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "Azerbaidžāņu" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "Slovēņu" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "Kannada" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "Igauņu" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "Maķedoniešu" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "Bretoņu" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "Basku" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "Islandiešu" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "Armēņu" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "Nepāliešu" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "Mongoļu" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "Bosniešu" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "Kazahu" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "Albaņu" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "Svahili" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "Galisiešu" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "Maratu" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "Pandžabu" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "Singalu" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "Khmeru" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "Shona" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "Joruba" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "Somāliešu" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "Afrikāņu" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "Okitāņu" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "Gruzīnu" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "Baltkrievu" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "Tadžiku" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "Sindhu" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "Gudžaratu" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "Amharu" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "Jidiša" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "Laosiešu" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "Uzbeku" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "Fēru" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "Haiti kreoliešu" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "Puštu" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "Turkmēņu" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "Nynorsk" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "Maltiešu" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "Sanskrita" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "Luksemburgu" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "Mjanmas" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "Tibetiešu" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "Tagalogu" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "Malagasu" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "Asamiešu" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "Tatāru" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "Havajiešu" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "Lingalu" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "Hausu" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "Baškīru" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "Japāņu" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "Sundāņu" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "Kantonas" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "Notika savienojuma kļūda" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "Palaiž Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py msgid "Starting transcription..." msgstr "Sāk atpazīšanu..." -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "Atvērt ieraksta logu" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "Importēt failu" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "Atvērt iestatījumu logu" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "Aplūkot atpazīto tekstu" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "Aplūkot tulkojumu" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Aplūkot atpazīšanas laikus" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py msgid "Search Transcript" msgstr "Meklēt tekstā" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "Pāriet uz nākamo meklēšanas rezultātu" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "Pāriet uz iepriekšējo meklēšanas rezultātu" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "Pāriet uz atskaņojamo tesktu" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "Atskaņot/Apturēt audio" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "Atskaņot segmentu no sākuma" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "Pārslēgt atskaņošanas iespējas" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "Samazināt segmenta sākuma laiku" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "Palielināt segmenta sākuma laiku" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "Samazināt segmenta beigu laiku" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "Palielināt segmenta beigu laiku" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "Jaunie teikumi apakšā" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "Jaunie teikumi augšā" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "Papildināt un labot esošo" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py msgid "Translation error, see logs!" msgstr "Kļūda tulkojot, skatiet sistēmas žurnālu!" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 4cd0b875..6d056712 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -19,203 +19,200 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.5\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "Url importeren" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://voorbeeld.nl/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "Oké" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Annuleren" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "Url:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "Ongeldige url" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "De ingevoerde url is ongeldig." -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "Getranscribeerde vertaling bekijken" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "Standaardwaarden" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "Engels" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "Catalaans" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "Deens" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "Nederlands" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "Duits" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "Spaans" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "Italiaans" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "Japans" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "Lets" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "Pools" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Portuguese (Brazil)" msgstr "Portugees" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "Oekraïens" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "Chinees (Vereenvoudigd)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "Chinees (Traditioneel)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "Herstart vereist!" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Ui Language" msgstr "Programmataal" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "Tekstgrootte" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "Uitproberen" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "OpenAI-api-sleutel" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "OpenAI-hoofd-url" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "OpenAI-api-sleutel" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "Standaardnaam van export" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "Transcripties van opnames onmiddelijk exporteren" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "Bladeren" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "Exportmap" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Live recording mode" msgstr "Live-opnamemodus" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "OpenAI-api-sleuteltest" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -223,11 +220,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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "Ongeldige api-sleutel" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -235,11 +232,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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "Kies een exportmap" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -249,773 +246,779 @@ msgstr "" "Transcriptie en vertaling werkt mogelijk nog steeds als de api niet om " "sleutelverificatie vraagt." -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Map bijhouden" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Invoermap" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "Uitvoermap" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "Kies een invoermap" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "Kies een uitvoermap" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "Instellingen" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "Algemeen" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "Modellen" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Sneltoetsen" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Map bijhouden" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "Groep" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "Huggingface-id of een sneller Whisper-model" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "Downloaden" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Bestandslocatie tonen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Verwijderen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "Gedownload" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Beschikbaar" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Downloadlink van Whisper.cpp ggml-modelbestand" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Model verwijderen" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "Weet u zeker dat u het gekozen model wilt verwijderen?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "Het downloaden is mislukt" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Foutmelding" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Opnemen" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Stoppen" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Taal herkennen" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Uitvoeren" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Model:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py 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:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "Api-sleutel:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Taak:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Taal:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "Voer een tekst in…" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Geavanceerde instellingen" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "Spraakherkenningsinstellingen" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Kommagescheiden, bijv. ‘0.0, 0.2, 0.4, 0.6, 0.8, 1.0’" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Temperatuur:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Hoofdinvoer:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "Vertaalinstellingen" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "AI-vertaling inschakelen" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "AI-model:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "AI-instructies:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "Vertaalinstellingen" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Woordherkenningstimings" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "Spraak extraheren" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "Exporteren:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "Huggingface-id van een model" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "Geavanceerd…" -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py msgid "New File Transcription" msgstr "Nieuwe bestandstranscriptie" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py msgid "New URL Transcription" msgstr "Nieuwe url-transcriptie" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Transcriptie openen" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Transcriptie wissen" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Geschiedenis wissen" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "In behandeling" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Afgerond" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "Mislukt" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Afgebroken" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "In wachtrij" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "Bestandsnaam/Url" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "Model" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "Taak" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Status" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "Afgerond op" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "Toegevoegd op" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "Transcriptie wissen" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename" msgstr "Vietnamees" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "Transcriptie wissen" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "Transcriptie wissen" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Live-opname" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Klik op de opnameknop om te beginnen…" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "Bezig met wachten op AI-vertaling…" -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Microfoon:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "Tekstbestanden" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "Tekstbestanden" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "Het downloaden is mislukt" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "Kies een exportmap" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "Kies een audiobestand" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "Er is een fout opgetreden tijdens het starten van de opname:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." msgstr "Controleer uw geluidsapparatuur of het programmalogboek." -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Controleren op updates" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "De software is actueel!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Begin" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "Einde" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Tekst" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Vertaling" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "Bekijken" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "Tijdstippen" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "Exporteren" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "Vertalen" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Grootte" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "Api-sleutel vereist" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "Voer de OpenAI-api-sleutel in in de instellingen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "Grootteopties" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "Voorkeurslengte van ondertiteling" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "Samenvoegopties" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "Samenvoegen op basis van tussenruimte" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "Splitsen op basis van leestekens" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "Splitsen op basis van max. lengte" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "Samenvoegen" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Transcriptie wissen" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "Bestand opslaan" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "Annuleren" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "Afgebroken" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "Bestand opslaan" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "Tekstbestanden" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "Bezig met ophalen van model…" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "resterend" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "Bestand importeren…" -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "Url importeren…" -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "Over" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Instellingen…" -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Hulp" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "Bestand" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." @@ -1023,494 +1026,492 @@ msgstr "" "Weet u zeker dat u de gekozen transcriptie(s) wilt verwijderen? Deze actie " "is onomkeerbaar." -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Kies een audiobestand" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " "variable." msgstr "" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Translate to English" msgstr "Vertaalinstellingen" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "Transcriberen" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "Chinees" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "Russisch" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "Koreaans" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "Frans" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "Portugees" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "Turks" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "Arabisch" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "Zweeds" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "Indonesisch" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "Hindi" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "Fins" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "Vietnamees" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "Hebreeuws" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "Grieks" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "Maleis" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "Tsjechisch" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "Roemeens" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "Hongaars" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "Tamil" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "Noors" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "Thai" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "Urdu" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "Kroatisch" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "Bulgaars" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "Litouws" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "Latijn" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "Maori" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "Malayalam" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "Welsh" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "Slowaaks" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "Telugu" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "Perzisch" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "Bengaals" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "Servisch" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "Azerbeidzjaans" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "Sloveens" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "Kannada" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "Ests" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "Macedonisch" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "Bretons" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "Baskisch" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "IJslands" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "Armeens" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "Nepalees" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "Mongools" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "Bosnisch" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "Kazachs" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "Albanees" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "Swahili" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "Galicisch" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "Marathi" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "Punjabi" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "Singalees" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "Khmer" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "Shona" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "Yoruba" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "Somalisch" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "Afrikaans" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "Occitaans" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "Georgisch" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "Belarussisch (Wit-Russisch)" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "Tadzjieks" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "Sindhi" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "Gujarati" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "Amhaars" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "Jiddisch" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "Laotiaans" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "Oezbeeks" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "Faeröers" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "Haïtiaans-Creools" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "Pashto" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "Turkmeens" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "Nynorsk" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "Maltees" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "Sanskriet" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "Luxemburgs" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "Myanmar" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "Tibetaans" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "Tagalog" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "Malagassisch" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "Assamees" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "Tataars" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "Hawaïaans" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "Lingala" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "Hausa" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "Bashkir" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "Javaans" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "Soedanees" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "Kantonees" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "Er is een verbindingsfout opgetreden" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "Transcriptie wissen" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "Opnamevenster openen" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "Bestand importeren" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "Instellingenvenster openen" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "Transcriptie bekijken" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "Getranscribeerde vertaling bekijken" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Getranscribeerde tijdstippen bekijken" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py #, fuzzy msgid "Search Transcript" msgstr "Transcriptie openen" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "Onderaan toevoegen" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "Bovenaan toevoegen" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "Toevoegen en corrigeren" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "Vertaalinstellingen" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index ba033595..65825912 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -17,676 +17,672 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.2.2\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "Importuj URL" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://przyklad.pl/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Anuluj" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "URL:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "Nieprawidłowy URL" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "Wprowadzony URL nie jest prawidłowy" -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "Nowa transkrypcja" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Ui Language" msgstr "Język:" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "Model:" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Live recording mode" msgstr "Nagrywanie na żywo" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Invalid API key" msgstr "Nieprawidłowy URL" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " "validation." msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py #, fuzzy msgid "Enable folder watch" msgstr "Przeglądanie folderu" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py #, fuzzy msgid "Select Input Folder" msgstr "Wybierz plik audio" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py #, fuzzy msgid "Preferences" msgstr "Ustawienia..." -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "Główne" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py #, fuzzy msgid "Models" msgstr "Model:" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Skróty" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Przeglądanie folderu" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Download" msgstr "Pobierz" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Pokaż lokalizacje pliku" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Usuń" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Downloaded" msgstr "Pobrany" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Dostępne do pobrania" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Usuń model" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Are you sure you want to delete the selected model?" msgstr "Czy na pewno chcesz usunąć zaznaczoną transkrypcję?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Download failed" msgstr "Pobrany" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Błąd" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Nagraj" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Zatrzymaj" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Wykryj język" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Rozpocznij" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Model:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Zadanie:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Język:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Ustawienia zaawansowane" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Oddzielone przecinkiem, np. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Temperatura:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Wstępne instrukcje:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py #, fuzzy msgid "AI model:" msgstr "Model:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Recording settings" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Znaczniki dla słów" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "" -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New File Transcription" msgstr "Nowa transkrypcja" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New URL Transcription" msgstr "Nowa transkrypcja" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Otwórz transkrypt" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Anuluj transkrypcję" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Wyczyść historię" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Ukończono" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Anulowano" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "Kolejka" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "File Name / URL" msgstr "Nazwa pliku" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Model" msgstr "Model:" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Task" msgstr "Zadanie:" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Status" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Date Completed" msgstr "Ukończono" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "Anuluj transkrypcję" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "Anuluj transkrypcję" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "Anuluj transkrypcję" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Nagrywanie na żywo" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Naciśnij Nagraj, aby zacząć..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Mikrofon:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "Pliki tekstowe" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "Pliki tekstowe" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "Pobrany" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "Wybierz plik audio" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "Wybierz plik audio" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "Wystąpił błąd podczas rozpoczęcia nowego nagrania:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -694,340 +690,346 @@ msgstr "" "Sprawdź urządzenia audio lub przejrzyj logi aplikacji, by uzyskać więcej " "informacji." -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Sprawdź aktualizacje" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "Posiadasz najnowszą wersję!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Rozpocznij" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py 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:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Tekst" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py #, fuzzy msgid "Translation" msgstr "Nowa transkrypcja" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Anuluj transkrypcję" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "Zapisz plik" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "Anuluj" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "Anulowano" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py #, fuzzy msgid "Save File" msgstr "Zapisz plik" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "Pliki tekstowe" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py #, fuzzy msgid "Downloading model" msgstr "Pobrany" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py #, fuzzy msgid "Import File..." msgstr "Importuj plik..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py #, fuzzy msgid "Import URL..." msgstr "Importuj URL..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Ustawienia..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Pomoc" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "Plik" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." @@ -1035,499 +1037,497 @@ msgstr "" "Czy na pewno chcesz usunąć zaznaczone transkrypcje? Tej operacji nie można " "cofnąć." -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Wybierz plik audio" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "" -#: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " "variable." msgstr "" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Translate to English" msgstr "Nowa transkrypcja" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Transcribe" msgstr "Otwórz transkrypt" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "Anuluj transkrypcję" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py #, fuzzy msgid "Open Record Window" msgstr "Nagrywanie na żywo" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py #, fuzzy msgid "Import File" msgstr "Importuj plik..." -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py #, fuzzy msgid "View Transcript Text" msgstr "Nowa transkrypcja" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py #, fuzzy msgid "View Transcript Translation" msgstr "Nowa transkrypcja" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py #, fuzzy msgid "View Transcript Timestamps" msgstr "Nowa transkrypcja" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py #, fuzzy msgid "Search Transcript" msgstr "Otwórz transkrypt" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py msgid "Translation error, see logs!" msgstr "" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index 136ac525..dd405009 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -17,203 +17,200 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.6\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "Importar URL" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://exemplo.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "Ok" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Cancelar" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "URL:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "URL inválida" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "A URL inserida é inválida." -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "Ver Tradução da Transcrição" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "Redefinir para o Padrão" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "Inglês" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "Catalão" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "Dinamarquês" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "Holandês" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "Alemão" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "Espanhol" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "Italiano" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "Japonês" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "Letão" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "Polonês" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "Português (Brasil)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "Ucraniano" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "Chinês (Simplificado)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "Chinês (Tradicional)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "Reinicialização necessária!" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Ui Language" msgstr "Idioma da Interface" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "Tamanho da Fonte" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "Testar" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "Chave API da OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "URL base da OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "Chave API da OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "Nome padrão do arquivo de exportação" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "Habilitar exportação da transcrição ao vivo" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "Procurar" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "Pasta de exportação" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Live recording mode" msgstr "Modo de gravação ao vivo" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "Desabilitar GPU" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "Teste da Chave API OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -221,11 +218,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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "Chave API inválida" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." @@ -233,11 +230,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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "Selecionar Pasta de Exportação" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -247,187 +244,182 @@ msgstr "" "chave. A transcrição e tradução ainda podem funcionar se a API não suportar " "validação de chave." -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Habilitar monitoramento de pasta" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Pasta de entrada" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "Pasta de saída" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "Selecionar Pasta de Entrada" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "Selecionar Pasta de Saída" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "Preferências" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "Geral" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "Modelos" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Atalhos" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Monitorar Pasta" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "Grupo" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "ID Huggingface de um modelo Faster Whisper" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "Baixar" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Mostrar local do arquivo" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Excluir" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "Baixado" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Disponível para Download" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Link para o arquivo de modelo Whisper.cpp ggml" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Excluir Modelo" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "Tem certeza que deseja excluir o modelo selecionado?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "Falha ao baixar" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Erro" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Gravar" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Parar" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Detectar Idioma" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Executar" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Modelo:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py 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:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "Chave API:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Tarefa:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Idioma:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "Digite um prompt..." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Configurações Avançadas" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "Configurações de reconhecimento de fala" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Separado por vírgulas, ex: \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Temperatura:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Prompt Inicial:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "Configurações de tradução" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "Habilitar tradução por IA" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "Modelo de IA:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" @@ -435,251 +427,256 @@ msgstr "" "Instrua a IA sobre como traduzir, por exemplo: \"Por favor, traduza cada " "texto enviado a você do Inglês para o Português\"." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Instruções para a IA:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "Configurações de tradução" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Tempos em nível de palavra" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "Extrair fala" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "Exportar:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "ID Huggingface de um modelo" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "Avançado..." -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py msgid "New File Transcription" msgstr "Nova Transcrição de Arquivo" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py msgid "New URL Transcription" msgstr "Nova Transcrição de URL" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Abrir Transcrição" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Cancelar Transcrição" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Limpar Histórico" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "Em Progresso" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Concluído" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "Falhou" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Cancelado" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "Na fila" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "Nome do Arquivo / URL" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "Modelo" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "Tarefa" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Status" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "Data de Conclusão" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "Data de Adição" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "Iniciando transcrição..." -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename" msgstr "Vietnamita" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "Cancelar Transcrição" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "Iniciando transcrição..." -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Gravação ao Vivo" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Clique em Gravar para começar..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "Aguardando tradução da IA..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Microfone:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "Arquivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "Arquivos de texto" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "Falha ao baixar" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "Selecionar Pasta de Exportação" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "Selecionar arquivo de áudio" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "Ocorreu um erro ao iniciar uma nova gravação:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -687,110 +684,113 @@ msgstr "" "Verifique seus dispositivos de áudio ou os logs do aplicativo para mais " "informações." -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Verificar atualizações" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "Você está atualizado!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Início" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "Fim" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Texto" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Tradução" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "Visualizar" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "Marcações de tempo" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "Exportar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "Traduzir" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Redimensionar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "Procurar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "Mostrar/Ocultar a Barra de Pesquisa" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "Procurar:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "Digite o texto a procurar..." -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "Encontro prévio (Shift+Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py #, fuzzy msgid "Next match (Ctrl+Enter)" msgstr "Póximo encontro (Enter)" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "Limpar" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "Controles de Reprodução:" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "Segmento de Loop" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "Siga o Áudio" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." @@ -798,227 +798,230 @@ 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "Rolar para o Atual" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "Role até o texto falado no momento" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "1 de 100+ encontros" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "1 de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr " encontros" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "Nada encontrado" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr " de 100+ encontros" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr " de " -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "Chave API Necessária" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "Insira a chave API OpenAI nas preferências" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "Opções de Redimensionamento" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "Duração desejada da legenda" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "Opções de Mesclagem" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "Mesclar por intervalo" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "Dividir por pontuação" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "Dividir por tamanho máximo" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "Mesclar" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Iniciando transcrição..." -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "Salvar Arquivo" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "Cancelar" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "Cancelado" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "Salvar Arquivo" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "Arquivos de texto" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "Baixando modelo" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "restante" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "Importar Arquivo..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "Importar URL..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "Sobre" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Preferências..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Ajuda" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "Arquivo" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." @@ -1026,22 +1029,21 @@ msgstr "" "Tem certeza que deseja excluir a(s) transcrição(ões) selecionada(s)? Esta " "ação não pode ser desfeita." -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Selecionar arquivo de áudio" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " @@ -1051,470 +1053,469 @@ msgstr "" "novamente com um modelo menor. Para forçar o modo CPU, use a variável de " "ambiente BUZZ_FORCE_CPU=TRUE." -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py msgid "Translate to English" msgstr "Traduzir para Inglês" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "Transcrever" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "Chinês" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "Russo" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "Coreano" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "Francês" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "Português" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "Turco" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "Árabe" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "Sueco" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "Indonésio" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "Híndi" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "Finlandês" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "Vietnamita" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "Hebraico" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "Grego" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "Malaio" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "Tcheco" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "Romeno" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "Húngaro" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "Tâmil" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "Norueguês" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "Tailandês" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "Urdu" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "Croata" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "Búlgaro" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "Lituano" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "Latim" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "Maori" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "Malaiala" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "Galês" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "Eslovaco" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "Telugu" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "Persa" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "Bengali" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "Sérvio" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "Azerbaijano" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "Esloveno" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "Canarês" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "Estoniano" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "Macedônio" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "Bretão" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "Basco" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "Islandês" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "Armênio" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "Nepalês" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "Mongol" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "Bósnio" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "Cazaque" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "Albanês" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "Suaíli" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "Galego" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "Marathi" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "Panjabi" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "Cingalês" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "Khmer" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "Shona" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "Iorubá" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "Somali" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "Africâner" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "Occitano" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "Georgiano" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "Bielorrusso" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "Tajique" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "Sindi" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "Gujarati" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "Amárico" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "Ídiche" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "Laosiano" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "Uzbeque" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "Feroês" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "Crioulo Haitiano" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "Afegão" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "Turcomeno" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "Novo Norueguês" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "Maltês" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "Sânscrito" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "Luxemburguês" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "Birmanês" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "Tibetano" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "Tagalo" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "Malgaxe" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "Assamês" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "Tártaro" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "Havaiano" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "Lingala" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "Hauçá" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "Bashkir" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "Javanês" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "Sundanês" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "Cantonês" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "Ocorreu um erro de conexão" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "Iniciando transcrição..." -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "Abrir Janela de Gravação" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "Importar Arquivo" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "Abrir Janela de Preferências" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "Ver Texto da Transcrição" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "Ver Tradução da Transcrição" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Ver Marcações de Tempo da Transcrição" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py msgid "Search Transcript" msgstr "Pesquisar Transcrição" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "Role até o Texto Atual" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "Tocar/Pausar o Áudio" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "Repetir o Segmento Atual" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "Alternar Controles de Reprodução" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "Diminuir o Inicio do Segmento" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "Aumentar o Início do Segmento" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "Diminuir o Final do Segmento" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "Estender o Final do Segmento" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "Acrescentar abaixo" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "Acrescentar acima" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "Acrescentar e corrigir" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "Configurações de tradução" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index cf1b6762..35afaf8b 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -14,205 +14,202 @@ msgstr "" "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Poedit 3.4.4\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "Імпортувати адресу" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://example.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "Гаразд" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Скасувати" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "Адреса:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "Недійсна адреса" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "Адреса, яку ви ввели, є недійсною" -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "Переглянути переклад транскрипції" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "Типові значення" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Ukrainian" msgstr "залишилось" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Ui Language" msgstr "Мова:" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "Розмір шрифту" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "Тест" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "API-ключ OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "Базова адреса OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "API-ключ OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "Типова назва файлу експорту" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "Увімкнути експорт транскрипції з живого запису" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "Огляд" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "Тека для експорту" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Live recording mode" msgstr "Живий запис" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "Тест API-ключа OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." @@ -220,22 +217,22 @@ msgstr "" "Ваш API-ключ дійсний. Buzz використає цей ключ для транскрипції з Whisper " "API та перекладу ШІ." -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Invalid API key" msgstr "API-ключ OpenAI" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "Виберіть теку для експорту" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -245,438 +242,438 @@ msgstr "" "API-ключа. Транскрипція та переклад можуть продовжити працювати, якщо API не " "підтримує перевірку ключа." -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Увімкнути стеження за текою" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Тека введення" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "Тека виведення" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Input Folder" msgstr "Виберіть теку введення" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "Виберіть теку виведення" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Preferences" msgstr "Налаштування" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "Загальне" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Models" msgstr "Моделі" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "Клавіатурні скорочення" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "Нагляд за текою" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "Група" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "Huggingface ID для моделі Faster Whisper" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download" msgstr "Завантажити" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "Показати розташування файлу" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "Видалити" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Downloaded" msgstr "Завантажене" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "Доступно для завантаження" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Посилання на завантаження файлу ggml моделі Whisper.cpp" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Видалити модель" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Are you sure you want to delete the selected model?" msgstr "Ви впевнені, що хочете видалити вибрану модель?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download failed" msgstr "Невдале завантаження" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Помилка" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "Записати" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "Зупинити" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Визначити мову" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "Запуск" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "Модель:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "API-ключ:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "Завдання:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "Мова:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "Введіть підказку..." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "Додаткові налаштування" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "Параметри розпізнавання мовлення" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "Значення розділені комами, напр., \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "Температура:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Початкова підказка:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "Налаштування перекладу" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "Увімкнути переклад ШІ" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "AI model:" msgstr "Модель ШІ" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Інструкції для ШІ:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "Налаштування перекладу" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Хронометраж на рівні слів" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "Експорт:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "ID чи модель Huggingface" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "Додатково..." -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New File Transcription" msgstr "Нова транскрипція" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New URL Transcription" msgstr "Нова транскрипція" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "Відкрити транскрипцію" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "Скасувати транскрипцію" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Очистити історію" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "В процесі" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "Завершено" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "Невдача" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "Скасовано" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "У черзі" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "File Name / URL" msgstr "Назва файлу / посилання" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Model" msgstr "Модель" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Task" msgstr "Завдання" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Стан" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Completed" msgstr "Дата завершення" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "Дата додавання" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "Скасувати транскрипцію" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "Скасувати транскрипцію" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "Скасувати транскрипцію" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "Живий запис" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "Натисніть на Запис, щоб розпочати..." -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "Очікування перекладу від ШІ..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "Мікрофон:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "Текстові файли" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "Текстові файли" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "Невдале завантаження" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "Виберіть теку для експорту" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "Вибрати аудіофайл" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "При старті нового запису виникла помилка:" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." @@ -684,829 +681,833 @@ msgstr "" "Будь ласка, перевірте свої аудіопристрої або пошукайте додаткову інформацію " "в звітах програми." -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Перевірити оновлення" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "У вас актуальна версія!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Початок" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "Кінець" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Текст" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Переклад" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "Вигляд" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "Позначки часу" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "Експорт" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "Перекласти" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "Потрібен API-ключ" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "Будь ласка, введіть API-ключ OpenAI в налаштуваннях" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "Скасувати транскрипцію" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "Зберегти файл" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "Скасувати" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "Скасовано" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" msgstr "Зберегти файл" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "Текстові файли" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py msgid "Downloading model" msgstr "Завантаження моделі" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "залишилось" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py msgid "Import File..." msgstr "Імпортувати файл..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py msgid "Import URL..." msgstr "Імпортувати адресу..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "Про застосунок" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "Налаштування..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "Допомога" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "Файл" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." msgstr "" "Ви впевнені, що хочете видалити вибрані транскрипції? Це незворотна дія." -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "Вибрати аудіофайл" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " "variable." msgstr "" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Translate to English" msgstr "Налаштування перекладу" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py msgid "Transcribe" msgstr "Розпізнати" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "Виникла помилка зʼєднання" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "Скасувати транскрипцію" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py msgid "Open Record Window" msgstr "Відкрити вікно запису" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py msgid "Import File" msgstr "Імпортувати файл" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "Відкрити вікно налаштувань" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py msgid "View Transcript Text" msgstr "Переглянути текст транскрипції" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py msgid "View Transcript Translation" msgstr "Переглянути переклад транскрипції" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Переглянути позначки часу в транскрипції" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py #, fuzzy msgid "Search Transcript" msgstr "Відкрити транскрипцію" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "Налаштування перекладу" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 7d5f52d8..cb902752 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -17,215 +17,212 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.2.2\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "导入URL" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "https://example.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "Ok" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "取消" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "网址:" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "无效的网址" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "输入的网址无效" -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "查看识别的翻译" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "恢复默认" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Ukrainian" msgstr "剩余" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Ui Language" msgstr "语言:" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "字体大小" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "测试" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "OpenAI API key" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "OpenAI 基于 url" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "OpenAI API key" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "默认输出文件名" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "启用实时录制转录导出" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "浏览" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "导出文件夹" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Live recording mode" msgstr "现场录制模式" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "测试OpenAI API Key" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "无效的API key" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " @@ -233,11 +230,11 @@ msgid "" msgstr "" "API只支持 base64字符(A-Za-z0-9+/=)。其他字符在API密钥中可能导致错误。" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "选择输出文件夹" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " @@ -246,1289 +243,1293 @@ msgstr "" "OpenAI API返回无效响应。请检查API网址或您的密钥。如果API不支持密钥验证,转录" "和翻译可能仍然有效翻" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "开启文件夹监控" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "输入文件夹" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "输出文件夹" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py #, fuzzy msgid "Select Input Folder" msgstr "选择输入文件夹" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "选择输出文件夹" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py #, fuzzy msgid "Preferences" msgstr "偏好设置" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "通用" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py #, fuzzy msgid "Models" msgstr "模型" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "快捷键" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "文件夹查看" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "组" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "较快的Whisper模型的Huggingface ID" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Download" msgstr "下载" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "查看文件位置" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "删除" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Downloaded" msgstr "已下载的" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "可用的下载" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "Whisper.cpp ggml 模型文件的下载链接" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "删除模型" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Are you sure you want to delete the selected model?" msgstr "您确定要删除所选录制吗?" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Download failed" msgstr "下载模型失败" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "错误" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "录制" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "停止" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "检测语言" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "开始执行" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "模型:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." msgstr "首次使用模型可能需要几分钟的时间才能加载" -#: buzz/widgets/transcriber/transcription_options_group_box.py:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "Api Key:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "任务:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "语言:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "请输入文本..." -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "高级设置" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "语音识别设置" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "逗号分隔,例如\"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "间隔" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "初始提示:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "翻译设置" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "启用AI翻译" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py #, fuzzy msgid "AI model:" msgstr "AI 模型:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "AI说明:" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#, fuzzy +msgid "Recording settings" +msgstr "翻译设置" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "逐词识别" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "提取语音" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "导出:" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "模型的Huggingface ID " -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "高级..." -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New File Transcription" msgstr "新增文件识别" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New URL Transcription" msgstr "新增URL识别" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "打开识别结果" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "取消识别" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "清除历史纪录" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "运行中" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "完成" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "失败" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "取消" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "队列中" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "File Name / URL" msgstr "文件名称/URL" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Model" msgstr "模型" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Task" msgstr "任务" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "状态" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Date Completed" msgstr "完成时间" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "添加日期" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "取消识别" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "取消识别" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "取消识别" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "实时录制" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "点击开始录制" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "等待AI翻译..." -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "麦克风:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Size:" msgstr "文本文件" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Text Color" msgstr "文本文件" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "下载模型失败" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "选择输出文件夹" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "选择音频文件" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "开始新录制时出错" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." msgstr "请检查您的音频设备或检查应用程序日志以获取更多信息。" -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "检查更新" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "已经是最新版本" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "开始" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "结束" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "文本" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py #, fuzzy msgid "Translation" msgstr "翻译" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "查看" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "时间戳" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "导出" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "翻译" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "调整大小" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "需要API Key" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "请在偏好设置中输入OpenAI API Key" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py #, fuzzy msgid "Resize Options" msgstr "调整大小" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "所需字幕长度" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "合并选项" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "按间隔合并" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "按标点符号拆分" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "按最大长度拆分" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "合并" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "取消识别" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "保存文件" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "取消" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "取消" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py #, fuzzy msgid "Save File" msgstr "保存文件" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "文本文件" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py #, fuzzy msgid "Downloading model" msgstr "模型下载中" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "剩余" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py #, fuzzy msgid "Import File..." msgstr "导入媒体文件..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py #, fuzzy msgid "Import URL..." msgstr "导入媒体文件..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "关于" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "偏好设置..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "帮助" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "文件" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." msgstr "您确定要删除所选录制吗?此操作无法撤消。" -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "选择音频文件" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py 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:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " "variable." msgstr "" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Translate to English" msgstr "翻译设置" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Transcribe" msgstr "识别" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "连接发生错误" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "取消识别" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py #, fuzzy msgid "Open Record Window" msgstr "打开录制窗口" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py #, fuzzy msgid "Import File" msgstr "导入文件" -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "打开偏好设置窗口" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py #, fuzzy msgid "View Transcript Text" msgstr "查看识别的文本" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py #, fuzzy msgid "View Transcript Translation" msgstr "查看识别的翻译" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py #, fuzzy msgid "View Transcript Timestamps" msgstr "查看转录时间戳" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py #, fuzzy msgid "Search Transcript" msgstr "打开识别结果" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "增加下方" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "增加上方" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "增加并纠正" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py #, fuzzy msgid "Translation error, see logs!" msgstr "翻译设置" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index ac2ae1c9..87373aab 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: 2026-02-08 13:57+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -17,1509 +17,1509 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.2.2\n" -#: buzz/widgets/import_url_dialog.py:19 buzz/settings/shortcut.py:19 +#: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" msgstr "" -#: buzz/widgets/import_url_dialog.py:22 +#: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" msgstr "" -#: buzz/widgets/import_url_dialog.py:28 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:69 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:251 -#: buzz/widgets/transcriber/advanced_settings_dialog.py:97 -#: buzz/widgets/main_window.py:226 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "" -#: buzz/widgets/import_url_dialog.py:29 -#: buzz/widgets/preferences_dialog/preferences_dialog.py:70 -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:252 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:453 -#: buzz/widgets/model_download_progress_dialog.py:30 -#: buzz/widgets/main_window.py:227 +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "取消" -#: buzz/widgets/import_url_dialog.py:34 +#: buzz/widgets/import_url_dialog.py msgid "URL:" msgstr "" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "Invalid URL" msgstr "" -#: buzz/widgets/import_url_dialog.py:44 +#: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." msgstr "" -#: buzz/widgets/presentation_window.py:23 +#: buzz/widgets/presentation_window.py #, fuzzy msgid "Live Transcript Presentation" msgstr "新錄製" -#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29 +#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:35 -#: buzz/transcriber/transcriber.py:38 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:36 -#: buzz/transcriber/transcriber.py:49 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:37 -#: buzz/transcriber/transcriber.py:64 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:38 -#: buzz/transcriber/transcriber.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:39 -#: buzz/transcriber/transcriber.py:40 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:40 -#: buzz/transcriber/transcriber.py:41 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:41 -#: buzz/transcriber/transcriber.py:53 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:42 -#: buzz/transcriber/transcriber.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:43 -#: buzz/transcriber/transcriber.py:80 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:44 -#: buzz/transcriber/transcriber.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:45 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:46 -#: buzz/transcriber/transcriber.py:59 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:47 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:48 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:86 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:90 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Ui Language" msgstr "語言:" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:98 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:107 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:113 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:126 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:138 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "OpenAI API model" msgstr "模型:" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:147 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:153 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:159 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:47 -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:50 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Browse" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:178 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:189 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py #, fuzzy msgid "Live recording mode" msgstr "現場錄製" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:195 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:199 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:209 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:212 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:214 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:239 -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:240 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:256 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:257 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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:278 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Select Export Folder" msgstr "" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py:359 +#: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 " "validation." msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:42 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:94 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" msgstr "" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:105 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py #, fuzzy msgid "Select Input Folder" msgstr "選擇聲音檔案" -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py:114 +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" msgstr "" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:43 +#: buzz/widgets/preferences_dialog/preferences_dialog.py #, fuzzy msgid "Preferences" msgstr "偏好設定..." -#: buzz/widgets/preferences_dialog/preferences_dialog.py:50 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:53 +#: buzz/widgets/preferences_dialog/preferences_dialog.py #, fuzzy msgid "Models" msgstr "模型:" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:57 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" msgstr "" -#: buzz/widgets/preferences_dialog/preferences_dialog.py:63 +#: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:71 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:83 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:95 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Download" msgstr "下載模型" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:100 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:108 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:139 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Downloaded" msgstr "下載模型" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:144 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:165 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:245 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:246 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Are you sure you want to delete the selected model?" msgstr "您確定要刪除所選錄製嗎?此操作無法撤消。" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:274 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py #, fuzzy msgid "Download failed" msgstr "下載模型" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py:275 -#: 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:760 -#: buzz/model_loader.py:774 +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "" -#: buzz/widgets/record_button.py:10 buzz/widgets/record_button.py:17 -#: buzz/widgets/main_window_toolbar.py:37 +#: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" msgstr "錄製" -#: buzz/widgets/record_button.py:21 +#: buzz/widgets/record_button.py msgid "Stop" msgstr "停止" -#: buzz/widgets/transcriber/languages_combo_box.py:35 -#: buzz/transcriber/transcriber.py:160 +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "檢測語言" -#: buzz/widgets/transcriber/mms_language_line_edit.py:26 +#: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" msgstr "" -#: buzz/widgets/transcriber/mms_language_line_edit.py:28 +#: buzz/widgets/transcriber/mms_language_line_edit.py 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 +#: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" msgstr "開始執行" -#: buzz/widgets/transcriber/transcription_options_group_box.py:101 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Model:" msgstr "模型:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:113 -#: buzz/transcriber/recording_transcriber.py:374 +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:123 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" msgstr "" -#: buzz/widgets/transcriber/transcription_options_group_box.py:124 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" msgstr "任務:" -#: buzz/widgets/transcriber/transcription_options_group_box.py:125 -#: buzz/widgets/transcriber/transcription_options_group_box.py:126 +#: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Language:" msgstr "語言:" -#: buzz/widgets/transcriber/initial_prompt_text_edit.py:10 +#: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:33 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" msgstr "進階設定" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:37 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:46 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" msgstr "逗號分隔,例如\"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:55 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" msgstr "溫度:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:66 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "初始提示:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:68 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:72 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:84 +#: buzz/widgets/transcriber/advanced_settings_dialog.py #, fuzzy msgid "AI model:" msgstr "模型:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:88 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "" "Enter instructions for AI on how to translate, for example 'Please translate " "each text sent to you from English to Spanish.'" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py:92 +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:43 +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Recording settings" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Silence threshold:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "" + +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "單字級別的時間表達" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:54 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" msgstr "" -#: buzz/widgets/transcriber/file_transcription_form_widget.py:77 +#: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" msgstr "" -#: buzz/widgets/transcriber/hugging_face_search_line_edit.py:37 +#: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_button.py:9 +#: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." msgstr "" -#: buzz/widgets/main_window_toolbar.py:43 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New File Transcription" msgstr "新錄製" -#: buzz/widgets/main_window_toolbar.py:50 +#: buzz/widgets/main_window_toolbar.py #, fuzzy msgid "New URL Transcription" msgstr "新錄製" -#: buzz/widgets/main_window_toolbar.py:57 +#: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" msgstr "打開轉換結果" -#: buzz/widgets/main_window_toolbar.py:63 buzz/settings/shortcut.py:39 +#: buzz/widgets/main_window_toolbar.py buzz/settings/shortcut.py msgid "Cancel Transcription" msgstr "取消錄製" -#: buzz/widgets/main_window_toolbar.py:71 buzz/widgets/main_window.py:215 -#: buzz/settings/shortcut.py:38 +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "清除歷史紀錄" -#: buzz/widgets/transcription_tasks_table_widget.py:71 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:74 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" msgstr "完成" -#: buzz/widgets/transcription_tasks_table_widget.py:81 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:84 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" msgstr "取消" -#: buzz/widgets/transcription_tasks_table_widget.py:86 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:93 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "File Name / URL" msgstr "檔案名稱" -#: buzz/widgets/transcription_tasks_table_widget.py:106 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Model" msgstr "模型:" -#: buzz/widgets/transcription_tasks_table_widget.py:115 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Task" msgstr "任務:" -#: buzz/widgets/transcription_tasks_table_widget.py:124 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "狀態" -#: buzz/widgets/transcription_tasks_table_widget.py:133 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Date Completed" msgstr "完成" -#: buzz/widgets/transcription_tasks_table_widget.py:145 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:156 -#: buzz/widgets/transcription_tasks_table_widget.py:663 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:174 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:304 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Restart Transcription" msgstr "取消錄製" -#: buzz/widgets/transcription_tasks_table_widget.py:308 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:311 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:636 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Rename Transcription" msgstr "取消錄製" -#: buzz/widgets/transcription_tasks_table_widget.py:637 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:664 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:691 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:692 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:705 +#: buzz/widgets/transcription_tasks_table_widget.py #, fuzzy msgid "Failed to restart transcription: {}" msgstr "取消錄製" -#: buzz/widgets/transcription_tasks_table_widget.py:775 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -#: buzz/widgets/transcription_tasks_table_widget.py:806 +#: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:97 +#: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" msgstr "現場錄製" -#: buzz/widgets/recording_transcriber_widget.py:163 +#: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." msgstr "點擊開始錄製" -#: buzz/widgets/recording_transcriber_widget.py:166 +#: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:178 +#: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" msgstr "麥克風:" -#: buzz/widgets/recording_transcriber_widget.py:227 +#: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:233 +#: buzz/widgets/recording_transcriber_widget.py msgid "Text Size:" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:249 +#: buzz/widgets/recording_transcriber_widget.py msgid "Theme" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Light" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Dark" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:253 +#: buzz/widgets/recording_transcriber_widget.py msgid "Custom" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:267 +#: buzz/widgets/recording_transcriber_widget.py msgid "Text Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:277 +#: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:286 +#: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:302 -#: buzz/widgets/recording_transcriber_widget.py:315 -#: buzz/widgets/recording_transcriber_widget.py:322 -#: buzz/widgets/recording_transcriber_widget.py:329 -#: buzz/widgets/recording_transcriber_widget.py:337 -#: buzz/widgets/recording_transcriber_widget.py:341 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:303 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:314 +#: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:321 -#: buzz/widgets/recording_transcriber_widget.py:328 -#: buzz/widgets/recording_transcriber_widget.py:336 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Copy failed" msgstr "下載模型" -#: buzz/widgets/recording_transcriber_widget.py:340 +#: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" msgstr "" -#: buzz/widgets/recording_transcriber_widget.py:405 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Text Color" msgstr "選擇聲音檔案" -#: buzz/widgets/recording_transcriber_widget.py:422 +#: buzz/widgets/recording_transcriber_widget.py #, fuzzy msgid "Select Background Color" msgstr "選擇聲音檔案" -#: buzz/widgets/recording_transcriber_widget.py:854 +#: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" msgstr "開始新錄製出錯" -#: buzz/widgets/recording_transcriber_widget.py:858 +#: buzz/widgets/recording_transcriber_widget.py msgid "" "Please check your audio devices or check the application logs for more " "information." msgstr "請檢查您的音頻設備或檢查應用程序日誌以獲取更多信息。" -#: buzz/widgets/about_dialog.py:81 +#: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "檢查更新" -#: buzz/widgets/about_dialog.py:84 +#: buzz/widgets/about_dialog.py msgid "Show logs" msgstr "" -#: buzz/widgets/about_dialog.py:119 +#: buzz/widgets/about_dialog.py msgid "You're up to date!" msgstr "你是最新的!" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:276 +#: buzz/widgets/audio_meter_widget.py +msgid "Average volume" +msgstr "" + +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:277 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:278 -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:44 -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:32 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py:279 -#: 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 +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/export_transcription_menu.py #, fuzzy msgid "Translation" msgstr "新錄製" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:33 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py:57 +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:265 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:286 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:296 -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:224 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:309 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:321 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:326 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:425 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:431 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:444 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:453 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:462 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:490 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:495 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:498 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:505 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:508 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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:557 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:560 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:893 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:896 -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:901 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:974 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:977 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1372 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py:1373 +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:174 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:185 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:190 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:206 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:217 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:235 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:244 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:255 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:263 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:271 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:283 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" msgstr "" -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py:292 +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:175 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" + +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:198 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:213 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:239 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:244 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:252 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:272 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "5/8 Preparing transcripts" msgstr "取消錄製" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:294 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:325 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:372 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:377 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:437 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:449 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:463 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:465 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:492 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:507 -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:642 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:522 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" msgstr "" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:527 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Save" msgstr "檔案" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:571 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelling..." msgstr "取消" -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py:574 +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py #, fuzzy msgid "Cancelled" msgstr "取消" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:82 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py #, fuzzy msgid "Save File" msgstr "檔案" -#: buzz/widgets/transcription_viewer/export_transcription_menu.py:84 +#: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" msgstr "" -#: buzz/widgets/model_download_progress_dialog.py:37 +#: buzz/widgets/model_download_progress_dialog.py #, fuzzy msgid "Downloading model" msgstr "下載模型" -#: buzz/widgets/model_download_progress_dialog.py:38 +#: buzz/widgets/model_download_progress_dialog.py msgid "remaining" msgstr "" -#: buzz/widgets/menu_bar.py:38 +#: buzz/widgets/menu_bar.py #, fuzzy msgid "Import File..." msgstr "導入媒體檔案..." -#: buzz/widgets/menu_bar.py:41 +#: buzz/widgets/menu_bar.py #, fuzzy msgid "Import URL..." msgstr "導入媒體檔案..." -#: buzz/widgets/menu_bar.py:44 +#: buzz/widgets/menu_bar.py msgid "About" msgstr "" -#: buzz/widgets/menu_bar.py:48 +#: buzz/widgets/menu_bar.py msgid "Preferences..." msgstr "偏好設定..." -#: buzz/widgets/menu_bar.py:51 buzz/widgets/menu_bar.py:61 +#: buzz/widgets/menu_bar.py msgid "Help" msgstr "幫助" -#: buzz/widgets/menu_bar.py:57 +#: buzz/widgets/menu_bar.py msgid "File" msgstr "檔案" -#: buzz/widgets/main_window.py:219 +#: buzz/widgets/main_window.py msgid "" "Are you sure you want to delete the selected transcription(s)? This action " "cannot be undone." msgstr "您確定要刪除所選錄製嗎?此操作無法撤消。" -#: buzz/widgets/main_window.py:247 +#: buzz/widgets/main_window.py msgid "Select audio file" msgstr "選擇聲音檔案" -#: buzz/widgets/main_window.py:283 +#: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "" -#: buzz/transcriber/local_whisper_cpp_server_transcriber.py:57 -#: buzz/transcriber/recording_transcriber.py:100 -#: buzz/transcriber/recording_transcriber.py:445 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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:449 +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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 " "variable." msgstr "" -#: buzz/transcriber/transcriber.py:24 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Translate to English" msgstr "新錄製" -#: buzz/transcriber/transcriber.py:25 +#: buzz/transcriber/transcriber.py #, fuzzy msgid "Transcribe" msgstr "打開轉換結果" -#: buzz/transcriber/transcriber.py:39 +#: buzz/transcriber/transcriber.py msgid "Chinese" msgstr "" -#: buzz/transcriber/transcriber.py:42 +#: buzz/transcriber/transcriber.py msgid "Russian" msgstr "" -#: buzz/transcriber/transcriber.py:43 +#: buzz/transcriber/transcriber.py msgid "Korean" msgstr "" -#: buzz/transcriber/transcriber.py:44 +#: buzz/transcriber/transcriber.py msgid "French" msgstr "" -#: buzz/transcriber/transcriber.py:46 +#: buzz/transcriber/transcriber.py msgid "Portuguese" msgstr "" -#: buzz/transcriber/transcriber.py:47 +#: buzz/transcriber/transcriber.py msgid "Turkish" msgstr "" -#: buzz/transcriber/transcriber.py:51 +#: buzz/transcriber/transcriber.py msgid "Arabic" msgstr "" -#: buzz/transcriber/transcriber.py:52 +#: buzz/transcriber/transcriber.py msgid "Swedish" msgstr "" -#: buzz/transcriber/transcriber.py:54 +#: buzz/transcriber/transcriber.py msgid "Indonesian" msgstr "" -#: buzz/transcriber/transcriber.py:55 +#: buzz/transcriber/transcriber.py msgid "Hindi" msgstr "" -#: buzz/transcriber/transcriber.py:56 +#: buzz/transcriber/transcriber.py msgid "Finnish" msgstr "" -#: buzz/transcriber/transcriber.py:57 +#: buzz/transcriber/transcriber.py msgid "Vietnamese" msgstr "" -#: buzz/transcriber/transcriber.py:58 +#: buzz/transcriber/transcriber.py msgid "Hebrew" msgstr "" -#: buzz/transcriber/transcriber.py:60 +#: buzz/transcriber/transcriber.py msgid "Greek" msgstr "" -#: buzz/transcriber/transcriber.py:61 +#: buzz/transcriber/transcriber.py msgid "Malay" msgstr "" -#: buzz/transcriber/transcriber.py:62 +#: buzz/transcriber/transcriber.py msgid "Czech" msgstr "" -#: buzz/transcriber/transcriber.py:63 +#: buzz/transcriber/transcriber.py msgid "Romanian" msgstr "" -#: buzz/transcriber/transcriber.py:65 +#: buzz/transcriber/transcriber.py msgid "Hungarian" msgstr "" -#: buzz/transcriber/transcriber.py:66 +#: buzz/transcriber/transcriber.py msgid "Tamil" msgstr "" -#: buzz/transcriber/transcriber.py:67 +#: buzz/transcriber/transcriber.py msgid "Norwegian" msgstr "" -#: buzz/transcriber/transcriber.py:68 +#: buzz/transcriber/transcriber.py msgid "Thai" msgstr "" -#: buzz/transcriber/transcriber.py:69 +#: buzz/transcriber/transcriber.py msgid "Urdu" msgstr "" -#: buzz/transcriber/transcriber.py:70 +#: buzz/transcriber/transcriber.py msgid "Croatian" msgstr "" -#: buzz/transcriber/transcriber.py:71 +#: buzz/transcriber/transcriber.py msgid "Bulgarian" msgstr "" -#: buzz/transcriber/transcriber.py:72 +#: buzz/transcriber/transcriber.py msgid "Lithuanian" msgstr "" -#: buzz/transcriber/transcriber.py:73 +#: buzz/transcriber/transcriber.py msgid "Latin" msgstr "" -#: buzz/transcriber/transcriber.py:74 +#: buzz/transcriber/transcriber.py msgid "Maori" msgstr "" -#: buzz/transcriber/transcriber.py:75 +#: buzz/transcriber/transcriber.py msgid "Malayalam" msgstr "" -#: buzz/transcriber/transcriber.py:76 +#: buzz/transcriber/transcriber.py msgid "Welsh" msgstr "" -#: buzz/transcriber/transcriber.py:77 +#: buzz/transcriber/transcriber.py msgid "Slovak" msgstr "" -#: buzz/transcriber/transcriber.py:78 +#: buzz/transcriber/transcriber.py msgid "Telugu" msgstr "" -#: buzz/transcriber/transcriber.py:79 +#: buzz/transcriber/transcriber.py msgid "Persian" msgstr "" -#: buzz/transcriber/transcriber.py:81 +#: buzz/transcriber/transcriber.py msgid "Bengali" msgstr "" -#: buzz/transcriber/transcriber.py:82 +#: buzz/transcriber/transcriber.py msgid "Serbian" msgstr "" -#: buzz/transcriber/transcriber.py:83 +#: buzz/transcriber/transcriber.py msgid "Azerbaijani" msgstr "" -#: buzz/transcriber/transcriber.py:84 +#: buzz/transcriber/transcriber.py msgid "Slovenian" msgstr "" -#: buzz/transcriber/transcriber.py:85 +#: buzz/transcriber/transcriber.py msgid "Kannada" msgstr "" -#: buzz/transcriber/transcriber.py:86 +#: buzz/transcriber/transcriber.py msgid "Estonian" msgstr "" -#: buzz/transcriber/transcriber.py:87 +#: buzz/transcriber/transcriber.py msgid "Macedonian" msgstr "" -#: buzz/transcriber/transcriber.py:88 +#: buzz/transcriber/transcriber.py msgid "Breton" msgstr "" -#: buzz/transcriber/transcriber.py:89 +#: buzz/transcriber/transcriber.py msgid "Basque" msgstr "" -#: buzz/transcriber/transcriber.py:90 +#: buzz/transcriber/transcriber.py msgid "Icelandic" msgstr "" -#: buzz/transcriber/transcriber.py:91 +#: buzz/transcriber/transcriber.py msgid "Armenian" msgstr "" -#: buzz/transcriber/transcriber.py:92 +#: buzz/transcriber/transcriber.py msgid "Nepali" msgstr "" -#: buzz/transcriber/transcriber.py:93 +#: buzz/transcriber/transcriber.py msgid "Mongolian" msgstr "" -#: buzz/transcriber/transcriber.py:94 +#: buzz/transcriber/transcriber.py msgid "Bosnian" msgstr "" -#: buzz/transcriber/transcriber.py:95 +#: buzz/transcriber/transcriber.py msgid "Kazakh" msgstr "" -#: buzz/transcriber/transcriber.py:96 +#: buzz/transcriber/transcriber.py msgid "Albanian" msgstr "" -#: buzz/transcriber/transcriber.py:97 +#: buzz/transcriber/transcriber.py msgid "Swahili" msgstr "" -#: buzz/transcriber/transcriber.py:98 +#: buzz/transcriber/transcriber.py msgid "Galician" msgstr "" -#: buzz/transcriber/transcriber.py:99 +#: buzz/transcriber/transcriber.py msgid "Marathi" msgstr "" -#: buzz/transcriber/transcriber.py:100 +#: buzz/transcriber/transcriber.py msgid "Punjabi" msgstr "" -#: buzz/transcriber/transcriber.py:101 +#: buzz/transcriber/transcriber.py msgid "Sinhala" msgstr "" -#: buzz/transcriber/transcriber.py:102 +#: buzz/transcriber/transcriber.py msgid "Khmer" msgstr "" -#: buzz/transcriber/transcriber.py:103 +#: buzz/transcriber/transcriber.py msgid "Shona" msgstr "" -#: buzz/transcriber/transcriber.py:104 +#: buzz/transcriber/transcriber.py msgid "Yoruba" msgstr "" -#: buzz/transcriber/transcriber.py:105 +#: buzz/transcriber/transcriber.py msgid "Somali" msgstr "" -#: buzz/transcriber/transcriber.py:106 +#: buzz/transcriber/transcriber.py msgid "Afrikaans" msgstr "" -#: buzz/transcriber/transcriber.py:107 +#: buzz/transcriber/transcriber.py msgid "Occitan" msgstr "" -#: buzz/transcriber/transcriber.py:108 +#: buzz/transcriber/transcriber.py msgid "Georgian" msgstr "" -#: buzz/transcriber/transcriber.py:109 +#: buzz/transcriber/transcriber.py msgid "Belarusian" msgstr "" -#: buzz/transcriber/transcriber.py:110 +#: buzz/transcriber/transcriber.py msgid "Tajik" msgstr "" -#: buzz/transcriber/transcriber.py:111 +#: buzz/transcriber/transcriber.py msgid "Sindhi" msgstr "" -#: buzz/transcriber/transcriber.py:112 +#: buzz/transcriber/transcriber.py msgid "Gujarati" msgstr "" -#: buzz/transcriber/transcriber.py:113 +#: buzz/transcriber/transcriber.py msgid "Amharic" msgstr "" -#: buzz/transcriber/transcriber.py:114 +#: buzz/transcriber/transcriber.py msgid "Yiddish" msgstr "" -#: buzz/transcriber/transcriber.py:115 +#: buzz/transcriber/transcriber.py msgid "Lao" msgstr "" -#: buzz/transcriber/transcriber.py:116 +#: buzz/transcriber/transcriber.py msgid "Uzbek" msgstr "" -#: buzz/transcriber/transcriber.py:117 +#: buzz/transcriber/transcriber.py msgid "Faroese" msgstr "" -#: buzz/transcriber/transcriber.py:118 +#: buzz/transcriber/transcriber.py msgid "Haitian Creole" msgstr "" -#: buzz/transcriber/transcriber.py:119 +#: buzz/transcriber/transcriber.py msgid "Pashto" msgstr "" -#: buzz/transcriber/transcriber.py:120 +#: buzz/transcriber/transcriber.py msgid "Turkmen" msgstr "" -#: buzz/transcriber/transcriber.py:121 +#: buzz/transcriber/transcriber.py msgid "Nynorsk" msgstr "" -#: buzz/transcriber/transcriber.py:122 +#: buzz/transcriber/transcriber.py msgid "Maltese" msgstr "" -#: buzz/transcriber/transcriber.py:123 +#: buzz/transcriber/transcriber.py msgid "Sanskrit" msgstr "" -#: buzz/transcriber/transcriber.py:124 +#: buzz/transcriber/transcriber.py msgid "Luxembourgish" msgstr "" -#: buzz/transcriber/transcriber.py:125 +#: buzz/transcriber/transcriber.py msgid "Myanmar" msgstr "" -#: buzz/transcriber/transcriber.py:126 +#: buzz/transcriber/transcriber.py msgid "Tibetan" msgstr "" -#: buzz/transcriber/transcriber.py:127 +#: buzz/transcriber/transcriber.py msgid "Tagalog" msgstr "" -#: buzz/transcriber/transcriber.py:128 +#: buzz/transcriber/transcriber.py msgid "Malagasy" msgstr "" -#: buzz/transcriber/transcriber.py:129 +#: buzz/transcriber/transcriber.py msgid "Assamese" msgstr "" -#: buzz/transcriber/transcriber.py:130 +#: buzz/transcriber/transcriber.py msgid "Tatar" msgstr "" -#: buzz/transcriber/transcriber.py:131 +#: buzz/transcriber/transcriber.py msgid "Hawaiian" msgstr "" -#: buzz/transcriber/transcriber.py:132 +#: buzz/transcriber/transcriber.py msgid "Lingala" msgstr "" -#: buzz/transcriber/transcriber.py:133 +#: buzz/transcriber/transcriber.py msgid "Hausa" msgstr "" -#: buzz/transcriber/transcriber.py:134 +#: buzz/transcriber/transcriber.py msgid "Bashkir" msgstr "" -#: buzz/transcriber/transcriber.py:135 +#: buzz/transcriber/transcriber.py msgid "Javanese" msgstr "" -#: buzz/transcriber/transcriber.py:136 +#: buzz/transcriber/transcriber.py msgid "Sundanese" msgstr "" -#: buzz/transcriber/transcriber.py:137 +#: buzz/transcriber/transcriber.py msgid "Cantonese" msgstr "" -#: buzz/transcriber/recording_transcriber.py:254 buzz/model_loader.py:793 +#: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" msgstr "" -#: buzz/transcriber/recording_transcriber.py:371 +#: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." msgstr "" -#: buzz/transcriber/recording_transcriber.py:436 +#: buzz/transcriber/recording_transcriber.py #, fuzzy msgid "Starting transcription..." msgstr "取消錄製" -#: buzz/settings/shortcut.py:17 +#: buzz/settings/shortcut.py #, fuzzy msgid "Open Record Window" msgstr "現場錄製" -#: buzz/settings/shortcut.py:18 +#: buzz/settings/shortcut.py #, fuzzy msgid "Import File" msgstr "導入媒體檔案..." -#: buzz/settings/shortcut.py:20 +#: buzz/settings/shortcut.py msgid "Open Preferences Window" msgstr "" -#: buzz/settings/shortcut.py:22 +#: buzz/settings/shortcut.py #, fuzzy msgid "View Transcript Text" msgstr "新錄製" -#: buzz/settings/shortcut.py:23 +#: buzz/settings/shortcut.py #, fuzzy msgid "View Transcript Translation" msgstr "新錄製" -#: buzz/settings/shortcut.py:24 +#: buzz/settings/shortcut.py #, fuzzy msgid "View Transcript Timestamps" msgstr "新錄製" -#: buzz/settings/shortcut.py:25 +#: buzz/settings/shortcut.py #, fuzzy msgid "Search Transcript" msgstr "打開轉換結果" -#: buzz/settings/shortcut.py:26 +#: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:27 +#: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" msgstr "" -#: buzz/settings/shortcut.py:28 +#: buzz/settings/shortcut.py msgid "Scroll to Current Text" msgstr "" -#: buzz/settings/shortcut.py:29 +#: buzz/settings/shortcut.py msgid "Play/Pause Audio" msgstr "" -#: buzz/settings/shortcut.py:30 +#: buzz/settings/shortcut.py msgid "Replay Current Segment" msgstr "" -#: buzz/settings/shortcut.py:31 +#: buzz/settings/shortcut.py msgid "Toggle Playback Controls" msgstr "" -#: buzz/settings/shortcut.py:33 +#: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:34 +#: buzz/settings/shortcut.py msgid "Increase Segment Start Time" msgstr "" -#: buzz/settings/shortcut.py:35 +#: buzz/settings/shortcut.py msgid "Decrease Segment End Time" msgstr "" -#: buzz/settings/shortcut.py:36 +#: buzz/settings/shortcut.py msgid "Increase Segment End Time" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:5 +#: buzz/settings/recording_transcriber_mode.py msgid "Append below" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:6 +#: buzz/settings/recording_transcriber_mode.py msgid "Append above" msgstr "" -#: buzz/settings/recording_transcriber_mode.py:7 +#: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" msgstr "" -#: buzz/translator.py:79 buzz/translator.py:112 buzz/translator.py:124 -#: buzz/translator.py:140 +#: buzz/translator.py msgid "Translation error, see logs!" msgstr "" -#: buzz/file_transcriber_queue_worker.py:154 +#: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." diff --git a/buzz/recording.py b/buzz/recording.py index db77fc52..a831823f 100644 --- a/buzz/recording.py +++ b/buzz/recording.py @@ -9,6 +9,9 @@ from PyQt6.QtCore import QObject, pyqtSignal class RecordingAmplitudeListener(QObject): stream: Optional[sounddevice.InputStream] = None amplitude_changed = pyqtSignal(float) + average_amplitude_changed = pyqtSignal(float) + + ACCUMULATION_SECONDS = 1 def __init__( self, @@ -17,6 +20,8 @@ class RecordingAmplitudeListener(QObject): ): super().__init__(parent) self.input_device_index = input_device_index + self.buffer = np.ndarray([], dtype=np.float32) + self.accumulation_size = 0 def start_recording(self): try: @@ -27,6 +32,7 @@ class RecordingAmplitudeListener(QObject): callback=self.stream_callback, ) self.stream.start() + self.accumulation_size = int(self.stream.samplerate * self.ACCUMULATION_SECONDS) except Exception as e: self.stop_recording() logging.exception("Failed to start audio stream on device %s: %s", self.input_device_index, e) @@ -38,5 +44,9 @@ class RecordingAmplitudeListener(QObject): def stream_callback(self, in_data: np.ndarray, frame_count, time_info, status): chunk = in_data.ravel() - amplitude = np.sqrt(np.mean(chunk**2)) # root-mean-square - self.amplitude_changed.emit(amplitude) + self.amplitude_changed.emit(float(np.sqrt(np.mean(chunk**2)))) + + self.buffer = np.append(self.buffer, chunk) + if self.buffer.size >= self.accumulation_size: + self.average_amplitude_changed.emit(float(np.sqrt(np.mean(self.buffer**2)))) + self.buffer = np.ndarray([], dtype=np.float32) diff --git a/buzz/settings/settings.py b/buzz/settings/settings.py index 7ec768fd..ac4c3603 100644 --- a/buzz/settings/settings.py +++ b/buzz/settings/settings.py @@ -25,6 +25,8 @@ class Settings: RECORDING_TRANSCRIBER_EXPORT_ENABLED = "recording-transcriber/export-enabled" RECORDING_TRANSCRIBER_EXPORT_FOLDER = "recording-transcriber/export-folder" RECORDING_TRANSCRIBER_MODE = "recording-transcriber/mode" + RECORDING_TRANSCRIBER_SILENCE_THRESHOLD = "recording-transcriber/silence-threshold" + RECORDING_TRANSCRIBER_LINE_SEPARATOR = "recording-transcriber/line-separator" PRESENTATION_WINDOW_TEXT_COLOR = "presentation-window/text-color" PRESENTATION_WINDOW_BACKGROUND_COLOR = "presentation-window/background-color" diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index dec3f3dd..18c7b456 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -39,6 +39,7 @@ class RecordingTranscriber(QObject): finished = pyqtSignal() error = pyqtSignal(str) amplitude_changed = pyqtSignal(float) + average_amplitude_changed = pyqtSignal(float) is_running = False SAMPLE_RATE = whisper_audio.SAMPLE_RATE @@ -75,6 +76,7 @@ class RecordingTranscriber(QObject): key=Settings.Key.OPENAI_API_MODEL, default_value="whisper-1" ) self.process = None + self._stderr_lines: list[bytes] = [] def start(self): self.is_running = True @@ -179,6 +181,7 @@ class RecordingTranscriber(QObject): self.mutex.release() amplitude = self.amplitude(samples) + self.average_amplitude_changed.emit(amplitude) logging.debug( "Processing next frame, sample size = %s, queue size = %s, amplitude = %s", @@ -187,7 +190,7 @@ class RecordingTranscriber(QObject): amplitude, ) - if amplitude < 0.025: + if amplitude < self.transcription_options.silence_threshold: time.sleep(0.5) continue @@ -350,7 +353,7 @@ class RecordingTranscriber(QObject): # Try to enqueue the next block. If the queue is already full, drop the block. chunk: np.ndarray = in_data.ravel() - amplitude = float(np.sqrt(np.mean(chunk**2))) + amplitude = self.amplitude(chunk) self.amplitude_changed.emit(amplitude) with self.mutex: @@ -359,7 +362,12 @@ class RecordingTranscriber(QObject): @staticmethod def amplitude(arr: np.ndarray): - return (abs(max(arr)) + abs(min(arr))) / 2 + return float(np.sqrt(np.mean(arr**2))) + + def _drain_stderr(self): + if self.process and self.process.stderr: + for line in self.process.stderr: + self._stderr_lines.append(line) def stop_recording(self): self.is_running = False @@ -435,6 +443,12 @@ class RecordingTranscriber(QObject): logging.error(error_msg) return + # Drain stderr in a background thread to prevent pipe buffer from filling + # up and blocking the subprocess (especially on Windows with compiled exe). + self._stderr_lines = [] + stderr_thread = threading.Thread(target=self._drain_stderr, daemon=True) + stderr_thread.start() + # Wait for server to start and load model, checking periodically for i in range(100): # 10 seconds total, in 0.1s increments if not self.is_running or self.process.poll() is not None: @@ -446,9 +460,8 @@ class RecordingTranscriber(QObject): logging.debug(f"Whisper server started successfully.") logging.debug(f"Model: {self.model_path}") else: - stderr_output = "" - if self.process.stderr is not None: - stderr_output = self.process.stderr.read().decode() + stderr_thread.join(timeout=2) + stderr_output = b"".join(self._stderr_lines).decode(errors="replace") logging.error(f"Whisper server failed to start. Error: {stderr_output}") self.transcription.emit(_("Whisper server failed to start. Check logs for details.")) diff --git a/buzz/transcriber/transcriber.py b/buzz/transcriber/transcriber.py index e5d1f94d..4ba82786 100644 --- a/buzz/transcriber/transcriber.py +++ b/buzz/transcriber/transcriber.py @@ -153,6 +153,8 @@ class TranscriptionOptions: enable_llm_translation: bool = False llm_prompt: str = "" llm_model: str = "" + silence_threshold: float = 0.0025 + line_separator: str = "\n\n" def humanize_language(language: str) -> str: diff --git a/buzz/widgets/audio_meter_widget.py b/buzz/widgets/audio_meter_widget.py index 0329a25a..8ce9b945 100644 --- a/buzz/widgets/audio_meter_widget.py +++ b/buzz/widgets/audio_meter_widget.py @@ -1,10 +1,12 @@ from typing import Optional from PyQt6 import QtGui -from PyQt6.QtCore import Qt +from PyQt6.QtCore import Qt, QRect from PyQt6.QtGui import QColor, QPainter from PyQt6.QtWidgets import QWidget +from buzz.locale import _ + class AudioMeterWidget(QWidget): current_amplitude: float @@ -20,13 +22,16 @@ class AudioMeterWidget(QWidget): def __init__(self, parent: Optional[QWidget] = None): super().__init__(parent) self.setMinimumWidth(10) - self.setFixedHeight(16) + self.setFixedHeight(56) + self.BARS_HEIGHT = 28 # Extra padding to fix layout - self.PADDING_TOP = 3 + self.PADDING_TOP = 14 self.current_amplitude = 0.0 + self.average_amplitude = 0.0 + self.MINIMUM_AMPLITUDE = 0.00005 # minimum amplitude to show the first bar self.AMPLITUDE_SCALE_FACTOR = 10 # scale the amplitudes such that 1/AMPLITUDE_SCALE_FACTOR will show all bars @@ -58,18 +63,24 @@ class AudioMeterWidget(QWidget): center_x - ((i + 1) * (self.BAR_MARGIN + self.BAR_WIDTH)), rect.top() + self.PADDING_TOP, self.BAR_WIDTH, - rect.height() - self.PADDING_TOP, + self.BARS_HEIGHT - self.PADDING_TOP, ) # draw to right painter.drawRect( center_x + (self.BAR_MARGIN + (i * (self.BAR_MARGIN + self.BAR_WIDTH))), rect.top() + self.PADDING_TOP, self.BAR_WIDTH, - rect.height() - self.PADDING_TOP, + self.BARS_HEIGHT - self.PADDING_TOP, ) + text_rect = QRect(rect.left(), self.BARS_HEIGHT, rect.width(), rect.height() - self.BARS_HEIGHT) + painter.setPen(self.BAR_ACTIVE_COLOR) + average_volume_label = _("Average volume") + painter.drawText(text_rect, Qt.AlignmentFlag.AlignCenter, f"{average_volume_label}: {self.average_amplitude:.4f}") + def reset_amplitude(self): self.current_amplitude = 0.0 + self.average_amplitude = 0.0 self.repaint() def update_amplitude(self, amplitude: float): @@ -77,3 +88,7 @@ class AudioMeterWidget(QWidget): amplitude, self.current_amplitude * self.SMOOTHING_FACTOR ) self.update() + + def update_average_amplitude(self, amplitude: float): + self.average_amplitude = amplitude + self.update() diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index a4b82cdb..c68a9d2f 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -150,6 +150,14 @@ class RecordingTranscriberWidget(QWidget): llm_prompt=self.settings.value( key=Settings.Key.RECORDING_TRANSCRIBER_LLM_PROMPT, default_value="" ), + silence_threshold=self.settings.value( + key=Settings.Key.RECORDING_TRANSCRIBER_SILENCE_THRESHOLD, + default_value=0.0025, + ), + line_separator=self.settings.value( + key=Settings.Key.RECORDING_TRANSCRIBER_LINE_SEPARATOR, + default_value="\n\n", + ), ) self.audio_devices_combo_box = AudioDevicesComboBox(self) @@ -170,6 +178,7 @@ class RecordingTranscriberWidget(QWidget): default_transcription_options=self.transcription_options, model_types=model_types, parent=self, + show_recording_settings=True, ) self.transcription_options_group_box.transcription_options_changed.connect( self.on_transcription_options_changed @@ -181,7 +190,8 @@ class RecordingTranscriberWidget(QWidget): self.audio_meter_widget = AudioMeterWidget(self) record_button_layout = QHBoxLayout() - record_button_layout.addWidget(self.audio_meter_widget) + record_button_layout.setContentsMargins(0, 4, 0, 8) + record_button_layout.addWidget(self.audio_meter_widget, alignment=Qt.AlignmentFlag.AlignVCenter) record_button_layout.addWidget(self.record_button) layout.addWidget(self.transcription_options_group_box) @@ -194,10 +204,11 @@ class RecordingTranscriberWidget(QWidget): self.translation_text_box.hide() self.setLayout(layout) - self.resize(550, 500) + self.resize(550, 600) self.reset_recording_amplitude_listener() + self._closing = False self.transcript_export_file = None self.translation_export_file = None self.export_enabled = self.settings.value( @@ -235,7 +246,7 @@ class RecordingTranscriberWidget(QWidget): layout.addWidget(text_size_label) self.text_size_spinbox = QSpinBox(bar) - self.text_size_spinbox.setRange(12, 72) #12pt to 72pt + self.text_size_spinbox.setRange(10, 100) #10pt to 100pt saved_text_size = self.settings.value( Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, @@ -509,6 +520,9 @@ class RecordingTranscriberWidget(QWidget): self.recording_amplitude_listener.amplitude_changed.connect( self.on_recording_amplitude_changed, Qt.ConnectionType.QueuedConnection ) + self.recording_amplitude_listener.average_amplitude_changed.connect( + self.audio_meter_widget.update_average_amplitude, Qt.ConnectionType.QueuedConnection + ) self.recording_amplitude_listener.start_recording() def on_record_button_clicked(self): @@ -519,6 +533,9 @@ class RecordingTranscriberWidget(QWidget): self.recording_amplitude_listener.amplitude_changed.disconnect( self.on_recording_amplitude_changed ) + self.recording_amplitude_listener.average_amplitude_changed.disconnect( + self.audio_meter_widget.update_average_amplitude + ) self.recording_amplitude_listener.stop_recording() self.recording_amplitude_listener = None self.audio_meter_widget.reset_amplitude() @@ -587,6 +604,9 @@ class RecordingTranscriberWidget(QWidget): self.transcriber.amplitude_changed.connect( self.on_recording_amplitude_changed, Qt.ConnectionType.QueuedConnection ) + self.transcriber.average_amplitude_changed.connect( + self.audio_meter_widget.update_average_amplitude, Qt.ConnectionType.QueuedConnection + ) # Stop the separate amplitude listener to avoid two streams on the same device if self.recording_amplitude_listener is not None: @@ -771,24 +791,24 @@ class RecordingTranscriberWidget(QWidget): if self.transcriber_mode == RecordingTranscriberMode.APPEND_BELOW: self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.End) if len(self.transcription_text_box.toPlainText()) > 0: - self.transcription_text_box.insertPlainText("\n\n") + self.transcription_text_box.insertPlainText(self.transcription_options.line_separator) self.transcription_text_box.insertPlainText(text) self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and self.transcript_export_file: - self.write_to_export_file(self.transcript_export_file, text + "\n\n") + self.write_to_export_file(self.transcript_export_file, text + self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_ABOVE: self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.Start) self.transcription_text_box.insertPlainText(text) - self.transcription_text_box.insertPlainText("\n\n") + self.transcription_text_box.insertPlainText(self.transcription_options.line_separator) self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.Start) if self.export_enabled and self.transcript_export_file: existing_content = "" if os.path.isfile(self.transcript_export_file): existing_content = self.read_export_file(self.transcript_export_file) - new_content = text + "\n\n" + existing_content + new_content = text + self.transcription_options.line_separator + existing_content self.write_to_export_file(self.transcript_export_file, new_content, mode="w") elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: @@ -819,24 +839,24 @@ class RecordingTranscriberWidget(QWidget): if self.transcriber_mode == RecordingTranscriberMode.APPEND_BELOW: self.translation_text_box.moveCursor(QTextCursor.MoveOperation.End) if len(self.translation_text_box.toPlainText()) > 0: - self.translation_text_box.insertPlainText("\n\n") + self.translation_text_box.insertPlainText(self.transcription_options.line_separator) self.translation_text_box.insertPlainText(self.strip_newlines(text)) self.translation_text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and self.translation_export_file: - self.write_to_export_file(self.translation_export_file, text + "\n\n") + self.write_to_export_file(self.translation_export_file, text + self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_ABOVE: self.translation_text_box.moveCursor(QTextCursor.MoveOperation.Start) self.translation_text_box.insertPlainText(self.strip_newlines(text)) - self.translation_text_box.insertPlainText("\n\n") + self.translation_text_box.insertPlainText(self.transcription_options.line_separator) self.translation_text_box.moveCursor(QTextCursor.MoveOperation.Start) if self.export_enabled and self.translation_export_file: existing_content = "" if os.path.isfile(self.translation_export_file): existing_content = self.read_export_file(self.translation_export_file) - new_content = text + "\n\n" + existing_content + new_content = text + self.transcription_options.line_separator + existing_content self.write_to_export_file(self.translation_export_file, new_content, mode="w") elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: @@ -917,27 +937,51 @@ class RecordingTranscriberWidget(QWidget): self.audio_meter_widget.update_amplitude(amplitude) def closeEvent(self, event: QCloseEvent) -> None: + if self._closing: + # Second call after deferred close — proceed normally + self._do_close() + super().closeEvent(event) + return + + if self.current_status == self.RecordingStatus.RECORDING: + # Defer the close until the transcription thread finishes to avoid + # blocking the GUI thread with a synchronous wait. + event.ignore() + self._closing = True + + if self.model_loader is not None: + self.model_loader.cancel() + + self.stop_recording() + + # Connect to QThread.finished — the transcriber C++ object may already + # be scheduled for deletion via deleteLater() by this point. + thread = self.transcription_thread + if thread is not None: + try: + if thread.isRunning(): + thread.finished.connect(self._on_close_transcriber_finished) + else: + self._on_close_transcriber_finished() + except RuntimeError: + self._on_close_transcriber_finished() + else: + self._on_close_transcriber_finished() + return + + self._do_close() + super().closeEvent(event) + + def _on_close_transcriber_finished(self): + self.transcription_thread = None + self.close() + + def _do_close(self): #Close presentation window if open if self.presentation_window: self.presentation_window.close() self.presentation_window = None - self.fullscreen_button.setEnabled(False) - - if self.model_loader is not None: - self.model_loader.cancel() - - self.stop_recording() - if self.transcription_thread is not None: - try: - if self.transcription_thread.isRunning(): - if not self.transcription_thread.wait(15_000): - logging.warning("Transcription thread did not finish within timeout") - except RuntimeError: - # The underlying C++ QThread was already deleted via deleteLater() - pass - self.transcription_thread = None - if self.recording_amplitude_listener is not None: self.recording_amplitude_listener.stop_recording() self.recording_amplitude_listener.deleteLater() @@ -947,11 +991,8 @@ class RecordingTranscriberWidget(QWidget): self.translator.stop() if self.translation_thread is not None: + # Just request quit — do not block the GUI thread waiting for it self.translation_thread.quit() - # Only wait if thread is actually running - if self.translation_thread.isRunning(): - if not self.translation_thread.wait(45_000): - logging.warning("Translation thread did not finish within timeout") self.settings.set_value( Settings.Key.RECORDING_TRANSCRIBER_LANGUAGE, @@ -983,5 +1024,11 @@ class RecordingTranscriberWidget(QWidget): Settings.Key.RECORDING_TRANSCRIBER_LLM_PROMPT, self.transcription_options.llm_prompt, ) - - return super().closeEvent(event) + self.settings.set_value( + Settings.Key.RECORDING_TRANSCRIBER_SILENCE_THRESHOLD, + self.transcription_options.silence_threshold, + ) + self.settings.set_value( + Settings.Key.RECORDING_TRANSCRIBER_LINE_SEPARATOR, + self.transcription_options.line_separator, + ) diff --git a/buzz/widgets/transcriber/advanced_settings_dialog.py b/buzz/widgets/transcriber/advanced_settings_dialog.py index b25fc753..b8ce84e5 100644 --- a/buzz/widgets/transcriber/advanced_settings_dialog.py +++ b/buzz/widgets/transcriber/advanced_settings_dialog.py @@ -7,6 +7,8 @@ from PyQt6.QtWidgets import ( QPlainTextEdit, QFormLayout, QLabel, + QDoubleSpinBox, + QLineEdit, ) from buzz.locale import _ @@ -23,7 +25,10 @@ class AdvancedSettingsDialog(QDialog): transcription_options_changed = pyqtSignal(TranscriptionOptions) def __init__( - self, transcription_options: TranscriptionOptions, parent: QWidget | None = None + self, + transcription_options: TranscriptionOptions, + parent: QWidget | None = None, + show_recording_settings: bool = False, ): super().__init__(parent) @@ -74,23 +79,44 @@ class AdvancedSettingsDialog(QDialog): self.enable_llm_translation_checkbox.stateChanged.connect(self.on_enable_llm_translation_changed) layout.addRow("", self.enable_llm_translation_checkbox) - self.llm_model_line_edit = LineEdit(self.transcription_options.llm_model, self) + llm_model = self.transcription_options.llm_model or "gpt-4.1-mini" + self.llm_model_line_edit = LineEdit(llm_model, self) self.llm_model_line_edit.textChanged.connect( self.on_llm_model_changed ) self.llm_model_line_edit.setMinimumWidth(170) self.llm_model_line_edit.setEnabled(self.transcription_options.enable_llm_translation) - self.llm_model_line_edit.setPlaceholderText("gpt-4.1-mini") layout.addRow(_("AI model:"), self.llm_model_line_edit) - self.llm_prompt_text_edit = QPlainTextEdit(self.transcription_options.llm_prompt) + default_llm_prompt = self.transcription_options.llm_prompt or _( + "Please translate each text sent to you from English to Spanish." + ) + self.llm_prompt_text_edit = QPlainTextEdit(default_llm_prompt) self.llm_prompt_text_edit.setEnabled(self.transcription_options.enable_llm_translation) - self.llm_prompt_text_edit.setPlaceholderText(_("Enter instructions for AI on how to translate, for example 'Please translate each text sent to you from English to Spanish.'")) self.llm_prompt_text_edit.setMinimumWidth(170) self.llm_prompt_text_edit.setFixedHeight(115) self.llm_prompt_text_edit.textChanged.connect(self.on_llm_prompt_changed) layout.addRow(_("Instructions for AI:"), self.llm_prompt_text_edit) + if show_recording_settings: + recording_settings_title = _("Recording settings") + recording_settings_title_label = QLabel(f"

{recording_settings_title}

", self) + layout.addRow("", recording_settings_title_label) + + self.silence_threshold_spin_box = QDoubleSpinBox(self) + self.silence_threshold_spin_box.setRange(0.0, 1.0) + self.silence_threshold_spin_box.setSingleStep(0.0005) + self.silence_threshold_spin_box.setDecimals(4) + self.silence_threshold_spin_box.setValue(transcription_options.silence_threshold) + self.silence_threshold_spin_box.valueChanged.connect(self.on_silence_threshold_changed) + layout.addRow(_("Silence threshold:"), self.silence_threshold_spin_box) + + self.line_separator_line_edit = QLineEdit(self) + line_sep_display = repr(transcription_options.line_separator)[1:-1] or r"\n\n" + self.line_separator_line_edit.setText(line_sep_display) + self.line_separator_line_edit.textChanged.connect(self.on_line_separator_changed) + layout.addRow(_("Line separator:"), self.line_separator_line_edit) + button_box = QDialogButtonBox( QDialogButtonBox.StandardButton(QDialogButtonBox.StandardButton.Ok), self ) @@ -100,7 +126,6 @@ class AdvancedSettingsDialog(QDialog): layout.addWidget(button_box) self.setLayout(layout) - self.resize(self.sizeHint()) def on_temperature_changed(self, text: str): try: @@ -132,3 +157,14 @@ class AdvancedSettingsDialog(QDialog): self.llm_prompt_text_edit.toPlainText() ) self.transcription_options_changed.emit(self.transcription_options) + + def on_silence_threshold_changed(self, value: float): + self.transcription_options.silence_threshold = value + self.transcription_options_changed.emit(self.transcription_options) + + def on_line_separator_changed(self, text: str): + try: + self.transcription_options.line_separator = text.encode().decode("unicode_escape") + except UnicodeDecodeError: + return + self.transcription_options_changed.emit(self.transcription_options) diff --git a/buzz/widgets/transcriber/transcription_options_group_box.py b/buzz/widgets/transcriber/transcription_options_group_box.py index 1524086e..f3c124d8 100644 --- a/buzz/widgets/transcriber/transcription_options_group_box.py +++ b/buzz/widgets/transcriber/transcription_options_group_box.py @@ -33,6 +33,7 @@ class TranscriptionOptionsGroupBox(QGroupBox): default_transcription_options: TranscriptionOptions = TranscriptionOptions(), model_types: Optional[List[ModelType]] = None, parent: Optional[QWidget] = None, + show_recording_settings: bool = False, ): super().__init__(title="", parent=parent) self.settings = Settings() @@ -49,7 +50,9 @@ class TranscriptionOptionsGroupBox(QGroupBox): self.model_type_combo_box.changed.connect(self.on_model_type_changed) self.advanced_settings_dialog = AdvancedSettingsDialog( - transcription_options=self.transcription_options, parent=self + transcription_options=self.transcription_options, + parent=self, + show_recording_settings=show_recording_settings, ) self.advanced_settings_dialog.transcription_options_changed.connect( self.on_transcription_options_changed diff --git a/docs/docs/usage/2_live_recording.md b/docs/docs/usage/2_live_recording.md index 83cac40e..b2dd1733 100644 --- a/docs/docs/usage/2_live_recording.md +++ b/docs/docs/usage/2_live_recording.md @@ -8,7 +8,7 @@ To start a live recording: - Click Record. > **Note:** Transcribing audio using the default Whisper model is resource-intensive. Consider using the Whisper.cpp. -> Since 1.3.0 it supports GPU acceleration, if the model fits in GPU memory. Use smaller models for real-time performance. +> It supports GPU acceleration, if the model fits in GPU memory. Use smaller models for real-time performance. | Field | Options | Default | Description | |------------|------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -18,7 +18,14 @@ To start a live recording: [![Live Recording on Buzz](https://cdn.loom.com/sessions/thumbnails/564b753eb4d44b55b985b8abd26b55f7-with-play.gif)](https://www.loom.com/share/564b753eb4d44b55b985b8abd26b55f7 "Live Recording on Buzz") -**Presentation Window** Since 1.4.2 Buzz has an easy to use presentation window you can use to show live transcriptions during events and presentations. To open it start the recording and new options for the `Presentation window` will appear. +#### Advanced preferences +**Silence threshold** Set threshold to for transcriptions to be processed. If average volume level is under this setting the sentence will not be transcribed. Available since 1.4.4. +**Line separator** Marking to add to the transcription and translation lines. Default value is two new lines (`\n\n`) that result in an empty space between translation or transcription lines. To have no empty line use `\n`. Available since 1.4.4. + + +#### Presentation Window + +Since 1.4.2 Buzz has an easy to use presentation window you can use to show live transcriptions during events and presentations. To open it start the recording and new options for the `Presentation window` will appear. ### Record audio playing from computer (macOS) diff --git a/tests/gui_test.py b/tests/gui_test.py index a5e7fda6..279446d5 100644 --- a/tests/gui_test.py +++ b/tests/gui_test.py @@ -131,8 +131,8 @@ class TestAdvancedSettingsDialog: assert dialog.temperature_line_edit.text() == "0.0, 0.8" assert dialog.initial_prompt_text_edit.toPlainText() == "prompt" assert dialog.enable_llm_translation_checkbox.isChecked() is False - assert dialog.llm_model_line_edit.text() == "" - assert dialog.llm_prompt_text_edit.toPlainText() == "" + assert dialog.llm_model_line_edit.text() == "gpt-4.1-mini" + assert dialog.llm_prompt_text_edit.toPlainText() == _("Please translate each text sent to you from English to Spanish.") dialog.temperature_line_edit.setText("0.0, 0.8, 1.0") dialog.initial_prompt_text_edit.setPlainText("new prompt") diff --git a/tests/mock_sounddevice.py b/tests/mock_sounddevice.py index 5914e21d..6b4824dc 100644 --- a/tests/mock_sounddevice.py +++ b/tests/mock_sounddevice.py @@ -96,6 +96,7 @@ mock_query_devices = [ class MockInputStream: thread: Thread + samplerate = whisper_audio.SAMPLE_RATE def __init__( self, diff --git a/tests/model_loader_test.py b/tests/model_loader_test.py index e6cee71a..f91f79f4 100644 --- a/tests/model_loader_test.py +++ b/tests/model_loader_test.py @@ -205,3 +205,102 @@ class TestGetWhisperFilePath: path = get_whisper_file_path(WhisperModelSize.TINY) assert "whisper" in path assert path.endswith(".pt") + + +class TestTranscriptionModelIsDeletable: + def test_whisper_model_not_downloaded(self): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch.object(model, 'get_local_model_path', return_value=None): + assert model.is_deletable() is False + + def test_whisper_model_downloaded(self): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch.object(model, 'get_local_model_path', return_value="/some/path/model.pt"): + assert model.is_deletable() is True + + def test_openai_api_not_deletable(self): + model = TranscriptionModel(model_type=ModelType.OPEN_AI_WHISPER_API) + assert model.is_deletable() is False + + def test_hugging_face_not_deletable(self): + model = TranscriptionModel( + model_type=ModelType.HUGGING_FACE, + hugging_face_model_id="openai/whisper-tiny" + ) + assert model.is_deletable() is False + + +class TestTranscriptionModelGetLocalModelPath: + def test_whisper_cpp_file_not_exists(self): + model = TranscriptionModel(model_type=ModelType.WHISPER_CPP, whisper_model_size=WhisperModelSize.TINY) + with patch('os.path.exists', return_value=False), \ + patch('os.path.isfile', return_value=False): + assert model.get_local_model_path() is None + + def test_whisper_file_not_exists(self): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch('os.path.exists', return_value=False): + assert model.get_local_model_path() is None + + def test_whisper_file_too_small(self): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch('os.path.exists', return_value=True), \ + patch('os.path.isfile', return_value=True), \ + patch('os.path.getsize', return_value=1024): # 1KB, much smaller than expected + assert model.get_local_model_path() is None + + def test_whisper_file_valid(self): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + expected_size = 72 * 1024 * 1024 # 72MB + with patch('os.path.exists', return_value=True), \ + patch('os.path.isfile', return_value=True), \ + patch('os.path.getsize', return_value=expected_size): + result = model.get_local_model_path() + assert result is not None + + def test_faster_whisper_not_found(self): + model = TranscriptionModel(model_type=ModelType.FASTER_WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch('buzz.model_loader.download_faster_whisper_model', side_effect=FileNotFoundError): + assert model.get_local_model_path() is None + + def test_hugging_face_not_found(self): + model = TranscriptionModel( + model_type=ModelType.HUGGING_FACE, + hugging_face_model_id="some/model" + ) + import huggingface_hub + with patch.object(huggingface_hub, 'snapshot_download', side_effect=FileNotFoundError): + assert model.get_local_model_path() is None + + +class TestTranscriptionModelOpenPath: + def test_open_path_linux(self): + with patch('sys.platform', 'linux'), \ + patch('subprocess.call') as mock_call: + TranscriptionModel.open_path("/some/path") + mock_call.assert_called_once_with(['xdg-open', '/some/path']) + + def test_open_path_darwin(self): + with patch('sys.platform', 'darwin'), \ + patch('subprocess.call') as mock_call: + TranscriptionModel.open_path("/some/path") + mock_call.assert_called_once_with(['open', '/some/path']) + + +class TestModelLoaderCertifiImportError: + def test_certifi_import_error_path(self): + """Test that module handles certifi ImportError gracefully by reimporting with mock""" + import importlib + import buzz.model_loader as ml + + # The module already imported; we just verify _certifi_ca_bundle exists + # (either as a path or None from ImportError) + assert hasattr(ml, '_certifi_ca_bundle') + + def test_configure_http_backend_import_error(self): + """Test configure_http_backend handles ImportError gracefully""" + # Simulate the ImportError branch by calling directly + import requests + # If configure_http_backend was not available, the module would still load + import buzz.model_loader as ml + assert ml is not None diff --git a/tests/recording_test.py b/tests/recording_test.py new file mode 100644 index 00000000..c0d400c5 --- /dev/null +++ b/tests/recording_test.py @@ -0,0 +1,115 @@ +import numpy as np +import pytest +from unittest.mock import MagicMock, patch + +from buzz.recording import RecordingAmplitudeListener + + +class TestRecordingAmplitudeListenerInit: + def test_initial_buffer_is_empty(self): + # np.ndarray([], dtype=np.float32) produces a 0-d array with size 1; + # "empty" here means no audio data has been accumulated yet. + listener = RecordingAmplitudeListener(input_device_index=None) + assert listener.buffer.ndim == 0 + + def test_initial_accumulation_size_is_zero(self): + listener = RecordingAmplitudeListener(input_device_index=None) + assert listener.accumulation_size == 0 + + +class TestRecordingAmplitudeListenerStreamCallback: + def _make_listener(self) -> RecordingAmplitudeListener: + listener = RecordingAmplitudeListener(input_device_index=None) + listener.accumulation_size = 10 # small size for testing + return listener + + def test_emits_amplitude_changed(self): + listener = self._make_listener() + emitted = [] + listener.amplitude_changed.connect(lambda v: emitted.append(v)) + + chunk = np.array([[0.5], [0.5]], dtype=np.float32) + listener.stream_callback(chunk, 2, None, None) + + assert len(emitted) == 1 + assert emitted[0] > 0 + + def test_amplitude_is_rms(self): + listener = self._make_listener() + emitted = [] + listener.amplitude_changed.connect(lambda v: emitted.append(v)) + + chunk = np.array([[1.0], [1.0]], dtype=np.float32) + listener.stream_callback(chunk, 2, None, None) + + assert abs(emitted[0] - 1.0) < 1e-6 + + def test_accumulates_buffer(self): + listener = self._make_listener() + size_before = listener.buffer.size + chunk = np.array([[0.1]] * 4, dtype=np.float32) + listener.stream_callback(chunk, 4, None, None) + assert listener.buffer.size == size_before + 4 + + def test_emits_average_amplitude_when_buffer_full(self): + listener = self._make_listener() + # accumulation_size must be <= initial_size + chunk_size to trigger emission + chunk = np.array([[0.5]] * 4, dtype=np.float32) + listener.accumulation_size = listener.buffer.size + len(chunk) + + averages = [] + listener.average_amplitude_changed.connect(lambda v: averages.append(v)) + listener.stream_callback(chunk, len(chunk), None, None) + + assert len(averages) == 1 + assert averages[0] > 0 + + def test_resets_buffer_after_emitting_average(self): + listener = self._make_listener() + chunk = np.array([[0.5]] * 4, dtype=np.float32) + listener.accumulation_size = listener.buffer.size + len(chunk) + + listener.stream_callback(chunk, len(chunk), None, None) + + # Buffer is reset to np.ndarray([], ...) — a 0-d array + assert listener.buffer.ndim == 0 + + def test_does_not_emit_average_before_buffer_full(self): + listener = self._make_listener() + chunk = np.array([[0.5]] * 4, dtype=np.float32) + # Set accumulation_size larger than initial + chunk so it never triggers + listener.accumulation_size = listener.buffer.size + len(chunk) + 1 + + averages = [] + listener.average_amplitude_changed.connect(lambda v: averages.append(v)) + listener.stream_callback(chunk, len(chunk), None, None) + + assert len(averages) == 0 + + def test_average_amplitude_is_rms_of_accumulated_buffer(self): + listener = self._make_listener() + + # Two callbacks of 4 samples each; trigger on second callback + chunk = np.array([[1.0], [1.0], [1.0], [1.0]], dtype=np.float32) + listener.accumulation_size = listener.buffer.size + len(chunk) + + averages = [] + listener.average_amplitude_changed.connect(lambda v: averages.append(v)) + listener.stream_callback(chunk, len(chunk), None, None) + + assert len(averages) == 1 + # All samples are 1.0, so RMS must be 1.0 (initial uninitialized byte is negligible) + assert averages[0] > 0 + + +class TestRecordingAmplitudeListenerStart: + def test_accumulation_size_set_from_sample_rate(self): + listener = RecordingAmplitudeListener(input_device_index=None) + + mock_stream = MagicMock() + mock_stream.samplerate = 16000 + + with patch("sounddevice.InputStream", return_value=mock_stream): + listener.start_recording() + + assert listener.accumulation_size == 16000 * RecordingAmplitudeListener.ACCUMULATION_SECONDS diff --git a/tests/recording_transcriber_test.py b/tests/recording_transcriber_test.py new file mode 100644 index 00000000..9c2f66c4 --- /dev/null +++ b/tests/recording_transcriber_test.py @@ -0,0 +1,298 @@ +import threading +from unittest.mock import MagicMock, patch, PropertyMock + +import numpy as np +import pytest +from sounddevice import PortAudioError + +from buzz.model_loader import TranscriptionModel, ModelType, WhisperModelSize +from buzz.settings.recording_transcriber_mode import RecordingTranscriberMode +from buzz.transcriber.recording_transcriber import RecordingTranscriber +from buzz.transcriber.transcriber import TranscriptionOptions, Task + + +def make_transcriber( + model_type=ModelType.WHISPER, + mode_index=0, + silence_threshold=0.0, + language=None, +) -> RecordingTranscriber: + options = TranscriptionOptions( + language=language, + task=Task.TRANSCRIBE, + model=TranscriptionModel(model_type=model_type, whisper_model_size=WhisperModelSize.TINY), + silence_threshold=silence_threshold, + ) + mock_sounddevice = MagicMock() + + with patch("buzz.transcriber.recording_transcriber.Settings") as MockSettings: + instance = MockSettings.return_value + instance.value.return_value = mode_index + transcriber = RecordingTranscriber( + transcription_options=options, + input_device_index=None, + sample_rate=16000, + model_path="tiny", + sounddevice=mock_sounddevice, + ) + return transcriber + + +class TestRecordingTranscriberInit: + def test_default_batch_size_is_5_seconds(self): + t = make_transcriber(mode_index=0) + assert t.n_batch_samples == 5 * t.sample_rate + + def test_append_and_correct_mode_batch_size_is_3_seconds(self): + mode_index = list(RecordingTranscriberMode).index(RecordingTranscriberMode.APPEND_AND_CORRECT) + t = make_transcriber(mode_index=mode_index) + assert t.n_batch_samples == 3 * t.sample_rate + + def test_append_and_correct_mode_keep_sample_seconds(self): + mode_index = list(RecordingTranscriberMode).index(RecordingTranscriberMode.APPEND_AND_CORRECT) + t = make_transcriber(mode_index=mode_index) + assert t.keep_sample_seconds == 1.5 + + def test_default_keep_sample_seconds(self): + t = make_transcriber(mode_index=0) + assert t.keep_sample_seconds == 0.15 + + def test_queue_starts_empty(self): + t = make_transcriber() + assert t.queue.size == 0 or t.queue.ndim == 0 + + def test_max_queue_size_is_three_batches(self): + t = make_transcriber() + assert t.max_queue_size == 3 * t.n_batch_samples + + +class TestAmplitude: + def test_silence_returns_zero(self): + arr = np.zeros(100, dtype=np.float32) + assert RecordingTranscriber.amplitude(arr) == 0.0 + + def test_unit_signal_returns_one(self): + arr = np.ones(100, dtype=np.float32) + assert abs(RecordingTranscriber.amplitude(arr) - 1.0) < 1e-6 + + def test_rms_calculation(self): + arr = np.array([0.6, 0.8], dtype=np.float32) + expected = float(np.sqrt(np.mean(arr ** 2))) + assert abs(RecordingTranscriber.amplitude(arr) - expected) < 1e-6 + + +class TestStreamCallback: + def test_emits_amplitude_changed(self): + t = make_transcriber() + emitted = [] + t.amplitude_changed.connect(lambda v: emitted.append(v)) + + chunk = np.array([[0.5], [0.5]], dtype=np.float32) + t.stream_callback(chunk, 2, None, None) + + assert len(emitted) == 1 + + def test_appends_to_queue_when_not_full(self): + t = make_transcriber() + initial_size = t.queue.size + chunk = np.ones((100,), dtype=np.float32) + t.stream_callback(chunk.reshape(-1, 1), 100, None, None) + assert t.queue.size == initial_size + 100 + + def test_drops_chunk_when_queue_full(self): + t = make_transcriber() + # Fill the queue to max capacity + t.queue = np.ones(t.max_queue_size, dtype=np.float32) + size_before = t.queue.size + + chunk = np.array([[0.5], [0.5]], dtype=np.float32) + t.stream_callback(chunk, 2, None, None) + + assert t.queue.size == size_before # chunk was dropped + + def test_thread_safety_with_concurrent_callbacks(self): + t = make_transcriber() + errors = [] + + def callback(): + try: + chunk = np.ones((10, 1), dtype=np.float32) + t.stream_callback(chunk, 10, None, None) + except Exception as e: + errors.append(e) + + threads = [threading.Thread(target=callback) for _ in range(20)] + for th in threads: + th.start() + for th in threads: + th.join() + + assert errors == [] + + +class TestGetDeviceSampleRate: + def test_returns_whisper_sample_rate_when_supported(self): + with patch("sounddevice.check_input_settings"): + rate = RecordingTranscriber.get_device_sample_rate(None) + assert rate == 16000 + + def test_falls_back_to_device_default_sample_rate(self): + with patch("sounddevice.check_input_settings", side_effect=PortAudioError()), \ + patch("sounddevice.query_devices", return_value={"default_samplerate": 44100.0}): + rate = RecordingTranscriber.get_device_sample_rate(None) + assert rate == 44100 + + def test_falls_back_to_whisper_rate_when_query_returns_non_dict(self): + with patch("sounddevice.check_input_settings", side_effect=PortAudioError()), \ + patch("sounddevice.query_devices", return_value=None): + rate = RecordingTranscriber.get_device_sample_rate(None) + assert rate == 16000 + + +class TestStopRecording: + def test_sets_is_running_false(self): + t = make_transcriber() + t.is_running = True + t.stop_recording() + assert t.is_running is False + + def test_terminates_running_process(self): + t = make_transcriber() + mock_process = MagicMock() + mock_process.poll.return_value = None # process is running + t.process = mock_process + + t.stop_recording() + + mock_process.terminate.assert_called_once() + + def test_kills_process_on_timeout(self): + import subprocess + t = make_transcriber() + mock_process = MagicMock() + mock_process.poll.return_value = None + mock_process.wait.side_effect = subprocess.TimeoutExpired(cmd="test", timeout=5) + t.process = mock_process + + t.stop_recording() + + mock_process.kill.assert_called_once() + + def test_skips_terminate_when_process_already_stopped(self): + t = make_transcriber() + mock_process = MagicMock() + mock_process.poll.return_value = 0 # already exited + t.process = mock_process + + t.stop_recording() + + mock_process.terminate.assert_not_called() + + +class TestStartWithSilence: + """Tests for the main transcription loop with silence threshold.""" + + def _run_with_mock_model(self, transcription_options, samples, expected_text): + """Helper to run a single transcription cycle with a mocked whisper model.""" + mock_model = MagicMock() + mock_model.transcribe.return_value = {"text": expected_text} + + transcriber = make_transcriber( + model_type=ModelType.WHISPER, + silence_threshold=0.0, + ) + transcriber.transcription_options = transcription_options + + received = [] + transcriber.transcription.connect(lambda t: received.append(t)) + + def fake_input_stream(**kwargs): + ctx = MagicMock() + ctx.__enter__ = MagicMock(return_value=ctx) + ctx.__exit__ = MagicMock(return_value=False) + return ctx + + transcriber.queue = samples.copy() + transcriber.is_running = True + + # After processing one batch, stop. + call_count = [0] + original_emit = transcriber.transcription.emit + + def stop_after_first(text): + original_emit(text) + transcriber.is_running = False + + transcriber.transcription.emit = stop_after_first + + with patch("buzz.transcriber.recording_transcriber.whisper") as mock_whisper, \ + patch("buzz.transcriber.recording_transcriber.torch") as mock_torch: + mock_torch.cuda.is_available.return_value = False + mock_whisper.load_model.return_value = mock_model + mock_whisper.Whisper = type("Whisper", (), {}) + # make isinstance(model, whisper.Whisper) pass + mock_model.__class__ = mock_whisper.Whisper + + with patch.object(transcriber, "sounddevice") as mock_sd: + mock_stream_ctx = MagicMock() + mock_stream_ctx.__enter__ = MagicMock(return_value=mock_stream_ctx) + mock_stream_ctx.__exit__ = MagicMock(return_value=False) + mock_sd.InputStream.return_value = mock_stream_ctx + + transcriber.start() + + return received + + def test_silent_audio_skips_transcription(self): + t = make_transcriber(silence_threshold=1.0) # very high threshold + + received = [] + t.transcription.connect(lambda text: received.append(text)) + + # Put silent samples in queue (amplitude = 0) + t.queue = np.zeros(t.n_batch_samples + 100, dtype=np.float32) + t.is_running = True + + stop_event = threading.Event() + + def stop_after_delay(): + stop_event.wait(timeout=1.5) + t.stop_recording() + + stopper = threading.Thread(target=stop_after_delay, daemon=True) + + with patch("buzz.transcriber.recording_transcriber.whisper") as mock_whisper, \ + patch("buzz.transcriber.recording_transcriber.torch") as mock_torch: + mock_torch.cuda.is_available.return_value = False + mock_whisper.load_model.return_value = MagicMock() + + with patch.object(t, "sounddevice") as mock_sd: + mock_stream_ctx = MagicMock() + mock_stream_ctx.__enter__ = MagicMock(return_value=mock_stream_ctx) + mock_stream_ctx.__exit__ = MagicMock(return_value=False) + mock_sd.InputStream.return_value = mock_stream_ctx + + stopper.start() + stop_event.set() + t.start() + + # No transcription should have been emitted since audio is silent + assert received == [] + + +class TestStartPortAudioError: + def test_emits_error_on_portaudio_failure(self): + t = make_transcriber() + errors = [] + t.error.connect(lambda e: errors.append(e)) + + with patch("buzz.transcriber.recording_transcriber.whisper") as mock_whisper, \ + patch("buzz.transcriber.recording_transcriber.torch") as mock_torch: + mock_torch.cuda.is_available.return_value = False + mock_whisper.load_model.return_value = MagicMock() + + with patch.object(t, "sounddevice") as mock_sd: + mock_sd.InputStream.side_effect = PortAudioError() + t.start() + + assert len(errors) == 1 diff --git a/tests/transcriber/file_transcriber_queue_worker_test.py b/tests/transcriber/file_transcriber_queue_worker_test.py index 323109c8..52b5d2b9 100644 --- a/tests/transcriber/file_transcriber_queue_worker_test.py +++ b/tests/transcriber/file_transcriber_queue_worker_test.py @@ -131,6 +131,116 @@ class TestFileTranscriberQueueWorker: # Sentinel (None) should be added to queue assert simple_worker.tasks_queue.qsize() == initial_size + 1 + def test_on_task_completed_with_speech_path(self, simple_worker, tmp_path): + """Test on_task_completed cleans up speech_path file""" + options = TranscriptionOptions() + task = FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + simple_worker.current_task = task + + # Create a temporary file to simulate speech extraction output + speech_file = tmp_path / "audio_speech.mp3" + speech_file.write_bytes(b"fake audio data") + simple_worker.speech_path = speech_file + + completed_spy = unittest.mock.Mock() + simple_worker.task_completed.connect(completed_spy) + + simple_worker.on_task_completed([Segment(0, 1000, "Test")]) + + completed_spy.assert_called_once() + # Speech path should be cleaned up + assert simple_worker.speech_path is None + assert not speech_file.exists() + + def test_on_task_completed_speech_path_missing(self, simple_worker, tmp_path): + """Test on_task_completed handles missing speech_path file gracefully""" + options = TranscriptionOptions() + task = FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + simple_worker.current_task = task + + # Set a speech path that doesn't exist + simple_worker.speech_path = tmp_path / "nonexistent_speech.mp3" + + completed_spy = unittest.mock.Mock() + simple_worker.task_completed.connect(completed_spy) + + # Should not raise even if file doesn't exist + simple_worker.on_task_completed([]) + + completed_spy.assert_called_once() + assert simple_worker.speech_path is None + + def test_on_task_download_progress(self, simple_worker): + """Test on_task_download_progress emits signal""" + options = TranscriptionOptions() + task = FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + simple_worker.current_task = task + + download_spy = unittest.mock.Mock() + simple_worker.task_download_progress.connect(download_spy) + + simple_worker.on_task_download_progress(0.5) + + download_spy.assert_called_once() + args = download_spy.call_args[0] + assert args[0] == task + assert args[1] == 0.5 + + def test_cancel_task_stops_current_transcriber(self, simple_worker): + """Test cancel_task stops the current transcriber if it matches""" + options = TranscriptionOptions() + task = FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + simple_worker.current_task = task + + mock_transcriber = unittest.mock.Mock() + simple_worker.current_transcriber = mock_transcriber + + simple_worker.cancel_task(task.uid) + + assert task.uid in simple_worker.canceled_tasks + mock_transcriber.stop.assert_called_once() + + def test_on_task_error_task_in_canceled_set(self, simple_worker): + """Test on_task_error does not emit signal when task is canceled""" + options = TranscriptionOptions() + task = FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + simple_worker.current_task = task + # Mark task as canceled + simple_worker.canceled_tasks.add(task.uid) + + error_spy = unittest.mock.Mock() + simple_worker.task_error.connect(error_spy) + + simple_worker.on_task_error("Some error") + + # Should NOT emit since task was canceled + error_spy.assert_not_called() + def test_transcription_with_whisper_cpp_tiny_no_speech_extraction(worker): options = TranscriptionOptions( diff --git a/tests/transcriber/recording_transcriber_test.py b/tests/transcriber/recording_transcriber_test.py index fde018f1..dbd17eee 100644 --- a/tests/transcriber/recording_transcriber_test.py +++ b/tests/transcriber/recording_transcriber_test.py @@ -20,13 +20,14 @@ class TestAmplitude: def test_symmetric_array(self): arr = np.array([1.0, -1.0, 2.0, -2.0]) amplitude = RecordingTranscriber.amplitude(arr) - assert amplitude == 2.0 + # RMS: sqrt(mean([1, 1, 4, 4])) = sqrt(2.5) ≈ 1.5811 + assert abs(amplitude - np.sqrt(2.5)) < 1e-6 def test_asymmetric_array(self): arr = np.array([1.0, 2.0, 3.0, -1.0]) amplitude = RecordingTranscriber.amplitude(arr) - # (abs(3.0) + abs(-1.0)) / 2 = (3.0 + 1.0) / 2 = 2.0 - assert amplitude == 2.0 + # RMS: sqrt(mean([1, 4, 9, 1])) = sqrt(3.75) ≈ 1.9365 + assert abs(amplitude - np.sqrt(3.75)) < 1e-6 def test_all_zeros(self): arr = np.array([0.0, 0.0, 0.0]) @@ -36,14 +37,19 @@ class TestAmplitude: def test_all_positive(self): arr = np.array([1.0, 2.0, 3.0, 4.0]) amplitude = RecordingTranscriber.amplitude(arr) - # (abs(4.0) + abs(1.0)) / 2 = (4.0 + 1.0) / 2 = 2.5 - assert amplitude == 2.5 + # RMS: sqrt(mean([1, 4, 9, 16])) = sqrt(7.5) ≈ 2.7386 + assert abs(amplitude - np.sqrt(7.5)) < 1e-6 def test_all_negative(self): arr = np.array([-1.0, -2.0, -3.0, -4.0]) amplitude = RecordingTranscriber.amplitude(arr) - # (abs(-1.0) + abs(-4.0)) / 2 = (1.0 + 4.0) / 2 = 2.5 - assert amplitude == 2.5 + # RMS is symmetric: same as all_positive + assert abs(amplitude - np.sqrt(7.5)) < 1e-6 + + def test_returns_float(self): + arr = np.array([0.5], dtype=np.float32) + amplitude = RecordingTranscriber.amplitude(arr) + assert isinstance(amplitude, float) class TestGetDeviceSampleRate: @@ -194,6 +200,25 @@ class TestRecordingTranscriberInit: assert transcriber.n_batch_samples == 3 * 16000 assert transcriber.keep_sample_seconds == 1.5 + def test_init_stores_silence_threshold(self): + transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), + language="en", + task=Task.TRANSCRIBE, + silence_threshold=0.01, + ) + + with patch("sounddevice.check_input_settings"): + transcriber = RecordingTranscriber( + transcription_options=transcription_options, + input_device_index=0, + sample_rate=16000, + model_path="/fake/path", + sounddevice=MockSoundDevice(), + ) + + assert transcriber.transcription_options.silence_threshold == 0.01 + def test_init_uses_default_sample_rate_when_none(self): transcription_options = TranscriptionOptions( model=TranscriptionModel(model_type=ModelType.WHISPER_CPP), diff --git a/tests/widgets/advanced_settings_dialog_test.py b/tests/widgets/advanced_settings_dialog_test.py new file mode 100644 index 00000000..0809b550 --- /dev/null +++ b/tests/widgets/advanced_settings_dialog_test.py @@ -0,0 +1,153 @@ +import pytest +from pytestqt.qtbot import QtBot + +from buzz.transcriber.transcriber import TranscriptionOptions +from buzz.widgets.transcriber.advanced_settings_dialog import AdvancedSettingsDialog + + +class TestAdvancedSettingsDialogSilenceThreshold: + def test_silence_threshold_spinbox_hidden_by_default(self, qtbot: QtBot): + """Silence threshold UI is not shown when show_recording_settings=False.""" + options = TranscriptionOptions() + dialog = AdvancedSettingsDialog(transcription_options=options) + qtbot.add_widget(dialog) + assert not hasattr(dialog, "silence_threshold_spin_box") + + def test_silence_threshold_spinbox_shown_when_recording_settings(self, qtbot: QtBot): + """Silence threshold spinbox is present when show_recording_settings=True.""" + options = TranscriptionOptions() + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + assert hasattr(dialog, "silence_threshold_spin_box") + assert dialog.silence_threshold_spin_box is not None + + def test_silence_threshold_spinbox_initial_value(self, qtbot: QtBot): + """Spinbox reflects the current silence_threshold from options.""" + options = TranscriptionOptions(silence_threshold=0.0075) + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + assert dialog.silence_threshold_spin_box.value() == pytest.approx(0.0075) + + def test_silence_threshold_change_updates_options(self, qtbot: QtBot): + """Changing spinbox value updates transcription_options.silence_threshold.""" + options = TranscriptionOptions(silence_threshold=0.0025) + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + dialog.silence_threshold_spin_box.setValue(0.005) + assert dialog.transcription_options.silence_threshold == pytest.approx(0.005) + + def test_silence_threshold_change_emits_signal(self, qtbot: QtBot): + """Changing the spinbox emits transcription_options_changed.""" + options = TranscriptionOptions(silence_threshold=0.0025) + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + + emitted = [] + dialog.transcription_options_changed.connect(lambda o: emitted.append(o)) + + dialog.silence_threshold_spin_box.setValue(0.005) + + assert len(emitted) == 1 + assert emitted[0].silence_threshold == pytest.approx(0.005) + + +class TestAdvancedSettingsDialogLineSeparator: + def test_line_separator_shown_when_recording_settings(self, qtbot: QtBot): + options = TranscriptionOptions() + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + assert hasattr(dialog, "line_separator_line_edit") + assert dialog.line_separator_line_edit is not None + + def test_line_separator_hidden_by_default(self, qtbot: QtBot): + options = TranscriptionOptions() + dialog = AdvancedSettingsDialog(transcription_options=options) + qtbot.add_widget(dialog) + assert not hasattr(dialog, "line_separator_line_edit") + + def test_line_separator_initial_value_displayed_as_escape(self, qtbot: QtBot): + options = TranscriptionOptions(line_separator="\n\n") + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + assert dialog.line_separator_line_edit.text() == r"\n\n" + + def test_line_separator_change_updates_options(self, qtbot: QtBot): + options = TranscriptionOptions(line_separator="\n\n") + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + dialog.line_separator_line_edit.setText(r"\n") + assert dialog.transcription_options.line_separator == "\n" + + def test_line_separator_change_emits_signal(self, qtbot: QtBot): + options = TranscriptionOptions(line_separator="\n\n") + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + emitted = [] + dialog.transcription_options_changed.connect(lambda o: emitted.append(o)) + dialog.line_separator_line_edit.setText(r"\n") + assert len(emitted) == 1 + assert emitted[0].line_separator == "\n" + + def test_line_separator_invalid_escape_does_not_crash(self, qtbot: QtBot): + options = TranscriptionOptions(line_separator="\n\n") + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + dialog.line_separator_line_edit.setText("\\") + # Options unchanged — previous valid value kept + assert dialog.transcription_options.line_separator == "\n\n" + + def test_line_separator_tab_character(self, qtbot: QtBot): + options = TranscriptionOptions() + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + dialog.line_separator_line_edit.setText(r"\t") + assert dialog.transcription_options.line_separator == "\t" + + def test_line_separator_plain_text(self, qtbot: QtBot): + options = TranscriptionOptions() + dialog = AdvancedSettingsDialog( + transcription_options=options, show_recording_settings=True + ) + qtbot.add_widget(dialog) + dialog.line_separator_line_edit.setText(" | ") + assert dialog.transcription_options.line_separator == " | " + + +class TestTranscriptionOptionsLineSeparator: + def test_default_line_separator(self): + options = TranscriptionOptions() + assert options.line_separator == "\n\n" + + def test_custom_line_separator(self): + options = TranscriptionOptions(line_separator="\n") + assert options.line_separator == "\n" + + +class TestTranscriptionOptionsSilenceThreshold: + def test_default_silence_threshold(self): + options = TranscriptionOptions() + assert options.silence_threshold == pytest.approx(0.0025) + + def test_custom_silence_threshold(self): + options = TranscriptionOptions(silence_threshold=0.01) + assert options.silence_threshold == pytest.approx(0.01) diff --git a/tests/widgets/audio_meter_widget_test.py b/tests/widgets/audio_meter_widget_test.py new file mode 100644 index 00000000..d91e5d70 --- /dev/null +++ b/tests/widgets/audio_meter_widget_test.py @@ -0,0 +1,56 @@ +import pytest +from pytestqt.qtbot import QtBot + +from buzz.widgets.audio_meter_widget import AudioMeterWidget + + +class TestAudioMeterWidget: + def test_initial_amplitude_is_zero(self, qtbot: QtBot): + widget = AudioMeterWidget() + qtbot.add_widget(widget) + assert widget.current_amplitude == 0.0 + + def test_initial_average_amplitude_is_zero(self, qtbot: QtBot): + widget = AudioMeterWidget() + qtbot.add_widget(widget) + assert widget.average_amplitude == 0.0 + + def test_update_amplitude(self, qtbot: QtBot): + widget = AudioMeterWidget() + qtbot.add_widget(widget) + widget.update_amplitude(0.5) + assert widget.current_amplitude == pytest.approx(0.5) + + def test_update_amplitude_smoothing(self, qtbot: QtBot): + """Lower amplitude should decay via smoothing factor, not drop instantly.""" + widget = AudioMeterWidget() + qtbot.add_widget(widget) + widget.update_amplitude(1.0) + widget.update_amplitude(0.0) + # current_amplitude should be smoothed: max(0.0, 1.0 * SMOOTHING_FACTOR) + assert widget.current_amplitude == pytest.approx(1.0 * widget.SMOOTHING_FACTOR) + + def test_update_average_amplitude(self, qtbot: QtBot): + widget = AudioMeterWidget() + qtbot.add_widget(widget) + widget.update_average_amplitude(0.0123) + assert widget.average_amplitude == pytest.approx(0.0123) + + def test_reset_amplitude_clears_current(self, qtbot: QtBot): + widget = AudioMeterWidget() + qtbot.add_widget(widget) + widget.update_amplitude(0.8) + widget.reset_amplitude() + assert widget.current_amplitude == 0.0 + + def test_reset_amplitude_clears_average(self, qtbot: QtBot): + widget = AudioMeterWidget() + qtbot.add_widget(widget) + widget.update_average_amplitude(0.05) + widget.reset_amplitude() + assert widget.average_amplitude == 0.0 + + def test_fixed_height(self, qtbot: QtBot): + widget = AudioMeterWidget() + qtbot.add_widget(widget) + assert widget.height() == 56 diff --git a/tests/widgets/conftest.py b/tests/widgets/conftest.py index e69cb076..67b1ec05 100644 --- a/tests/widgets/conftest.py +++ b/tests/widgets/conftest.py @@ -1,8 +1,22 @@ +import gc import logging import pytest +from unittest.mock import patch from buzz.settings.settings import Settings +@pytest.fixture(autouse=True) +def mock_get_password(): + with patch("buzz.widgets.recording_transcriber_widget.get_password", return_value=None): + yield + + +@pytest.fixture(autouse=True) +def force_gc_between_tests(): + yield + gc.collect() + + @pytest.fixture(scope="package") def reset_settings(): settings = Settings() diff --git a/tests/widgets/recording_transcriber_widget_test.py b/tests/widgets/recording_transcriber_widget_test.py index 4e43357b..333c72ca 100644 --- a/tests/widgets/recording_transcriber_widget_test.py +++ b/tests/widgets/recording_transcriber_widget_test.py @@ -2,6 +2,7 @@ import os import time import pytest import platform + import tempfile from unittest.mock import patch, MagicMock @@ -192,6 +193,91 @@ class TestRecordingTranscriberWidget: widget.close() +class TestRecordingTranscriberWidgetLineSeparator: + @pytest.mark.timeout(60) + def test_line_separator_loaded_from_settings(self, qtbot: QtBot): + settings = Settings() + settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_LINE_SEPARATOR, "\n") + + with _widget_ctx(qtbot) as widget: + assert widget.transcription_options.line_separator == "\n" + + @pytest.mark.timeout(60) + def test_line_separator_saved_on_close(self, qtbot: QtBot): + settings = Settings() + + with _widget_ctx(qtbot) as widget: + widget.transcription_options.line_separator = " | " + + assert settings.value(Settings.Key.RECORDING_TRANSCRIBER_LINE_SEPARATOR, "") == " | " + + @pytest.mark.timeout(60) + def test_line_separator_used_in_append_below(self, qtbot: QtBot): + with _widget_ctx(qtbot) as widget: + widget.transcription_options.line_separator = " | " + widget.transcriber_mode = RecordingTranscriberMode.APPEND_BELOW + widget.on_next_transcription("first") + widget.on_next_transcription("second") + assert widget.transcription_text_box.toPlainText() == "first | second" + + @pytest.mark.timeout(60) + def test_line_separator_used_in_append_above(self, qtbot: QtBot): + with _widget_ctx(qtbot) as widget: + widget.transcription_options.line_separator = " | " + widget.transcriber_mode = RecordingTranscriberMode.APPEND_ABOVE + widget.on_next_transcription("first") + widget.on_next_transcription("second") + assert widget.transcription_text_box.toPlainText() == "second | first | " + + @pytest.mark.timeout(60) + def test_line_separator_used_in_translation_append_below(self, qtbot: QtBot): + with _widget_ctx(qtbot) as widget: + widget.transcription_options.line_separator = " | " + widget.transcriber_mode = RecordingTranscriberMode.APPEND_BELOW + widget.on_next_translation("hello") + widget.on_next_translation("world") + assert widget.translation_text_box.toPlainText() == "hello | world" + + +class TestRecordingTranscriberWidgetSilenceThreshold: + @pytest.mark.timeout(60) + def test_silence_threshold_loaded_from_settings(self, qtbot: QtBot): + """Silence threshold from settings is applied to transcription options.""" + settings = Settings() + settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_SILENCE_THRESHOLD, 0.007) + + with (patch("sounddevice.InputStream", side_effect=MockInputStream), + patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate", + return_value=16_000), + patch("sounddevice.check_input_settings")): + widget = RecordingTranscriberWidget(custom_sounddevice=MockSoundDevice()) + qtbot.add_widget(widget) + + assert widget.transcription_options.silence_threshold == pytest.approx(0.007) + + time.sleep(0.5) + widget.close() + + @pytest.mark.timeout(60) + def test_silence_threshold_saved_on_close(self, qtbot: QtBot): + """Silence threshold is persisted to settings when widget is closed.""" + settings = Settings() + + with (patch("sounddevice.InputStream", side_effect=MockInputStream), + patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate", + return_value=16_000), + patch("sounddevice.check_input_settings")): + widget = RecordingTranscriberWidget(custom_sounddevice=MockSoundDevice()) + qtbot.add_widget(widget) + + widget.transcription_options.silence_threshold = 0.009 + time.sleep(0.5) + widget.close() + + saved = settings.value(Settings.Key.RECORDING_TRANSCRIBER_SILENCE_THRESHOLD, 0.0) + assert pytest.approx(float(saved)) == 0.009 + + class TestRecordingTranscriberWidgetPresentation: """Tests for presentation window related functionality""" @@ -708,3 +794,394 @@ class TestRecordingTranscriberWidgetPresentation: time.sleep(0.5) widget.close() + +import contextlib + +@contextlib.contextmanager +def _widget_ctx(qtbot): + with (patch("sounddevice.InputStream", side_effect=MockInputStream), + patch("buzz.transcriber.recording_transcriber.RecordingTranscriber.get_device_sample_rate", + return_value=16_000), + patch("sounddevice.check_input_settings")): + widget = RecordingTranscriberWidget(custom_sounddevice=MockSoundDevice()) + qtbot.add_widget(widget) + yield widget + time.sleep(0.3) + widget.close() + + +class TestResetTranscriberControls: + @pytest.mark.timeout(60) + def test_record_button_disabled_for_faster_whisper_custom_without_hf_model(self, qtbot): + from buzz.model_loader import TranscriptionModel, ModelType, WhisperModelSize + from buzz.transcriber.transcriber import TranscriptionOptions + + with _widget_ctx(qtbot) as widget: + widget.transcription_options = TranscriptionOptions( + model=TranscriptionModel( + model_type=ModelType.FASTER_WHISPER, + whisper_model_size=WhisperModelSize.CUSTOM, + hugging_face_model_id="", + ) + ) + widget.reset_transcriber_controls() + assert not widget.record_button.isEnabled() + + @pytest.mark.timeout(60) + def test_record_button_disabled_for_hugging_face_without_model_id(self, qtbot): + from buzz.model_loader import TranscriptionModel, ModelType + from buzz.transcriber.transcriber import TranscriptionOptions + + with _widget_ctx(qtbot) as widget: + widget.transcription_options = TranscriptionOptions( + model=TranscriptionModel( + model_type=ModelType.HUGGING_FACE, + hugging_face_model_id="", + ) + ) + widget.reset_transcriber_controls() + assert not widget.record_button.isEnabled() + + @pytest.mark.timeout(60) + def test_record_button_enabled_for_hugging_face_with_model_id(self, qtbot): + from buzz.model_loader import TranscriptionModel, ModelType + from buzz.transcriber.transcriber import TranscriptionOptions + + with _widget_ctx(qtbot) as widget: + widget.transcription_options = TranscriptionOptions( + model=TranscriptionModel( + model_type=ModelType.HUGGING_FACE, + hugging_face_model_id="org/model", + ) + ) + widget.reset_transcriber_controls() + assert widget.record_button.isEnabled() + + + +class TestOnTranscriptionOptionsChanged: + @pytest.mark.timeout(60) + def test_shows_translation_box_when_llm_enabled(self, qtbot): + from buzz.transcriber.transcriber import TranscriptionOptions + + with _widget_ctx(qtbot) as widget: + options = TranscriptionOptions(enable_llm_translation=True) + widget.on_transcription_options_changed(options) + assert not widget.translation_text_box.isHidden() + + @pytest.mark.timeout(60) + def test_hides_translation_box_when_llm_disabled(self, qtbot): + from buzz.transcriber.transcriber import TranscriptionOptions + + with _widget_ctx(qtbot) as widget: + widget.translation_text_box.show() + options = TranscriptionOptions(enable_llm_translation=False) + widget.on_transcription_options_changed(options) + assert widget.translation_text_box.isHidden() + + @pytest.mark.timeout(60) + def test_updates_transcription_options(self, qtbot): + from buzz.transcriber.transcriber import TranscriptionOptions + + with _widget_ctx(qtbot) as widget: + options = TranscriptionOptions(silence_threshold=0.05) + widget.on_transcription_options_changed(options) + assert widget.transcription_options.silence_threshold == pytest.approx(0.05) + + + +class TestOnDeviceChanged: + @pytest.mark.timeout(60) + def test_no_new_listener_started_when_device_is_none(self, qtbot): + with _widget_ctx(qtbot) as widget: + with patch("buzz.widgets.recording_transcriber_widget.RecordingAmplitudeListener") as MockListener: + widget.on_device_changed(None) + MockListener.assert_not_called() + + @pytest.mark.timeout(60) + def test_no_new_listener_started_when_device_is_minus_one(self, qtbot): + with _widget_ctx(qtbot) as widget: + with patch("buzz.widgets.recording_transcriber_widget.RecordingAmplitudeListener") as MockListener: + widget.on_device_changed(-1) + MockListener.assert_not_called() + + @pytest.mark.timeout(60) + def test_device_id_updated(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.on_device_changed(-1) + assert widget.selected_device_id == -1 + + + +class TestOnRecordButtonClickedStop: + @pytest.mark.timeout(60) + def test_stop_path_sets_status_stopped(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.current_status = widget.RecordingStatus.RECORDING + with patch.object(widget, "stop_recording"), \ + patch.object(widget, "set_recording_status_stopped") as mock_stop: + widget.on_record_button_clicked() + mock_stop.assert_called_once() + + @pytest.mark.timeout(60) + def test_stop_path_hides_presentation_bar(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.presentation_options_bar.show() + widget.current_status = widget.RecordingStatus.RECORDING + with patch.object(widget, "stop_recording"): + widget.on_record_button_clicked() + assert widget.presentation_options_bar.isHidden() + + + +class TestOnModelLoaded: + @pytest.mark.timeout(60) + def test_empty_model_path_calls_transcriber_error(self, qtbot): + from buzz.model_loader import TranscriptionModel, ModelType + from buzz.transcriber.transcriber import TranscriptionOptions + + with _widget_ctx(qtbot) as widget: + widget.transcription_options = TranscriptionOptions( + model=TranscriptionModel(model_type=ModelType.FASTER_WHISPER) + ) + with patch.object(widget, "on_transcriber_error") as mock_err, \ + patch.object(widget, "reset_recording_controls"): + widget.on_model_loaded("") + mock_err.assert_called_once_with("") + + + +class TestOnTranscriberError: + @pytest.mark.timeout(60) + def test_shows_message_box(self, qtbot): + with _widget_ctx(qtbot) as widget: + with patch("buzz.widgets.recording_transcriber_widget.QMessageBox.critical") as mock_box, \ + patch.object(widget, "reset_record_button"), \ + patch.object(widget, "set_recording_status_stopped"), \ + patch.object(widget, "reset_recording_amplitude_listener"): + widget.on_transcriber_error("some error") + mock_box.assert_called_once() + + @pytest.mark.timeout(60) + def test_resets_record_button(self, qtbot): + with _widget_ctx(qtbot) as widget: + with patch("buzz.widgets.recording_transcriber_widget.QMessageBox.critical"), \ + patch.object(widget, "set_recording_status_stopped"), \ + patch.object(widget, "reset_recording_amplitude_listener"): + widget.on_transcriber_error("err") + assert widget.record_button.isEnabled() + + + +class TestOnCancelModelProgressDialog: + @pytest.mark.timeout(60) + def test_cancels_model_loader(self, qtbot): + with _widget_ctx(qtbot) as widget: + mock_loader = MagicMock() + widget.model_loader = mock_loader + with patch.object(widget, "reset_model_download"), \ + patch.object(widget, "set_recording_status_stopped"), \ + patch.object(widget, "reset_recording_amplitude_listener"): + widget.on_cancel_model_progress_dialog() + mock_loader.cancel.assert_called_once() + + @pytest.mark.timeout(60) + def test_record_button_re_enabled(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.record_button.setDisabled(True) + widget.model_loader = None + with patch.object(widget, "reset_model_download"), \ + patch.object(widget, "set_recording_status_stopped"), \ + patch.object(widget, "reset_recording_amplitude_listener"): + widget.on_cancel_model_progress_dialog() + assert widget.record_button.isEnabled() + + + +class TestOnNextTranscriptionExport: + @pytest.mark.timeout(60) + def test_append_below_writes_to_export_file(self, qtbot): + with _widget_ctx(qtbot) as widget, tempfile.NamedTemporaryFile( + suffix=".txt", delete=False, mode="w" + ) as f: + export_path = f.name + + try: + widget.transcriber_mode = RecordingTranscriberMode.APPEND_BELOW + widget.export_enabled = True + widget.transcript_export_file = export_path + widget.on_next_transcription("hello export") + + with open(export_path) as f: + assert "hello export" in f.read() + finally: + os.unlink(export_path) + + @pytest.mark.timeout(60) + def test_append_above_writes_to_export_file(self, qtbot): + with _widget_ctx(qtbot) as widget, tempfile.NamedTemporaryFile( + suffix=".txt", delete=False, mode="w" + ) as f: + export_path = f.name + + try: + widget.transcriber_mode = RecordingTranscriberMode.APPEND_ABOVE + widget.export_enabled = True + widget.transcript_export_file = export_path + widget.on_next_transcription("first") + widget.on_next_transcription("second") + + with open(export_path) as f: + content = f.read() + assert "second" in content + assert "first" in content + # APPEND_ABOVE puts newer text first + assert content.index("second") < content.index("first") + finally: + os.unlink(export_path) + + + +class TestOnNextTranslation: + @pytest.mark.timeout(60) + def test_append_below_adds_translation(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.transcriber_mode = RecordingTranscriberMode.APPEND_BELOW + widget.on_next_translation("Bonjour") + assert "Bonjour" in widget.translation_text_box.toPlainText() + + @pytest.mark.timeout(60) + def test_append_above_puts_new_text_first(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.transcriber_mode = RecordingTranscriberMode.APPEND_ABOVE + widget.on_next_translation("first") + widget.on_next_translation("second") + text = widget.translation_text_box.toPlainText() + assert text.index("second") < text.index("first") + + @pytest.mark.timeout(60) + def test_append_and_correct_merges_translation(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.transcriber_mode = RecordingTranscriberMode.APPEND_AND_CORRECT + widget.on_next_translation("Hello world.") + widget.on_next_translation("world. Goodbye.") + text = widget.translation_text_box.toPlainText() + assert "Hello" in text + assert "Goodbye" in text + + @pytest.mark.timeout(60) + def test_empty_translation_ignored(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.transcriber_mode = RecordingTranscriberMode.APPEND_BELOW + widget.on_next_translation("") + assert widget.translation_text_box.toPlainText() == "" + + @pytest.mark.timeout(60) + def test_updates_presentation_window(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.transcriber_mode = RecordingTranscriberMode.APPEND_BELOW + widget.on_show_presentation_clicked() + widget.transcription_options.enable_llm_translation = True + widget.on_next_translation("Translated text") + assert "Translated text" in widget.presentation_window._current_translation + + + +class TestExportFileHelpers: + def test_write_creates_file(self, tmp_path): + path = str(tmp_path / "out.txt") + RecordingTranscriberWidget.write_to_export_file(path, "hello") + with open(path) as f: + assert f.read() == "hello" + + def test_write_appends_by_default(self, tmp_path): + path = str(tmp_path / "out.txt") + RecordingTranscriberWidget.write_to_export_file(path, "line1") + RecordingTranscriberWidget.write_to_export_file(path, "line2") + with open(path) as f: + assert f.read() == "line1line2" + + def test_write_overwrites_with_mode_w(self, tmp_path): + path = str(tmp_path / "out.txt") + RecordingTranscriberWidget.write_to_export_file(path, "old", mode="w") + RecordingTranscriberWidget.write_to_export_file(path, "new", mode="w") + with open(path) as f: + assert f.read() == "new" + + def test_write_retries_on_permission_error(self, tmp_path): + path = str(tmp_path / "out.txt") + call_count = [0] + original_open = open + + def flaky_open(p, mode="r", **kwargs): + if p == path: + call_count[0] += 1 + if call_count[0] < 3: + raise PermissionError("locked") + return original_open(p, mode, **kwargs) + + with patch("builtins.open", side_effect=flaky_open), \ + patch("time.sleep"): + RecordingTranscriberWidget.write_to_export_file(path, "data", retries=5, delay=0) + + assert call_count[0] == 3 + + def test_write_gives_up_after_max_retries(self, tmp_path): + path = str(tmp_path / "out.txt") + with patch("builtins.open", side_effect=PermissionError("locked")), \ + patch("time.sleep"): + RecordingTranscriberWidget.write_to_export_file(path, "data", retries=3, delay=0) + + def test_write_handles_oserror(self, tmp_path): + path = str(tmp_path / "out.txt") + with patch("builtins.open", side_effect=OSError("disk full")): + RecordingTranscriberWidget.write_to_export_file(path, "data") + + def test_read_returns_file_contents(self, tmp_path): + path = str(tmp_path / "in.txt") + with open(path, "w") as f: + f.write("content") + assert RecordingTranscriberWidget.read_export_file(path) == "content" + + def test_read_retries_on_permission_error(self, tmp_path): + path = str(tmp_path / "in.txt") + with open(path, "w") as f: + f.write("ok") + call_count = [0] + original_open = open + + def flaky_open(p, mode="r", **kwargs): + if p == path: + call_count[0] += 1 + if call_count[0] < 2: + raise PermissionError("locked") + return original_open(p, mode, **kwargs) + + with patch("builtins.open", side_effect=flaky_open), \ + patch("time.sleep"): + result = RecordingTranscriberWidget.read_export_file(path, retries=5, delay=0) + + assert result == "ok" + + def test_read_returns_empty_string_on_oserror(self, tmp_path): + path = str(tmp_path / "missing.txt") + with patch("builtins.open", side_effect=OSError("not found")): + assert RecordingTranscriberWidget.read_export_file(path) == "" + + def test_read_returns_empty_string_after_max_retries(self, tmp_path): + path = str(tmp_path / "locked.txt") + with patch("builtins.open", side_effect=PermissionError("locked")), \ + patch("time.sleep"): + result = RecordingTranscriberWidget.read_export_file(path, retries=2, delay=0) + assert result == "" + + + +class TestPresentationTranslationSync: + @pytest.mark.timeout(60) + def test_syncs_translation_when_llm_enabled(self, qtbot): + with _widget_ctx(qtbot) as widget: + widget.transcription_options.enable_llm_translation = True + widget.translation_text_box.setPlainText("Translated content") + widget.on_show_presentation_clicked() + assert "Translated content" in widget.presentation_window._current_translation diff --git a/tests/widgets/transcription_viewer/transcription_viewer_widget_additional_test.py b/tests/widgets/transcription_viewer/transcription_viewer_widget_additional_test.py index 124f3541..bf996203 100644 --- a/tests/widgets/transcription_viewer/transcription_viewer_widget_additional_test.py +++ b/tests/widgets/transcription_viewer/transcription_viewer_widget_additional_test.py @@ -880,3 +880,117 @@ class TestTranscriptionViewerWidgetAdditional: assert widget.follow_audio_enabled == False widget.close() + + def test_on_transcript_segment_clicked(self, qtbot: QtBot, transcription, transcription_service, shortcuts): + """Test on_transcript_segment_clicked method""" + widget = TranscriptionViewerWidget( + transcription, transcription_service, shortcuts + ) + qtbot.add_widget(widget) + + # Without current media player - should return early + widget.current_media_player = None + segment = widget.table_widget.model().record(0) + segment_mock = MagicMock() + segment_mock.start_time = 100 + widget.on_transcript_segment_clicked(segment_mock) + + # With current media player + widget.current_media_player = widget.audio_player + widget.on_transcript_segment_clicked(segment_mock) + + assert hasattr(widget, 'on_transcript_segment_clicked') + + widget.close() + + def test_hide_loop_controls(self, qtbot: QtBot, transcription, transcription_service, shortcuts): + """Test hide_loop_controls method""" + widget = TranscriptionViewerWidget( + transcription, transcription_service, shortcuts + ) + qtbot.add_widget(widget) + widget.show() + + widget.show_loop_controls() + assert widget.loop_controls_frame.isVisible() + + widget.hide_loop_controls() + assert not widget.loop_controls_frame.isVisible() + assert widget.playback_controls_visible is False + + widget.close() + + def test_toggle_playback_controls_visibility_hide(self, qtbot: QtBot, transcription, transcription_service, shortcuts): + """Test toggle_playback_controls_visibility hides controls when visible""" + widget = TranscriptionViewerWidget( + transcription, transcription_service, shortcuts + ) + qtbot.add_widget(widget) + widget.show() + + widget.show_loop_controls() + assert widget.loop_controls_frame.isVisible() + + widget.toggle_playback_controls_visibility() + assert not widget.loop_controls_frame.isVisible() + + widget.close() + + def test_toggle_audio_playback_when_playing(self, qtbot: QtBot, transcription, transcription_service, shortcuts): + """Test toggle_audio_playback pauses when playing""" + widget = TranscriptionViewerWidget( + transcription, transcription_service, shortcuts + ) + qtbot.add_widget(widget) + + # Mock media player in playing state + with patch.object( + widget.current_media_player.media_player, + 'playbackState', + return_value=QMediaPlayer.PlaybackState.PlayingState + ): + # Should call pause + with patch.object(widget.current_media_player.media_player, 'pause') as mock_pause: + widget.toggle_audio_playback() + mock_pause.assert_called_once() + + widget.close() + + def test_video_player_initialization(self, qtbot: QtBot, transcription_dao, transcription_segment_dao, transcription_service, shortcuts): + """Test widget initialization with video file - verifies video player code path""" + import uuid as uuid_mod + from buzz.db.entity.transcription import Transcription + from buzz.db.entity.transcription_segment import TranscriptionSegment + from buzz.model_loader import ModelType, WhisperModelSize + from buzz.transcriber.transcriber import Task + + id = uuid_mod.uuid4() + transcription_dao.insert( + Transcription( + id=str(id), + status="completed", + file="/fake/video.mp4", + task=Task.TRANSCRIBE.value, + model_type=ModelType.WHISPER.value, + whisper_model_size=WhisperModelSize.TINY.value, + ) + ) + transcription_segment_dao.insert( + TranscriptionSegment(0, 500, "Test segment", "", str(id)) + ) + transcription = transcription_dao.find_by_id(str(id)) + + # Patch is_video_file to return True; let VideoPlayer construct normally + # (it won't load media but the widget will be created) + with patch('buzz.widgets.transcription_viewer.transcription_viewer_widget.is_video_file', return_value=True): + widget = TranscriptionViewerWidget( + transcription, transcription_service, shortcuts + ) + qtbot.add_widget(widget) + + # Video player should have been created and set as current + assert widget.is_video is True + assert widget.video_player is not None + assert widget.current_media_player == widget.video_player + + widget.close() From 0f77deb17bb673742dc2450f89320b0f9690c3e3 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 22 Feb 2026 20:00:23 +0200 Subject: [PATCH 24/37] Additional tests (#1393) --- .coveragerc | 7 + pyproject.toml | 8 + tests/mock_sounddevice.py | 17 +- tests/model_loader_test.py | 347 +++++++++++++++++- .../file_transcriber_queue_worker_test.py | 94 +++++ .../hugging_face_search_line_edit_test.py | 177 +++++++++ .../speaker_identification_widget_test.py | 211 +++++++++++ 7 files changed, 855 insertions(+), 6 deletions(-) create mode 100644 tests/widgets/hugging_face_search_line_edit_test.py diff --git a/.coveragerc b/.coveragerc index 566ba584..c682e6aa 100644 --- a/.coveragerc +++ b/.coveragerc @@ -8,5 +8,12 @@ omit = deepmultilingualpunctuation/* ctc_forced_aligner/* +[report] +exclude_also = + if sys.platform == "win32": + if platform.system\(\) == "Windows": + if platform.system\(\) == "Linux": + if platform.system\(\) == "Darwin": + [html] directory = coverage/html diff --git a/pyproject.toml b/pyproject.toml index 7e0fc933..6a39cd84 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -184,6 +184,14 @@ sources = {"demucs_repo/demucs" = "demucs"} requires = ["hatchling", "cmake>=4.2.0,<5", "polib>=1.2.0,<2", "pybind11", "setuptools>=80.9.0"] build-backend = "hatchling.build" +[tool.coverage.report] +exclude_also = [ + "if sys.platform == \"win32\":", + "if platform.system\\(\\) == \"Windows\":", + "if platform.system\\(\\) == \"Linux\":", + "if platform.system\\(\\) == \"Darwin\":", +] + [tool.ruff] exclude = [ "**/whisper.cpp", diff --git a/tests/mock_sounddevice.py b/tests/mock_sounddevice.py index 6b4824dc..820199f9 100644 --- a/tests/mock_sounddevice.py +++ b/tests/mock_sounddevice.py @@ -105,18 +105,25 @@ class MockInputStream: **kwargs, ): self._stop_event = Event() - self.thread = Thread(target=self.target) self.callback = callback + # Pre-load audio on the calling (main) thread to avoid calling + # subprocess.run (fork) from a background thread on macOS, which + # can cause a segfault when Qt is running. + sample_rate = whisper_audio.SAMPLE_RATE + file_path = os.path.join( + os.path.dirname(__file__), "../testdata/whisper-french.mp3" + ) + self._audio = whisper_audio.load_audio(file_path, sr=sample_rate) + + self.thread = Thread(target=self.target) + def start(self): self.thread.start() def target(self): sample_rate = whisper_audio.SAMPLE_RATE - file_path = os.path.join( - os.path.dirname(__file__), "../testdata/whisper-french.mp3" - ) - audio = whisper_audio.load_audio(file_path, sr=sample_rate) + audio = self._audio chunk_duration_secs = 1 diff --git a/tests/model_loader_test.py b/tests/model_loader_test.py index f91f79f4..886e7d18 100644 --- a/tests/model_loader_test.py +++ b/tests/model_loader_test.py @@ -1,9 +1,13 @@ +import io import os +import threading +import time import pytest -from unittest.mock import patch +from unittest.mock import patch, MagicMock, call from buzz.model_loader import ( ModelDownloader, + HuggingfaceDownloadMonitor, TranscriptionModel, ModelType, WhisperModelSize, @@ -287,6 +291,347 @@ class TestTranscriptionModelOpenPath: mock_call.assert_called_once_with(['open', '/some/path']) +class TestTranscriptionModelOpenFileLocation: + def test_whisper_opens_parent_directory(self): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch.object(model, 'get_local_model_path', return_value="/some/path/model.pt"), \ + patch.object(TranscriptionModel, 'open_path') as mock_open: + model.open_file_location() + mock_open.assert_called_once_with(path="/some/path") + + def test_hugging_face_opens_grandparent_directory(self): + model = TranscriptionModel( + model_type=ModelType.HUGGING_FACE, + hugging_face_model_id="openai/whisper-tiny" + ) + with patch.object(model, 'get_local_model_path', return_value="/cache/models/snapshot/model.safetensors"), \ + patch.object(TranscriptionModel, 'open_path') as mock_open: + model.open_file_location() + # For HF: dirname(path) -> /cache/models/snapshot, then open_path(dirname(...)) -> /cache/models + mock_open.assert_called_once_with(path="/cache/models") + + def test_faster_whisper_opens_grandparent_directory(self): + model = TranscriptionModel(model_type=ModelType.FASTER_WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch.object(model, 'get_local_model_path', return_value="/cache/models/snapshot/model.bin"), \ + patch.object(TranscriptionModel, 'open_path') as mock_open: + model.open_file_location() + # For FW: dirname(path) -> /cache/models/snapshot, then open_path(dirname(...)) -> /cache/models + mock_open.assert_called_once_with(path="/cache/models") + + def test_no_model_path_does_nothing(self): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch.object(model, 'get_local_model_path', return_value=None), \ + patch.object(TranscriptionModel, 'open_path') as mock_open: + model.open_file_location() + mock_open.assert_not_called() + + +class TestTranscriptionModelDeleteLocalFile: + def test_whisper_model_removes_file(self, tmp_path): + model_file = tmp_path / "model.pt" + model_file.write_bytes(b"fake model data") + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch.object(model, 'get_local_model_path', return_value=str(model_file)): + model.delete_local_file() + assert not model_file.exists() + + def test_whisper_cpp_custom_removes_file(self, tmp_path): + model_file = tmp_path / "ggml-model-whisper-custom.bin" + model_file.write_bytes(b"fake model data") + model = TranscriptionModel(model_type=ModelType.WHISPER_CPP, whisper_model_size=WhisperModelSize.CUSTOM) + with patch.object(model, 'get_local_model_path', return_value=str(model_file)): + model.delete_local_file() + assert not model_file.exists() + + def test_whisper_cpp_non_custom_removes_bin_file(self, tmp_path): + model_file = tmp_path / "ggml-tiny.bin" + model_file.write_bytes(b"fake model data") + model = TranscriptionModel(model_type=ModelType.WHISPER_CPP, whisper_model_size=WhisperModelSize.TINY) + with patch.object(model, 'get_local_model_path', return_value=str(model_file)): + model.delete_local_file() + assert not model_file.exists() + + def test_whisper_cpp_non_custom_removes_coreml_files(self, tmp_path): + model_file = tmp_path / "ggml-tiny.bin" + model_file.write_bytes(b"fake model data") + coreml_zip = tmp_path / "ggml-tiny-encoder.mlmodelc.zip" + coreml_zip.write_bytes(b"fake zip") + coreml_dir = tmp_path / "ggml-tiny-encoder.mlmodelc" + coreml_dir.mkdir() + model = TranscriptionModel(model_type=ModelType.WHISPER_CPP, whisper_model_size=WhisperModelSize.TINY) + with patch.object(model, 'get_local_model_path', return_value=str(model_file)): + model.delete_local_file() + assert not model_file.exists() + assert not coreml_zip.exists() + assert not coreml_dir.exists() + + def test_hugging_face_removes_directory_tree(self, tmp_path): + # Structure: models--repo/snapshots/abc/model.safetensors + # delete_local_file does dirname(dirname(model_path)) = snapshots_dir + repo_dir = tmp_path / "models--repo" + snapshots_dir = repo_dir / "snapshots" + snapshot_dir = snapshots_dir / "abc123" + snapshot_dir.mkdir(parents=True) + model_file = snapshot_dir / "model.safetensors" + model_file.write_bytes(b"fake model") + + model = TranscriptionModel( + model_type=ModelType.HUGGING_FACE, + hugging_face_model_id="some/repo" + ) + with patch.object(model, 'get_local_model_path', return_value=str(model_file)): + model.delete_local_file() + # Two dirs up from model_file: dirname(dirname(model_file)) = snapshots_dir + assert not snapshots_dir.exists() + + def test_faster_whisper_removes_directory_tree(self, tmp_path): + repo_dir = tmp_path / "faster-whisper-tiny" + snapshots_dir = repo_dir / "snapshots" + snapshot_dir = snapshots_dir / "abc123" + snapshot_dir.mkdir(parents=True) + model_file = snapshot_dir / "model.bin" + model_file.write_bytes(b"fake model") + + model = TranscriptionModel(model_type=ModelType.FASTER_WHISPER, whisper_model_size=WhisperModelSize.TINY) + with patch.object(model, 'get_local_model_path', return_value=str(model_file)): + model.delete_local_file() + # Two dirs up from model_file: dirname(dirname(model_file)) = snapshots_dir + assert not snapshots_dir.exists() + + +class TestHuggingfaceDownloadMonitorFileSize: + def _make_monitor(self, tmp_path): + model_root = str(tmp_path / "models--test" / "snapshots" / "abc") + os.makedirs(model_root, exist_ok=True) + progress = MagicMock() + progress.emit = MagicMock() + monitor = HuggingfaceDownloadMonitor( + model_root=model_root, + progress=progress, + total_file_size=100 * 1024 * 1024 + ) + return monitor + + def test_emits_progress_for_tmp_files(self, tmp_path): + from buzz.model_loader import model_root_dir as orig_root + monitor = self._make_monitor(tmp_path) + + # Create a tmp file in model_root_dir + with patch('buzz.model_loader.model_root_dir', str(tmp_path)): + tmp_file = tmp_path / "tmpXYZ123" + tmp_file.write_bytes(b"x" * 1024) + + monitor.stop_event.clear() + # Run one iteration + monitor.monitor_file_size.__func__ if hasattr(monitor.monitor_file_size, '__func__') else None + + # Manually call internal logic once + emitted = [] + original_emit = monitor.progress.emit + monitor.progress.emit = lambda x: emitted.append(x) + + import buzz.model_loader as ml + old_root = ml.model_root_dir + ml.model_root_dir = str(tmp_path) + try: + monitor.stop_event.set() # stop after one iteration + monitor.stop_event.clear() + # call once manually by running the loop body + for filename in os.listdir(str(tmp_path)): + if filename.startswith("tmp"): + file_size = os.path.getsize(os.path.join(str(tmp_path), filename)) + monitor.progress.emit((file_size, monitor.total_file_size)) + assert len(emitted) > 0 + assert emitted[0][0] == 1024 + finally: + ml.model_root_dir = old_root + + def test_emits_progress_for_incomplete_files(self, tmp_path): + monitor = self._make_monitor(tmp_path) + + blobs_dir = tmp_path / "blobs" + blobs_dir.mkdir() + incomplete_file = blobs_dir / "somefile.incomplete" + incomplete_file.write_bytes(b"y" * 2048) + + emitted = [] + monitor.incomplete_download_root = str(blobs_dir) + monitor.progress.emit = lambda x: emitted.append(x) + + for filename in os.listdir(str(blobs_dir)): + if filename.endswith(".incomplete"): + file_size = os.path.getsize(os.path.join(str(blobs_dir), filename)) + monitor.progress.emit((file_size, monitor.total_file_size)) + + assert len(emitted) > 0 + assert emitted[0][0] == 2048 + + def test_stop_monitoring_emits_100_percent(self, tmp_path): + monitor = self._make_monitor(tmp_path) + monitor.monitor_thread = MagicMock() + monitor.stop_monitoring() + monitor.progress.emit.assert_called_with( + (monitor.total_file_size, monitor.total_file_size) + ) + + +class TestModelDownloaderDownloadModel: + def _make_downloader(self, model): + downloader = ModelDownloader(model=model) + downloader.signals = MagicMock() + downloader.signals.progress = MagicMock() + downloader.signals.progress.emit = MagicMock() + return downloader + + def test_download_model_fresh_success(self, tmp_path): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + downloader = self._make_downloader(model) + + file_path = str(tmp_path / "model.pt") + fake_content = b"fake model data" * 100 + + mock_response = MagicMock() + mock_response.__enter__ = lambda s: s + mock_response.__exit__ = MagicMock(return_value=False) + mock_response.status_code = 200 + mock_response.headers = {"Content-Length": str(len(fake_content))} + mock_response.iter_content = MagicMock(return_value=[fake_content]) + mock_response.raise_for_status = MagicMock() + + with patch('requests.get', return_value=mock_response), \ + patch('requests.head') as mock_head: + result = downloader.download_model(url="http://example.com/model.pt", file_path=file_path, expected_sha256=None) + + assert result is True + assert os.path.exists(file_path) + assert open(file_path, 'rb').read() == fake_content + + def test_download_model_already_downloaded_sha256_match(self, tmp_path): + import hashlib + content = b"complete model content" + sha256 = hashlib.sha256(content).hexdigest() + model_file = tmp_path / "model.pt" + model_file.write_bytes(content) + + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + downloader = self._make_downloader(model) + + mock_head = MagicMock() + mock_head.headers = {"Content-Length": str(len(content)), "Accept-Ranges": "bytes"} + mock_head.raise_for_status = MagicMock() + + with patch('requests.head', return_value=mock_head): + result = downloader.download_model( + url="http://example.com/model.pt", + file_path=str(model_file), + expected_sha256=sha256 + ) + + assert result is True + + def test_download_model_sha256_mismatch_redownloads(self, tmp_path): + import hashlib + content = b"complete model content" + bad_sha256 = "0" * 64 + model_file = tmp_path / "model.pt" + model_file.write_bytes(content) + + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + downloader = self._make_downloader(model) + + new_content = b"new model data" + mock_head = MagicMock() + mock_head.headers = {"Content-Length": str(len(content)), "Accept-Ranges": "bytes"} + mock_head.raise_for_status = MagicMock() + + mock_response = MagicMock() + mock_response.__enter__ = lambda s: s + mock_response.__exit__ = MagicMock(return_value=False) + mock_response.status_code = 200 + mock_response.headers = {"Content-Length": str(len(new_content))} + mock_response.iter_content = MagicMock(return_value=[new_content]) + mock_response.raise_for_status = MagicMock() + + with patch('requests.head', return_value=mock_head), \ + patch('requests.get', return_value=mock_response): + with pytest.raises(RuntimeError, match="SHA256 checksum does not match"): + downloader.download_model( + url="http://example.com/model.pt", + file_path=str(model_file), + expected_sha256=bad_sha256 + ) + + # File is deleted after SHA256 mismatch + assert not model_file.exists() + + def test_download_model_stopped_mid_download(self, tmp_path): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + downloader = self._make_downloader(model) + downloader.stopped = True + + file_path = str(tmp_path / "model.pt") + + def iter_content_gen(chunk_size): + yield b"chunk1" + + mock_response = MagicMock() + mock_response.__enter__ = lambda s: s + mock_response.__exit__ = MagicMock(return_value=False) + mock_response.status_code = 200 + mock_response.headers = {"Content-Length": "6"} + mock_response.iter_content = iter_content_gen + mock_response.raise_for_status = MagicMock() + + with patch('requests.get', return_value=mock_response): + result = downloader.download_model( + url="http://example.com/model.pt", + file_path=file_path, + expected_sha256=None + ) + + assert result is False + + def test_download_model_resumes_partial(self, tmp_path): + model = TranscriptionModel(model_type=ModelType.WHISPER, whisper_model_size=WhisperModelSize.TINY) + downloader = self._make_downloader(model) + + existing_content = b"partial" + model_file = tmp_path / "model.pt" + model_file.write_bytes(existing_content) + resume_content = b" completed" + total_size = len(existing_content) + len(resume_content) + + mock_head_size = MagicMock() + mock_head_size.headers = {"Content-Length": str(total_size), "Accept-Ranges": "bytes"} + mock_head_size.raise_for_status = MagicMock() + + mock_head_range = MagicMock() + mock_head_range.headers = {"Accept-Ranges": "bytes"} + mock_head_range.raise_for_status = MagicMock() + + mock_response = MagicMock() + mock_response.__enter__ = lambda s: s + mock_response.__exit__ = MagicMock(return_value=False) + mock_response.status_code = 206 + mock_response.headers = { + "Content-Range": f"bytes {len(existing_content)}-{total_size - 1}/{total_size}", + "Content-Length": str(len(resume_content)) + } + mock_response.iter_content = MagicMock(return_value=[resume_content]) + mock_response.raise_for_status = MagicMock() + + with patch('requests.head', side_effect=[mock_head_size, mock_head_range]), \ + patch('requests.get', return_value=mock_response): + result = downloader.download_model( + url="http://example.com/model.pt", + file_path=str(model_file), + expected_sha256=None + ) + + assert result is True + assert open(str(model_file), 'rb').read() == existing_content + resume_content + + class TestModelLoaderCertifiImportError: def test_certifi_import_error_path(self): """Test that module handles certifi ImportError gracefully by reimporting with mock""" diff --git a/tests/transcriber/file_transcriber_queue_worker_test.py b/tests/transcriber/file_transcriber_queue_worker_test.py index 52b5d2b9..03936bc8 100644 --- a/tests/transcriber/file_transcriber_queue_worker_test.py +++ b/tests/transcriber/file_transcriber_queue_worker_test.py @@ -242,6 +242,100 @@ class TestFileTranscriberQueueWorker: error_spy.assert_not_called() +class TestFileTranscriberQueueWorkerRun: + def _make_task(self, model_type=ModelType.WHISPER_CPP, extract_speech=False): + options = TranscriptionOptions( + model=TranscriptionModel(model_type=model_type, whisper_model_size=WhisperModelSize.TINY), + extract_speech=extract_speech + ) + return FileTranscriptionTask( + file_path=str(test_multibyte_utf8_audio_path), + transcription_options=options, + file_transcription_options=FileTranscriptionOptions(), + model_path="mock_path" + ) + + def test_run_returns_early_when_already_running(self, simple_worker): + simple_worker.is_running = True + # Should return without blocking (queue is empty, no get() call) + simple_worker.run() + # is_running stays True, nothing changed + assert simple_worker.is_running is True + + def test_run_stops_on_sentinel(self, simple_worker, qapp): + completed_spy = unittest.mock.Mock() + simple_worker.completed.connect(completed_spy) + + simple_worker.tasks_queue.put(None) + simple_worker.run() + + completed_spy.assert_called_once() + assert simple_worker.is_running is False + + def test_run_skips_canceled_task_then_stops_on_sentinel(self, simple_worker, qapp): + task = self._make_task() + simple_worker.canceled_tasks.add(task.uid) + + started_spy = unittest.mock.Mock() + simple_worker.task_started.connect(started_spy) + + # Put canceled task then sentinel + simple_worker.tasks_queue.put(task) + simple_worker.tasks_queue.put(None) + + simple_worker.run() + + # Canceled task should be skipped; completed emitted + started_spy.assert_not_called() + assert simple_worker.is_running is False + + def test_run_creates_openai_transcriber(self, simple_worker, qapp): + from buzz.transcriber.openai_whisper_api_file_transcriber import OpenAIWhisperAPIFileTranscriber + + task = self._make_task(model_type=ModelType.OPEN_AI_WHISPER_API) + simple_worker.tasks_queue.put(task) + + with unittest.mock.patch.object(OpenAIWhisperAPIFileTranscriber, 'run'), \ + unittest.mock.patch.object(OpenAIWhisperAPIFileTranscriber, 'moveToThread'), \ + unittest.mock.patch('buzz.file_transcriber_queue_worker.QThread') as mock_thread_class: + mock_thread = unittest.mock.MagicMock() + mock_thread_class.return_value = mock_thread + + simple_worker.run() + + assert isinstance(simple_worker.current_transcriber, OpenAIWhisperAPIFileTranscriber) + + def test_run_creates_whisper_transcriber_for_whisper_cpp(self, simple_worker, qapp): + task = self._make_task(model_type=ModelType.WHISPER_CPP) + simple_worker.tasks_queue.put(task) + + with unittest.mock.patch.object(WhisperFileTranscriber, 'run'), \ + unittest.mock.patch.object(WhisperFileTranscriber, 'moveToThread'), \ + unittest.mock.patch('buzz.file_transcriber_queue_worker.QThread') as mock_thread_class: + mock_thread = unittest.mock.MagicMock() + mock_thread_class.return_value = mock_thread + + simple_worker.run() + + assert isinstance(simple_worker.current_transcriber, WhisperFileTranscriber) + + def test_run_speech_extraction_failure_emits_error(self, simple_worker, qapp): + task = self._make_task(extract_speech=True) + simple_worker.tasks_queue.put(task) + + error_spy = unittest.mock.Mock() + simple_worker.task_error.connect(error_spy) + + with unittest.mock.patch('buzz.file_transcriber_queue_worker.demucsApi.Separator', + side_effect=RuntimeError("No internet")): + simple_worker.run() + + error_spy.assert_called_once() + args = error_spy.call_args[0] + assert args[0] == task + assert simple_worker.is_running is False + + def test_transcription_with_whisper_cpp_tiny_no_speech_extraction(worker): options = TranscriptionOptions( model=TranscriptionModel(model_type=ModelType.WHISPER_CPP, whisper_model_size=WhisperModelSize.TINY), diff --git a/tests/widgets/hugging_face_search_line_edit_test.py b/tests/widgets/hugging_face_search_line_edit_test.py new file mode 100644 index 00000000..d9a5b312 --- /dev/null +++ b/tests/widgets/hugging_face_search_line_edit_test.py @@ -0,0 +1,177 @@ +import json +from unittest.mock import MagicMock, patch + +import pytest +from PyQt6.QtCore import Qt, QEvent, QPoint +from PyQt6.QtGui import QKeyEvent +from PyQt6.QtNetwork import QNetworkReply, QNetworkAccessManager +from PyQt6.QtWidgets import QListWidgetItem +from pytestqt.qtbot import QtBot + +from buzz.widgets.transcriber.hugging_face_search_line_edit import HuggingFaceSearchLineEdit + + +@pytest.fixture +def widget(qtbot: QtBot): + mock_manager = MagicMock(spec=QNetworkAccessManager) + mock_manager.finished = MagicMock() + mock_manager.finished.connect = MagicMock() + w = HuggingFaceSearchLineEdit(network_access_manager=mock_manager) + qtbot.add_widget(w) + # Prevent popup.show() from triggering a Wayland fatal protocol error + # in headless/CI environments where popup windows lack a transient parent. + w.popup.show = MagicMock() + return w + + +class TestHuggingFaceSearchLineEdit: + def test_initial_state(self, widget): + assert widget.text() == "" + assert widget.placeholderText() != "" + + def test_default_value_set(self, qtbot: QtBot): + mock_manager = MagicMock(spec=QNetworkAccessManager) + mock_manager.finished = MagicMock() + mock_manager.finished.connect = MagicMock() + w = HuggingFaceSearchLineEdit(default_value="openai/whisper-tiny", network_access_manager=mock_manager) + qtbot.add_widget(w) + assert w.text() == "openai/whisper-tiny" + + def test_on_text_edited_emits_model_selected(self, widget, qtbot: QtBot): + spy = MagicMock() + widget.model_selected.connect(spy) + widget.on_text_edited("some/model") + spy.assert_called_once_with("some/model") + + def test_fetch_models_skips_short_text(self, widget): + widget.setText("ab") + result = widget.fetch_models() + assert result is None + + def test_fetch_models_makes_request_for_long_text(self, widget): + widget.setText("whisper-tiny") + mock_reply = MagicMock() + widget.network_manager.get = MagicMock(return_value=mock_reply) + result = widget.fetch_models() + widget.network_manager.get.assert_called_once() + assert result == mock_reply + + def test_fetch_models_url_contains_search_text(self, widget): + widget.setText("whisper") + widget.network_manager.get = MagicMock(return_value=MagicMock()) + widget.fetch_models() + call_args = widget.network_manager.get.call_args[0][0] + assert "whisper" in call_args.url().toString() + + def test_on_request_response_network_error_does_not_populate_popup(self, widget): + mock_reply = MagicMock(spec=QNetworkReply) + mock_reply.error.return_value = QNetworkReply.NetworkError.ConnectionRefusedError + widget.on_request_response(mock_reply) + assert widget.popup.count() == 0 + + def test_on_request_response_populates_popup(self, widget): + mock_reply = MagicMock(spec=QNetworkReply) + mock_reply.error.return_value = QNetworkReply.NetworkError.NoError + models = [{"id": "openai/whisper-tiny"}, {"id": "openai/whisper-base"}] + mock_reply.readAll.return_value.data.return_value = json.dumps(models).encode() + widget.on_request_response(mock_reply) + assert widget.popup.count() == 2 + assert widget.popup.item(0).text() == "openai/whisper-tiny" + assert widget.popup.item(1).text() == "openai/whisper-base" + + def test_on_request_response_empty_models_does_not_show_popup(self, widget): + mock_reply = MagicMock(spec=QNetworkReply) + mock_reply.error.return_value = QNetworkReply.NetworkError.NoError + mock_reply.readAll.return_value.data.return_value = json.dumps([]).encode() + widget.on_request_response(mock_reply) + assert widget.popup.count() == 0 + widget.popup.show.assert_not_called() + + def test_on_request_response_item_has_user_role_data(self, widget): + mock_reply = MagicMock(spec=QNetworkReply) + mock_reply.error.return_value = QNetworkReply.NetworkError.NoError + models = [{"id": "facebook/mms-1b-all"}] + mock_reply.readAll.return_value.data.return_value = json.dumps(models).encode() + widget.on_request_response(mock_reply) + item = widget.popup.item(0) + assert item.data(Qt.ItemDataRole.UserRole) == "facebook/mms-1b-all" + + def test_on_select_item_emits_model_selected(self, widget, qtbot: QtBot): + item = QListWidgetItem("openai/whisper-tiny") + item.setData(Qt.ItemDataRole.UserRole, "openai/whisper-tiny") + widget.popup.addItem(item) + widget.popup.setCurrentItem(item) + + spy = MagicMock() + widget.model_selected.connect(spy) + widget.on_select_item() + + spy.assert_called_with("openai/whisper-tiny") + assert widget.text() == "openai/whisper-tiny" + + def test_on_select_item_hides_popup(self, widget): + item = QListWidgetItem("openai/whisper-tiny") + item.setData(Qt.ItemDataRole.UserRole, "openai/whisper-tiny") + widget.popup.addItem(item) + widget.popup.setCurrentItem(item) + + with patch.object(widget.popup, 'hide') as mock_hide: + widget.on_select_item() + mock_hide.assert_called_once() + + def test_on_popup_selected_stops_timer(self, widget): + widget.timer.start() + assert widget.timer.isActive() + widget.on_popup_selected() + assert not widget.timer.isActive() + + def test_event_filter_ignores_non_popup_target(self, widget): + other = MagicMock() + event = MagicMock() + assert widget.eventFilter(other, event) is False + + def test_event_filter_mouse_press_hides_popup(self, widget): + event = MagicMock() + event.type.return_value = QEvent.Type.MouseButtonPress + with patch.object(widget.popup, 'hide') as mock_hide: + result = widget.eventFilter(widget.popup, event) + assert result is True + mock_hide.assert_called_once() + + def test_event_filter_escape_hides_popup(self, widget, qtbot: QtBot): + event = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_Escape, Qt.KeyboardModifier.NoModifier) + with patch.object(widget.popup, 'hide') as mock_hide: + result = widget.eventFilter(widget.popup, event) + assert result is True + mock_hide.assert_called_once() + + def test_event_filter_enter_selects_item(self, widget, qtbot: QtBot): + item = QListWidgetItem("openai/whisper-tiny") + item.setData(Qt.ItemDataRole.UserRole, "openai/whisper-tiny") + widget.popup.addItem(item) + widget.popup.setCurrentItem(item) + + spy = MagicMock() + widget.model_selected.connect(spy) + + event = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_Return, Qt.KeyboardModifier.NoModifier) + result = widget.eventFilter(widget.popup, event) + assert result is True + spy.assert_called_with("openai/whisper-tiny") + + def test_event_filter_enter_no_item_returns_true(self, widget, qtbot: QtBot): + event = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_Return, Qt.KeyboardModifier.NoModifier) + result = widget.eventFilter(widget.popup, event) + assert result is True + + def test_event_filter_navigation_keys_return_false(self, widget): + for key in [Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Home, + Qt.Key.Key_End, Qt.Key.Key_PageUp, Qt.Key.Key_PageDown]: + event = QKeyEvent(QEvent.Type.KeyPress, key, Qt.KeyboardModifier.NoModifier) + assert widget.eventFilter(widget.popup, event) is False + + def test_event_filter_other_key_hides_popup(self, widget): + event = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier) + with patch.object(widget.popup, 'hide') as mock_hide: + widget.eventFilter(widget.popup, event) + mock_hide.assert_called_once() diff --git a/tests/widgets/speaker_identification_widget_test.py b/tests/widgets/speaker_identification_widget_test.py index 5b65514d..fc97a819 100644 --- a/tests/widgets/speaker_identification_widget_test.py +++ b/tests/widgets/speaker_identification_widget_test.py @@ -90,6 +90,217 @@ class TestSpeakerIdentificationWidget: assert (result == [[{'end_time': 8904, 'speaker': 'Speaker 0', 'start_time': 140, 'text': 'Bien venue dans. '}]] or result == [[{'end_time': 8904, 'speaker': 'Speaker 0', 'start_time': 140, 'text': 'Bienvenue dans. '}]]) + def test_identify_button_toggles_visibility(self, qtbot: QtBot, transcription, transcription_service): + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + qtbot.addWidget(widget) + + # Before: identify visible, cancel hidden + assert not widget.step_1_button.isHidden() + assert widget.cancel_button.isHidden() + + from PyQt6.QtCore import QThread as RealQThread + mock_thread = MagicMock(spec=RealQThread) + mock_thread.started = MagicMock() + mock_thread.started.connect = MagicMock() + + with patch.object(widget, '_cleanup_thread'), \ + patch('buzz.widgets.transcription_viewer.speaker_identification_widget.QThread', return_value=mock_thread), \ + patch.object(widget, 'worker', create=True): + # patch moveToThread on IdentificationWorker to avoid type error + with patch.object(IdentificationWorker, 'moveToThread'): + widget.on_identify_button_clicked() + + # After: identify hidden, cancel visible + assert widget.step_1_button.isHidden() + assert not widget.cancel_button.isHidden() + + widget.close() + + def test_cancel_button_resets_ui(self, qtbot: QtBot, transcription, transcription_service): + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + qtbot.addWidget(widget) + + # Simulate identification started + widget.step_1_button.setVisible(False) + widget.cancel_button.setVisible(True) + + with patch.object(widget, '_cleanup_thread'): + widget.on_cancel_button_clicked() + + assert not widget.step_1_button.isHidden() + assert widget.cancel_button.isHidden() + assert widget.progress_bar.value() == 0 + assert len(widget.progress_label.text()) > 0 + + widget.close() + + def test_on_progress_update_sets_label_and_bar(self, qtbot: QtBot, transcription, transcription_service): + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + qtbot.addWidget(widget) + + widget.on_progress_update("3/8 Loading alignment model") + + assert widget.progress_label.text() == "3/8 Loading alignment model" + assert widget.progress_bar.value() == 3 + + widget.close() + + def test_on_progress_update_step_8_enables_save(self, qtbot: QtBot, transcription, transcription_service): + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + qtbot.addWidget(widget) + + assert not widget.save_button.isEnabled() + + widget.on_progress_update("8/8 Identification done") + + assert widget.save_button.isEnabled() + assert widget.step_2_group_box.isEnabled() + assert widget.merge_speaker_sentences.isEnabled() + + widget.close() + + def test_on_identification_finished_empty_result(self, qtbot: QtBot, transcription, transcription_service): + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + qtbot.addWidget(widget) + + initial_row_count = widget.speaker_preview_row.count() + + widget.on_identification_finished([]) + + assert widget.identification_result == [] + # Empty result returns early — speaker preview row unchanged + assert widget.speaker_preview_row.count() == initial_row_count + + widget.close() + + def test_on_identification_finished_populates_speakers(self, qtbot: QtBot, transcription, transcription_service): + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + qtbot.addWidget(widget) + + result = [ + {'speaker': 'Speaker 0', 'start_time': 0, 'end_time': 3000, 'text': 'Hello world.'}, + {'speaker': 'Speaker 1', 'start_time': 3000, 'end_time': 6000, 'text': 'Hi there.'}, + ] + widget.on_identification_finished(result) + + assert widget.identification_result == result + # Two speaker rows should have been created + assert widget.speaker_preview_row.count() == 2 + + widget.close() + + def test_on_identification_error_resets_buttons(self, qtbot: QtBot, transcription, transcription_service): + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + qtbot.addWidget(widget) + + widget.step_1_button.setVisible(False) + widget.cancel_button.setVisible(True) + + widget.on_identification_error("Some error") + + assert not widget.step_1_button.isHidden() + assert widget.cancel_button.isHidden() + assert widget.progress_bar.value() == 0 + + widget.close() + + def test_on_save_no_merge(self, qtbot: QtBot, transcription, transcription_service): + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + qtbot.addWidget(widget) + + result = [ + {'speaker': 'Speaker 0', 'start_time': 0, 'end_time': 2000, 'text': 'Hello.'}, + {'speaker': 'Speaker 0', 'start_time': 2000, 'end_time': 4000, 'text': 'World.'}, + {'speaker': 'Speaker 1', 'start_time': 4000, 'end_time': 6000, 'text': 'Hi.'}, + ] + widget.on_identification_finished(result) + widget.merge_speaker_sentences.setChecked(False) + + with patch.object(widget.transcription_service, 'copy_transcription', return_value=uuid.uuid4()) as mock_copy, \ + patch.object(widget.transcription_service, 'update_transcription_as_completed') as mock_update: + widget.on_save_button_clicked() + + mock_copy.assert_called_once() + mock_update.assert_called_once() + segments = mock_update.call_args[0][1] + # No merge: 3 entries → 3 segments + assert len(segments) == 3 + + widget.close() + + def test_on_save_with_merge(self, qtbot: QtBot, transcription, transcription_service): + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + ) + qtbot.addWidget(widget) + + result = [ + {'speaker': 'Speaker 0', 'start_time': 0, 'end_time': 2000, 'text': 'Hello.'}, + {'speaker': 'Speaker 0', 'start_time': 2000, 'end_time': 4000, 'text': 'World.'}, + {'speaker': 'Speaker 1', 'start_time': 4000, 'end_time': 6000, 'text': 'Hi.'}, + ] + widget.on_identification_finished(result) + widget.merge_speaker_sentences.setChecked(True) + + with patch.object(widget.transcription_service, 'copy_transcription', return_value=uuid.uuid4()), \ + patch.object(widget.transcription_service, 'update_transcription_as_completed') as mock_update: + widget.on_save_button_clicked() + + segments = mock_update.call_args[0][1] + # Merge: two consecutive Speaker 0 entries → merged into 1; Speaker 1 → 1 = 2 total + assert len(segments) == 2 + assert "Speaker 0" in segments[0].text + assert "Hello." in segments[0].text + assert "World." in segments[0].text + + widget.close() + + def test_on_save_emits_transcriptions_updated(self, qtbot: QtBot, transcription, transcription_service): + updated_signal = MagicMock() + widget = SpeakerIdentificationWidget( + transcription=transcription, + transcription_service=transcription_service, + transcriptions_updated_signal=updated_signal, + ) + qtbot.addWidget(widget) + + result = [{'speaker': 'Speaker 0', 'start_time': 0, 'end_time': 1000, 'text': 'Hi.'}] + widget.on_identification_finished(result) + + new_id = uuid.uuid4() + with patch.object(widget.transcription_service, 'copy_transcription', return_value=new_id), \ + patch.object(widget.transcription_service, 'update_transcription_as_completed'): + widget.on_save_button_clicked() + + updated_signal.emit.assert_called_once_with(new_id) + + widget.close() + def test_batch_processing_with_many_words(self): """Test batch processing when there are more than 200 words.""" # Create mock punctuation model From b2f98f139ee5894e1265b39c164e762dd495130f Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Thu, 26 Feb 2026 22:24:35 +0200 Subject: [PATCH 25/37] Youtube download update (#1396) --- .github/workflows/ci.yml | 4 ++-- buzz/transcriber/whisper_cpp.py | 5 +++++ pyproject.toml | 2 +- snap/snapcraft.yaml | 2 +- uv.lock | 30 ++++++++++++------------------ 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 43cf1cef..19e33ae7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -81,7 +81,7 @@ jobs: # Add ubuntu-toolchain-r PPA for newer libstdc++6 with GLIBCXX_3.4.32 sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y sudo apt-get update - sudo apt-get install -y gcc-13 g++-13 libstdc++-13-dev + sudo apt-get install -y libstdc++6 fi sudo apt-get install libyaml-dev libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-shape0 libxcb-cursor0 libportaudio2 gettext libpulse0 libgl1-mesa-dev libvulkan-dev ccache @@ -167,7 +167,7 @@ jobs: # Add ubuntu-toolchain-r PPA for newer libstdc++6 with GLIBCXX_3.4.32 sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y sudo apt-get update - sudo apt-get install -y gcc-13 g++-13 libstdc++-13-dev + sudo apt-get install -y libstdc++6 fi sudo apt-get install libyaml-dev libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-shape0 libxcb-cursor0 libportaudio2 gettext libpulse0 libgl1-mesa-dev libvulkan-dev ccache diff --git a/buzz/transcriber/whisper_cpp.py b/buzz/transcriber/whisper_cpp.py index d5fa1775..977b785e 100644 --- a/buzz/transcriber/whisper_cpp.py +++ b/buzz/transcriber/whisper_cpp.py @@ -303,6 +303,11 @@ class WhisperCpp: if not token_text: continue + # Skip low probability tokens + token_p = token_data.get("p", 1.0) + if token_p < 0.01: + continue + token_start = int(token_data.get("offsets", {}).get("from", 0)) token_end = int(token_data.get("offsets", {}).get("to", 0)) diff --git a/pyproject.toml b/pyproject.toml index 6a39cd84..789d4818 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ dependencies = [ "dataclasses-json>=0.6.4,<0.7", "numpy>=1.21.2,<2", "requests>=2.31.0,<3", - "yt-dlp>=2025.11.12,<2026", + "yt-dlp>=2026.2.21", "stable-ts>=2.19.1,<3", "faster-whisper>=1.2.1,<2", "openai-whisper==20250625", diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index abb6a7cd..ea1b5284 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -152,7 +152,7 @@ apps: desktop: usr/share/applications/buzz.desktop environment: PATH: $SNAP/usr/bin:$SNAP/bin:$PATH - LD_LIBRARY_PATH: $SNAP/lib/python3.12/site-packages/nvidia/cudnn/lib:$SNAP/lib/python3.12/site-packages/PyQt6:$SNAP/lib/python3.12/site-packages/PyQt6/Qt6/lib:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/lapack:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/blas:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/oss4-libsalsa:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy:$SNAP:$LD_LIBRARY_PATH + LD_LIBRARY_PATH: $SNAP/lib/python3.12/site-packages/nvidia/cudnn/lib:$SNAP/lib/python3.12/site-packages/PyQt6:$SNAP/lib/python3.12/site-packages/PyQt6/Qt6/lib:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/lapack:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/blas:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/oss4-libsalsa:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib:$SNAP:$LD_LIBRARY_PATH PYTHONPATH: $SNAP:$SNAP/lib/python3.12/site-packages/PyQt6:$SNAP/lib/python3.12/site-packages/PyQt6/Qt6/lib:$SNAP/usr/lib/python3/dist-packages:$SNAP/usr/lib/python3.12/site-packages:$SNAP/usr/local/lib/python3.12/dist-packages:$SNAP/usr/lib/python3.12/dist-packages:$PYTHONPATH QT_MEDIA_BACKEND: ffmpeg PULSE_LATENCY_MSEC: "30" diff --git a/uv.lock b/uv.lock index 5b51fac1..88630000 100644 --- a/uv.lock +++ b/uv.lock @@ -435,7 +435,7 @@ requires-dist = [ { name = "urllib3", specifier = ">=2.6.0,<3" }, { name = "uroman", specifier = ">=1.3.1.1" }, { name = "vulkan", specifier = ">=1.3.275.1,<2" }, - { name = "yt-dlp", specifier = ">=2025.11.12,<2026" }, + { name = "yt-dlp", specifier = ">=2026.2.21" }, ] [package.metadata.requires-dev] @@ -1862,21 +1862,15 @@ wheels = [ [[package]] name = "markupsafe" -version = "3.0.3" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +version = "3.0.2" +source = { registry = "https://download.pytorch.org/whl/cu129" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, - { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, - { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, - { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, - { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, - { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, - { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, - { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl" }, ] [[package]] @@ -4584,9 +4578,9 @@ wheels = [ [[package]] name = "yt-dlp" -version = "2025.12.8" +version = "2026.2.21" source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/14/77/db924ebbd99d0b2b571c184cb08ed232cf4906c6f9b76eed763cd2c84170/yt_dlp-2025.12.8.tar.gz", hash = "sha256:b773c81bb6b71cb2c111cfb859f453c7a71cf2ef44eff234ff155877184c3e4f", size = 3088947, upload-time = "2025-12-08T00:16:01.649Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/d9/55ffff25204733e94a507552ad984d5a8a8e4f9d1f0d91763e6b1a41c79b/yt_dlp-2026.2.21.tar.gz", hash = "sha256:4407dfc1a71fec0dee5ef916a8d4b66057812939b509ae45451fa8fb4376b539", size = 3116630, upload-time = "2026-02-21T20:40:53.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/2f/98c3596ad923f8efd32c90dca62e241e8ad9efcebf20831173c357042ba0/yt_dlp-2025.12.8-py3-none-any.whl", hash = "sha256:36e2584342e409cfbfa0b5e61448a1c5189e345cf4564294456ee509e7d3e065", size = 3291464, upload-time = "2025-12-08T00:15:58.556Z" }, + { url = "https://files.pythonhosted.org/packages/5a/40/664c99ee36d80d84ce7a96cd98aebcb3d16c19e6c3ad3461d2cf5424040e/yt_dlp-2026.2.21-py3-none-any.whl", hash = "sha256:0d8408f5b6d20487f5caeb946dfd04f9bcd2f1a3a125b744a0a982b590e449f7", size = 3313392, upload-time = "2026-02-21T20:40:51.514Z" }, ] From ff1f521a6a294564758fff091be25b04afa66702 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 27 Feb 2026 11:11:51 +0200 Subject: [PATCH 26/37] 1389 add folder import (#1398) --- Buzz.spec | 2 +- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 17 +- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 16 +- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 16 +- buzz/locale/en_US/LC_MESSAGES/buzz.po | 14 +- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 19 +- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 17 +- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 16 +- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 20 +- buzz/locale/nl/LC_MESSAGES/buzz.po | 16 +- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 16 +- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 17 +- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 16 +- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 16 +- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 16 +- buzz/widgets/main_window.py | 19 +- buzz/widgets/main_window_toolbar.py | 6 - buzz/widgets/menu_bar.py | 5 + tests/model_loader_test.py | 118 ++++++ tests/widgets/main_window_test.py | 62 +++ tests/widgets/menu_bar_test.py | 14 + .../transcription_tasks_table_widget_test.py | 371 ++++++++++++++++++ 22 files changed, 761 insertions(+), 68 deletions(-) diff --git a/Buzz.spec b/Buzz.spec index fca6db93..f590f0f5 100644 --- a/Buzz.spec +++ b/Buzz.spec @@ -46,7 +46,7 @@ datas += collect_data_files("whisper") datas += collect_data_files("demucs", include_py_files=True) datas += collect_data_files("whisper_diarization", include_py_files=True) datas += collect_data_files("deepmultilingualpunctuation", include_py_files=True) -datas += collect_data_files("ctc_forced_aligner", include_py_files=True) +datas += collect_data_files("ctc_forced_aligner", include_py_files=True, excludes=["build"]) datas += collect_data_files("nemo", include_py_files=True) datas += collect_data_files("lightning_fabric", include_py_files=True) datas += collect_data_files("pytorch_lightning", include_py_files=True) diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 7619f108..efee2942 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -422,9 +422,8 @@ msgid "AI model:" msgstr "Model d'IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +#, fuzzy +msgid "Please translate each text sent to you from English to Spanish." msgstr "" "Introdueix instruccions per a la IA sobre com traduir, per exemple 'Si us " "plau, tradueix cada text que t'hagi enviat de l'anglès al castellà'." @@ -1007,6 +1006,11 @@ msgstr "Importa fitxer..." msgid "Import URL..." msgstr "Importa l'URL..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "Importa fitxer..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "Quant a" @@ -1035,6 +1039,11 @@ msgstr "" msgid "Select audio file" msgstr "Selecciona un fitxer d'àudio" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "Selecciona la carpeta d'entrada" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "No s'ha pogut desar la clau OpenAI API a l'anell de claus" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index b96091ff..3b8c9ba7 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -420,9 +420,7 @@ msgid "AI model:" msgstr "AI model:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +msgid "Please translate each text sent to you from English to Spanish." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -1001,6 +999,11 @@ msgstr "Importer Fil..." msgid "Import URL..." msgstr "Importer URL..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "Importer Fil..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "Om" @@ -1029,6 +1032,11 @@ msgstr "" msgid "Select audio file" msgstr "Vælg audio-fil" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "Vælg inputmappe" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "Kan ikke gemme OpenAI API-nøgle i nøgleringen" diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index b437accb..91adbe57 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -422,9 +422,7 @@ msgid "AI model:" msgstr "KI-Modell:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +msgid "Please translate each text sent to you from English to Spanish." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -1002,6 +1000,11 @@ msgstr "Datei importieren..." msgid "Import URL..." msgstr "URL importieren..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "Datei importieren..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "Über" @@ -1030,6 +1033,11 @@ msgstr "" msgid "Select audio file" msgstr "Audiodatei auswählen" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "Eingabeordner auswählen" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index 50dee5de..b0db6c97 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -410,9 +410,7 @@ msgid "AI model:" msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +msgid "Please translate each text sent to you from English to Spanish." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -974,6 +972,10 @@ msgstr "" msgid "Import URL..." msgstr "" +#: buzz/widgets/menu_bar.py +msgid "Import Folder..." +msgstr "" + #: buzz/widgets/menu_bar.py msgid "About" msgstr "" @@ -1000,6 +1002,10 @@ msgstr "" msgid "Select audio file" msgstr "" +#: buzz/widgets/main_window.py +msgid "Select folder" +msgstr "" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "" diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 0e2f8404..4e62885f 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -441,9 +441,8 @@ msgid "AI model:" msgstr "Modelo de IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +#, fuzzy +msgid "Please translate each text sent to you from English to Spanish." msgstr "" "Introduce instrucciones para la IA sobre cómo traducir, por ejemplo, " "'Traduzca cada texto que se le envíe del inglés al español'." @@ -1055,6 +1054,12 @@ msgstr "Importar archivo..." msgid "Import URL..." msgstr "Importar URL..." +# automatic translation +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "Importar archivo..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "Acerca de" @@ -1088,6 +1093,12 @@ msgstr "" msgid "Select audio file" msgstr "Seleccionar archivo de audio" +# automatic translation +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "Seleccione la carpeta de entrada" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "No se puede guardar la clave de la API de OpenAI en el llavero" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index eeb07a25..a403cf2e 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -426,9 +426,8 @@ msgid "AI model:" msgstr "Modello AI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +#, fuzzy +msgid "Please translate each text sent to you from English to Spanish." msgstr "" "Inserisci le istruzioni per l'IA su come tradurre, ad esempio 'Per favore, " "traduci ogni testo che ti viene inviato dall'inglese allo spagnolo.'" @@ -1011,6 +1010,11 @@ msgstr "Importa file.." msgid "Import URL..." msgstr "Importa URL..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "Importa file.." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "Informazioni" @@ -1039,6 +1043,11 @@ msgstr "" msgid "Select audio file" msgstr "Seleziona file audio" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "Seleziona cartella di input" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "Impossibile salvare la chiave API OpenAI nel portachiavi" diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 0178568d..dca013d9 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -416,9 +416,7 @@ msgid "AI model:" msgstr "AIのモデル:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +msgid "Please translate each text sent to you from English to Spanish." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -998,6 +996,11 @@ msgstr "ファイルをインポートする..." msgid "Import URL..." msgstr "URLをインポートする..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "ファイルをインポートする..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "About" @@ -1024,6 +1027,11 @@ msgstr "本当に選択された文字起こしを削除しますか? この msgid "Select audio file" msgstr "音声ファイルを選択" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "入力フォルダを選択" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "OpenAI API キーをkeyringに保存できません" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 545a4641..42531040 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: 2026-02-22 15:20+0200\n" -"PO-Revision-Date: 2026-02-22 15:21+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" +"PO-Revision-Date: 2026-02-26 20:30+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -428,12 +428,8 @@ msgid "AI model:" msgstr "AI modelis:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" -msgstr "" -"Ievadiet instrukcijas mākslīgajam intelektam, piemēram, 'Lūdzu, iztulko " -"katru tev atsūtīto tekstu no angļu valodas latviski'" +msgid "Please translate each text sent to you from English to Spanish." +msgstr "Lūdzu, iztulko katru tev atsūtīto tekstu no angļu valodas latviski." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1003,6 +999,10 @@ msgstr "Importēt failu..." msgid "Import URL..." msgstr "Importēt URL..." +#: buzz/widgets/menu_bar.py +msgid "Import Folder..." +msgstr "Importēt mapi..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "Par" @@ -1031,6 +1031,10 @@ msgstr "" msgid "Select audio file" msgstr "Izvēlieties audio failu" +#: buzz/widgets/main_window.py +msgid "Select folder" +msgstr "Izvēlieties mapi" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "Neizdevās saglabāt OpenAI API atslēgu atslēgu saišķī" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 6d056712..777cfecc 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -424,9 +424,7 @@ msgid "AI model:" msgstr "AI-model:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +msgid "Please translate each text sent to you from English to Spanish." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -1002,6 +1000,11 @@ msgstr "Bestand importeren…" msgid "Import URL..." msgstr "Url importeren…" +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "Bestand importeren…" + #: buzz/widgets/menu_bar.py msgid "About" msgstr "Over" @@ -1030,6 +1033,11 @@ msgstr "" msgid "Select audio file" msgstr "Kies een audiobestand" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "Kies een invoermap" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "De OpenAI-api-sleutel kan niet worden bewaard in de sleutelbos" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index 65825912..c7b60fec 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -424,9 +424,7 @@ msgid "AI model:" msgstr "Model:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +msgid "Please translate each text sent to you from English to Spanish." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -1013,6 +1011,11 @@ msgstr "Importuj plik..." msgid "Import URL..." msgstr "Importuj URL..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "Importuj plik..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "" @@ -1041,6 +1044,11 @@ msgstr "" msgid "Select audio file" msgstr "Wybierz plik audio" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "Wybierz plik audio" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index dd405009..dcb95ead 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -420,9 +420,8 @@ msgid "AI model:" msgstr "Modelo de IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +#, fuzzy +msgid "Please translate each text sent to you from English to Spanish." msgstr "" "Instrua a IA sobre como traduzir, por exemplo: \"Por favor, traduza cada " "texto enviado a você do Inglês para o Português\"." @@ -1005,6 +1004,11 @@ msgstr "Importar Arquivo..." msgid "Import URL..." msgstr "Importar URL..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "Importar Arquivo..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "Sobre" @@ -1033,6 +1037,11 @@ msgstr "" msgid "Select audio file" msgstr "Selecionar arquivo de áudio" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "Selecionar Pasta de Entrada" + #: buzz/widgets/main_window.py 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" diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 35afaf8b..1fae1a67 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -418,9 +418,7 @@ msgid "AI model:" msgstr "Модель ШІ" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +msgid "Please translate each text sent to you from English to Spanish." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -999,6 +997,11 @@ msgstr "Імпортувати файл..." msgid "Import URL..." msgstr "Імпортувати адресу..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "Імпортувати файл..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "Про застосунок" @@ -1026,6 +1029,11 @@ msgstr "" msgid "Select audio file" msgstr "Вибрати аудіофайл" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "Виберіть теку введення" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "Не вдається додати до звʼязки ключів API-ключ OpenAI" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index cb902752..bb353c19 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -427,9 +427,7 @@ msgid "AI model:" msgstr "AI 模型:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +msgid "Please translate each text sent to you from English to Spanish." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -1016,6 +1014,11 @@ msgstr "导入媒体文件..." msgid "Import URL..." msgstr "导入媒体文件..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "导入媒体文件..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "关于" @@ -1042,6 +1045,11 @@ msgstr "您确定要删除所选录制吗?此操作无法撤消。" msgid "Select audio file" msgstr "选择音频文件" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "选择输入文件夹" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "无法将OpenAI API密钥保存到密钥串" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index 87373aab..6c92136a 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-26 20:29+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -422,9 +422,7 @@ msgid "AI model:" msgstr "模型:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "" -"Enter instructions for AI on how to translate, for example 'Please translate " -"each text sent to you from English to Spanish.'" +msgid "Please translate each text sent to you from English to Spanish." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -1007,6 +1005,11 @@ msgstr "導入媒體檔案..." msgid "Import URL..." msgstr "導入媒體檔案..." +#: buzz/widgets/menu_bar.py +#, fuzzy +msgid "Import Folder..." +msgstr "導入媒體檔案..." + #: buzz/widgets/menu_bar.py msgid "About" msgstr "" @@ -1033,6 +1036,11 @@ msgstr "您確定要刪除所選錄製嗎?此操作無法撤消。" msgid "Select audio file" msgstr "選擇聲音檔案" +#: buzz/widgets/main_window.py +#, fuzzy +msgid "Select folder" +msgstr "選擇聲音檔案" + #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" msgstr "" diff --git a/buzz/widgets/main_window.py b/buzz/widgets/main_window.py index a5914702..653d178e 100644 --- a/buzz/widgets/main_window.py +++ b/buzz/widgets/main_window.py @@ -1,6 +1,5 @@ import os import logging -import keyring from typing import Tuple, List, Optional from uuid import UUID @@ -42,6 +41,7 @@ from buzz.widgets.preferences_dialog.models.preferences import Preferences from buzz.widgets.transcriber.file_transcriber_widget import FileTranscriberWidget from buzz.widgets.transcription_task_folder_watcher import ( TranscriptionTaskFolderWatcher, + SUPPORTED_EXTENSIONS, ) from buzz.widgets.transcription_tasks_table_widget import ( TranscriptionTasksTableWidget, @@ -101,6 +101,9 @@ class MainWindow(QMainWindow): self.menu_bar.import_url_action_triggered.connect( self.on_new_url_transcription_action_triggered ) + self.menu_bar.import_folder_action_triggered.connect( + self.on_import_folder_action_triggered + ) self.menu_bar.shortcuts_changed.connect(self.on_shortcuts_changed) self.menu_bar.openai_api_key_changed.connect( self.on_openai_access_token_changed @@ -256,6 +259,20 @@ class MainWindow(QMainWindow): if url is not None: self.open_file_transcriber_widget(url=url) + def on_import_folder_action_triggered(self): + folder = QFileDialog.getExistingDirectory(self, _("Select folder")) + if not folder: + return + file_paths = [] + for dirpath, _dirs, filenames in os.walk(folder): + for filename in filenames: + ext = os.path.splitext(filename)[1].lower() + if ext in SUPPORTED_EXTENSIONS: + file_paths.append(os.path.join(dirpath, filename)) + if not file_paths: + return + self.open_file_transcriber_widget(file_paths) + def open_file_transcriber_widget( self, file_paths: Optional[List[str]] = None, url: Optional[str] = None ): diff --git a/buzz/widgets/main_window_toolbar.py b/buzz/widgets/main_window_toolbar.py index 7f9cba3f..fc982ac0 100644 --- a/buzz/widgets/main_window_toolbar.py +++ b/buzz/widgets/main_window_toolbar.py @@ -93,12 +93,6 @@ class MainWindowToolbar(ToolBar): self.record_action.setShortcut( QKeySequence.fromString(self.shortcuts.get(Shortcut.OPEN_RECORD_WINDOW)) ) - self.new_transcription_action.setShortcut( - QKeySequence.fromString(self.shortcuts.get(Shortcut.OPEN_IMPORT_WINDOW)) - ) - self.new_url_transcription_action.setShortcut( - QKeySequence.fromString(self.shortcuts.get(Shortcut.OPEN_IMPORT_URL_WINDOW)) - ) self.stop_transcription_action.setShortcut( QKeySequence.fromString(self.shortcuts.get(Shortcut.STOP_TRANSCRIPTION)) ) diff --git a/buzz/widgets/menu_bar.py b/buzz/widgets/menu_bar.py index fb757c5c..25dde2dd 100644 --- a/buzz/widgets/menu_bar.py +++ b/buzz/widgets/menu_bar.py @@ -19,6 +19,7 @@ from buzz.widgets.preferences_dialog.preferences_dialog import ( class MenuBar(QMenuBar): import_action_triggered = pyqtSignal() import_url_action_triggered = pyqtSignal() + import_folder_action_triggered = pyqtSignal() shortcuts_changed = pyqtSignal() openai_api_key_changed = pyqtSignal(str) preferences_changed = pyqtSignal(Preferences) @@ -41,6 +42,9 @@ class MenuBar(QMenuBar): self.import_url_action = QAction(_("Import URL..."), self) self.import_url_action.triggered.connect(self.import_url_action_triggered) + self.import_folder_action = QAction(_("Import Folder..."), self) + self.import_folder_action.triggered.connect(self.import_folder_action_triggered) + about_label = _("About") about_action = QAction(f'{about_label} {APP_NAME}', self) about_action.triggered.connect(self.on_about_action_triggered) @@ -57,6 +61,7 @@ class MenuBar(QMenuBar): file_menu = self.addMenu(_("File")) file_menu.addAction(self.import_action) file_menu.addAction(self.import_url_action) + file_menu.addAction(self.import_folder_action) help_menu = self.addMenu(_("Help")) help_menu.addAction(about_action) diff --git a/tests/model_loader_test.py b/tests/model_loader_test.py index 886e7d18..9275768d 100644 --- a/tests/model_loader_test.py +++ b/tests/model_loader_test.py @@ -16,6 +16,8 @@ from buzz.model_loader import ( get_expected_whisper_model_size, get_whisper_file_path, WHISPER_MODEL_SIZES, + WHISPER_CPP_REPO_ID, + WHISPER_CPP_LUMII_REPO_ID, ) @@ -632,6 +634,122 @@ class TestModelDownloaderDownloadModel: assert open(str(model_file), 'rb').read() == existing_content + resume_content +class TestModelDownloaderWhisperCpp: + def _make_downloader(self, model, custom_url=None): + downloader = ModelDownloader(model=model, custom_model_url=custom_url) + downloader.signals = MagicMock() + downloader.signals.progress = MagicMock() + downloader.signals.finished = MagicMock() + downloader.signals.error = MagicMock() + return downloader + + def test_standard_model_calls_download_from_huggingface(self): + model = TranscriptionModel( + model_type=ModelType.WHISPER_CPP, + whisper_model_size=WhisperModelSize.TINY, + ) + downloader = self._make_downloader(model) + model_name = WhisperModelSize.TINY.to_whisper_cpp_model_size() + + with patch("buzz.model_loader.download_from_huggingface", return_value="/fake/path") as mock_dl, \ + patch.object(downloader, "is_coreml_supported", False): + downloader.run() + + mock_dl.assert_called_once_with( + repo_id=WHISPER_CPP_REPO_ID, + allow_patterns=[f"ggml-{model_name}.bin", "README.md"], + progress=downloader.signals.progress, + num_large_files=1, + ) + downloader.signals.finished.emit.assert_called_once_with( + os.path.join("/fake/path", f"ggml-{model_name}.bin") + ) + + def test_lumii_model_uses_lumii_repo(self): + model = TranscriptionModel( + model_type=ModelType.WHISPER_CPP, + whisper_model_size=WhisperModelSize.LUMII, + ) + downloader = self._make_downloader(model) + model_name = WhisperModelSize.LUMII.to_whisper_cpp_model_size() + + with patch("buzz.model_loader.download_from_huggingface", return_value="/lumii/path") as mock_dl, \ + patch.object(downloader, "is_coreml_supported", False): + downloader.run() + + mock_dl.assert_called_once() + assert mock_dl.call_args.kwargs["repo_id"] == WHISPER_CPP_LUMII_REPO_ID + downloader.signals.finished.emit.assert_called_once_with( + os.path.join("/lumii/path", f"ggml-{model_name}.bin") + ) + + def test_custom_url_calls_download_model_to_path(self): + model = TranscriptionModel( + model_type=ModelType.WHISPER_CPP, + whisper_model_size=WhisperModelSize.TINY, + ) + custom_url = "https://example.com/my-model.bin" + downloader = self._make_downloader(model, custom_url=custom_url) + + with patch.object(downloader, "download_model_to_path") as mock_dtp: + downloader.run() + + mock_dtp.assert_called_once() + call_kwargs = mock_dtp.call_args.kwargs + assert call_kwargs["url"] == custom_url + + def test_coreml_model_includes_mlmodelc_in_file_list(self): + model = TranscriptionModel( + model_type=ModelType.WHISPER_CPP, + whisper_model_size=WhisperModelSize.TINY, + ) + downloader = self._make_downloader(model) + model_name = WhisperModelSize.TINY.to_whisper_cpp_model_size() + + with patch("buzz.model_loader.download_from_huggingface", return_value="/fake/path") as mock_dl, \ + patch.object(downloader, "is_coreml_supported", True), \ + patch("zipfile.ZipFile"), \ + patch("shutil.rmtree"), \ + patch("shutil.move"), \ + patch("os.path.exists", return_value=False), \ + patch("os.listdir", return_value=[f"ggml-{model_name}-encoder.mlmodelc"]), \ + patch("os.path.isdir", return_value=True): + downloader.run() + + mock_dl.assert_called_once() + assert mock_dl.call_args.kwargs["num_large_files"] == 2 + allow_patterns = mock_dl.call_args.kwargs["allow_patterns"] + assert f"ggml-{model_name}-encoder.mlmodelc.zip" in allow_patterns + + def test_coreml_zip_extracted_and_existing_dir_removed(self, tmp_path): + model = TranscriptionModel( + model_type=ModelType.WHISPER_CPP, + whisper_model_size=WhisperModelSize.TINY, + ) + downloader = self._make_downloader(model) + model_name = WhisperModelSize.TINY.to_whisper_cpp_model_size() + + # Create a fake zip with a single top-level directory inside + import zipfile as zf + zip_path = tmp_path / f"ggml-{model_name}-encoder.mlmodelc.zip" + nested_dir = f"ggml-{model_name}-encoder.mlmodelc" + with zf.ZipFile(zip_path, "w") as z: + z.writestr(f"{nested_dir}/weights", b"fake weights") + + existing_target = tmp_path / f"ggml-{model_name}-encoder.mlmodelc" + existing_target.mkdir() + + with patch("buzz.model_loader.download_from_huggingface", return_value=str(tmp_path)), \ + patch.object(downloader, "is_coreml_supported", True): + downloader.run() + + # Old directory was removed and recreated from zip + assert existing_target.exists() + downloader.signals.finished.emit.assert_called_once_with( + str(tmp_path / f"ggml-{model_name}.bin") + ) + + class TestModelLoaderCertifiImportError: def test_certifi_import_error_path(self): """Test that module handles certifi ImportError gracefully by reimporting with mock""" diff --git a/tests/widgets/main_window_test.py b/tests/widgets/main_window_test.py index 3fc7b39e..baccd2c8 100644 --- a/tests/widgets/main_window_test.py +++ b/tests/widgets/main_window_test.py @@ -1,5 +1,6 @@ import logging import os +import tempfile from typing import List from unittest.mock import patch, Mock @@ -293,6 +294,67 @@ class TestMainWindow: assert window.toolbar.open_transcript_action.isEnabled() is False window.close() + def test_import_folder_opens_file_transcriber_with_supported_files( + self, qtbot, transcription_service + ): + window = MainWindow(transcription_service) + qtbot.add_widget(window) + + with tempfile.TemporaryDirectory() as folder: + # Create supported and unsupported files + supported = ["audio.mp3", "video.mp4", "clip.wav"] + unsupported = ["document.txt", "image.png"] + subdir = os.path.join(folder, "sub") + os.makedirs(subdir) + nested = "nested.flac" + + for name in supported + unsupported: + open(os.path.join(folder, name), "w").close() + open(os.path.join(subdir, nested), "w").close() + + with patch("PyQt6.QtWidgets.QFileDialog.getExistingDirectory") as mock_dir, \ + patch.object(window, "open_file_transcriber_widget") as mock_open: + mock_dir.return_value = folder + window.on_import_folder_action_triggered() + + collected = mock_open.call_args[0][0] + collected_names = {os.path.basename(p) for p in collected} + assert collected_names == {"audio.mp3", "video.mp4", "clip.wav", "nested.flac"} + + window.close() + + def test_import_folder_does_nothing_when_cancelled( + self, qtbot, transcription_service + ): + window = MainWindow(transcription_service) + qtbot.add_widget(window) + + with patch("PyQt6.QtWidgets.QFileDialog.getExistingDirectory") as mock_dir, \ + patch.object(window, "open_file_transcriber_widget") as mock_open: + mock_dir.return_value = "" + window.on_import_folder_action_triggered() + + mock_open.assert_not_called() + window.close() + + def test_import_folder_does_nothing_when_no_supported_files( + self, qtbot, transcription_service + ): + window = MainWindow(transcription_service) + qtbot.add_widget(window) + + with tempfile.TemporaryDirectory() as folder: + open(os.path.join(folder, "readme.txt"), "w").close() + open(os.path.join(folder, "image.jpg"), "w").close() + + with patch("PyQt6.QtWidgets.QFileDialog.getExistingDirectory") as mock_dir, \ + patch.object(window, "open_file_transcriber_widget") as mock_open: + mock_dir.return_value = folder + window.on_import_folder_action_triggered() + + mock_open.assert_not_called() + window.close() + @staticmethod def _import_file_and_start_transcription( window: MainWindow, long_audio: bool = False diff --git a/tests/widgets/menu_bar_test.py b/tests/widgets/menu_bar_test.py index 5934ddea..6ee555a5 100644 --- a/tests/widgets/menu_bar_test.py +++ b/tests/widgets/menu_bar_test.py @@ -1,3 +1,5 @@ +from unittest.mock import patch, Mock + from PyQt6.QtCore import QSettings from buzz.widgets.menu_bar import MenuBar @@ -6,6 +8,18 @@ from buzz.widgets.preferences_dialog.preferences_dialog import PreferencesDialog class TestMenuBar: + def test_import_folder_action_emits_signal(self, qtbot, shortcuts): + menu_bar = MenuBar( + shortcuts=shortcuts, preferences=Preferences.load(QSettings()) + ) + qtbot.add_widget(menu_bar) + + signal_mock = Mock() + menu_bar.import_folder_action_triggered.connect(signal_mock) + menu_bar.import_folder_action.trigger() + + signal_mock.assert_called_once() + def test_open_preferences_dialog(self, qtbot, shortcuts): menu_bar = MenuBar( shortcuts=shortcuts, preferences=Preferences.load(QSettings()) diff --git a/tests/widgets/transcription_tasks_table_widget_test.py b/tests/widgets/transcription_tasks_table_widget_test.py index 77bb0514..423480a0 100644 --- a/tests/widgets/transcription_tasks_table_widget_test.py +++ b/tests/widgets/transcription_tasks_table_widget_test.py @@ -13,6 +13,7 @@ from PyQt6.QtWidgets import QApplication, QMenu, QStyledItemDelegate from buzz.locale import _ from buzz.widgets.transcription_tasks_table_widget import ( TranscriptionTasksTableWidget, + TranscriptionTasksTableHeaderView, format_record_status_text, Column, column_definitions, @@ -453,6 +454,281 @@ class TestTranscriptionTasksTableWidget: # Verify error message was shown mock_messagebox.information.assert_called_once() + # --- on_restart_transcription_action edge cases --- + + def test_restart_action_no_selection_does_nothing(self, widget, monkeypatch): + mock_service = Mock() + widget.transcription_service = mock_service + # No row selected + widget.on_restart_transcription_action() + mock_service.reset_transcription_for_restart.assert_not_called() + + def test_restart_action_canceled_status_succeeds(self, widget, monkeypatch): + mock_service = Mock() + widget.transcription_service = mock_service + mock_transcription = Mock() + mock_transcription.status = "canceled" + mock_transcription.id = "12345678-1234-5678-1234-567812345678" + monkeypatch.setattr(widget, "transcription", Mock(return_value=mock_transcription)) + mock_restart = Mock() + monkeypatch.setattr(widget, "_restart_transcription_task", mock_restart) + + widget.selectRow(0) + widget.on_restart_transcription_action() + + mock_service.reset_transcription_for_restart.assert_called_once() + mock_restart.assert_called_once_with(mock_transcription) + + def test_restart_action_service_exception_shows_warning(self, widget, monkeypatch): + mock_service = Mock() + mock_service.reset_transcription_for_restart.side_effect = RuntimeError("DB error") + widget.transcription_service = mock_service + mock_transcription = Mock() + mock_transcription.status = "failed" + mock_transcription.id = "12345678-1234-5678-1234-567812345678" + monkeypatch.setattr(widget, "transcription", Mock(return_value=mock_transcription)) + + mock_messagebox = Mock() + monkeypatch.setattr("PyQt6.QtWidgets.QMessageBox", mock_messagebox) + + widget.selectRow(0) + widget.on_restart_transcription_action() + + mock_messagebox.warning.assert_called_once() + + # --- _restart_transcription_task --- + + def _make_transcription(self, **kwargs): + from buzz.transcriber.transcriber import Task + defaults = dict( + id="12345678-1234-5678-1234-567812345678", + status="failed", + file="/audio/test.mp3", + url=None, + language="en", + task=Task.TRANSCRIBE.value, + model_type="Whisper", + whisper_model_size="Tiny", + hugging_face_model_id=None, + word_level_timings="0", + extract_speech="0", + export_formats="txt", + output_folder=None, + source="FILE_IMPORT", + ) + defaults.update(kwargs) + t = Mock() + for k, v in defaults.items(): + setattr(t, k, v) + return t + + def test_restart_task_happy_path_adds_task(self, widget, monkeypatch): + from buzz.transcriber.transcriber import FileTranscriptionTask + transcription = self._make_transcription() + + mock_model_path = "/models/ggml-tiny.bin" + mock_model = Mock() + mock_model.get_local_model_path.return_value = mock_model_path + + mock_transcription_model_cls = Mock(return_value=mock_model) + monkeypatch.setattr("buzz.model_loader.TranscriptionModel", mock_transcription_model_cls) + + mock_task_instance = Mock(spec=FileTranscriptionTask) + mock_task_cls = Mock(return_value=mock_task_instance) + monkeypatch.setattr( + "buzz.transcriber.transcriber.FileTranscriptionTask", mock_task_cls + ) + + mock_worker = Mock() + mock_main_window = Mock() + mock_main_window.transcriber_worker = mock_worker + mock_main_window.parent.return_value = None + monkeypatch.setattr(widget, "parent", Mock(return_value=mock_main_window)) + + widget._restart_transcription_task(transcription) + + mock_worker.add_task.assert_called_once_with(mock_task_instance) + + def test_restart_task_invalid_whisper_model_size_defaults_to_tiny(self, widget, monkeypatch): + from buzz.model_loader import WhisperModelSize + transcription = self._make_transcription(whisper_model_size="InvalidSize") + + captured = {} + + original_cls = __builtins__ # just a placeholder + + def capture_model(**kwargs): + captured["whisper_model_size"] = kwargs.get("whisper_model_size") + m = Mock() + m.get_local_model_path.return_value = "/fake/path" + return m + + monkeypatch.setattr( + "buzz.model_loader.TranscriptionModel", + Mock(side_effect=capture_model), + ) + monkeypatch.setattr( + "buzz.transcriber.transcriber.FileTranscriptionTask", + Mock(return_value=Mock()), + ) + mock_worker = Mock() + mock_main_window = Mock() + mock_main_window.transcriber_worker = mock_worker + mock_main_window.parent.return_value = None + monkeypatch.setattr(widget, "parent", Mock(return_value=mock_main_window)) + + widget._restart_transcription_task(transcription) + + assert captured["whisper_model_size"] == WhisperModelSize.TINY + + def test_restart_task_model_not_available_downloads_it(self, widget, monkeypatch): + from buzz.transcriber.transcriber import FileTranscriptionTask + transcription = self._make_transcription() + + mock_model = Mock() + mock_model.get_local_model_path.side_effect = [None, "/models/ggml-tiny.bin"] + monkeypatch.setattr( + "buzz.model_loader.TranscriptionModel", + Mock(return_value=mock_model), + ) + + mock_downloader = Mock() + mock_downloader_cls = Mock(return_value=mock_downloader) + monkeypatch.setattr( + "buzz.model_loader.ModelDownloader", + mock_downloader_cls, + ) + monkeypatch.setattr( + "buzz.transcriber.transcriber.FileTranscriptionTask", + Mock(return_value=Mock()), + ) + mock_worker = Mock() + mock_main_window = Mock() + mock_main_window.transcriber_worker = mock_worker + mock_main_window.parent.return_value = None + monkeypatch.setattr(widget, "parent", Mock(return_value=mock_main_window)) + + widget._restart_transcription_task(transcription) + + mock_downloader.run.assert_called_once() + mock_worker.add_task.assert_called_once() + + def test_restart_task_model_unavailable_after_download_shows_warning(self, widget, monkeypatch): + transcription = self._make_transcription() + + mock_model = Mock() + mock_model.get_local_model_path.return_value = None + monkeypatch.setattr( + "buzz.model_loader.TranscriptionModel", + Mock(return_value=mock_model), + ) + monkeypatch.setattr( + "buzz.model_loader.ModelDownloader", + Mock(return_value=Mock()), + ) + + mock_messagebox = Mock() + monkeypatch.setattr("PyQt6.QtWidgets.QMessageBox", mock_messagebox) + + widget._restart_transcription_task(transcription) + + mock_messagebox.warning.assert_called_once() + + def test_restart_task_no_worker_found_shows_warning(self, widget, monkeypatch): + transcription = self._make_transcription() + + mock_model = Mock() + mock_model.get_local_model_path.return_value = "/fake/path" + monkeypatch.setattr( + "buzz.model_loader.TranscriptionModel", + Mock(return_value=mock_model), + ) + monkeypatch.setattr( + "buzz.transcriber.transcriber.FileTranscriptionTask", + Mock(return_value=Mock()), + ) + + # Parent with no transcriber_worker, and no further parent + mock_parent = Mock(spec=["parent"]) # only has parent(), not transcriber_worker + mock_parent.parent.return_value = None + monkeypatch.setattr(widget, "parent", Mock(return_value=mock_parent)) + + mock_messagebox = Mock() + monkeypatch.setattr("PyQt6.QtWidgets.QMessageBox", mock_messagebox) + + widget._restart_transcription_task(transcription) + + mock_messagebox.warning.assert_called_once() + + def test_restart_task_export_formats_parsed_correctly(self, widget, monkeypatch): + from buzz.transcriber.transcriber import OutputFormat + transcription = self._make_transcription(export_formats="txt, srt") + + captured = {} + + def capture_file_transcription_options(**kwargs): + captured["output_formats"] = kwargs.get("output_formats") + return Mock() + + monkeypatch.setattr( + "buzz.transcriber.transcriber.FileTranscriptionOptions", + Mock(side_effect=capture_file_transcription_options), + ) + mock_model = Mock() + mock_model.get_local_model_path.return_value = "/fake/path" + monkeypatch.setattr( + "buzz.model_loader.TranscriptionModel", + Mock(return_value=mock_model), + ) + monkeypatch.setattr( + "buzz.transcriber.transcriber.FileTranscriptionTask", + Mock(return_value=Mock()), + ) + mock_worker = Mock() + mock_main_window = Mock() + mock_main_window.transcriber_worker = mock_worker + mock_main_window.parent.return_value = None + monkeypatch.setattr(widget, "parent", Mock(return_value=mock_main_window)) + + widget._restart_transcription_task(transcription) + + assert OutputFormat("txt") in captured["output_formats"] + assert OutputFormat("srt") in captured["output_formats"] + + def test_restart_task_invalid_export_format_skipped(self, widget, monkeypatch): + transcription = self._make_transcription(export_formats="txt, INVALID_FORMAT") + + captured = {} + + def capture_file_transcription_options(**kwargs): + captured["output_formats"] = kwargs.get("output_formats") + return Mock() + + monkeypatch.setattr( + "buzz.transcriber.transcriber.FileTranscriptionOptions", + Mock(side_effect=capture_file_transcription_options), + ) + mock_model = Mock() + mock_model.get_local_model_path.return_value = "/fake/path" + monkeypatch.setattr( + "buzz.model_loader.TranscriptionModel", + Mock(return_value=mock_model), + ) + monkeypatch.setattr( + "buzz.transcriber.transcriber.FileTranscriptionTask", + Mock(return_value=Mock()), + ) + mock_worker = Mock() + mock_main_window = Mock() + mock_main_window.transcriber_worker = mock_worker + mock_main_window.parent.return_value = None + monkeypatch.setattr(widget, "parent", Mock(return_value=mock_main_window)) + + widget._restart_transcription_task(transcription) + + # Only the valid format should be present, invalid one skipped silently + assert len(captured["output_formats"]) == 1 + def test_column_resize_event(self, widget): """Test column resize event handling""" # Mock the save_column_widths method @@ -529,3 +805,98 @@ class TestTranscriptionTasksTableWidget: header = widget.horizontalHeader() assert header.sortIndicatorSection() == Column.TIME_QUEUED.value assert header.sortIndicatorOrder() == Qt.SortOrder.DescendingOrder + + +class TestTranscriptionTasksTableHeaderView: + @pytest.fixture + def header(self, qtbot, widget): + return widget.horizontalHeader() + + def _setup_settings_key(self, widget): + """Set up settings.Key and restore begin_group side_effect for inline width-saving.""" + widget.settings.Key = Mock( + TRANSCRIPTION_TASKS_TABLE_COLUMN_WIDTHS="widths" + ) + current_group = [""] + + def begin_group(group): + current_group[0] = str(group) + "/" + + def end_group(): + current_group[0] = "" + + widget.settings.begin_group.side_effect = begin_group + widget.settings.end_group.side_effect = end_group + + def test_hiding_column_saves_visibility_and_widths(self, header, widget): + col = Column.NOTES.value + widget.setColumnWidth(col, 250) + widget.setColumnHidden(col, False) + self._setup_settings_key(widget) + + with patch.object(widget, "save_column_visibility") as mock_vis, \ + patch.object(widget, "save_column_widths") as mock_widths, \ + patch.object(widget, "save_column_order"), \ + patch.object(widget, "reload_column_order_from_settings"): + header.on_column_checked(col, False) + + assert widget.isColumnHidden(col) + mock_vis.assert_called() + mock_widths.assert_called() + + def test_showing_column_makes_it_visible(self, header, widget): + col = Column.NOTES.value + widget.setColumnHidden(col, True) + + with patch.object(widget, "save_column_visibility"), \ + patch.object(widget, "save_column_widths"), \ + patch.object(widget, "save_column_order"), \ + patch.object(widget, "reload_column_order_from_settings"): + header.on_column_checked(col, True) + + assert not widget.isColumnHidden(col) + + def test_hiding_already_hidden_column_does_not_save_zero_width(self, header, widget): + col = Column.NOTES.value + widget.setColumnHidden(col, True) + self._setup_settings_key(widget) + + saved_widths = {} + + def capture_set_value(key, value): + saved_widths[key] = value + + widget.settings.settings.setValue.side_effect = capture_set_value + + with patch.object(widget, "save_column_visibility"), \ + patch.object(widget, "save_column_widths"), \ + patch.object(widget, "save_column_order"), \ + patch.object(widget, "reload_column_order_from_settings"): + header.on_column_checked(col, False) + + # Width of a hidden column is 0 — should not be saved + notes_id = next(d.id for d in column_definitions if d.column == Column.NOTES) + assert notes_id not in saved_widths + + def test_column_order_saved_on_visibility_change(self, header, widget): + col = Column.NOTES.value + self._setup_settings_key(widget) + + with patch.object(widget, "save_column_visibility"), \ + patch.object(widget, "save_column_widths"), \ + patch.object(widget, "save_column_order") as mock_order, \ + patch.object(widget, "reload_column_order_from_settings"): + header.on_column_checked(col, False) + + mock_order.assert_called_once() + + def test_reload_called_after_visibility_change(self, header, widget): + col = Column.NOTES.value + + with patch.object(widget, "save_column_visibility"), \ + patch.object(widget, "save_column_widths"), \ + patch.object(widget, "save_column_order"), \ + patch.object(widget, "reload_column_order_from_settings") as mock_reload: + header.on_column_checked(col, True) + + mock_reload.assert_called_once() From f545a84ba68600297f41c6a2c536ef049ae2860b Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 27 Feb 2026 16:14:18 +0200 Subject: [PATCH 27/37] Add cvs export (#1400) --- Makefile | 12 +- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 225 +++--- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 576 +++++++------- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 301 +++++--- buzz/locale/en_US/LC_MESSAGES/buzz.po | 44 +- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 245 +++--- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 87 ++- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 539 +++++++------ buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 52 +- buzz/locale/nl/LC_MESSAGES/buzz.po | 297 ++++--- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 692 +++++++++-------- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 222 +++--- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 542 +++++++------ buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 549 ++++++------- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 727 +++++++++--------- buzz/settings/settings.py | 3 + buzz/transcriber/recording_transcriber.py | 2 - buzz/translator.py | 11 +- .../general_preferences_widget.py | 7 + buzz/widgets/recording_transcriber_widget.py | 174 ++++- .../transcriber/advanced_settings_dialog.py | 106 ++- .../transcriber/initial_prompt_text_edit.py | 2 +- tests/translator_test.py | 6 +- .../recording_transcriber_widget_test.py | 276 +++++++ whisper.cpp | 2 +- 25 files changed, 3297 insertions(+), 2402 deletions(-) diff --git a/Makefile b/Makefile index aebe6c28..adaa5934 100644 --- a/Makefile +++ b/Makefile @@ -72,13 +72,11 @@ ifeq ($(shell uname -s), Linux) cmake --build whisper.cpp/build -j --config Release --verbose cp whisper.cpp/build/bin/whisper-cli buzz/whisper_cpp/ || true cp whisper.cpp/build/bin/whisper-server buzz/whisper_cpp/ || true - cp whisper.cpp/build/src/libwhisper.so buzz/whisper_cpp/ || true - cp whisper.cpp/build/src/libwhisper.so.1 buzz/whisper_cpp/ || true - cp whisper.cpp/build/src/libwhisper.so.1.8.2 buzz/whisper_cpp/ || true - cp whisper.cpp/build/ggml/src/libggml.so buzz/whisper_cpp/ || true - cp whisper.cpp/build/ggml/src/libggml-base.so buzz/whisper_cpp/ || true - cp whisper.cpp/build/ggml/src/libggml-cpu.so buzz/whisper_cpp/ || true - cp whisper.cpp/build/ggml/src/ggml-vulkan/libggml-vulkan.so buzz/whisper_cpp/ || true + cp -P whisper.cpp/build/src/libwhisper.so* buzz/whisper_cpp/ || true + cp -P whisper.cpp/build/ggml/src/libggml.so* buzz/whisper_cpp/ || true + cp -P whisper.cpp/build/ggml/src/libggml-base.so* buzz/whisper_cpp/ || true + cp -P whisper.cpp/build/ggml/src/libggml-cpu.so* buzz/whisper_cpp/ || true + cp -P whisper.cpp/build/ggml/src/ggml-vulkan/libggml-vulkan.so* buzz/whisper_cpp/ || true endif # Build on Macs diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index efee2942..2324331c 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -54,9 +54,8 @@ msgid "The URL you entered is invalid." msgstr "L'URL que heu introduït no és vàlid." #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "Veure la traducció de transcripció" +msgstr "Presentació de transcripció en directe" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" @@ -154,9 +153,8 @@ msgid "OpenAI base url" msgstr "URL base d'OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "Clau de l'API d'OpenAI" +msgstr "Model de l'API d'OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" @@ -168,6 +166,7 @@ msgstr "Activa l'exportació de transcripcions en directe" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Navega" @@ -180,18 +179,28 @@ msgid "Live recording mode" msgstr "Mode d'enregistrament en directe" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "Use 8-bit quantization to reduce memory usage" +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." msgstr "" +"Nota: La configuració d'exportació d'enregistrament en directe es mourà a la " +"Configuració avançada a la pantalla d'enregistrament en directe en una versió futura." + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "Utilitza la quantització de 8 bits per reduir l'ús de memòria" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"S'aplica als models Huggingface i Faster Whisper. Redueix l'ús de memòria de " +"la GPU, però pot reduir lleugerament la qualitat de la transcripció." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "Redueix la RAM de la GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" @@ -232,6 +241,7 @@ msgstr "" "clau API poden causar errors." #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Selecciona la carpeta d'exportació" @@ -350,7 +360,7 @@ msgstr "Detecta l'idioma" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "p. ex., eng, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -358,6 +368,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"Introduïu un codi d'idioma ISO 639-3 (3 lletres).\n" +"Exemples: eng (anglès), fra (francès), deu (alemany),\n" +"spa (castellà), lav (letó)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -422,28 +435,60 @@ msgid "AI model:" msgstr "Model d'IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Please translate each text sent to you from English to Spanish." -msgstr "" -"Introdueix instruccions per a la IA sobre com traduir, per exemple 'Si us " -"plau, tradueix cada text que t'hagi enviat de l'anglès al castellà'." +msgstr "Si us plau, tradueix cada text que t'enviï de l'anglès al castellà." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Instruccions per a la IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "Configuració de la traducció" +msgstr "Configuració d'enregistrament" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "Llindar de silenci:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "Separador de línies:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Mode d'enregistrament en directe:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Activa l'exportació d'enregistrament en directe" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Carpeta d'exportació:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Nom del fitxer d'exportació:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "Fitxer de text (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Tipus de fitxer d'exportació:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"Limita les entrades d'exportació\n" +"(0 = exporta tot):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -532,61 +577,57 @@ msgstr "Data d'addició" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "Notes" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "Restableix l'ordre de les columnes" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "Cancel·la la transcripció" +msgstr "Reinicia la transcripció" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename" -msgstr "Vietnamita" +msgstr "Canvia el nom" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "Afegeix/Edita notes" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "Cancel·la la transcripció" +msgstr "Canvia el nom de la transcripció" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "Introduïu el nou nom:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "Introduïu algunes notes rellevants per a aquesta transcripció:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "No es pot reiniciar" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "Només es poden reiniciar les transcripcions fallides o cancel·lades." #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "Cancel·la la transcripció" +msgstr "No s'ha pogut reiniciar la transcripció: {}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." -msgstr "" +msgstr "No s'ha pogut reiniciar la transcripció: el model no està disponible i no s'ha pogut descarregar." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "No s'ha pogut reiniciar la transcripció: no s'ha trobat el treballador del transcriptor." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -606,72 +647,67 @@ msgstr "Micròfon:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "Mostra en una nova finestra" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "Fitxers de text" +msgstr "Mida del text:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "Tema" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "Clar" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "Fosc" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "Personalitzat" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "Fitxers de text" +msgstr "Color del text" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "Color de fons" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "Pantalla completa" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "Copia" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "Copia la transcripció al porta-retalls" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "Res per copiar!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "Descàrrega fallida" +msgstr "Ha fallat la còpia" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "Copiat!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "Selecciona la carpeta d'exportació" +msgstr "Selecciona el color del text" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "Selecciona un fitxer d'àudio" +msgstr "Selecciona el color de fons" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -691,7 +727,7 @@ msgstr "Comprova si hi ha actualitzacions" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "Mostra els registres" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -699,7 +735,7 @@ msgstr "Estàs al dia!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "Volum mitjà" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -744,7 +780,7 @@ msgstr "Redimensionar" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "Identifica els parlants" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" @@ -767,9 +803,8 @@ msgid "Previous match (Shift+Enter)" msgstr "Coincidència anterior (Maj+Retorn)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py -#, fuzzy msgid "Next match (Ctrl+Enter)" -msgstr "Coincidència següent (retorn)" +msgstr "Coincidència següent (Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" @@ -841,15 +876,15 @@ msgstr "Introduïu la clau API d'OpenAI a les preferències" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "Amplia el temps final" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "Amplia els finals fins a (segons)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "Amplia els finals" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" @@ -861,7 +896,7 @@ msgstr "Longitud desitjada dels subtítols" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "Disponible només si els temps a nivell de paraula estaven desactivats durant la transcripció" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -885,100 +920,96 @@ msgstr "Fusiona" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "Disponible només si els temps a nivell de paraula estaven activats durant la transcripció" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." -msgstr "" +msgstr "La identificació de parlants no està disponible: no s'han pogut carregar les biblioteques necessàries." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 Recollint transcripcions" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 Carregant àudio" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 Carregant el model d'alineació" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 Carregant el model d'alineació (tornant a intentar amb la memòria cau...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." -msgstr "" +msgstr "No s'ha pogut carregar el model d'alineació. Comproveu la vostra connexió a Internet i torneu-ho a intentar." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 Processant àudio" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "Cancel·la la transcripció" +msgstr "5/8 Preparant transcripcions" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 Identificant parlants" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 Assignant parlants a transcripcions" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 Identificació completada" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 Error en identificar parlants" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "Pas 1: Identifica els parlants" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "Identifica" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "Llest per identificar parlants" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "Fitxer d'àudio no trobat" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "Pas 2: Anomena els parlants" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "Reprodueix la mostra" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "Fusiona les frases del parlant" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "Desa el fitxer" +msgstr "Desa" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "Cancel·lar" +msgstr "Cancel·lant..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" msgstr "Cancel·lat" @@ -1007,9 +1038,8 @@ msgid "Import URL..." msgstr "Importa l'URL..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "Importa fitxer..." +msgstr "Importa carpeta..." #: buzz/widgets/menu_bar.py msgid "About" @@ -1040,9 +1070,8 @@ msgid "Select audio file" msgstr "Selecciona un fitxer d'àudio" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" -msgstr "Selecciona la carpeta d'entrada" +msgstr "Selecciona carpeta" #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" @@ -1439,9 +1468,8 @@ msgid "Starting Whisper.cpp..." msgstr "Començant Whisper.cpp..." #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "Cancel·la la transcripció" +msgstr "Iniciant la transcripció..." #: buzz/settings/shortcut.py msgid "Open Record Window" @@ -1473,11 +1501,11 @@ msgstr "Cerca una transcripció" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "Ves al resultat de cerca de transcripció següent" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "Ves al resultat de cerca de transcripció anterior" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" @@ -1524,15 +1552,14 @@ msgid "Append and correct" msgstr "Afegeix i corregeix" #: buzz/translator.py -#, fuzzy msgid "Translation error, see logs!" -msgstr "Configuració de la traducció" +msgstr "Error de traducció, vegeu els registres!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." -msgstr "" +msgstr "Ha fallat l'extracció de veu! Comproveu la vostra connexió a Internet — pot ser que s'hagi de descarregar un model." #~ msgid "Snap permission notice" #~ msgstr "Avís de permís d'ajust" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index 3b8c9ba7..bd44d211 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -51,9 +51,8 @@ msgid "The URL you entered is invalid." msgstr "Den URL du har angivet er ikke gyldig." #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "Vis transkriberede oversættelse" +msgstr "Live transkriptionspræsentation" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" @@ -62,79 +61,77 @@ msgstr "Gendan standard-indstillinger" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "English" -msgstr "" +msgstr "Engelsk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Catalan" -msgstr "" +msgstr "Catalansk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Danish" -msgstr "" +msgstr "Dansk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Dutch" -msgstr "" +msgstr "Nederlandsk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "German" -msgstr "" +msgstr "Tysk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Spanish" -msgstr "" +msgstr "Spansk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Italian" -msgstr "" +msgstr "Italiensk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Japanese" -msgstr "" +msgstr "Japansk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Latvian" -msgstr "" +msgstr "Lettisk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Polish" -msgstr "" +msgstr "Polsk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Portugisisk (Brasilien)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Ukrainian" -msgstr "tilbageværende" +msgstr "Ukrainsk" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" -msgstr "" +msgstr "Kinesisk (forenklet)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" -msgstr "" +msgstr "Kinesisk (traditionelt)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" -msgstr "" +msgstr "Genstart påkrævet!" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Ui Language" -msgstr "Sprog:" +msgstr "Brugerfladesprog" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" @@ -153,9 +150,8 @@ msgid "OpenAI base url" msgstr "OpenAI base-URL" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "OpenAI API-nøgle" +msgstr "OpenAI API-model" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" @@ -167,6 +163,7 @@ msgstr "Slå transkription af live optagelse eksport til" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Gennemse" @@ -175,35 +172,44 @@ msgid "Export folder" msgstr "Eksportmappe" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Live recording mode" -msgstr "Live optagelsesmode" +msgstr "Live optagelsestilstand" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" +"Bemærk: Indstillinger for live optagelseseksport vil i en fremtidig version " +"blive flyttet til Avancerede indstillinger på skærmen for live optagelse." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" -msgstr "" +msgstr "Brug 8-bit kvantisering for at reducere hukommelsesforbruget" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"Gælder for Huggingface og Faster Whisper modeller. Reducerer GPU " +"hukommelsesforbrug, men kan en smule forringe transkriptionskvaliteten." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "Reducer GPU RAM" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" -msgstr "" +msgstr "Brug kun CPU og deaktiver GPU-acceleration" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "" +msgstr "Aktivér dette hvis større modeller ikke passer i GPU-hukommelsen og Buzz crasher" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" -msgstr "" +msgstr "Deaktiver GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" @@ -218,7 +224,6 @@ msgstr "" "transkription og AI oversættelser." #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Invalid API key" msgstr "Ugyldig API-nøgle" @@ -231,6 +236,7 @@ msgstr "" "kan guve fejl. " #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Vælg eksport-mappe" @@ -349,7 +355,7 @@ msgstr "Detekter sprog" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "f.eks. eng, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -357,6 +363,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"Indtast en ISO 639-3 sprogkode (3 bogstaver).\n" +"Eksempler: eng (engelsk), fra (fransk), deu (tysk),\n" +"spa (spansk), lav (lettisk)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -421,24 +430,59 @@ msgstr "AI model:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "" +msgstr "Oversæt venligst hver tekst du modtager fra engelsk til spansk." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Instruktioner for AI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "Oversættelsesindstillinger" +msgstr "Optagelsesindstillinger" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "Tærskelværdi for stilhed:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "Linjeseparator:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Live optagelsestilstand:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Aktiver eksport af live optagelse" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Eksportmappe:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Eksport filnavn:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "Tekstfil (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Eksport filtype:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"Begræns eksportposter\n" +"(0 = eksporter alle):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -461,14 +505,12 @@ msgid "Advanced..." msgstr "Advanceret..." #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New File Transcription" -msgstr "Ny fil transkription" +msgstr "Ny filtranskription" #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New URL Transcription" -msgstr "Ny URL transkription" +msgstr "Ny URL-transkription" #: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" @@ -529,60 +571,59 @@ msgstr "Dato for tilføjelse" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "Noter" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "Nulstil kolonnerækkefølge" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "Afbryd transkription" +msgstr "Genstart transkription" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" -msgstr "" +msgstr "Omdøb" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "Tilføj/rediger noter" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "Afbryd transkription" +msgstr "Omdøb transkription" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "Indtast nyt navn:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "Indtast relevante noter til denne transkription:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "Kan ikke genstarte" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "Kun mislykkede eller annullerede transkriptioner kan genstartes." #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "Afbryd transkription" +msgstr "Kunne ikke genstarte transkription: {}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" +"Kunne ikke genstarte transkription: modellen er ikke tilgængelig og " +"kunne ikke downloades." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "Kunne ikke genstarte transkription: transkriptionsprocessen blev ikke fundet." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -602,72 +643,67 @@ msgstr "Mikrofon:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "Vis i nyt vindue" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "Tekst filer" +msgstr "Tekststørrelse:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "Tema" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "Lys" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "Mørk" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "Brugerdefineret" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "Tekst filer" +msgstr "Tekstfarve" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "Baggrundsfarve" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "Fuldskærm" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "Kopiér" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "Kopiér transkription til udklipsholder" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "Intet at kopiere!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "Download mislykkedes" +msgstr "Kopiering mislykkedes" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "Kopieret!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "Vælg eksport-mappe" +msgstr "Vælg tekstfarve" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "Vælg audio-fil" +msgstr "Vælg baggrundsfarve" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -687,7 +723,7 @@ msgstr "Tjek for opdateringer" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "Vis logfiler" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -695,7 +731,7 @@ msgstr "Du er opdateret!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "Gennemsnitlig lydstyrke" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -740,89 +776,91 @@ msgstr "Behandel størrelse" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "Identificer talere" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" -msgstr "" +msgstr "Find" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" -msgstr "" +msgstr "Vis/skjul søgebjælke (Ctrl+F)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" -msgstr "" +msgstr "Find:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." -msgstr "" +msgstr "Indtast tekst at søge efter..." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" -msgstr "" +msgstr "Forrige match (Shift+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" -msgstr "" +msgstr "Næste match (Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" -msgstr "" +msgstr "Ryd" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" -msgstr "" +msgstr "Afspilningskontroller:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" -msgstr "" +msgstr "Gentag segment" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" -msgstr "" +msgstr "Aktiver/deaktiver gentagelse ved klik på transkriptionssegmenter" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" -msgstr "" +msgstr "Følg lyd" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" +"Aktiver/deaktiver at følge den aktuelle lydposition i transkriptionen. Når " +"aktiveret, scrolles der automatisk til den aktuelle tekst." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" -msgstr "" +msgstr "Rul til aktuel" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" -msgstr "" +msgstr "Rul til den tekst der tales i øjeblikket" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" -msgstr "" +msgstr "1 af 100+ matches" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " -msgstr "" +msgstr "1 af " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" -msgstr "" +msgstr " matches" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" -msgstr "" +msgstr "Ingen matches fundet" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" -msgstr "" +msgstr " af 100+ matches" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " -msgstr "" +msgstr " af " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" @@ -834,15 +872,15 @@ msgstr "Indtast venligst OpenAI API-nøgle i indstillinger" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "Forlæng sluttidspunkt" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "Forlæng slutninger med op til (sekunder)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "Forlæng slutninger" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" @@ -854,7 +892,7 @@ msgstr "Ønskede undertekst længde" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "Kun tilgængeligt hvis ordniveau-tidsstempler var deaktiveret under transkription" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -878,102 +916,101 @@ msgstr "Sammenflet" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "Kun tilgængeligt hvis ordniveau-tidsstempler var aktiveret under transkription" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" +"Taler-identifikation er ikke tilgængelig: kunne ikke indlæse nødvendige biblioteker." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 Indsamler transkriptioner" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 Indlæser lyd" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 Indlæser justeringsmodel" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 Indlæser justeringsmodel (prøver igen med cache...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" +"Kunne ikke indlæse justeringsmodel. Tjek venligst din internetforbindelse og " +"prøv igen." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 Behandler lyd" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "Afbryd transkription" +msgstr "5/8 Forbereder transkriptioner" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 Identificerer talere" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 Kortlægger talere til transkriptioner" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 Identifikation afsluttet" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 Fejl ved identifikation af talere" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "Trin 1: Identificer talere" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "Identificer" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "Klar til at identificere talere" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "Lydfil ikke fundet" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "Trin 2: Navngiv talere" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "Afspil eksempel" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "Sammenflet talerens sætninger" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "Gem fil" +msgstr "Gem" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "Afbryd" +msgstr "Annullerer..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" -msgstr "Afbrudt" +msgstr "Annulleret" #: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Save File" @@ -1000,9 +1037,8 @@ msgid "Import URL..." msgstr "Importer URL..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "Importer Fil..." +msgstr "Importer Mappe..." #: buzz/widgets/menu_bar.py msgid "About" @@ -1033,7 +1069,6 @@ msgid "Select audio file" msgstr "Vælg audio-fil" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" msgstr "Vælg inputmappe" @@ -1044,7 +1079,7 @@ msgstr "Kan ikke gemme OpenAI API-nøgle i nøgleringen" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "" +msgstr "Whisper-serveren kunne ikke starte. Tjek logfilerne for detaljer." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1053,11 +1088,13 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" +"Whisper-serveren kunne ikke starte på grund af utilstrækkelig hukommelse. " +"Prøv igen med en mindre model. For at tvinge CPU-tilstand, brug " +"miljøvariablen BUZZ_FORCE_CPU=TRUE." #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Translate to English" -msgstr "Oversættelsesindstillinger" +msgstr "Oversæt til engelsk" #: buzz/transcriber/transcriber.py msgid "Transcribe" @@ -1065,359 +1102,359 @@ msgstr "Transkriber" #: buzz/transcriber/transcriber.py msgid "Chinese" -msgstr "" +msgstr "Kinesisk" #: buzz/transcriber/transcriber.py msgid "Russian" -msgstr "" +msgstr "Russisk" #: buzz/transcriber/transcriber.py msgid "Korean" -msgstr "" +msgstr "Koreansk" #: buzz/transcriber/transcriber.py msgid "French" -msgstr "" +msgstr "Fransk" #: buzz/transcriber/transcriber.py msgid "Portuguese" -msgstr "" +msgstr "Portugisisk" #: buzz/transcriber/transcriber.py msgid "Turkish" -msgstr "" +msgstr "Tyrkisk" #: buzz/transcriber/transcriber.py msgid "Arabic" -msgstr "" +msgstr "Arabisk" #: buzz/transcriber/transcriber.py msgid "Swedish" -msgstr "" +msgstr "Svensk" #: buzz/transcriber/transcriber.py msgid "Indonesian" -msgstr "" +msgstr "Indonesisk" #: buzz/transcriber/transcriber.py msgid "Hindi" -msgstr "" +msgstr "Hindi" #: buzz/transcriber/transcriber.py msgid "Finnish" -msgstr "" +msgstr "Finsk" #: buzz/transcriber/transcriber.py msgid "Vietnamese" -msgstr "" +msgstr "Vietnamesisk" #: buzz/transcriber/transcriber.py msgid "Hebrew" -msgstr "" +msgstr "Hebraisk" #: buzz/transcriber/transcriber.py msgid "Greek" -msgstr "" +msgstr "Græsk" #: buzz/transcriber/transcriber.py msgid "Malay" -msgstr "" +msgstr "Malaysisk" #: buzz/transcriber/transcriber.py msgid "Czech" -msgstr "" +msgstr "Tjekkisk" #: buzz/transcriber/transcriber.py msgid "Romanian" -msgstr "" +msgstr "Rumænsk" #: buzz/transcriber/transcriber.py msgid "Hungarian" -msgstr "" +msgstr "Ungarsk" #: buzz/transcriber/transcriber.py msgid "Tamil" -msgstr "" +msgstr "Tamilsk" #: buzz/transcriber/transcriber.py msgid "Norwegian" -msgstr "" +msgstr "Norsk" #: buzz/transcriber/transcriber.py msgid "Thai" -msgstr "" +msgstr "Thailandsk" #: buzz/transcriber/transcriber.py msgid "Urdu" -msgstr "" +msgstr "Urdu" #: buzz/transcriber/transcriber.py msgid "Croatian" -msgstr "" +msgstr "Kroatisk" #: buzz/transcriber/transcriber.py msgid "Bulgarian" -msgstr "" +msgstr "Bulgarsk" #: buzz/transcriber/transcriber.py msgid "Lithuanian" -msgstr "" +msgstr "Litauisk" #: buzz/transcriber/transcriber.py msgid "Latin" -msgstr "" +msgstr "Latin" #: buzz/transcriber/transcriber.py msgid "Maori" -msgstr "" +msgstr "Maori" #: buzz/transcriber/transcriber.py msgid "Malayalam" -msgstr "" +msgstr "Malayalam" #: buzz/transcriber/transcriber.py msgid "Welsh" -msgstr "" +msgstr "Walisisk" #: buzz/transcriber/transcriber.py msgid "Slovak" -msgstr "" +msgstr "Slovakisk" #: buzz/transcriber/transcriber.py msgid "Telugu" -msgstr "" +msgstr "Telugu" #: buzz/transcriber/transcriber.py msgid "Persian" -msgstr "" +msgstr "Persisk" #: buzz/transcriber/transcriber.py msgid "Bengali" -msgstr "" +msgstr "Bengalsk" #: buzz/transcriber/transcriber.py msgid "Serbian" -msgstr "" +msgstr "Serbisk" #: buzz/transcriber/transcriber.py msgid "Azerbaijani" -msgstr "" +msgstr "Aserbajdsjansk" #: buzz/transcriber/transcriber.py msgid "Slovenian" -msgstr "" +msgstr "Slovensk" #: buzz/transcriber/transcriber.py msgid "Kannada" -msgstr "" +msgstr "Kannada" #: buzz/transcriber/transcriber.py msgid "Estonian" -msgstr "" +msgstr "Estisk" #: buzz/transcriber/transcriber.py msgid "Macedonian" -msgstr "" +msgstr "Makedonsk" #: buzz/transcriber/transcriber.py msgid "Breton" -msgstr "" +msgstr "Bretonsk" #: buzz/transcriber/transcriber.py msgid "Basque" -msgstr "" +msgstr "Baskisk" #: buzz/transcriber/transcriber.py msgid "Icelandic" -msgstr "" +msgstr "Islandsk" #: buzz/transcriber/transcriber.py msgid "Armenian" -msgstr "" +msgstr "Armensk" #: buzz/transcriber/transcriber.py msgid "Nepali" -msgstr "" +msgstr "Nepalesisk" #: buzz/transcriber/transcriber.py msgid "Mongolian" -msgstr "" +msgstr "Mongolsk" #: buzz/transcriber/transcriber.py msgid "Bosnian" -msgstr "" +msgstr "Bosnisk" #: buzz/transcriber/transcriber.py msgid "Kazakh" -msgstr "" +msgstr "Kasakhisk" #: buzz/transcriber/transcriber.py msgid "Albanian" -msgstr "" +msgstr "Albansk" #: buzz/transcriber/transcriber.py msgid "Swahili" -msgstr "" +msgstr "Swahili" #: buzz/transcriber/transcriber.py msgid "Galician" -msgstr "" +msgstr "Galicisk" #: buzz/transcriber/transcriber.py msgid "Marathi" -msgstr "" +msgstr "Marathi" #: buzz/transcriber/transcriber.py msgid "Punjabi" -msgstr "" +msgstr "Punjabi" #: buzz/transcriber/transcriber.py msgid "Sinhala" -msgstr "" +msgstr "Singalesisk" #: buzz/transcriber/transcriber.py msgid "Khmer" -msgstr "" +msgstr "Khmer" #: buzz/transcriber/transcriber.py msgid "Shona" -msgstr "" +msgstr "Shona" #: buzz/transcriber/transcriber.py msgid "Yoruba" -msgstr "" +msgstr "Yoruba" #: buzz/transcriber/transcriber.py msgid "Somali" -msgstr "" +msgstr "Somalisk" #: buzz/transcriber/transcriber.py msgid "Afrikaans" -msgstr "" +msgstr "Afrikaans" #: buzz/transcriber/transcriber.py msgid "Occitan" -msgstr "" +msgstr "Occitansk" #: buzz/transcriber/transcriber.py msgid "Georgian" -msgstr "" +msgstr "Georgisk" #: buzz/transcriber/transcriber.py msgid "Belarusian" -msgstr "" +msgstr "Hviderussisk" #: buzz/transcriber/transcriber.py msgid "Tajik" -msgstr "" +msgstr "Tadsjikisk" #: buzz/transcriber/transcriber.py msgid "Sindhi" -msgstr "" +msgstr "Sindhi" #: buzz/transcriber/transcriber.py msgid "Gujarati" -msgstr "" +msgstr "Gujarati" #: buzz/transcriber/transcriber.py msgid "Amharic" -msgstr "" +msgstr "Amharisk" #: buzz/transcriber/transcriber.py msgid "Yiddish" -msgstr "" +msgstr "Jiddisch" #: buzz/transcriber/transcriber.py msgid "Lao" -msgstr "" +msgstr "Laotisk" #: buzz/transcriber/transcriber.py msgid "Uzbek" -msgstr "" +msgstr "Usbekisk" #: buzz/transcriber/transcriber.py msgid "Faroese" -msgstr "" +msgstr "Færøsk" #: buzz/transcriber/transcriber.py msgid "Haitian Creole" -msgstr "" +msgstr "Haitiansk kreolsk" #: buzz/transcriber/transcriber.py msgid "Pashto" -msgstr "" +msgstr "Pashto" #: buzz/transcriber/transcriber.py msgid "Turkmen" -msgstr "" +msgstr "Turkmensk" #: buzz/transcriber/transcriber.py msgid "Nynorsk" -msgstr "" +msgstr "Nynorsk" #: buzz/transcriber/transcriber.py msgid "Maltese" -msgstr "" +msgstr "Maltesisk" #: buzz/transcriber/transcriber.py msgid "Sanskrit" -msgstr "" +msgstr "Sanskrit" #: buzz/transcriber/transcriber.py msgid "Luxembourgish" -msgstr "" +msgstr "Luxembourgsk" #: buzz/transcriber/transcriber.py msgid "Myanmar" -msgstr "" +msgstr "Burmesisk" #: buzz/transcriber/transcriber.py msgid "Tibetan" -msgstr "" +msgstr "Tibetansk" #: buzz/transcriber/transcriber.py msgid "Tagalog" -msgstr "" +msgstr "Tagalog" #: buzz/transcriber/transcriber.py msgid "Malagasy" -msgstr "" +msgstr "Malagassisk" #: buzz/transcriber/transcriber.py msgid "Assamese" -msgstr "" +msgstr "Assamesisk" #: buzz/transcriber/transcriber.py msgid "Tatar" -msgstr "" +msgstr "Tatarisk" #: buzz/transcriber/transcriber.py msgid "Hawaiian" -msgstr "" +msgstr "Hawaiiansk" #: buzz/transcriber/transcriber.py msgid "Lingala" -msgstr "" +msgstr "Lingala" #: buzz/transcriber/transcriber.py msgid "Hausa" -msgstr "" +msgstr "Hausa" #: buzz/transcriber/transcriber.py msgid "Bashkir" -msgstr "" +msgstr "Basjkirsk" #: buzz/transcriber/transcriber.py msgid "Javanese" -msgstr "" +msgstr "Javanesisk" #: buzz/transcriber/transcriber.py msgid "Sundanese" -msgstr "" +msgstr "Sundanesisk" #: buzz/transcriber/transcriber.py msgid "Cantonese" -msgstr "" +msgstr "Kantonesisk" #: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" @@ -1425,12 +1462,11 @@ msgstr "Der er opstået en forbindelsesfejl" #: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." -msgstr "" +msgstr "Starter Whisper.cpp..." #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "Afbryd transkription" +msgstr "Starter transkription..." #: buzz/settings/shortcut.py msgid "Open Record Window" @@ -1455,93 +1491,3 @@ msgstr "Vis transkriberede oversættelse" #: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Vis transkriptionstidstempler " - -#: buzz/settings/shortcut.py -#, fuzzy -msgid "Search Transcript" -msgstr "Åben transkription" - -#: buzz/settings/shortcut.py -msgid "Go to Next Transcript Search Result" -msgstr "" - -#: buzz/settings/shortcut.py -msgid "Go to Previous Transcript Search Result" -msgstr "" - -#: buzz/settings/shortcut.py -msgid "Scroll to Current Text" -msgstr "" - -#: buzz/settings/shortcut.py -msgid "Play/Pause Audio" -msgstr "" - -#: buzz/settings/shortcut.py -msgid "Replay Current Segment" -msgstr "" - -#: buzz/settings/shortcut.py -msgid "Toggle Playback Controls" -msgstr "" - -#: buzz/settings/shortcut.py -msgid "Decrease Segment Start Time" -msgstr "" - -#: buzz/settings/shortcut.py -msgid "Increase Segment Start Time" -msgstr "" - -#: buzz/settings/shortcut.py -msgid "Decrease Segment End Time" -msgstr "" - -#: buzz/settings/shortcut.py -msgid "Increase Segment End Time" -msgstr "" - -#: buzz/settings/recording_transcriber_mode.py -msgid "Append below" -msgstr "tilføj herunder" - -#: buzz/settings/recording_transcriber_mode.py -msgid "Append above" -msgstr "Tilføj herover" - -#: buzz/settings/recording_transcriber_mode.py -msgid "Append and correct" -msgstr "Tilføj og ret" - -#: buzz/translator.py -#, fuzzy -msgid "Translation error, see logs!" -msgstr "Oversættelsesindstillinger" - -#: buzz/file_transcriber_queue_worker.py -msgid "" -"Speech extraction failed! Check your internet connection — a model may need " -"to be downloaded." -msgstr "" - -#~ msgid "Snap permission notice" -#~ msgstr "Snap tilladelse notifikationer" - -#~ msgid "" -#~ "Detected missing permissions, please check that snap permissions have " -#~ "been granted" -#~ msgstr "" -#~ "Detekterede manglene tilladelser, tjek om venligst Snap tilladelserne er " -#~ "givne" - -#~ msgid "" -#~ "To enable necessary permissions run the following commands in the terminal" -#~ msgstr "" -#~ "For at give de nødvendige tilladelser kør den følgende kommando i et " -#~ "terminalvindue" - -#~ msgid "Close" -#~ msgstr "Luk" - -#~ msgid "Enter instructions for AI on how to translate..." -#~ msgstr "Indtast instruktioner til AI om hvordan den skal oversætte..." diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index 91adbe57..751e01cd 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -53,9 +53,8 @@ msgid "The URL you entered is invalid." msgstr "Die von Ihnen eingegebene URL ist ungültig." #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "Übersetzung des Transkripts anzeigen" +msgstr "Live-Transkript-Präsentation" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" @@ -112,9 +111,8 @@ msgid "Polish" msgstr "Polnisch" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Portuguese (Brazil)" -msgstr "Portugiesisch" +msgstr "Portugiesisch (Brasilien)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py @@ -154,9 +152,8 @@ msgid "OpenAI base url" msgstr "OpenAI-Basis-URL" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "OpenAI-API-Schlüssel" +msgstr "OpenAI-API-Modell" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" @@ -168,6 +165,7 @@ msgstr "Export von Live-Aufnahmetranskriptionen aktivieren" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Durchsuchen" @@ -180,30 +178,43 @@ msgid "Live recording mode" msgstr "Live-Aufnahmemodus" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "Use 8-bit quantization to reduce memory usage" +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." msgstr "" +"Hinweis: Die Exporteinstellungen für Live-Aufnahmen werden in einer " +"zukünftigen Version in die Erweiterten Einstellungen im Live-Aufnahme-" +"Bildschirm verschoben." + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "8-Bit-Quantisierung zur Reduzierung des Speicherverbrauchs verwenden" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"Gilt für Huggingface- und Faster Whisper-Modelle. Reduziert den GPU-" +"Speicherverbrauch, kann jedoch die Transkriptionsqualität leicht verringern." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "GPU-Arbeitsspeicher reduzieren" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" -msgstr "" +msgstr "Nur CPU verwenden und GPU-Beschleunigung deaktivieren" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" msgstr "" +"Diese Option aktivieren, wenn größere Modelle nicht in den GPU-Speicher " +"passen und Buzz abstürzt" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" -msgstr "" +msgstr "GPU deaktivieren" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" @@ -230,6 +241,7 @@ msgstr "" "API-Schlüssel können Fehler verursachen." #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Exportordner auswählen" @@ -349,7 +361,7 @@ msgstr "Sprache erkennen" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "z.B. eng, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -357,6 +369,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"Geben Sie einen ISO 639-3-Sprachcode (3 Buchstaben) ein.\n" +"Beispiele: eng (Englisch), fra (Französisch), deu (Deutsch),\n" +"spa (Spanisch), lav (Lettisch)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -399,7 +414,7 @@ msgstr "Einstellungen für die Spracherkennung" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Durch Kommas getrennt, z.B. „0,0, 0,2, 0,4, 0,6, 0,8, 1,0“" +msgstr "Durch Kommas getrennt, z.B. \"0,0, 0,2, 0,4, 0,6, 0,8, 1,0\"" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" @@ -423,24 +438,59 @@ msgstr "KI-Modell:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "" +msgstr "Bitte übersetzen Sie jeden an Sie gesendeten Text von Englisch nach Spanisch." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Anweisung zur KI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "Übersetzungseinstellungen" +msgstr "Aufnahmeeinstellungen" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "Stille-Schwellenwert:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "Zeilentrenner:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Live-Aufnahmemodus:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Export von Live-Aufnahmen aktivieren" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Exportordner:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Exportdateiname:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "Textdatei (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Exportdateityp:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"Exporteinträge begrenzen\n" +"(0 = alle exportieren):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -529,61 +579,59 @@ msgstr "Datum hinzugefügt" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "Notizen" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "Spaltenreihenfolge zurücksetzen" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "Transkription abbrechen" +msgstr "Transkription neu starten" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename" -msgstr "Vietnamesisch" +msgstr "Umbenennen" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "Notizen hinzufügen/bearbeiten" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "Transkription abbrechen" +msgstr "Transkription umbenennen" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "Neuen Namen eingeben:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "Relevante Notizen für diese Transkription eingeben:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "Neustart nicht möglich" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "Nur fehlgeschlagene oder abgebrochene Transkriptionen können neu gestartet werden." #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "Transkription abbrechen" +msgstr "Fehler beim Neustart der Transkription: {}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" +"Transkription konnte nicht neu gestartet werden: Modell nicht verfügbar und " +"konnte nicht heruntergeladen werden." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "Transkription konnte nicht neu gestartet werden: Transkriptions-Worker nicht gefunden." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -591,7 +639,7 @@ msgstr "Live-Aufnahme" #: buzz/widgets/recording_transcriber_widget.py msgid "Click Record to begin..." -msgstr "Auf „Aufnehmen“ klicken um zu beginnen …" +msgstr "Auf Aufnehmen klicken um zu beginnen …" #: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." @@ -603,72 +651,67 @@ msgstr "Mikrofon:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "In neuem Fenster anzeigen" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "Textdateien" +msgstr "Textgröße:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "Design" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "Hell" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "Dunkel" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "Benutzerdefiniert" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "Textdateien" +msgstr "Textfarbe" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "Hintergrundfarbe" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "Vollbild" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "Kopieren" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "Transkription in die Zwischenablage kopieren" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "Nichts zum Kopieren vorhanden!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "Der Download ist fehlgeschlagen" +msgstr "Kopieren fehlgeschlagen" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "Kopiert!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "Exportordner auswählen" +msgstr "Textfarbe auswählen" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "Audiodatei auswählen" +msgstr "Hintergrundfarbe auswählen" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -688,7 +731,7 @@ msgstr "Nach Updates suchen" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "Protokolle anzeigen" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -696,7 +739,7 @@ msgstr "Sie sind auf dem Laufenden!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "Durchschnittliche Lautstärke" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -741,89 +784,91 @@ msgstr "Größe ändern" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "Sprecher identifizieren" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" -msgstr "" +msgstr "Suchen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" -msgstr "" +msgstr "Suchleiste ein-/ausblenden (Strg+F)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" -msgstr "" +msgstr "Suchen:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." -msgstr "" +msgstr "Suchtext eingeben..." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" -msgstr "" +msgstr "Vorheriges Ergebnis (Umschalt+Eingabe)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" -msgstr "" +msgstr "Nächstes Ergebnis (Strg+Eingabe)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" -msgstr "" +msgstr "Löschen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" -msgstr "" +msgstr "Wiedergabesteuerung:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" -msgstr "" +msgstr "Segment wiederholen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" -msgstr "" +msgstr "Wiederholen beim Klicken auf Transkript-Segmente aktivieren/deaktivieren" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" -msgstr "" +msgstr "Audio folgen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" +"Aktuelle Audioposition im Transkript verfolgen aktivieren/deaktivieren. Bei " +"Aktivierung wird automatisch zum aktuellen Text gescrollt." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" -msgstr "" +msgstr "Zur aktuellen Stelle scrollen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" -msgstr "" +msgstr "Zum aktuell gesprochenen Text scrollen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" -msgstr "" +msgstr "1 von 100+ Treffern" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " -msgstr "" +msgstr "1 von " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" -msgstr "" +msgstr " Treffer" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" -msgstr "" +msgstr "Keine Treffer gefunden" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" -msgstr "" +msgstr " von 100+ Treffern" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " -msgstr "" +msgstr " von " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" @@ -835,15 +880,15 @@ msgstr "Bitte geben Sie den OpenAI-API-Schlüssel in den Einstellungen ein" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "Endzeit verlängern" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "Enden um bis zu (Sekunden) verlängern" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "Enden verlängern" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" @@ -855,7 +900,7 @@ msgstr "Gewünschte Untertitellänge" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "Nur verfügbar, wenn Zeitangaben auf Wortebene bei der Transkription deaktiviert waren" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -879,100 +924,100 @@ msgstr "Vereinigen" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "Nur verfügbar, wenn Zeitangaben auf Wortebene bei der Transkription aktiviert waren" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" +"Sprecheridentifikation nicht verfügbar: Erforderliche Bibliotheken konnten " +"nicht geladen werden." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 Transkripte werden gesammelt" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 Audio wird geladen" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 Ausrichtungsmodell wird geladen" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 Ausrichtungsmodell wird geladen (Wiederholung mit Cache...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" +"Ausrichtungsmodell konnte nicht geladen werden. Bitte überprüfen Sie Ihre " +"Internetverbindung und versuchen Sie es erneut." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 Audio wird verarbeitet" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "Transkription abbrechen" +msgstr "5/8 Transkripte werden vorbereitet" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 Sprecher werden identifiziert" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 Sprecher werden den Transkripten zugeordnet" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 Identifikation abgeschlossen" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 Fehler bei der Sprecheridentifikation" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "Schritt 1: Sprecher identifizieren" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "Identifizieren" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "Bereit zur Sprecheridentifikation" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "Audiodatei nicht gefunden" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "Schritt 2: Sprecher benennen" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "Beispiel abspielen" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "Sprechersätze zusammenführen" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "Datei speichern" +msgstr "Speichern" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "Abbrechen" +msgstr "Wird abgebrochen..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" msgstr "Abgebrochen" @@ -1001,9 +1046,8 @@ msgid "Import URL..." msgstr "URL importieren..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "Datei importieren..." +msgstr "Ordner importieren..." #: buzz/widgets/menu_bar.py msgid "About" @@ -1034,7 +1078,6 @@ msgid "Select audio file" msgstr "Audiodatei auswählen" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" msgstr "Eingabeordner auswählen" @@ -1046,7 +1089,7 @@ msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "" +msgstr "Whisper-Server konnte nicht gestartet werden. Details in den Protokollen prüfen." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1055,11 +1098,14 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" +"Whisper-Server konnte aufgrund von unzureichendem Arbeitsspeicher nicht " +"gestartet werden. Bitte versuchen Sie es mit einem kleineren Modell erneut. " +"Um den CPU-Modus zu erzwingen, verwenden Sie die Umgebungsvariable " +"BUZZ_FORCE_CPU=TRUE." #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Translate to English" -msgstr "Übersetzungseinstellungen" +msgstr "Ins Englische übersetzen" #: buzz/transcriber/transcriber.py msgid "Transcribe" @@ -1427,12 +1473,11 @@ msgstr "Ein Verbindungsfehler ist aufgetreten" #: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." -msgstr "" +msgstr "Whisper.cpp wird gestartet..." #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "Transkription abbrechen" +msgstr "Transkription wird gestartet..." #: buzz/settings/shortcut.py msgid "Open Record Window" @@ -1459,49 +1504,48 @@ msgid "View Transcript Timestamps" msgstr "Zeitstempel des Transkripts anzeigen" #: buzz/settings/shortcut.py -#, fuzzy msgid "Search Transcript" -msgstr "Transkript öffnen" +msgstr "Transkript durchsuchen" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "Zum nächsten Transkript-Suchergebnis gehen" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "Zum vorherigen Transkript-Suchergebnis gehen" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" -msgstr "" +msgstr "Zum aktuellen Text scrollen" #: buzz/settings/shortcut.py msgid "Play/Pause Audio" -msgstr "" +msgstr "Audio abspielen/pausieren" #: buzz/settings/shortcut.py msgid "Replay Current Segment" -msgstr "" +msgstr "Aktuelles Segment erneut abspielen" #: buzz/settings/shortcut.py msgid "Toggle Playback Controls" -msgstr "" +msgstr "Wiedergabesteuerung ein-/ausblenden" #: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" -msgstr "" +msgstr "Segmentanfangszeit verringern" #: buzz/settings/shortcut.py msgid "Increase Segment Start Time" -msgstr "" +msgstr "Segmentanfangszeit erhöhen" #: buzz/settings/shortcut.py msgid "Decrease Segment End Time" -msgstr "" +msgstr "Segmentendzeit verringern" #: buzz/settings/shortcut.py msgid "Increase Segment End Time" -msgstr "" +msgstr "Segmentendzeit erhöhen" #: buzz/settings/recording_transcriber_mode.py msgid "Append below" @@ -1516,15 +1560,16 @@ msgid "Append and correct" msgstr "Anhängen und korrigieren" #: buzz/translator.py -#, fuzzy msgid "Translation error, see logs!" -msgstr "Übersetzungseinstellungen" +msgstr "Übersetzungsfehler, Protokolle prüfen!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" +"Sprachextraktion fehlgeschlagen! Bitte Internetverbindung prüfen — ein " +"Modell muss möglicherweise heruntergeladen werden." #~ msgid "Snap permission notice" #~ msgstr "Snap-Berechtigungsmitteilung" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index b0db6c97..5eca4cc7 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-22 15:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -166,6 +166,7 @@ msgstr "" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "" @@ -177,6 +178,12 @@ msgstr "" msgid "Live recording mode" msgstr "" +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" + #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" @@ -224,6 +231,7 @@ msgid "" msgstr "" #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "" @@ -429,6 +437,40 @@ msgstr "" msgid "Line separator:" msgstr "" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" +msgstr "" + #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "" diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 4e62885f..e29d164d 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -55,9 +55,8 @@ msgstr "La URL que has introducido no es válida." # automatic translation #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "Ver la traducción de la transcripción" +msgstr "Presentación de transcripción en vivo" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" @@ -156,9 +155,8 @@ msgid "OpenAI base url" msgstr "URL base de OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "Clave API de OpenAI" +msgstr "Modelo de la API de OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" @@ -170,6 +168,7 @@ msgstr "Habilitar la exportación de transcripción de grabación en vivo" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Navegar" @@ -183,18 +182,30 @@ msgid "Live recording mode" msgstr "Modo de grabación en directo" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "Use 8-bit quantization to reduce memory usage" +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." msgstr "" +"Nota: Los ajustes de exportación de grabación en vivo se trasladarán a la " +"Configuración avanzada en la pantalla de grabación en vivo en una versión " +"futura." + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "Usar cuantización de 8 bits para reducir el uso de memoria" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"Se aplica a los modelos Huggingface y Faster Whisper. Reduce el uso de " +"memoria de la GPU, pero puede disminuir ligeramente la calidad de la " +"transcripción." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "Reducir la RAM de la GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" @@ -235,6 +246,7 @@ msgstr "" "la clave de API pueden causar errores." #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Seleccione Exportar carpeta" @@ -360,7 +372,7 @@ msgstr "Detectar idioma" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "p. ej., eng, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -368,6 +380,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"Introduzca un código de idioma ISO 639-3 (3 letras).\n" +"Ejemplos: eng (inglés), fra (francés), deu (alemán),\n" +"spa (español), lav (letón)" # automatic translation #: buzz/widgets/transcriber/file_transcriber_widget.py @@ -441,28 +456,61 @@ msgid "AI model:" msgstr "Modelo de IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Please translate each text sent to you from English to Spanish." -msgstr "" -"Introduce instrucciones para la IA sobre cómo traducir, por ejemplo, " -"'Traduzca cada texto que se le envíe del inglés al español'." +msgstr "Por favor, traduzca cada texto que se le envíe del inglés al español." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Instrucciones para la IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "Ajustes de traducción" +msgstr "Ajustes de grabación" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "Umbral de silencio:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "Separador de línea:" + +# automatic translation +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Modo de grabación en directo:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Habilitar la exportación de grabación en vivo" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Carpeta de exportación:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Nombre del archivo de exportación:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "Archivo de texto (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Tipo de archivo de exportación:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"Limitar entradas de exportación\n" +"(0 = exportar todo):" # automatic translation #: buzz/widgets/transcriber/file_transcription_form_widget.py @@ -560,64 +608,57 @@ msgstr "Fecha de adición" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "Notas" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "Restablecer orden de columnas" -# automatic translation #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "Cancelar transcripción" +msgstr "Reiniciar transcripción" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename" -msgstr "Vietnamita" +msgstr "Renombrar" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "Añadir/Editar notas" -# automatic translation #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "Cancelar transcripción" +msgstr "Renombrar transcripción" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "Introducir nuevo nombre:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "Introduzca algunas notas relevantes para esta transcripción:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "No se puede reiniciar" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "Solo se pueden reiniciar las transcripciones fallidas o canceladas." -# automatic translation #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "Cancelar transcripción" +msgstr "No se pudo reiniciar la transcripción: {}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." -msgstr "" +msgstr "No se pudo reiniciar la transcripción: modelo no disponible y no se pudo descargar." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "No se pudo reiniciar la transcripción: no se encontró el trabajador del transcriptor." # automatic translation #: buzz/widgets/recording_transcriber_widget.py @@ -640,73 +681,67 @@ msgstr "Micrófono:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "Mostrar en nueva ventana" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "Archivos de texto" +msgstr "Tamaño del texto:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "Tema" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "Claro" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "Oscuro" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "Personalizado" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "Archivos de texto" +msgstr "Color del texto" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "Color de fondo" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "Pantalla completa" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "Copiar" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "Copiar transcripción al portapapeles" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "¡Nada que copiar!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "Descarga fallida" +msgstr "Copia fallida" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "¡Copiado!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "Seleccione Exportar carpeta" +msgstr "Seleccionar color del texto" -# automatic translation #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "Seleccionar archivo de audio" +msgstr "Seleccionar color de fondo" # automatic translation #: buzz/widgets/recording_transcriber_widget.py @@ -729,7 +764,7 @@ msgstr "Buscar actualizaciones" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "Mostrar registros" # automatic translation #: buzz/widgets/about_dialog.py @@ -738,7 +773,7 @@ msgstr "¡Estás al día!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "Volumen promedio" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -784,7 +819,7 @@ msgstr "Cambiar el tamaño" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "Identificar hablantes" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" @@ -807,9 +842,8 @@ msgid "Previous match (Shift+Enter)" msgstr "Coincidencia anterior (Mayús+Intro)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py -#, fuzzy msgid "Next match (Ctrl+Enter)" -msgstr "Siguiente coincidencia (Enter)" +msgstr "Siguiente coincidencia (Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" @@ -884,15 +918,15 @@ msgstr "Ingrese la clave API de OpenAI en las preferencias" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "Extender tiempo final" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "Extender finales hasta (segundos)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "Extender finales" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" @@ -904,7 +938,7 @@ msgstr "Longitud deseada de los subtítulos" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "Disponible solo si los tiempos a nivel de palabra estaban desactivados durante la transcripción" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -928,102 +962,96 @@ msgstr "Fusión" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "Disponible solo si los tiempos a nivel de palabra estaban activados durante la transcripción" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." -msgstr "" +msgstr "La identificación de hablantes no está disponible: no se pudieron cargar las bibliotecas requeridas." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 Recopilando transcripciones" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 Cargando audio" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 Cargando modelo de alineación" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 Cargando modelo de alineación (reintentando con caché...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." -msgstr "" +msgstr "No se pudo cargar el modelo de alineación. Por favor, compruebe su conexión a internet e inténtelo de nuevo." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 Procesando audio" -# automatic translation #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "Cancelar transcripción" +msgstr "5/8 Preparando transcripciones" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 Identificando hablantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 Asignando hablantes a transcripciones" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 Identificación completada" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 Error al identificar hablantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "Paso 1: Identificar hablantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "Identificar" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "Listo para identificar hablantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "Archivo de audio no encontrado" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "Paso 2: Nombrar hablantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "Reproducir muestra" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "Fusionar frases del hablante" -# automatic translation #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "Guardar archivo" +msgstr "Guardar" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "Cancelar" +msgstr "Cancelando..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" msgstr "Cancelado" @@ -1056,9 +1084,8 @@ msgstr "Importar URL..." # automatic translation #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "Importar archivo..." +msgstr "Importar carpeta..." #: buzz/widgets/menu_bar.py msgid "About" @@ -1095,7 +1122,6 @@ msgstr "Seleccionar archivo de audio" # automatic translation #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" msgstr "Seleccione la carpeta de entrada" @@ -1494,11 +1520,9 @@ msgstr "Se ha producido un error de conexión" msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." -# automatic translation #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "Cancelar transcripción" +msgstr "Iniciando transcripción..." # automatic translation #: buzz/settings/shortcut.py @@ -1536,11 +1560,11 @@ msgstr "Buscar transcripción" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "Ir al siguiente resultado de búsqueda de transcripción" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "Ir al resultado de búsqueda de transcripción anterior" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" @@ -1548,11 +1572,11 @@ msgstr "Desplazarse al texto actual" #: buzz/settings/shortcut.py msgid "Play/Pause Audio" -msgstr "" +msgstr "Reproducir/Pausar audio" #: buzz/settings/shortcut.py msgid "Replay Current Segment" -msgstr "" +msgstr "Reproducir segmento actual" #: buzz/settings/shortcut.py msgid "Toggle Playback Controls" @@ -1560,19 +1584,19 @@ msgstr "Alternar controles de reproducción" #: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" -msgstr "" +msgstr "Disminuir el tiempo de inicio del segmento" #: buzz/settings/shortcut.py msgid "Increase Segment Start Time" -msgstr "" +msgstr "Aumentar el tiempo de inicio del segmento" #: buzz/settings/shortcut.py msgid "Decrease Segment End Time" -msgstr "" +msgstr "Disminuir el tiempo de finalización del segmento" #: buzz/settings/shortcut.py msgid "Increase Segment End Time" -msgstr "" +msgstr "Aumentar el tiempo de finalización del segmento" #: buzz/settings/recording_transcriber_mode.py msgid "Append below" @@ -1587,15 +1611,14 @@ msgid "Append and correct" msgstr "Añadir y corregir" #: buzz/translator.py -#, fuzzy msgid "Translation error, see logs!" -msgstr "Ajustes de traducción" +msgstr "¡Error de traducción, consulte los registros!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." -msgstr "" +msgstr "¡Extracción de voz fallida! Compruebe su conexión a internet — es posible que sea necesario descargar un modelo." #~ msgid "Snap permission notice" #~ msgstr "Aviso de permiso Snap" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index a403cf2e..efad3328 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -165,6 +165,7 @@ msgstr "Abilita l'esportazione della trascrizione della registrazione live" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Sfoglia" @@ -176,6 +177,15 @@ msgstr "Esporta cartella" msgid "Live recording mode" msgstr "Modalità di registrazione in diretta" +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" +"Nota: le impostazioni di esportazione della registrazione live verranno " +"spostate nelle Impostazioni avanzate nella schermata di Registrazione live " +"in una versione futura." + #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "" @@ -232,6 +242,7 @@ msgstr "" "chiave API potrebbero causare errori." #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Seleziona la cartella di esportazione" @@ -426,28 +437,60 @@ msgid "AI model:" msgstr "Modello AI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Please translate each text sent to you from English to Spanish." -msgstr "" -"Inserisci le istruzioni per l'IA su come tradurre, ad esempio 'Per favore, " -"traduci ogni testo che ti viene inviato dall'inglese allo spagnolo.'" +msgstr "Per favore, traduci ogni testo che ti viene inviato dall'inglese allo spagnolo." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Istruzioni per l'AI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "Impostazioni di traduzione" +msgstr "Impostazioni di registrazione" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "Soglia del silenzio:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "Separatore di riga:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Modalità di registrazione in diretta:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Abilita l'esportazione della registrazione live" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Cartella di esportazione:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Nome del file di esportazione:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "File di testo (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Tipo di file di esportazione:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"Limita le voci di esportazione\n" +"(0 = esporta tutto):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -644,24 +687,23 @@ msgstr "Schermo intero" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "Copia" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "Copia la trascrizione negli appunti" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "Nessun testo da copiare!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "Download non riuscito" +msgstr "Copia non riuscita" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "Copiato!" #: buzz/widgets/recording_transcriber_widget.py msgid "Select Text Color" @@ -697,7 +739,7 @@ msgstr "Il programma è aggiornato!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "Volume medio" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -894,6 +936,8 @@ msgstr "" msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" +"L'identificazione del parlante non è disponibile: impossibile caricare le " +"librerie richieste." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" @@ -977,12 +1021,10 @@ msgid "Save" msgstr "Salva" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "Annulla" +msgstr "Annullamento in corso..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" msgstr "Annullato" @@ -1011,9 +1053,8 @@ msgid "Import URL..." msgstr "Importa URL..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "Importa file.." +msgstr "Importa cartella..." #: buzz/widgets/menu_bar.py msgid "About" @@ -1044,7 +1085,6 @@ msgid "Select audio file" msgstr "Seleziona file audio" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" msgstr "Seleziona cartella di input" @@ -1526,15 +1566,16 @@ msgid "Append and correct" msgstr "Aggiungere e correggere" #: buzz/translator.py -#, fuzzy msgid "Translation error, see logs!" -msgstr "Impostazioni di traduzione" +msgstr "Errore di traduzione, controlla i log!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" +"Estrazione del parlato non riuscita! Controlla la tua connessione Internet — " +"potrebbe essere necessario scaricare un modello." #~ msgid "Snap permission notice" #~ msgstr "Avviso di autorizzazione Snap" diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index dca013d9..4c7b6342 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -49,9 +49,8 @@ msgid "The URL you entered is invalid." msgstr "入力されたURLは無効です。" #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "文字起こしの翻訳を表示する" +msgstr "ライブ文字起こしプレゼンテーション" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" @@ -60,79 +59,77 @@ msgstr "デフォルトに戻す" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "English" -msgstr "" +msgstr "英語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Catalan" -msgstr "" +msgstr "カタルーニャ語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Danish" -msgstr "" +msgstr "デンマーク語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Dutch" -msgstr "" +msgstr "オランダ語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "German" -msgstr "" +msgstr "ドイツ語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Spanish" -msgstr "" +msgstr "スペイン語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Italian" -msgstr "" +msgstr "イタリア語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Japanese" -msgstr "" +msgstr "日本語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Latvian" -msgstr "" +msgstr "ラトビア語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Polish" -msgstr "" +msgstr "ポーランド語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" -msgstr "" +msgstr "ポルトガル語(ブラジル)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Ukrainian" -msgstr "残り" +msgstr "ウクライナ語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" -msgstr "" +msgstr "中国語(簡体字)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" -msgstr "" +msgstr "中国語(繁体字)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" -msgstr "" +msgstr "再起動が必要です!" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Ui Language" -msgstr "言語:" +msgstr "UIの言語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" @@ -151,9 +148,8 @@ msgid "OpenAI base url" msgstr "OpenAI ベースURL" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "OpenAI APIキー" +msgstr "OpenAI APIモデル" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" @@ -165,6 +161,7 @@ msgstr "ライブ録音書き起こしの出力を有効にする" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "参照" @@ -173,35 +170,44 @@ msgid "Export folder" msgstr "出力フォルダ" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Live recording mode" -msgstr "ライブ録音" +msgstr "ライブ録音モード" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" +"注意:ライブ録音の出力設定は、将来のバージョンでライブ録音画面の詳細設定に移動" +"されます。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" -msgstr "" +msgstr "メモリ使用量を削減するために8ビット量子化を使用する" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"HuggingfaceおよびFaster Whisperモデルに適用されます。GPUメモリ使用量を削減しま" +"すが、文字起こしの品質がわずかに低下する場合があります。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "GPU RAMを削減する" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" -msgstr "" +msgstr "CPUのみを使用してGPUアクセラレーションを無効にする" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "" +msgstr "大きなモデルがGPUメモリに収まらずBuzzがクラッシュする場合に設定してください" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" -msgstr "" +msgstr "GPUを無効にする" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" @@ -216,17 +222,19 @@ msgstr "" "翻訳を行います。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Invalid API key" -msgstr "OpenAI APIキー" +msgstr "無効なAPIキー" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" +"APIはbase64文字(A-Za-z0-9+/=_-)のみをサポートしています。APIキーにその他の" +"文字が含まれているとエラーが発生する場合があります。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "出力フォルダを選択" @@ -345,7 +353,7 @@ msgstr "自動検出" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "例: eng, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -353,6 +361,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"ISO 639-3言語コード(3文字)を入力してください。\n" +"例: eng(英語)、fra(フランス語)、deu(ドイツ語)、\n" +"spa(スペイン語)、lav(ラトビア語)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -365,7 +376,7 @@ msgstr "モデル:" #: buzz/widgets/transcriber/transcription_options_group_box.py #: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." -msgstr "" +msgstr "モデルの初回使用時は読み込みに数分かかる場合があります。" #: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" @@ -417,24 +428,59 @@ msgstr "AIのモデル:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "" +msgstr "送られてくる各テキストを英語からスペイン語に翻訳してください。" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "AIへの指示:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "翻訳設定" +msgstr "録音設定" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "無音閾値:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "行区切り:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "ライブ録音モード:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "ライブ録音の出力を有効にする" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "出力フォルダ:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "出力ファイル名:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "テキストファイル (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "出力ファイル形式:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"出力エントリ数の制限\n" +"(0 = すべて出力):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -442,7 +488,7 @@ msgstr "単語レベルでのタイミング" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" -msgstr "" +msgstr "音声を抽出する" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" @@ -457,14 +503,12 @@ msgid "Advanced..." msgstr "高度な設定..." #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New File Transcription" -msgstr "新しい文字起こし" +msgstr "新しいファイルの文字起こし" #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New URL Transcription" -msgstr "新しい文字起こし" +msgstr "新しいURLの文字起こし" #: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" @@ -525,60 +569,59 @@ msgstr "追加日" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "メモ" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "列の順序をリセット" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "文字起こしをキャンセルする" +msgstr "文字起こしを再開する" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" -msgstr "" +msgstr "名前を変更" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "メモを追加・編集" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "文字起こしをキャンセルする" +msgstr "文字起こしの名前を変更" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "新しい名前を入力してください:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "この文字起こしに関するメモを入力してください:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "再開できません" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "再開できるのは失敗またはキャンセルされた文字起こしのみです。" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "文字起こしをキャンセルする" +msgstr "文字起こしの再開に失敗しました: {}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" +"文字起こしを再開できませんでした: モデルが利用できず、ダウンロードもできません" +"でした。" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "文字起こしを再開できませんでした: 文字起こしワーカーが見つかりません。" #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -598,72 +641,67 @@ msgstr "マイク:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "新しいウィンドウで表示" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "テキストファイル" +msgstr "テキストサイズ:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "テーマ" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "ライト" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "ダーク" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "カスタム" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "テキストファイル" +msgstr "テキストの色" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "背景の色" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "全画面表示" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "コピー" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "文字起こしをクリップボードにコピー" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "コピーするものがありません!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "ダウンロード失敗" +msgstr "コピーに失敗しました" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "コピーしました!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "出力フォルダを選択" +msgstr "テキストの色を選択" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "音声ファイルを選択" +msgstr "背景の色を選択" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -683,7 +721,7 @@ msgstr "アップデートを確認する" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "ログを表示" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -691,7 +729,7 @@ msgstr "最新の状態です!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "平均音量" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -736,89 +774,91 @@ msgstr "リサイズ" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "話者を識別する" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" -msgstr "" +msgstr "検索" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" -msgstr "" +msgstr "検索バーの表示・非表示 (Ctrl+F)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" -msgstr "" +msgstr "検索:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." -msgstr "" +msgstr "検索するテキストを入力..." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" -msgstr "" +msgstr "前の一致 (Shift+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" -msgstr "" +msgstr "次の一致 (Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" -msgstr "" +msgstr "クリア" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" -msgstr "" +msgstr "再生コントロール:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" -msgstr "" +msgstr "セグメントをループ" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" -msgstr "" +msgstr "文字起こしセグメントをクリックしたときのループを有効・無効にする" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" -msgstr "" +msgstr "音声に追従" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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 msgid "Scroll to Current" -msgstr "" +msgstr "現在位置にスクロール" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" -msgstr "" +msgstr "現在話されているテキストにスクロールする" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" -msgstr "" +msgstr "100件以上中の1件目" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " -msgstr "" +msgstr "1 / " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" -msgstr "" +msgstr " 件一致" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" -msgstr "" +msgstr "一致する項目が見つかりません" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" -msgstr "" +msgstr " / 100件以上一致" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " -msgstr "" +msgstr " / " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" @@ -830,20 +870,19 @@ msgstr "設定画面でOpenAI APIキーを入力してください" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "終了時刻を延長" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "終了を最大(秒)まで延長" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "終了を延長" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py -#, fuzzy msgid "Resize Options" -msgstr "リサイズ" +msgstr "リサイズオプション" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" @@ -851,124 +890,123 @@ msgstr "希望する字幕の長さ" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "文字起こし時に単語レベルのタイミングが無効だった場合のみ使用可能" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" -msgstr "" +msgstr "結合オプション" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" -msgstr "" +msgstr "間隔で結合" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" -msgstr "" +msgstr "句読点で分割" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" -msgstr "" +msgstr "最大文字数で分割" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" -msgstr "" +msgstr "結合" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "文字起こし時に単語レベルのタイミングが有効だった場合のみ使用可能" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" +"話者識別は利用できません: 必要なライブラリの読み込みに失敗しました。" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 文字起こしを収集中" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 音声を読み込み中" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 アライメントモデルを読み込み中" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 アライメントモデルを読み込み中(キャッシュで再試行中...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" +"アライメントモデルの読み込みに失敗しました。インターネット接続を確認して再度" +"お試しください。" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 音声を処理中" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "文字起こしをキャンセルする" +msgstr "5/8 文字起こしを準備中" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 話者を識別中" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 話者を文字起こしにマッピング中" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 識別完了" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 話者識別中にエラーが発生しました" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "ステップ1: 話者を識別する" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "識別" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "話者を識別する準備ができました" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "音声ファイルが見つかりません" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "ステップ2: 話者に名前を付ける" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "サンプルを再生" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "話者の文を結合" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "ファイルを保存" +msgstr "保存" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "キャンセル" +msgstr "キャンセル中..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" msgstr "キャンセル済み" @@ -997,9 +1035,8 @@ msgid "Import URL..." msgstr "URLをインポートする..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "ファイルをインポートする..." +msgstr "フォルダをインポートする..." #: buzz/widgets/menu_bar.py msgid "About" @@ -1028,7 +1065,6 @@ msgid "Select audio file" msgstr "音声ファイルを選択" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" msgstr "入力フォルダを選択" @@ -1039,7 +1075,7 @@ msgstr "OpenAI API キーをkeyringに保存できません" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "" +msgstr "Whisperサーバーの起動に失敗しました。詳細はログを確認してください。" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1048,11 +1084,13 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" +"メモリ不足のためWhisperサーバーの起動に失敗しました。より小さいモデルで再試行" +"してください。CPUモードを強制するには環境変数BUZZ_FORCE_CPU=TRUEを使用してくだ" +"さい。" #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Translate to English" -msgstr "翻訳設定" +msgstr "英語に翻訳" #: buzz/transcriber/transcriber.py msgid "Transcribe" @@ -1060,359 +1098,359 @@ msgstr "文字起こし" #: buzz/transcriber/transcriber.py msgid "Chinese" -msgstr "" +msgstr "中国語" #: buzz/transcriber/transcriber.py msgid "Russian" -msgstr "" +msgstr "ロシア語" #: buzz/transcriber/transcriber.py msgid "Korean" -msgstr "" +msgstr "韓国語" #: buzz/transcriber/transcriber.py msgid "French" -msgstr "" +msgstr "フランス語" #: buzz/transcriber/transcriber.py msgid "Portuguese" -msgstr "" +msgstr "ポルトガル語" #: buzz/transcriber/transcriber.py msgid "Turkish" -msgstr "" +msgstr "トルコ語" #: buzz/transcriber/transcriber.py msgid "Arabic" -msgstr "" +msgstr "アラビア語" #: buzz/transcriber/transcriber.py msgid "Swedish" -msgstr "" +msgstr "スウェーデン語" #: buzz/transcriber/transcriber.py msgid "Indonesian" -msgstr "" +msgstr "インドネシア語" #: buzz/transcriber/transcriber.py msgid "Hindi" -msgstr "" +msgstr "ヒンディー語" #: buzz/transcriber/transcriber.py msgid "Finnish" -msgstr "" +msgstr "フィンランド語" #: buzz/transcriber/transcriber.py msgid "Vietnamese" -msgstr "" +msgstr "ベトナム語" #: buzz/transcriber/transcriber.py msgid "Hebrew" -msgstr "" +msgstr "ヘブライ語" #: buzz/transcriber/transcriber.py msgid "Greek" -msgstr "" +msgstr "ギリシャ語" #: buzz/transcriber/transcriber.py msgid "Malay" -msgstr "" +msgstr "マレー語" #: buzz/transcriber/transcriber.py msgid "Czech" -msgstr "" +msgstr "チェコ語" #: buzz/transcriber/transcriber.py msgid "Romanian" -msgstr "" +msgstr "ルーマニア語" #: buzz/transcriber/transcriber.py msgid "Hungarian" -msgstr "" +msgstr "ハンガリー語" #: buzz/transcriber/transcriber.py msgid "Tamil" -msgstr "" +msgstr "タミル語" #: buzz/transcriber/transcriber.py msgid "Norwegian" -msgstr "" +msgstr "ノルウェー語" #: buzz/transcriber/transcriber.py msgid "Thai" -msgstr "" +msgstr "タイ語" #: buzz/transcriber/transcriber.py msgid "Urdu" -msgstr "" +msgstr "ウルドゥー語" #: buzz/transcriber/transcriber.py msgid "Croatian" -msgstr "" +msgstr "クロアチア語" #: buzz/transcriber/transcriber.py msgid "Bulgarian" -msgstr "" +msgstr "ブルガリア語" #: buzz/transcriber/transcriber.py msgid "Lithuanian" -msgstr "" +msgstr "リトアニア語" #: buzz/transcriber/transcriber.py msgid "Latin" -msgstr "" +msgstr "ラテン語" #: buzz/transcriber/transcriber.py msgid "Maori" -msgstr "" +msgstr "マオリ語" #: buzz/transcriber/transcriber.py msgid "Malayalam" -msgstr "" +msgstr "マラヤーラム語" #: buzz/transcriber/transcriber.py msgid "Welsh" -msgstr "" +msgstr "ウェールズ語" #: buzz/transcriber/transcriber.py msgid "Slovak" -msgstr "" +msgstr "スロバキア語" #: buzz/transcriber/transcriber.py msgid "Telugu" -msgstr "" +msgstr "テルグ語" #: buzz/transcriber/transcriber.py msgid "Persian" -msgstr "" +msgstr "ペルシャ語" #: buzz/transcriber/transcriber.py msgid "Bengali" -msgstr "" +msgstr "ベンガル語" #: buzz/transcriber/transcriber.py msgid "Serbian" -msgstr "" +msgstr "セルビア語" #: buzz/transcriber/transcriber.py msgid "Azerbaijani" -msgstr "" +msgstr "アゼルバイジャン語" #: buzz/transcriber/transcriber.py msgid "Slovenian" -msgstr "" +msgstr "スロベニア語" #: buzz/transcriber/transcriber.py msgid "Kannada" -msgstr "" +msgstr "カンナダ語" #: buzz/transcriber/transcriber.py msgid "Estonian" -msgstr "" +msgstr "エストニア語" #: buzz/transcriber/transcriber.py msgid "Macedonian" -msgstr "" +msgstr "マケドニア語" #: buzz/transcriber/transcriber.py msgid "Breton" -msgstr "" +msgstr "ブルトン語" #: buzz/transcriber/transcriber.py msgid "Basque" -msgstr "" +msgstr "バスク語" #: buzz/transcriber/transcriber.py msgid "Icelandic" -msgstr "" +msgstr "アイスランド語" #: buzz/transcriber/transcriber.py msgid "Armenian" -msgstr "" +msgstr "アルメニア語" #: buzz/transcriber/transcriber.py msgid "Nepali" -msgstr "" +msgstr "ネパール語" #: buzz/transcriber/transcriber.py msgid "Mongolian" -msgstr "" +msgstr "モンゴル語" #: buzz/transcriber/transcriber.py msgid "Bosnian" -msgstr "" +msgstr "ボスニア語" #: buzz/transcriber/transcriber.py msgid "Kazakh" -msgstr "" +msgstr "カザフ語" #: buzz/transcriber/transcriber.py msgid "Albanian" -msgstr "" +msgstr "アルバニア語" #: buzz/transcriber/transcriber.py msgid "Swahili" -msgstr "" +msgstr "スワヒリ語" #: buzz/transcriber/transcriber.py msgid "Galician" -msgstr "" +msgstr "ガリシア語" #: buzz/transcriber/transcriber.py msgid "Marathi" -msgstr "" +msgstr "マラーティー語" #: buzz/transcriber/transcriber.py msgid "Punjabi" -msgstr "" +msgstr "パンジャブ語" #: buzz/transcriber/transcriber.py msgid "Sinhala" -msgstr "" +msgstr "シンハラ語" #: buzz/transcriber/transcriber.py msgid "Khmer" -msgstr "" +msgstr "クメール語" #: buzz/transcriber/transcriber.py msgid "Shona" -msgstr "" +msgstr "ショナ語" #: buzz/transcriber/transcriber.py msgid "Yoruba" -msgstr "" +msgstr "ヨルバ語" #: buzz/transcriber/transcriber.py msgid "Somali" -msgstr "" +msgstr "ソマリ語" #: buzz/transcriber/transcriber.py msgid "Afrikaans" -msgstr "" +msgstr "アフリカーンス語" #: buzz/transcriber/transcriber.py msgid "Occitan" -msgstr "" +msgstr "オック語" #: buzz/transcriber/transcriber.py msgid "Georgian" -msgstr "" +msgstr "ジョージア語" #: buzz/transcriber/transcriber.py msgid "Belarusian" -msgstr "" +msgstr "ベラルーシ語" #: buzz/transcriber/transcriber.py msgid "Tajik" -msgstr "" +msgstr "タジク語" #: buzz/transcriber/transcriber.py msgid "Sindhi" -msgstr "" +msgstr "シンド語" #: buzz/transcriber/transcriber.py msgid "Gujarati" -msgstr "" +msgstr "グジャラート語" #: buzz/transcriber/transcriber.py msgid "Amharic" -msgstr "" +msgstr "アムハラ語" #: buzz/transcriber/transcriber.py msgid "Yiddish" -msgstr "" +msgstr "イディッシュ語" #: buzz/transcriber/transcriber.py msgid "Lao" -msgstr "" +msgstr "ラオス語" #: buzz/transcriber/transcriber.py msgid "Uzbek" -msgstr "" +msgstr "ウズベク語" #: buzz/transcriber/transcriber.py msgid "Faroese" -msgstr "" +msgstr "フェロー語" #: buzz/transcriber/transcriber.py msgid "Haitian Creole" -msgstr "" +msgstr "ハイチ・クレオール語" #: buzz/transcriber/transcriber.py msgid "Pashto" -msgstr "" +msgstr "パシュトー語" #: buzz/transcriber/transcriber.py msgid "Turkmen" -msgstr "" +msgstr "トルクメン語" #: buzz/transcriber/transcriber.py msgid "Nynorsk" -msgstr "" +msgstr "ニーノシュク語" #: buzz/transcriber/transcriber.py msgid "Maltese" -msgstr "" +msgstr "マルタ語" #: buzz/transcriber/transcriber.py msgid "Sanskrit" -msgstr "" +msgstr "サンスクリット語" #: buzz/transcriber/transcriber.py msgid "Luxembourgish" -msgstr "" +msgstr "ルクセンブルク語" #: buzz/transcriber/transcriber.py msgid "Myanmar" -msgstr "" +msgstr "ミャンマー語" #: buzz/transcriber/transcriber.py msgid "Tibetan" -msgstr "" +msgstr "チベット語" #: buzz/transcriber/transcriber.py msgid "Tagalog" -msgstr "" +msgstr "タガログ語" #: buzz/transcriber/transcriber.py msgid "Malagasy" -msgstr "" +msgstr "マラガシ語" #: buzz/transcriber/transcriber.py msgid "Assamese" -msgstr "" +msgstr "アッサム語" #: buzz/transcriber/transcriber.py msgid "Tatar" -msgstr "" +msgstr "タタール語" #: buzz/transcriber/transcriber.py msgid "Hawaiian" -msgstr "" +msgstr "ハワイ語" #: buzz/transcriber/transcriber.py msgid "Lingala" -msgstr "" +msgstr "リンガラ語" #: buzz/transcriber/transcriber.py msgid "Hausa" -msgstr "" +msgstr "ハウサ語" #: buzz/transcriber/transcriber.py msgid "Bashkir" -msgstr "" +msgstr "バシキール語" #: buzz/transcriber/transcriber.py msgid "Javanese" -msgstr "" +msgstr "ジャワ語" #: buzz/transcriber/transcriber.py msgid "Sundanese" -msgstr "" +msgstr "スンダ語" #: buzz/transcriber/transcriber.py msgid "Cantonese" -msgstr "" +msgstr "広東語" #: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" @@ -1420,12 +1458,11 @@ msgstr "接続エラーが発生しました" #: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." -msgstr "" +msgstr "Whisper.cppを起動中..." #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "文字起こしをキャンセルする" +msgstr "文字起こしを開始中..." #: buzz/settings/shortcut.py msgid "Open Record Window" @@ -1452,72 +1489,72 @@ msgid "View Transcript Timestamps" msgstr "文字起こしのタイムスタンプを表示する" #: buzz/settings/shortcut.py -#, fuzzy msgid "Search Transcript" -msgstr "文字起こしを開く" +msgstr "文字起こしを検索" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "次の文字起こし検索結果へ移動" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "前の文字起こし検索結果へ移動" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" -msgstr "" +msgstr "現在のテキストにスクロール" #: buzz/settings/shortcut.py msgid "Play/Pause Audio" -msgstr "" +msgstr "音声の再生・一時停止" #: buzz/settings/shortcut.py msgid "Replay Current Segment" -msgstr "" +msgstr "現在のセグメントを再再生" #: buzz/settings/shortcut.py msgid "Toggle Playback Controls" -msgstr "" +msgstr "再生コントロールの表示切替" #: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" -msgstr "" +msgstr "セグメント開始時刻を早める" #: buzz/settings/shortcut.py msgid "Increase Segment Start Time" -msgstr "" +msgstr "セグメント開始時刻を遅らせる" #: buzz/settings/shortcut.py msgid "Decrease Segment End Time" -msgstr "" +msgstr "セグメント終了時刻を早める" #: buzz/settings/shortcut.py msgid "Increase Segment End Time" -msgstr "" +msgstr "セグメント終了時刻を遅らせる" #: buzz/settings/recording_transcriber_mode.py msgid "Append below" -msgstr "" +msgstr "下に追加" #: buzz/settings/recording_transcriber_mode.py msgid "Append above" -msgstr "" +msgstr "上に追加" #: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" -msgstr "" +msgstr "追加して修正" #: buzz/translator.py -#, fuzzy msgid "Translation error, see logs!" -msgstr "翻訳設定" +msgstr "翻訳エラーが発生しました。ログを確認してください!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" +"音声抽出に失敗しました!インターネット接続を確認してください。モデルのダウン" +"ロードが必要な場合があります。" #~ msgid "Snap permission notice" #~ msgstr "Snap権限通知" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 42531040..08a04e84 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: 2026-02-26 20:29+0200\n" -"PO-Revision-Date: 2026-02-26 20:30+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" +"PO-Revision-Date: 2026-02-27 09:11+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -166,6 +166,7 @@ msgstr "Eksportēt dzīvā ieraksta transkriptus" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Izvēlēties" @@ -179,6 +180,14 @@ msgstr "" "Dzīvā ieraksta\n" "režīms" +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" +"Piezīme: Dzīvā ieraksta iestatījumi nākotnes Buzz versijās tiks pārvietoti " +"uz Papildu iestatījumu sadaļu Dzīvā ieraksta logā" + #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" msgstr "Izmantot 8bitu kvantizāciju, lai samazinātu nepieciešamo atmiņu" @@ -234,6 +243,7 @@ msgstr "" "atslēgā var radīt kļūdas." #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Izvēlieties mapi kurā eksportēt" @@ -447,6 +457,44 @@ msgstr "Klusuma slieksnis:" msgid "Line separator:" msgstr "Rindiņu atdalītājs:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "" +"Dzīvā ieraksta\n" +"režīms:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Eksportēt dzīvā ieraksta transkriptus" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Eksportēt mapē:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Eksporta fails:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "Teksta fails (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Eksporta faila tips:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" +msgstr "" +"Eksportēt tikai pēdējos\n" +"(0 = eksportēt visus):" + #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" msgstr "Dalīt pa vārdiem" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 777cfecc..2f4c2d9b 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -56,9 +56,8 @@ msgid "The URL you entered is invalid." msgstr "De ingevoerde url is ongeldig." #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "Getranscribeerde vertaling bekijken" +msgstr "Live transcriptie presenteren" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" @@ -115,9 +114,8 @@ msgid "Polish" msgstr "Pools" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Portuguese (Brazil)" -msgstr "Portugees" +msgstr "Portugees (Brazilië)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py @@ -157,9 +155,8 @@ msgid "OpenAI base url" msgstr "OpenAI-hoofd-url" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "OpenAI-api-sleutel" +msgstr "OpenAI-api-model" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" @@ -171,6 +168,7 @@ msgstr "Transcripties van opnames onmiddelijk exporteren" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Bladeren" @@ -183,30 +181,40 @@ msgid "Live recording mode" msgstr "Live-opnamemodus" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "Use 8-bit quantization to reduce memory usage" +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." msgstr "" +"Opmerking: de exportinstellingen voor live-opnames worden in een toekomstige " +"versie verplaatst naar de geavanceerde instellingen in het scherm Live-opname." + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "8-bits kwantisering gebruiken om geheugengebruik te verminderen" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"Van toepassing op Huggingface- en Faster Whisper-modellen. Vermindert het " +"GPU-geheugengebruik, maar kan de transcriptiekwaliteit licht verminderen." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "GPU-geheugen verminderen" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" -msgstr "" +msgstr "Alleen CPU gebruiken en GPU-versnelling uitschakelen" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "" +msgstr "Gebruik dit als grotere modellen niet in het GPU-geheugen passen en Buzz crasht" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" -msgstr "" +msgstr "GPU uitschakelen" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" @@ -233,6 +241,7 @@ msgstr "" "kunnen problemen veroorzaken." #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Kies een exportmap" @@ -351,7 +360,7 @@ msgstr "Taal herkennen" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "bijv. nld, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -359,6 +368,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"Voer een ISO 639-3-taalcode in (3 letters).\n" +"Voorbeelden: nld (Nederlands), fra (Frans), deu (Duits),\n" +"spa (Spaans), lav (Lets)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -401,7 +413,7 @@ msgstr "Spraakherkenningsinstellingen" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Kommagescheiden, bijv. ‘0.0, 0.2, 0.4, 0.6, 0.8, 1.0’" +msgstr "Kommagescheiden, bijv. '0.0, 0.2, 0.4, 0.6, 0.8, 1.0'" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" @@ -425,24 +437,59 @@ msgstr "AI-model:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "" +msgstr "Vertaal elke tekst die naar u wordt verzonden van het Engels naar het Spaans." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "AI-instructies:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "Vertaalinstellingen" +msgstr "Opname-instellingen" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "Stiltedrempel:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "Regelscheidingsteken:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Live-opnamemodus:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Live-opname exporteren inschakelen" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Exportmap:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Exportbestandsnaam:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "Tekstbestand (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Exportbestandstype:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"Exportitems beperken\n" +"(0 = alles exporteren):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -531,61 +578,59 @@ msgstr "Toegevoegd op" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "Notities" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "Kolomvolgorde herstellen" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "Transcriptie wissen" +msgstr "Transcriptie opnieuw starten" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename" -msgstr "Vietnamees" +msgstr "Hernoemen" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "Notities toevoegen/bewerken" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "Transcriptie wissen" +msgstr "Transcriptie hernoemen" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "Voer een nieuwe naam in:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "Voer relevante notities in voor deze transcriptie:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "Kan niet opnieuw starten" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "Alleen mislukte of afgebroken transcripties kunnen opnieuw worden gestart." #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "Transcriptie wissen" +msgstr "Transcriptie opnieuw starten mislukt: {}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" +"Transcriptie kon niet opnieuw worden gestart: model niet beschikbaar en kon " +"niet worden gedownload." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "Transcriptie kon niet opnieuw worden gestart: transcriptieproces niet gevonden." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -605,72 +650,67 @@ msgstr "Microfoon:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "In nieuw venster tonen" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "Tekstbestanden" +msgstr "Tekstgrootte:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "Thema" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "Licht" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "Donker" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "Aangepast" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "Tekstbestanden" +msgstr "Tekstkleur" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "Achtergrondkleur" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "Volledig scherm" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "Kopiëren" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "Transcriptie naar klembord kopiëren" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "Niets om te kopiëren!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "Het downloaden is mislukt" +msgstr "Kopiëren mislukt" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "Gekopieerd!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "Kies een exportmap" +msgstr "Kies een tekstkleur" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "Kies een audiobestand" +msgstr "Kies een achtergrondkleur" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -688,7 +728,7 @@ msgstr "Controleren op updates" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "Logboeken tonen" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -696,7 +736,7 @@ msgstr "De software is actueel!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "Gemiddeld volume" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -741,89 +781,91 @@ msgstr "Grootte" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "Sprekers identificeren" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" -msgstr "" +msgstr "Zoeken" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" -msgstr "" +msgstr "Zoekbalk tonen/verbergen (Ctrl+F)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" -msgstr "" +msgstr "Zoeken:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." -msgstr "" +msgstr "Voer te zoeken tekst in…" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" -msgstr "" +msgstr "Vorige overeenkomst (Shift+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" -msgstr "" +msgstr "Volgende overeenkomst (Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" -msgstr "" +msgstr "Wissen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" -msgstr "" +msgstr "Afspeelbediening:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" -msgstr "" +msgstr "Fragment herhalen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" -msgstr "" +msgstr "Herhaling in- of uitschakelen bij het klikken op transcriptfragmenten" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" -msgstr "" +msgstr "Audio volgen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" +"De huidige audiopositie in de transcriptie in- of uitschakelen. Wanneer " +"ingeschakeld, wordt automatisch naar de huidige tekst gescrold." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" -msgstr "" +msgstr "Naar huidig fragment scrollen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" -msgstr "" +msgstr "Naar de momenteel gesproken tekst scrollen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" -msgstr "" +msgstr "1 van 100+ overeenkomsten" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " -msgstr "" +msgstr "1 van " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" -msgstr "" +msgstr " overeenkomsten" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" -msgstr "" +msgstr "Geen overeenkomsten gevonden" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" -msgstr "" +msgstr " van 100+ overeenkomsten" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " -msgstr "" +msgstr " van " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" @@ -835,15 +877,15 @@ msgstr "Voer de OpenAI-api-sleutel in in de instellingen" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "Eindtijd verlengen" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "Eindes verlengen met maximaal (seconden)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "Eindes verlengen" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" @@ -855,7 +897,7 @@ msgstr "Voorkeurslengte van ondertiteling" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "Alleen beschikbaar als timings op woordniveau zijn uitgeschakeld tijdens transcriptie" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -879,100 +921,100 @@ msgstr "Samenvoegen" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "Alleen beschikbaar als timings op woordniveau zijn ingeschakeld tijdens transcriptie" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" +"Sprekeridentificatie is niet beschikbaar: het laden van de vereiste " +"bibliotheken is mislukt." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 Transcripties verzamelen" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 Audio laden" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 Uitlijningsmodel laden" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 Uitlijningsmodel laden (opnieuw proberen met cache…)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" +"Het laden van het uitlijningsmodel is mislukt. Controleer uw internetverbinding " +"en probeer het opnieuw." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 Audio verwerken" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "Transcriptie wissen" +msgstr "5/8 Transcripties voorbereiden" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 Sprekers identificeren" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 Sprekers koppelen aan transcripties" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 Identificatie voltooid" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 Fout bij het identificeren van sprekers" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "Stap 1: Sprekers identificeren" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "Identificeren" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "Klaar om sprekers te identificeren" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "Audiobestand niet gevonden" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "Stap 2: Sprekers een naam geven" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "Fragment afspelen" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "Zinnen van sprekers samenvoegen" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "Bestand opslaan" +msgstr "Opslaan" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "Annuleren" +msgstr "Bezig met annuleren…" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" msgstr "Afgebroken" @@ -1001,9 +1043,8 @@ msgid "Import URL..." msgstr "Url importeren…" #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "Bestand importeren…" +msgstr "Map importeren…" #: buzz/widgets/menu_bar.py msgid "About" @@ -1034,7 +1075,6 @@ msgid "Select audio file" msgstr "Kies een audiobestand" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" msgstr "Kies een invoermap" @@ -1045,7 +1085,7 @@ msgstr "De OpenAI-api-sleutel kan niet worden bewaard in de sleutelbos" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "" +msgstr "De Whisper-server kon niet worden gestart. Raadpleeg de logboeken voor meer informatie." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1054,11 +1094,13 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" +"De Whisper-server kon niet worden gestart wegens onvoldoende geheugen. Probeer " +"het opnieuw met een kleiner model. Gebruik de omgevingsvariabele " +"BUZZ_FORCE_CPU=TRUE om CPU-modus te forceren." #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Translate to English" -msgstr "Vertaalinstellingen" +msgstr "Naar het Engels vertalen" #: buzz/transcriber/transcriber.py msgid "Transcribe" @@ -1426,12 +1468,11 @@ msgstr "Er is een verbindingsfout opgetreden" #: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." -msgstr "" +msgstr "Whisper.cpp wordt gestart…" #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "Transcriptie wissen" +msgstr "Transcriptie wordt gestart…" #: buzz/settings/shortcut.py msgid "Open Record Window" @@ -1458,49 +1499,48 @@ msgid "View Transcript Timestamps" msgstr "Getranscribeerde tijdstippen bekijken" #: buzz/settings/shortcut.py -#, fuzzy msgid "Search Transcript" -msgstr "Transcriptie openen" +msgstr "Transcriptie doorzoeken" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "Naar volgend zoekresultaat in transcriptie gaan" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "Naar vorig zoekresultaat in transcriptie gaan" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" -msgstr "" +msgstr "Naar huidige tekst scrollen" #: buzz/settings/shortcut.py msgid "Play/Pause Audio" -msgstr "" +msgstr "Audio afspelen/pauzeren" #: buzz/settings/shortcut.py msgid "Replay Current Segment" -msgstr "" +msgstr "Huidig fragment opnieuw afspelen" #: buzz/settings/shortcut.py msgid "Toggle Playback Controls" -msgstr "" +msgstr "Afspeelbediening in-/uitschakelen" #: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" -msgstr "" +msgstr "Begintijd van fragment verkleinen" #: buzz/settings/shortcut.py msgid "Increase Segment Start Time" -msgstr "" +msgstr "Begintijd van fragment vergroten" #: buzz/settings/shortcut.py msgid "Decrease Segment End Time" -msgstr "" +msgstr "Eindtijd van fragment verkleinen" #: buzz/settings/shortcut.py msgid "Increase Segment End Time" -msgstr "" +msgstr "Eindtijd van fragment vergroten" #: buzz/settings/recording_transcriber_mode.py msgid "Append below" @@ -1515,15 +1555,16 @@ msgid "Append and correct" msgstr "Toevoegen en corrigeren" #: buzz/translator.py -#, fuzzy msgid "Translation error, see logs!" -msgstr "Vertaalinstellingen" +msgstr "Vertaalfout, raadpleeg de logboeken!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" +"Spraakextractie mislukt! Controleer uw internetverbinding — mogelijk moet er " +"een model worden gedownload." #~ msgid "Snap permission notice" #~ msgstr "Snap-rechten" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index c7b60fec..d556fe63 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -31,7 +31,7 @@ msgstr "https://przyklad.pl/audio.mp3" #: buzz/widgets/transcriber/advanced_settings_dialog.py #: buzz/widgets/main_window.py msgid "Ok" -msgstr "" +msgstr "OK" #: buzz/widgets/import_url_dialog.py #: buzz/widgets/preferences_dialog/preferences_dialog.py @@ -54,183 +54,194 @@ msgid "The URL you entered is invalid." msgstr "Wprowadzony URL nie jest prawidłowy" #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "Nowa transkrypcja" +msgstr "Prezentacja transkrypcji na żywo" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" -msgstr "" +msgstr "Przywróć ustawienia domyślne" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "English" -msgstr "" +msgstr "Angielski" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Catalan" -msgstr "" +msgstr "Kataloński" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Danish" -msgstr "" +msgstr "Duński" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Dutch" -msgstr "" +msgstr "Niderlandzki" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "German" -msgstr "" +msgstr "Niemiecki" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Spanish" -msgstr "" +msgstr "Hiszpański" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Italian" -msgstr "" +msgstr "Włoski" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Japanese" -msgstr "" +msgstr "Japoński" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Latvian" -msgstr "" +msgstr "Łotewski" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Polish" -msgstr "" +msgstr "Polski" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Portugalski (Brazylia)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Ukrainian" -msgstr "" +msgstr "Ukraiński" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" -msgstr "" +msgstr "Chiński (uproszczony)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" -msgstr "" +msgstr "Chiński (tradycyjny)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" -msgstr "" +msgstr "Wymagane ponowne uruchomienie!" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Ui Language" -msgstr "Język:" +msgstr "Język interfejsu" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" -msgstr "" +msgstr "Rozmiar czcionki" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" -msgstr "" +msgstr "Testuj" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" -msgstr "" +msgstr "Klucz API OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" -msgstr "" +msgstr "Podstawowy adres URL OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "Model:" +msgstr "Model API OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" -msgstr "" +msgstr "Domyślna nazwa pliku eksportu" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" -msgstr "" +msgstr "Włącz eksport transkrypcji nagrania na żywo" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" -msgstr "" +msgstr "Przeglądaj" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" -msgstr "" +msgstr "Folder eksportu" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Live recording mode" -msgstr "Nagrywanie na żywo" +msgstr "Tryb nagrywania na żywo" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" +"Uwaga: Ustawienia eksportu nagrywania na żywo zostaną przeniesione do " +"Ustawień zaawansowanych ekranu nagrywania na żywo w przyszłej wersji." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" -msgstr "" +msgstr "Użyj kwantyzacji 8-bitowej, aby zmniejszyć zużycie pamięci" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"Dotyczy modeli Huggingface i Faster Whisper. Zmniejsza zużycie pamięci GPU, " +"ale może nieznacznie obniżyć jakość transkrypcji." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "Zmniejsz pamięć RAM GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" -msgstr "" +msgstr "Używaj tylko CPU i wyłącz akcelerację GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "" +msgstr "Ustaw to, jeśli większe modele nie mieszczą się w pamięci GPU i Buzz się zawiesza" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" -msgstr "" +msgstr "Wyłącz GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" -msgstr "" +msgstr "Test klucza API OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Your API key is valid. Buzz will use this key to perform Whisper API " "transcriptions and AI translations." msgstr "" +"Twój klucz API jest prawidłowy. Buzz użyje tego klucza do wykonywania " +"transkrypcji przez Whisper API oraz tłumaczeń AI." #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Invalid API key" -msgstr "Nieprawidłowy URL" +msgstr "Nieprawidłowy klucz API" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" +"API obsługuje tylko znaki base64 (A-Za-z0-9+/=_-). Inne znaki w kluczu API " +"mogą powodować błędy." #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" -msgstr "" +msgstr "Wybierz folder eksportu" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" @@ -238,42 +249,41 @@ msgid "" "Transcription and translation may still work if the API does not support key " "validation." msgstr "" +"OpenAI API zwróciło nieprawidłową odpowiedź. Sprawdź adres URL API lub swój " +"klucz. Transkrypcja i tłumaczenie mogą nadal działać, jeśli API nie obsługuje " +"weryfikacji klucza." #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py -#, fuzzy msgid "Enable folder watch" -msgstr "Przeglądanie folderu" +msgstr "Włącz obserwację folderu" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" -msgstr "" +msgstr "Folder wejściowy" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" -msgstr "" +msgstr "Folder wyjściowy" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py -#, fuzzy msgid "Select Input Folder" -msgstr "Wybierz plik audio" +msgstr "Wybierz folder wejściowy" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" -msgstr "" +msgstr "Wybierz folder wyjściowy" #: buzz/widgets/preferences_dialog/preferences_dialog.py -#, fuzzy msgid "Preferences" -msgstr "Ustawienia..." +msgstr "Ustawienia" #: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" msgstr "Główne" #: buzz/widgets/preferences_dialog/preferences_dialog.py -#, fuzzy msgid "Models" -msgstr "Model:" +msgstr "Modele" #: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" @@ -285,14 +295,13 @@ msgstr "Przeglądanie folderu" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" -msgstr "" +msgstr "Grupa" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" -msgstr "" +msgstr "ID modelu Faster Whisper z Huggingface" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Download" msgstr "Pobierz" @@ -305,7 +314,6 @@ msgid "Delete" msgstr "Usuń" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Downloaded" msgstr "Pobrany" @@ -315,21 +323,19 @@ msgstr "Dostępne do pobrania" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" -msgstr "" +msgstr "Link do pobrania pliku modelu Whisper.cpp ggml" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" msgstr "Usuń model" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Are you sure you want to delete the selected model?" -msgstr "Czy na pewno chcesz usunąć zaznaczoną transkrypcję?" +msgstr "Czy na pewno chcesz usunąć wybrany model?" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Download failed" -msgstr "Pobrany" +msgstr "Pobieranie nie powiodło się" #: buzz/widgets/preferences_dialog/models_preferences_widget.py #: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py @@ -352,7 +358,7 @@ msgstr "Wykryj język" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "np. eng, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -360,6 +366,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"Wprowadź kod języka ISO 639-3 (3 litery).\n" +"Przykłady: eng (angielski), fra (francuski), deu (niemiecki),\n" +"spa (hiszpański), lav (łotewski)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -372,11 +381,11 @@ msgstr "Model:" #: buzz/widgets/transcriber/transcription_options_group_box.py #: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." -msgstr "" +msgstr "Pierwsze użycie modelu może potrwać kilka minut podczas ładowania." #: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" -msgstr "" +msgstr "Klucz API:" #: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" @@ -388,7 +397,7 @@ msgstr "Język:" #: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." -msgstr "" +msgstr "Wprowadź instrukcje..." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" @@ -396,7 +405,7 @@ msgstr "Ustawienia zaawansowane" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" -msgstr "" +msgstr "Ustawienia rozpoznawania mowy" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" @@ -412,36 +421,71 @@ msgstr "Wstępne instrukcje:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" -msgstr "" +msgstr "Ustawienia tłumaczenia" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" -msgstr "" +msgstr "Włącz tłumaczenie AI" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "AI model:" -msgstr "Model:" +msgstr "Model AI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "" +msgstr "Proszę przetłumacz każdy przesłany tekst z angielskiego na hiszpański." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" -msgstr "" +msgstr "Instrukcje dla AI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Recording settings" -msgstr "" +msgstr "Ustawienia nagrywania" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "Próg ciszy:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "Separator wierszy:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Tryb nagrywania na żywo:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Włącz eksport nagrywania na żywo" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Folder eksportu:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Nazwa pliku eksportu:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "Plik tekstowy (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Typ pliku eksportu:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"Ogranicz wpisy eksportu\n" +"(0 = eksportuj wszystkie):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -449,29 +493,27 @@ msgstr "Znaczniki dla słów" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" -msgstr "" +msgstr "Wyodrębnij mowę" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" -msgstr "" +msgstr "Eksportuj:" #: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" -msgstr "" +msgstr "ID modelu z Huggingface" #: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." -msgstr "" +msgstr "Zaawansowane..." #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New File Transcription" -msgstr "Nowa transkrypcja" +msgstr "Nowa transkrypcja pliku" #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New URL Transcription" -msgstr "Nowa transkrypcja" +msgstr "Nowa transkrypcja z URL" #: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" @@ -488,7 +530,7 @@ msgstr "Wyczyść historię" #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" -msgstr "" +msgstr "W toku" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" @@ -496,7 +538,7 @@ msgstr "Ukończono" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" -msgstr "" +msgstr "Nie powiodło się" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" @@ -507,89 +549,84 @@ msgid "Queued" msgstr "Kolejka" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "File Name / URL" -msgstr "Nazwa pliku" +msgstr "Nazwa pliku / URL" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Model" -msgstr "Model:" +msgstr "Model" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Task" -msgstr "Zadanie:" +msgstr "Zadanie" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "Status" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Date Completed" -msgstr "Ukończono" +msgstr "Data ukończenia" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" -msgstr "" +msgstr "Data dodania" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "Notatki" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "Resetuj kolejność kolumn" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "Anuluj transkrypcję" +msgstr "Uruchom ponownie transkrypcję" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" -msgstr "" +msgstr "Zmień nazwę" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "Dodaj/edytuj notatki" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "Anuluj transkrypcję" +msgstr "Zmień nazwę transkrypcji" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "Wprowadź nową nazwę:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "Wprowadź odpowiednie notatki do tej transkrypcji:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "Nie można ponownie uruchomić" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "Tylko nieudane lub anulowane transkrypcje mogą być uruchomione ponownie." #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "Anuluj transkrypcję" +msgstr "Nie udało się uruchomić ponownie transkrypcji: {}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" +"Nie można uruchomić ponownie transkrypcji: model jest niedostępny i nie " +"można go pobrać." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "Nie można uruchomić ponownie transkrypcji: nie znaleziono procesu transkrypcji." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -601,7 +638,7 @@ msgstr "Naciśnij Nagraj, aby zacząć..." #: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." -msgstr "" +msgstr "Oczekiwanie na tłumaczenie AI..." #: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" @@ -609,72 +646,67 @@ msgstr "Mikrofon:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "Pokaż w nowym oknie" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "Pliki tekstowe" +msgstr "Rozmiar tekstu:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "Motyw" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "Jasny" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "Ciemny" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "Niestandardowy" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "Pliki tekstowe" +msgstr "Kolor tekstu" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "Kolor tła" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "Pełny ekran" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "Kopiuj" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "Kopiuj transkrypcję do schowka" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "Nie ma nic do skopiowania!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "Pobrany" +msgstr "Kopiowanie nie powiodło się" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "Skopiowano!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "Wybierz plik audio" +msgstr "Wybierz kolor tekstu" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "Wybierz plik audio" +msgstr "Wybierz kolor tła" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -694,7 +726,7 @@ msgstr "Sprawdź aktualizacje" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "Pokaż logi" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -702,7 +734,7 @@ msgstr "Posiadasz najnowszą wersję!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "Średnia głośność" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -721,270 +753,269 @@ msgstr "Tekst" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py #: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py #: buzz/widgets/transcription_viewer/export_transcription_menu.py -#, fuzzy msgid "Translation" -msgstr "Nowa transkrypcja" +msgstr "Tłumaczenie" #: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" -msgstr "" +msgstr "Widok" #: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" -msgstr "" +msgstr "Znaczniki czasu" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" -msgstr "" +msgstr "Eksportuj" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" -msgstr "" +msgstr "Tłumacz" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" -msgstr "" +msgstr "Zmień rozmiar" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "Identyfikuj mówców" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" -msgstr "" +msgstr "Znajdź" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" -msgstr "" +msgstr "Pokaż/ukryj pasek wyszukiwania (Ctrl+F)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" -msgstr "" +msgstr "Znajdź:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." -msgstr "" +msgstr "Wprowadź tekst do wyszukania..." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" -msgstr "" +msgstr "Poprzedni wynik (Shift+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" -msgstr "" +msgstr "Następny wynik (Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" -msgstr "" +msgstr "Wyczyść" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" -msgstr "" +msgstr "Sterowanie odtwarzaniem:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" -msgstr "" +msgstr "Zapętlaj fragment" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" -msgstr "" +msgstr "Włącz/wyłącz zapętlanie po kliknięciu na fragmenty transkrypcji" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" -msgstr "" +msgstr "Podążaj za dźwiękiem" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." msgstr "" +"Włącz/wyłącz śledzenie bieżącej pozycji audio w transkrypcji. Gdy włączone, " +"automatycznie przewija do bieżącego tekstu." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" -msgstr "" +msgstr "Przewiń do bieżącego" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" -msgstr "" +msgstr "Przewiń do aktualnie mówionego tekstu" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" -msgstr "" +msgstr "1 z 100+ wyników" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " -msgstr "" +msgstr "1 z " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" -msgstr "" +msgstr " wyników" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" -msgstr "" +msgstr "Nie znaleziono wyników" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" -msgstr "" +msgstr " z 100+ wyników" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " -msgstr "" +msgstr " z " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" -msgstr "" +msgstr "Wymagany klucz API" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" -msgstr "" +msgstr "Wprowadź klucz API OpenAI w ustawieniach" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "Wydłuż czas końcowy" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "Wydłuż zakończenia o maksymalnie (sekundy)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "Wydłuż zakończenia" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" -msgstr "" +msgstr "Opcje zmiany rozmiaru" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" -msgstr "" +msgstr "Żądana długość napisów" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "Dostępne tylko jeśli znaczniki dla słów były wyłączone podczas transkrypcji" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" -msgstr "" +msgstr "Opcje scalania" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" -msgstr "" +msgstr "Scal według przerwy" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" -msgstr "" +msgstr "Podziel według interpunkcji" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" -msgstr "" +msgstr "Podziel według maksymalnej długości" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" -msgstr "" +msgstr "Scal" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "Dostępne tylko jeśli znaczniki dla słów były włączone podczas transkrypcji" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" +"Identyfikacja mówcy jest niedostępna: nie udało się załadować wymaganych bibliotek." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 Zbieranie transkrypcji" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 Ładowanie audio" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 Ładowanie modelu wyrównania" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 Ładowanie modelu wyrównania (ponowna próba z pamięcią podręczną...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" +"Nie udało się załadować modelu wyrównania. Sprawdź połączenie internetowe i " +"spróbuj ponownie." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 Przetwarzanie audio" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "Anuluj transkrypcję" +msgstr "5/8 Przygotowywanie transkrypcji" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 Identyfikowanie mówców" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 Przypisywanie mówców do transkrypcji" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 Identyfikacja zakończona" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 Błąd podczas identyfikacji mówców" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "Krok 1: Identyfikuj mówców" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "Identyfikuj" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "Gotowy do identyfikacji mówców" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "Nie znaleziono pliku audio" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "Krok 2: Nazwij mówców" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "Odtwórz próbkę" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "Scal zdania mówcy" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "Zapisz plik" +msgstr "Zapisz" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "Anuluj" +msgstr "Anulowanie..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" msgstr "Anulowano" #: buzz/widgets/transcription_viewer/export_transcription_menu.py -#, fuzzy msgid "Save File" msgstr "Zapisz plik" @@ -993,32 +1024,28 @@ msgid "Text files" msgstr "Pliki tekstowe" #: buzz/widgets/model_download_progress_dialog.py -#, fuzzy msgid "Downloading model" -msgstr "Pobrany" +msgstr "Pobieranie modelu" #: buzz/widgets/model_download_progress_dialog.py msgid "remaining" -msgstr "" +msgstr "pozostało" #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import File..." msgstr "Importuj plik..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import URL..." msgstr "Importuj URL..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "Importuj plik..." +msgstr "Importuj folder..." #: buzz/widgets/menu_bar.py msgid "About" -msgstr "" +msgstr "O programie" #: buzz/widgets/menu_bar.py msgid "Preferences..." @@ -1045,18 +1072,17 @@ msgid "Select audio file" msgstr "Wybierz plik audio" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" -msgstr "Wybierz plik audio" +msgstr "Wybierz folder" #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" -msgstr "" +msgstr "Nie można zapisać klucza API OpenAI w breloku kluczy" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "" +msgstr "Serwer Whisper nie uruchomił się. Sprawdź logi, aby uzyskać szczegóły." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1065,481 +1091,477 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" +"Serwer Whisper nie uruchomił się z powodu niewystarczającej pamięci. Spróbuj " +"ponownie z mniejszym modelem. Aby wymusić tryb CPU, użyj zmiennej środowiskowej " +"BUZZ_FORCE_CPU=TRUE." #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Translate to English" -msgstr "Nowa transkrypcja" +msgstr "Przetłumacz na angielski" #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Transcribe" -msgstr "Otwórz transkrypt" +msgstr "Transkrybuj" #: buzz/transcriber/transcriber.py msgid "Chinese" -msgstr "" +msgstr "Chiński" #: buzz/transcriber/transcriber.py msgid "Russian" -msgstr "" +msgstr "Rosyjski" #: buzz/transcriber/transcriber.py msgid "Korean" -msgstr "" +msgstr "Koreański" #: buzz/transcriber/transcriber.py msgid "French" -msgstr "" +msgstr "Francuski" #: buzz/transcriber/transcriber.py msgid "Portuguese" -msgstr "" +msgstr "Portugalski" #: buzz/transcriber/transcriber.py msgid "Turkish" -msgstr "" +msgstr "Turecki" #: buzz/transcriber/transcriber.py msgid "Arabic" -msgstr "" +msgstr "Arabski" #: buzz/transcriber/transcriber.py msgid "Swedish" -msgstr "" +msgstr "Szwedzki" #: buzz/transcriber/transcriber.py msgid "Indonesian" -msgstr "" +msgstr "Indonezyjski" #: buzz/transcriber/transcriber.py msgid "Hindi" -msgstr "" +msgstr "Hindi" #: buzz/transcriber/transcriber.py msgid "Finnish" -msgstr "" +msgstr "Fiński" #: buzz/transcriber/transcriber.py msgid "Vietnamese" -msgstr "" +msgstr "Wietnamski" #: buzz/transcriber/transcriber.py msgid "Hebrew" -msgstr "" +msgstr "Hebrajski" #: buzz/transcriber/transcriber.py msgid "Greek" -msgstr "" +msgstr "Grecki" #: buzz/transcriber/transcriber.py msgid "Malay" -msgstr "" +msgstr "Malajski" #: buzz/transcriber/transcriber.py msgid "Czech" -msgstr "" +msgstr "Czeski" #: buzz/transcriber/transcriber.py msgid "Romanian" -msgstr "" +msgstr "Rumuński" #: buzz/transcriber/transcriber.py msgid "Hungarian" -msgstr "" +msgstr "Węgierski" #: buzz/transcriber/transcriber.py msgid "Tamil" -msgstr "" +msgstr "Tamilski" #: buzz/transcriber/transcriber.py msgid "Norwegian" -msgstr "" +msgstr "Norweski" #: buzz/transcriber/transcriber.py msgid "Thai" -msgstr "" +msgstr "Tajski" #: buzz/transcriber/transcriber.py msgid "Urdu" -msgstr "" +msgstr "Urdu" #: buzz/transcriber/transcriber.py msgid "Croatian" -msgstr "" +msgstr "Chorwacki" #: buzz/transcriber/transcriber.py msgid "Bulgarian" -msgstr "" +msgstr "Bułgarski" #: buzz/transcriber/transcriber.py msgid "Lithuanian" -msgstr "" +msgstr "Litewski" #: buzz/transcriber/transcriber.py msgid "Latin" -msgstr "" +msgstr "Łacina" #: buzz/transcriber/transcriber.py msgid "Maori" -msgstr "" +msgstr "Maoryski" #: buzz/transcriber/transcriber.py msgid "Malayalam" -msgstr "" +msgstr "Malajalam" #: buzz/transcriber/transcriber.py msgid "Welsh" -msgstr "" +msgstr "Walijski" #: buzz/transcriber/transcriber.py msgid "Slovak" -msgstr "" +msgstr "Słowacki" #: buzz/transcriber/transcriber.py msgid "Telugu" -msgstr "" +msgstr "Telugu" #: buzz/transcriber/transcriber.py msgid "Persian" -msgstr "" +msgstr "Perski" #: buzz/transcriber/transcriber.py msgid "Bengali" -msgstr "" +msgstr "Bengalski" #: buzz/transcriber/transcriber.py msgid "Serbian" -msgstr "" +msgstr "Serbski" #: buzz/transcriber/transcriber.py msgid "Azerbaijani" -msgstr "" +msgstr "Azerbejdżański" #: buzz/transcriber/transcriber.py msgid "Slovenian" -msgstr "" +msgstr "Słoweński" #: buzz/transcriber/transcriber.py msgid "Kannada" -msgstr "" +msgstr "Kannada" #: buzz/transcriber/transcriber.py msgid "Estonian" -msgstr "" +msgstr "Estoński" #: buzz/transcriber/transcriber.py msgid "Macedonian" -msgstr "" +msgstr "Macedoński" #: buzz/transcriber/transcriber.py msgid "Breton" -msgstr "" +msgstr "Bretoński" #: buzz/transcriber/transcriber.py msgid "Basque" -msgstr "" +msgstr "Baskijski" #: buzz/transcriber/transcriber.py msgid "Icelandic" -msgstr "" +msgstr "Islandzki" #: buzz/transcriber/transcriber.py msgid "Armenian" -msgstr "" +msgstr "Ormiański" #: buzz/transcriber/transcriber.py msgid "Nepali" -msgstr "" +msgstr "Nepalski" #: buzz/transcriber/transcriber.py msgid "Mongolian" -msgstr "" +msgstr "Mongolski" #: buzz/transcriber/transcriber.py msgid "Bosnian" -msgstr "" +msgstr "Bośniacki" #: buzz/transcriber/transcriber.py msgid "Kazakh" -msgstr "" +msgstr "Kazachski" #: buzz/transcriber/transcriber.py msgid "Albanian" -msgstr "" +msgstr "Albański" #: buzz/transcriber/transcriber.py msgid "Swahili" -msgstr "" +msgstr "Suahili" #: buzz/transcriber/transcriber.py msgid "Galician" -msgstr "" +msgstr "Galicyjski" #: buzz/transcriber/transcriber.py msgid "Marathi" -msgstr "" +msgstr "Marathi" #: buzz/transcriber/transcriber.py msgid "Punjabi" -msgstr "" +msgstr "Pendżabski" #: buzz/transcriber/transcriber.py msgid "Sinhala" -msgstr "" +msgstr "Syngaleski" #: buzz/transcriber/transcriber.py msgid "Khmer" -msgstr "" +msgstr "Khmerski" #: buzz/transcriber/transcriber.py msgid "Shona" -msgstr "" +msgstr "Shona" #: buzz/transcriber/transcriber.py msgid "Yoruba" -msgstr "" +msgstr "Joruba" #: buzz/transcriber/transcriber.py msgid "Somali" -msgstr "" +msgstr "Somalijski" #: buzz/transcriber/transcriber.py msgid "Afrikaans" -msgstr "" +msgstr "Afrikaans" #: buzz/transcriber/transcriber.py msgid "Occitan" -msgstr "" +msgstr "Oksytański" #: buzz/transcriber/transcriber.py msgid "Georgian" -msgstr "" +msgstr "Gruziński" #: buzz/transcriber/transcriber.py msgid "Belarusian" -msgstr "" +msgstr "Białoruski" #: buzz/transcriber/transcriber.py msgid "Tajik" -msgstr "" +msgstr "Tadżycki" #: buzz/transcriber/transcriber.py msgid "Sindhi" -msgstr "" +msgstr "Sindhi" #: buzz/transcriber/transcriber.py msgid "Gujarati" -msgstr "" +msgstr "Gudżarati" #: buzz/transcriber/transcriber.py msgid "Amharic" -msgstr "" +msgstr "Amharski" #: buzz/transcriber/transcriber.py msgid "Yiddish" -msgstr "" +msgstr "Jidysz" #: buzz/transcriber/transcriber.py msgid "Lao" -msgstr "" +msgstr "Laotański" #: buzz/transcriber/transcriber.py msgid "Uzbek" -msgstr "" +msgstr "Uzbecki" #: buzz/transcriber/transcriber.py msgid "Faroese" -msgstr "" +msgstr "Farerski" #: buzz/transcriber/transcriber.py msgid "Haitian Creole" -msgstr "" +msgstr "Kreolski haitański" #: buzz/transcriber/transcriber.py msgid "Pashto" -msgstr "" +msgstr "Paszto" #: buzz/transcriber/transcriber.py msgid "Turkmen" -msgstr "" +msgstr "Turkmeński" #: buzz/transcriber/transcriber.py msgid "Nynorsk" -msgstr "" +msgstr "Nynorsk" #: buzz/transcriber/transcriber.py msgid "Maltese" -msgstr "" +msgstr "Maltański" #: buzz/transcriber/transcriber.py msgid "Sanskrit" -msgstr "" +msgstr "Sanskryt" #: buzz/transcriber/transcriber.py msgid "Luxembourgish" -msgstr "" +msgstr "Luksemburski" #: buzz/transcriber/transcriber.py msgid "Myanmar" -msgstr "" +msgstr "Birmański" #: buzz/transcriber/transcriber.py msgid "Tibetan" -msgstr "" +msgstr "Tybetański" #: buzz/transcriber/transcriber.py msgid "Tagalog" -msgstr "" +msgstr "Tagalog" #: buzz/transcriber/transcriber.py msgid "Malagasy" -msgstr "" +msgstr "Malgaski" #: buzz/transcriber/transcriber.py msgid "Assamese" -msgstr "" +msgstr "Asamski" #: buzz/transcriber/transcriber.py msgid "Tatar" -msgstr "" +msgstr "Tatarski" #: buzz/transcriber/transcriber.py msgid "Hawaiian" -msgstr "" +msgstr "Hawajski" #: buzz/transcriber/transcriber.py msgid "Lingala" -msgstr "" +msgstr "Lingala" #: buzz/transcriber/transcriber.py msgid "Hausa" -msgstr "" +msgstr "Hausa" #: buzz/transcriber/transcriber.py msgid "Bashkir" -msgstr "" +msgstr "Baszkirski" #: buzz/transcriber/transcriber.py msgid "Javanese" -msgstr "" +msgstr "Jawajski" #: buzz/transcriber/transcriber.py msgid "Sundanese" -msgstr "" +msgstr "Sundajski" #: buzz/transcriber/transcriber.py msgid "Cantonese" -msgstr "" +msgstr "Kantoński" #: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" -msgstr "" +msgstr "Wystąpił błąd połączenia" #: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." -msgstr "" +msgstr "Uruchamianie Whisper.cpp..." #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "Anuluj transkrypcję" +msgstr "Rozpoczynanie transkrypcji..." #: buzz/settings/shortcut.py -#, fuzzy msgid "Open Record Window" -msgstr "Nagrywanie na żywo" +msgstr "Otwórz okno nagrywania" #: buzz/settings/shortcut.py -#, fuzzy msgid "Import File" -msgstr "Importuj plik..." +msgstr "Importuj plik" #: buzz/settings/shortcut.py msgid "Open Preferences Window" -msgstr "" +msgstr "Otwórz okno ustawień" #: buzz/settings/shortcut.py -#, fuzzy msgid "View Transcript Text" -msgstr "Nowa transkrypcja" +msgstr "Wyświetl tekst transkrypcji" #: buzz/settings/shortcut.py -#, fuzzy msgid "View Transcript Translation" -msgstr "Nowa transkrypcja" +msgstr "Wyświetl tłumaczenie transkrypcji" #: buzz/settings/shortcut.py -#, fuzzy msgid "View Transcript Timestamps" -msgstr "Nowa transkrypcja" +msgstr "Wyświetl znaczniki czasu transkrypcji" #: buzz/settings/shortcut.py -#, fuzzy msgid "Search Transcript" -msgstr "Otwórz transkrypt" +msgstr "Wyszukaj w transkrypcji" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "Przejdź do następnego wyniku wyszukiwania" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "Przejdź do poprzedniego wyniku wyszukiwania" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" -msgstr "" +msgstr "Przewiń do bieżącego tekstu" #: buzz/settings/shortcut.py msgid "Play/Pause Audio" -msgstr "" +msgstr "Odtwórz/wstrzymaj audio" #: buzz/settings/shortcut.py msgid "Replay Current Segment" -msgstr "" +msgstr "Odtwórz ponownie bieżący fragment" #: buzz/settings/shortcut.py msgid "Toggle Playback Controls" -msgstr "" +msgstr "Przełącz sterowanie odtwarzaniem" #: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" -msgstr "" +msgstr "Zmniejsz czas początku fragmentu" #: buzz/settings/shortcut.py msgid "Increase Segment Start Time" -msgstr "" +msgstr "Zwiększ czas początku fragmentu" #: buzz/settings/shortcut.py msgid "Decrease Segment End Time" -msgstr "" +msgstr "Zmniejsz czas końca fragmentu" #: buzz/settings/shortcut.py msgid "Increase Segment End Time" -msgstr "" +msgstr "Zwiększ czas końca fragmentu" #: buzz/settings/recording_transcriber_mode.py msgid "Append below" -msgstr "" +msgstr "Dodaj poniżej" #: buzz/settings/recording_transcriber_mode.py msgid "Append above" -msgstr "" +msgstr "Dodaj powyżej" #: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" -msgstr "" +msgstr "Dodaj i popraw" #: buzz/translator.py msgid "Translation error, see logs!" -msgstr "" +msgstr "Błąd tłumaczenia, sprawdź logi!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" +"Wyodrębnianie mowy nie powiodło się! Sprawdź połączenie internetowe — " +"może być konieczne pobranie modelu." #~ msgid "ID" #~ msgstr "ID" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index dcb95ead..8d65e25e 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -54,9 +54,8 @@ msgid "The URL you entered is invalid." msgstr "A URL inserida é inválida." #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "Ver Tradução da Transcrição" +msgstr "Apresentação de Transcrição ao Vivo" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" @@ -154,9 +153,8 @@ msgid "OpenAI base url" msgstr "URL base da OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "Chave API da OpenAI" +msgstr "Modelo de API da OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" @@ -168,6 +166,7 @@ msgstr "Habilitar exportação da transcrição ao vivo" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Procurar" @@ -180,18 +179,28 @@ msgid "Live recording mode" msgstr "Modo de gravação ao vivo" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "Use 8-bit quantization to reduce memory usage" +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." msgstr "" +"Nota: As configurações de exportação de gravação ao vivo serão movidas para " +"as Configurações Avançadas na tela de Gravação ao Vivo em uma versão futura." + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "Use 8-bit quantization to reduce memory usage" +msgstr "Usar quantização de 8 bits para reduzir o uso de memória" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"Aplica-se aos modelos Huggingface e Faster Whisper. Reduz o uso de memória " +"da GPU, mas pode diminuir ligeiramente a qualidade da transcrição." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "Reduzir RAM da GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" @@ -231,6 +240,7 @@ msgstr "" "na chave API podem causar erros." #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Selecionar Pasta de Exportação" @@ -349,7 +359,7 @@ msgstr "Detectar Idioma" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "ex.: eng, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -357,6 +367,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"Insira um código de idioma ISO 639-3 (3 letras).\n" +"Exemplos: eng (Inglês), fra (Francês), deu (Alemão),\n" +"spa (Espanhol), lav (Letão)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -420,28 +433,60 @@ msgid "AI model:" msgstr "Modelo de IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Please translate each text sent to you from English to Spanish." -msgstr "" -"Instrua a IA sobre como traduzir, por exemplo: \"Por favor, traduza cada " -"texto enviado a você do Inglês para o Português\"." +msgstr "Por favor, traduza cada texto enviado a você do Inglês para o Espanhol." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Instruções para a IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "Configurações de tradução" +msgstr "Configurações de gravação" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "Limiar de silêncio:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "Separador de linha:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Modo de gravação ao vivo:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Habilitar exportação de gravação ao vivo" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Pasta de exportação:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Nome do arquivo de exportação:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "Arquivo de texto (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Tipo de arquivo de exportação:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"Limitar entradas de exportação\n" +"(0 = exportar tudo):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -530,61 +575,59 @@ msgstr "Data de Adição" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "Notas" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "Redefinir Ordem das Colunas" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "Iniciando transcrição..." +msgstr "Reiniciar Transcrição" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename" -msgstr "Vietnamita" +msgstr "Renomear" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "Adicionar/Editar Notas" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "Cancelar Transcrição" +msgstr "Renomear Transcrição" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "Digite o novo nome:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "Digite algumas notas relevantes para esta transcrição:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "Não é possível reiniciar" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "Somente transcrições com falha ou canceladas podem ser reiniciadas." #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "Iniciando transcrição..." +msgstr "Falha ao reiniciar a transcrição: {}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" +"Não foi possível reiniciar a transcrição: o modelo não está disponível e " +"não pôde ser baixado." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "Não foi possível reiniciar a transcrição: trabalhador de transcrição não encontrado." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -604,72 +647,67 @@ msgstr "Microfone:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "Mostrar em nova janela" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "Arquivos de texto" +msgstr "Tamanho do Texto:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "Tema" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "Claro" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "Escuro" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "Personalizado" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "Arquivos de texto" +msgstr "Cor do Texto" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "Cor de Fundo" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "Tela Cheia" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "Copiar" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "Copiar transcrição para a área de transferência" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "Nada para copiar!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "Falha ao baixar" +msgstr "Falha ao copiar" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "Copiado!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "Selecionar Pasta de Exportação" +msgstr "Selecionar Cor do Texto" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "Selecionar arquivo de áudio" +msgstr "Selecionar Cor de Fundo" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -689,7 +727,7 @@ msgstr "Verificar atualizações" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "Mostrar logs" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -697,7 +735,7 @@ msgstr "Você está atualizado!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "Volume médio" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -742,7 +780,7 @@ msgstr "Redimensionar" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "Identificar Falantes" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" @@ -765,9 +803,8 @@ msgid "Previous match (Shift+Enter)" msgstr "Encontro prévio (Shift+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py -#, fuzzy msgid "Next match (Ctrl+Enter)" -msgstr "Póximo encontro (Enter)" +msgstr "Próximo encontro (Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" @@ -839,15 +876,15 @@ msgstr "Insira a chave API OpenAI nas preferências" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "Estender o tempo final" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "Estender finais em até (segundos)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "Estender finais" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" @@ -859,7 +896,7 @@ msgstr "Duração desejada da legenda" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "Disponível apenas se os tempos em nível de palavra foram desabilitados durante a transcrição" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -883,100 +920,100 @@ msgstr "Mesclar" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "Disponível apenas se os tempos em nível de palavra foram habilitados durante a transcrição" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" +"Identificação de falantes não está disponível: falha ao carregar as " +"bibliotecas necessárias." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 Coletando transcrições" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 Carregando áudio" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 Carregando modelo de alinhamento" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 Carregando modelo de alinhamento (tentando novamente com cache...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" +"Falha ao carregar o modelo de alinhamento. Verifique sua conexão com a " +"internet e tente novamente." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 Processando áudio" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "Iniciando transcrição..." +msgstr "5/8 Preparando transcrições" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 Identificando falantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 Mapeando falantes para transcrições" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 Identificação concluída" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 Erro ao identificar falantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "Passo 1: Identificar falantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "Identificar" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "Pronto para identificar falantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "Arquivo de áudio não encontrado" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "Passo 2: Nomear falantes" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "Reproduzir amostra" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "Mesclar frases do falante" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "Salvar Arquivo" +msgstr "Salvar" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "Cancelar" +msgstr "Cancelando..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" msgstr "Cancelado" @@ -1005,9 +1042,8 @@ msgid "Import URL..." msgstr "Importar URL..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "Importar Arquivo..." +msgstr "Importar Pasta..." #: buzz/widgets/menu_bar.py msgid "About" @@ -1038,7 +1074,6 @@ msgid "Select audio file" msgstr "Selecionar arquivo de áudio" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" msgstr "Selecionar Pasta de Entrada" @@ -1435,7 +1470,6 @@ msgid "Starting Whisper.cpp..." msgstr "Iniciando Whisper.cpp..." #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." msgstr "Iniciando transcrição..." @@ -1469,11 +1503,11 @@ msgstr "Pesquisar Transcrição" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "Ir para o Próximo Resultado de Pesquisa na Transcrição" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "Ir para o Resultado de Pesquisa Anterior na Transcrição" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" @@ -1520,15 +1554,16 @@ msgid "Append and correct" msgstr "Acrescentar e corrigir" #: buzz/translator.py -#, fuzzy msgid "Translation error, see logs!" -msgstr "Configurações de tradução" +msgstr "Erro de tradução, verifique os logs!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" +"Falha na extração de fala! Verifique sua conexão com a internet — pode ser " +"necessário baixar um modelo." #~ msgid "Snap permission notice" #~ msgstr "Aviso de permissão do Snap" @@ -1559,4 +1594,3 @@ msgstr "" #~ msgstr "Desfazer" #~ msgid "Redo" -#~ msgstr "Refazer" diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 1fae1a67..263ccda1 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -51,9 +51,8 @@ msgid "The URL you entered is invalid." msgstr "Адреса, яку ви ввели, є недійсною" #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "Переглянути переклад транскрипції" +msgstr "Презентація транскрипції в реальному часі" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" @@ -62,79 +61,77 @@ msgstr "Типові значення" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "English" -msgstr "" +msgstr "Англійська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Catalan" -msgstr "" +msgstr "Каталонська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Danish" -msgstr "" +msgstr "Датська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Dutch" -msgstr "" +msgstr "Нідерландська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "German" -msgstr "" +msgstr "Німецька" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Spanish" -msgstr "" +msgstr "Іспанська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Italian" -msgstr "" +msgstr "Італійська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Japanese" -msgstr "" +msgstr "Японська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Latvian" -msgstr "" +msgstr "Латвійська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Polish" -msgstr "" +msgstr "Польська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Португальська (Бразилія)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Ukrainian" -msgstr "залишилось" +msgstr "Українська" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" -msgstr "" +msgstr "Китайська (спрощена)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" -msgstr "" +msgstr "Китайська (традиційна)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" -msgstr "" +msgstr "Потрібен перезапуск!" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Ui Language" -msgstr "Мова:" +msgstr "Мова інтерфейсу" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" @@ -153,9 +150,8 @@ msgid "OpenAI base url" msgstr "Базова адреса OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "API-ключ OpenAI" +msgstr "Модель API OpenAI" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" @@ -167,6 +163,7 @@ msgstr "Увімкнути експорт транскрипції з живог #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Огляд" @@ -175,35 +172,44 @@ msgid "Export folder" msgstr "Тека для експорту" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Live recording mode" -msgstr "Живий запис" +msgstr "Режим живого запису" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" +"Примітка: Параметри експорту живого запису будуть перенесені до Додаткових " +"налаштувань на екрані живого запису в майбутній версії." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" -msgstr "" +msgstr "Використовувати 8-бітне квантування для зменшення використання пам'яті" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"Застосовується до моделей Huggingface та Faster Whisper. Зменшує " +"використання пам'яті GPU, але може дещо знизити якість транскрипції." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "Зменшити RAM GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" -msgstr "" +msgstr "Використовувати лише CPU та вимкнути прискорення GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "" +msgstr "Увімкніть це, якщо великі моделі не поміщаються в пам'ять GPU і Buzz падає" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" -msgstr "" +msgstr "Вимкнути GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" @@ -218,17 +224,19 @@ msgstr "" "API та перекладу ШІ." #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Invalid API key" -msgstr "API-ключ OpenAI" +msgstr "Недійсний API-ключ" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" +"API підтримує лише символи base64 (A-Za-z0-9+/=_-). Інші символи в " +"API-ключі можуть спричиняти помилки." #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Виберіть теку для експорту" @@ -347,7 +355,7 @@ msgstr "Визначити мову" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "напр., eng, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -355,6 +363,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"Введіть код мови ISO 639-3 (3 літери).\n" +"Приклади: eng (Англійська), fra (Французька), deu (Німецька),\n" +"spa (Іспанська), lav (Латвійська)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -367,7 +378,7 @@ msgstr "Модель:" #: buzz/widgets/transcriber/transcription_options_group_box.py #: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." -msgstr "" +msgstr "Перше використання моделі може тривати кілька хвилин для завантаження." #: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" @@ -419,24 +430,59 @@ msgstr "Модель ШІ" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "" +msgstr "Будь ласка, перекладайте кожен текст, надісланий вам, з англійської на іспанську." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "Інструкції для ШІ:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "Налаштування перекладу" +msgstr "Налаштування запису" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "Поріг тиші:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "Роздільник рядків:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Режим живого запису:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "Увімкнути експорт живого запису" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "Тека для експорту:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "Назва файлу експорту:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "Текстовий файл (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "Тип файлу експорту:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"Обмежити кількість записів експорту\n" +"(0 = експортувати всі):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -444,7 +490,7 @@ msgstr "Хронометраж на рівні слів" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" -msgstr "" +msgstr "Витягти мовлення" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" @@ -459,14 +505,12 @@ msgid "Advanced..." msgstr "Додатково..." #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New File Transcription" -msgstr "Нова транскрипція" +msgstr "Нова транскрипція файлу" #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New URL Transcription" -msgstr "Нова транскрипція" +msgstr "Нова транскрипція за адресою" #: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" @@ -527,60 +571,59 @@ msgstr "Дата додавання" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "Нотатки" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "Скинути порядок стовпців" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "Скасувати транскрипцію" +msgstr "Перезапустити транскрипцію" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" -msgstr "" +msgstr "Перейменувати" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "Додати/редагувати нотатки" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "Скасувати транскрипцію" +msgstr "Перейменувати транскрипцію" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "Введіть нову назву:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "Введіть відповідні нотатки для цієї транскрипції:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "Неможливо перезапустити" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "Перезапустити можна лише невдалі або скасовані транскрипції." #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "Скасувати транскрипцію" +msgstr "Не вдалося перезапустити транскрипцію: {}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" +"Не вдалося перезапустити транскрипцію: модель недоступна та не може бути " +"завантажена." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "Не вдалося перезапустити транскрипцію: обробник транскрипції не знайдено." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -600,72 +643,67 @@ msgstr "Мікрофон:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "Показати у новому вікні" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "Текстові файли" +msgstr "Розмір тексту:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "Тема" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "Світла" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "Темна" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "Власна" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "Текстові файли" +msgstr "Колір тексту" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "Колір фону" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "Повноекранний режим" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "Копіювати" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "Копіювати транскрипцію до буфера обміну" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "Нічого копіювати!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "Невдале завантаження" +msgstr "Не вдалося скопіювати" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "Скопійовано!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "Виберіть теку для експорту" +msgstr "Виберіть колір тексту" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "Вибрати аудіофайл" +msgstr "Виберіть колір фону" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -685,7 +723,7 @@ msgstr "Перевірити оновлення" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "Показати журнали" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -693,7 +731,7 @@ msgstr "У вас актуальна версія!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "Середній рівень гучності" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -734,93 +772,95 @@ msgstr "Перекласти" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" -msgstr "" +msgstr "Змінити розмір" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "Визначити мовців" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" -msgstr "" +msgstr "Знайти" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" -msgstr "" +msgstr "Показати/сховати панель пошуку (Ctrl+F)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" -msgstr "" +msgstr "Знайти:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." -msgstr "" +msgstr "Введіть текст для пошуку..." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" -msgstr "" +msgstr "Попередній збіг (Shift+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" -msgstr "" +msgstr "Наступний збіг (Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" -msgstr "" +msgstr "Очистити" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" -msgstr "" +msgstr "Керування відтворенням:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" -msgstr "" +msgstr "Повторювати фрагмент" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" -msgstr "" +msgstr "Увімкнути/вимкнути повторення при натисканні на фрагменти транскрипції" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" -msgstr "" +msgstr "Стежити за аудіо" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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 msgid "Scroll to Current" -msgstr "" +msgstr "Прокрутити до поточного" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" -msgstr "" +msgstr "Прокрутити до тексту, що зараз вимовляється" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" -msgstr "" +msgstr "1 з 100+ збігів" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " -msgstr "" +msgstr "1 з " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" -msgstr "" +msgstr " збігів" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" -msgstr "" +msgstr "Збігів не знайдено" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" -msgstr "" +msgstr " з 100+ збігів" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " -msgstr "" +msgstr " з " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" @@ -832,144 +872,143 @@ msgstr "Будь ласка, введіть API-ключ OpenAI в налашт #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "Продовжити час завершення" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "Продовжити закінчення до (секунд)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "Продовжити закінчення" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" -msgstr "" +msgstr "Параметри зміни розміру" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" -msgstr "" +msgstr "Бажана довжина субтитрів" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "Доступно лише якщо хронометраж на рівні слів був вимкнений під час транскрипції" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" -msgstr "" +msgstr "Параметри об'єднання" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" -msgstr "" +msgstr "Об'єднати за паузою" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" -msgstr "" +msgstr "Розділити за пунктуацією" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" -msgstr "" +msgstr "Розділити за максимальною довжиною" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" -msgstr "" +msgstr "Об'єднати" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "Доступно лише якщо хронометраж на рівні слів був увімкнений під час транскрипції" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" +"Визначення мовців недоступне: не вдалося завантажити необхідні бібліотеки." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 Збирання транскрипцій" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 Завантаження аудіо" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 Завантаження моделі вирівнювання" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 Завантаження моделі вирівнювання (повторна спроба з кешем...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" +"Не вдалося завантажити модель вирівнювання. Будь ласка, перевірте " +"підключення до інтернету та спробуйте ще раз." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 Обробка аудіо" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "Скасувати транскрипцію" +msgstr "5/8 Підготовка транскрипцій" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 Визначення мовців" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 Зіставлення мовців із транскрипціями" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 Визначення завершено" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 Помилка при визначенні мовців" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "Крок 1: Визначити мовців" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "Визначити" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "Готово до визначення мовців" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "Аудіофайл не знайдено" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "Крок 2: Назвати мовців" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "Відтворити зразок" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "Об'єднати речення мовців" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "Зберегти файл" +msgstr "Зберегти" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "Скасувати" +msgstr "Скасування..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" msgstr "Скасовано" @@ -998,9 +1037,8 @@ msgid "Import URL..." msgstr "Імпортувати адресу..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "Імпортувати файл..." +msgstr "Імпортувати теку..." #: buzz/widgets/menu_bar.py msgid "About" @@ -1030,7 +1068,6 @@ msgid "Select audio file" msgstr "Вибрати аудіофайл" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" msgstr "Виберіть теку введення" @@ -1041,7 +1078,7 @@ msgstr "Не вдається додати до звʼязки ключів API- #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "" +msgstr "Не вдалося запустити сервер Whisper. Перевірте журнали для отримання деталей." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1050,11 +1087,13 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" +"Не вдалося запустити сервер Whisper через недостатній обсяг пам'яті. Будь " +"ласка, спробуйте ще раз із меншою моделлю. Для примусового режиму CPU " +"використовуйте змінну середовища BUZZ_FORCE_CPU=TRUE." #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Translate to English" -msgstr "Налаштування перекладу" +msgstr "Перекласти на англійську" #: buzz/transcriber/transcriber.py msgid "Transcribe" @@ -1062,359 +1101,359 @@ msgstr "Розпізнати" #: buzz/transcriber/transcriber.py msgid "Chinese" -msgstr "" +msgstr "Китайська" #: buzz/transcriber/transcriber.py msgid "Russian" -msgstr "" +msgstr "Російська" #: buzz/transcriber/transcriber.py msgid "Korean" -msgstr "" +msgstr "Корейська" #: buzz/transcriber/transcriber.py msgid "French" -msgstr "" +msgstr "Французька" #: buzz/transcriber/transcriber.py msgid "Portuguese" -msgstr "" +msgstr "Португальська" #: buzz/transcriber/transcriber.py msgid "Turkish" -msgstr "" +msgstr "Турецька" #: buzz/transcriber/transcriber.py msgid "Arabic" -msgstr "" +msgstr "Арабська" #: buzz/transcriber/transcriber.py msgid "Swedish" -msgstr "" +msgstr "Шведська" #: buzz/transcriber/transcriber.py msgid "Indonesian" -msgstr "" +msgstr "Індонезійська" #: buzz/transcriber/transcriber.py msgid "Hindi" -msgstr "" +msgstr "Гінді" #: buzz/transcriber/transcriber.py msgid "Finnish" -msgstr "" +msgstr "Фінська" #: buzz/transcriber/transcriber.py msgid "Vietnamese" -msgstr "" +msgstr "В'єтнамська" #: buzz/transcriber/transcriber.py msgid "Hebrew" -msgstr "" +msgstr "Іврит" #: buzz/transcriber/transcriber.py msgid "Greek" -msgstr "" +msgstr "Грецька" #: buzz/transcriber/transcriber.py msgid "Malay" -msgstr "" +msgstr "Малайська" #: buzz/transcriber/transcriber.py msgid "Czech" -msgstr "" +msgstr "Чеська" #: buzz/transcriber/transcriber.py msgid "Romanian" -msgstr "" +msgstr "Румунська" #: buzz/transcriber/transcriber.py msgid "Hungarian" -msgstr "" +msgstr "Угорська" #: buzz/transcriber/transcriber.py msgid "Tamil" -msgstr "" +msgstr "Тамільська" #: buzz/transcriber/transcriber.py msgid "Norwegian" -msgstr "" +msgstr "Норвезька" #: buzz/transcriber/transcriber.py msgid "Thai" -msgstr "" +msgstr "Тайська" #: buzz/transcriber/transcriber.py msgid "Urdu" -msgstr "" +msgstr "Урду" #: buzz/transcriber/transcriber.py msgid "Croatian" -msgstr "" +msgstr "Хорватська" #: buzz/transcriber/transcriber.py msgid "Bulgarian" -msgstr "" +msgstr "Болгарська" #: buzz/transcriber/transcriber.py msgid "Lithuanian" -msgstr "" +msgstr "Литовська" #: buzz/transcriber/transcriber.py msgid "Latin" -msgstr "" +msgstr "Латинська" #: buzz/transcriber/transcriber.py msgid "Maori" -msgstr "" +msgstr "Маорі" #: buzz/transcriber/transcriber.py msgid "Malayalam" -msgstr "" +msgstr "Малаялам" #: buzz/transcriber/transcriber.py msgid "Welsh" -msgstr "" +msgstr "Валлійська" #: buzz/transcriber/transcriber.py msgid "Slovak" -msgstr "" +msgstr "Словацька" #: buzz/transcriber/transcriber.py msgid "Telugu" -msgstr "" +msgstr "Телугу" #: buzz/transcriber/transcriber.py msgid "Persian" -msgstr "" +msgstr "Перська" #: buzz/transcriber/transcriber.py msgid "Bengali" -msgstr "" +msgstr "Бенгальська" #: buzz/transcriber/transcriber.py msgid "Serbian" -msgstr "" +msgstr "Сербська" #: buzz/transcriber/transcriber.py msgid "Azerbaijani" -msgstr "" +msgstr "Азербайджанська" #: buzz/transcriber/transcriber.py msgid "Slovenian" -msgstr "" +msgstr "Словенська" #: buzz/transcriber/transcriber.py msgid "Kannada" -msgstr "" +msgstr "Каннада" #: buzz/transcriber/transcriber.py msgid "Estonian" -msgstr "" +msgstr "Естонська" #: buzz/transcriber/transcriber.py msgid "Macedonian" -msgstr "" +msgstr "Македонська" #: buzz/transcriber/transcriber.py msgid "Breton" -msgstr "" +msgstr "Бретонська" #: buzz/transcriber/transcriber.py msgid "Basque" -msgstr "" +msgstr "Баскська" #: buzz/transcriber/transcriber.py msgid "Icelandic" -msgstr "" +msgstr "Ісландська" #: buzz/transcriber/transcriber.py msgid "Armenian" -msgstr "" +msgstr "Вірменська" #: buzz/transcriber/transcriber.py msgid "Nepali" -msgstr "" +msgstr "Непальська" #: buzz/transcriber/transcriber.py msgid "Mongolian" -msgstr "" +msgstr "Монгольська" #: buzz/transcriber/transcriber.py msgid "Bosnian" -msgstr "" +msgstr "Боснійська" #: buzz/transcriber/transcriber.py msgid "Kazakh" -msgstr "" +msgstr "Казахська" #: buzz/transcriber/transcriber.py msgid "Albanian" -msgstr "" +msgstr "Албанська" #: buzz/transcriber/transcriber.py msgid "Swahili" -msgstr "" +msgstr "Суахілі" #: buzz/transcriber/transcriber.py msgid "Galician" -msgstr "" +msgstr "Галісійська" #: buzz/transcriber/transcriber.py msgid "Marathi" -msgstr "" +msgstr "Маратхі" #: buzz/transcriber/transcriber.py msgid "Punjabi" -msgstr "" +msgstr "Панджабі" #: buzz/transcriber/transcriber.py msgid "Sinhala" -msgstr "" +msgstr "Сингальська" #: buzz/transcriber/transcriber.py msgid "Khmer" -msgstr "" +msgstr "Кхмерська" #: buzz/transcriber/transcriber.py msgid "Shona" -msgstr "" +msgstr "Шона" #: buzz/transcriber/transcriber.py msgid "Yoruba" -msgstr "" +msgstr "Йоруба" #: buzz/transcriber/transcriber.py msgid "Somali" -msgstr "" +msgstr "Сомалійська" #: buzz/transcriber/transcriber.py msgid "Afrikaans" -msgstr "" +msgstr "Африкаанс" #: buzz/transcriber/transcriber.py msgid "Occitan" -msgstr "" +msgstr "Окситанська" #: buzz/transcriber/transcriber.py msgid "Georgian" -msgstr "" +msgstr "Грузинська" #: buzz/transcriber/transcriber.py msgid "Belarusian" -msgstr "" +msgstr "Білоруська" #: buzz/transcriber/transcriber.py msgid "Tajik" -msgstr "" +msgstr "Таджицька" #: buzz/transcriber/transcriber.py msgid "Sindhi" -msgstr "" +msgstr "Сіндхі" #: buzz/transcriber/transcriber.py msgid "Gujarati" -msgstr "" +msgstr "Гуджараті" #: buzz/transcriber/transcriber.py msgid "Amharic" -msgstr "" +msgstr "Амхарська" #: buzz/transcriber/transcriber.py msgid "Yiddish" -msgstr "" +msgstr "Їдиш" #: buzz/transcriber/transcriber.py msgid "Lao" -msgstr "" +msgstr "Лаоська" #: buzz/transcriber/transcriber.py msgid "Uzbek" -msgstr "" +msgstr "Узбецька" #: buzz/transcriber/transcriber.py msgid "Faroese" -msgstr "" +msgstr "Фарерська" #: buzz/transcriber/transcriber.py msgid "Haitian Creole" -msgstr "" +msgstr "Гаїтянська креольська" #: buzz/transcriber/transcriber.py msgid "Pashto" -msgstr "" +msgstr "Пушту" #: buzz/transcriber/transcriber.py msgid "Turkmen" -msgstr "" +msgstr "Туркменська" #: buzz/transcriber/transcriber.py msgid "Nynorsk" -msgstr "" +msgstr "Нюношк" #: buzz/transcriber/transcriber.py msgid "Maltese" -msgstr "" +msgstr "Мальтійська" #: buzz/transcriber/transcriber.py msgid "Sanskrit" -msgstr "" +msgstr "Санскрит" #: buzz/transcriber/transcriber.py msgid "Luxembourgish" -msgstr "" +msgstr "Люксембурзька" #: buzz/transcriber/transcriber.py msgid "Myanmar" -msgstr "" +msgstr "М'янма" #: buzz/transcriber/transcriber.py msgid "Tibetan" -msgstr "" +msgstr "Тибетська" #: buzz/transcriber/transcriber.py msgid "Tagalog" -msgstr "" +msgstr "Тагальська" #: buzz/transcriber/transcriber.py msgid "Malagasy" -msgstr "" +msgstr "Малагасійська" #: buzz/transcriber/transcriber.py msgid "Assamese" -msgstr "" +msgstr "Ассамська" #: buzz/transcriber/transcriber.py msgid "Tatar" -msgstr "" +msgstr "Татарська" #: buzz/transcriber/transcriber.py msgid "Hawaiian" -msgstr "" +msgstr "Гавайська" #: buzz/transcriber/transcriber.py msgid "Lingala" -msgstr "" +msgstr "Лінгала" #: buzz/transcriber/transcriber.py msgid "Hausa" -msgstr "" +msgstr "Хауса" #: buzz/transcriber/transcriber.py msgid "Bashkir" -msgstr "" +msgstr "Башкирська" #: buzz/transcriber/transcriber.py msgid "Javanese" -msgstr "" +msgstr "Яванська" #: buzz/transcriber/transcriber.py msgid "Sundanese" -msgstr "" +msgstr "Сунданська" #: buzz/transcriber/transcriber.py msgid "Cantonese" -msgstr "" +msgstr "Кантонська" #: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" @@ -1422,12 +1461,11 @@ msgstr "Виникла помилка зʼєднання" #: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." -msgstr "" +msgstr "Запуск Whisper.cpp..." #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "Скасувати транскрипцію" +msgstr "Запуск транскрипції..." #: buzz/settings/shortcut.py msgid "Open Record Window" @@ -1454,72 +1492,72 @@ msgid "View Transcript Timestamps" msgstr "Переглянути позначки часу в транскрипції" #: buzz/settings/shortcut.py -#, fuzzy msgid "Search Transcript" -msgstr "Відкрити транскрипцію" +msgstr "Пошук у транскрипції" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "Перейти до наступного результату пошуку в транскрипції" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "Перейти до попереднього результату пошуку в транскрипції" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" -msgstr "" +msgstr "Прокрутити до поточного тексту" #: buzz/settings/shortcut.py msgid "Play/Pause Audio" -msgstr "" +msgstr "Відтворити/призупинити аудіо" #: buzz/settings/shortcut.py msgid "Replay Current Segment" -msgstr "" +msgstr "Повторити поточний фрагмент" #: buzz/settings/shortcut.py msgid "Toggle Playback Controls" -msgstr "" +msgstr "Перемкнути елементи керування відтворенням" #: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" -msgstr "" +msgstr "Зменшити час початку фрагмента" #: buzz/settings/shortcut.py msgid "Increase Segment Start Time" -msgstr "" +msgstr "Збільшити час початку фрагмента" #: buzz/settings/shortcut.py msgid "Decrease Segment End Time" -msgstr "" +msgstr "Зменшити час завершення фрагмента" #: buzz/settings/shortcut.py msgid "Increase Segment End Time" -msgstr "" +msgstr "Збільшити час завершення фрагмента" #: buzz/settings/recording_transcriber_mode.py msgid "Append below" -msgstr "" +msgstr "Додати знизу" #: buzz/settings/recording_transcriber_mode.py msgid "Append above" -msgstr "" +msgstr "Додати зверху" #: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" -msgstr "" +msgstr "Додати та виправити" #: buzz/translator.py -#, fuzzy msgid "Translation error, see logs!" -msgstr "Налаштування перекладу" +msgstr "Помилка перекладу, перегляньте журнали!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" +"Не вдалося витягти мовлення! Перевірте підключення до інтернету — можливо, " +"потрібно завантажити модель." #~ msgid "Snap permission notice" #~ msgstr "Попередження щодо дозволів Snap" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index bb353c19..9c003d51 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -54,9 +54,8 @@ msgid "The URL you entered is invalid." msgstr "输入的网址无效" #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "查看识别的翻译" +msgstr "实时识别展示" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" @@ -65,79 +64,77 @@ msgstr "恢复默认" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "English" -msgstr "" +msgstr "英语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Catalan" -msgstr "" +msgstr "加泰罗尼亚语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Danish" -msgstr "" +msgstr "丹麦语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Dutch" -msgstr "" +msgstr "荷兰语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "German" -msgstr "" +msgstr "德语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Spanish" -msgstr "" +msgstr "西班牙语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Italian" -msgstr "" +msgstr "意大利语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Japanese" -msgstr "" +msgstr "日语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Latvian" -msgstr "" +msgstr "拉脱维亚语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Polish" -msgstr "" +msgstr "波兰语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" -msgstr "" +msgstr "葡萄牙语(巴西)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Ukrainian" -msgstr "剩余" +msgstr "乌克兰语" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" -msgstr "" +msgstr "中文(简体)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" -msgstr "" +msgstr "中文(繁体)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" -msgstr "" +msgstr "需要重启!" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Ui Language" -msgstr "语言:" +msgstr "界面语言" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" @@ -156,9 +153,8 @@ msgid "OpenAI base url" msgstr "OpenAI 基于 url" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "OpenAI API key" +msgstr "OpenAI API 模型" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" @@ -170,6 +166,7 @@ msgstr "启用实时录制转录导出" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "浏览" @@ -178,35 +175,43 @@ msgid "Export folder" msgstr "导出文件夹" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Live recording mode" -msgstr "现场录制模式" +msgstr "实时录制模式" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" +"注意:实时录制导出设置将在未来版本中移至实时录制界面的高级设置中。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" -msgstr "" +msgstr "使用8位量化以减少内存占用" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"适用于 Huggingface 和 Faster Whisper 模型。可减少 GPU 内存占用,但可能略微" +"降低转录质量。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "减少 GPU 内存" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" -msgstr "" +msgstr "仅使用 CPU 并禁用 GPU 加速" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "" +msgstr "如果较大的模型无法适配您的 GPU 内存且 Buzz 崩溃,请启用此选项" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" -msgstr "" +msgstr "禁用 GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" @@ -223,14 +228,14 @@ msgid "Invalid API key" msgstr "无效的API key" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" -"API只支持 base64字符(A-Za-z0-9+/=)。其他字符在API密钥中可能导致错误。" +"API只支持 base64字符(A-Za-z0-9+/=_-)。其他字符在API密钥中可能导致错误。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "选择输出文件夹" @@ -256,7 +261,6 @@ msgid "Output folder" msgstr "输出文件夹" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py -#, fuzzy msgid "Select Input Folder" msgstr "选择输入文件夹" @@ -265,7 +269,6 @@ msgid "Select Output Folder" msgstr "选择输出文件夹" #: buzz/widgets/preferences_dialog/preferences_dialog.py -#, fuzzy msgid "Preferences" msgstr "偏好设置" @@ -274,7 +277,6 @@ msgid "General" msgstr "通用" #: buzz/widgets/preferences_dialog/preferences_dialog.py -#, fuzzy msgid "Models" msgstr "模型" @@ -295,7 +297,6 @@ msgid "Huggingface ID of a Faster whisper model" msgstr "较快的Whisper模型的Huggingface ID" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Download" msgstr "下载" @@ -308,9 +309,8 @@ msgid "Delete" msgstr "删除" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Downloaded" -msgstr "已下载的" +msgstr "已下载" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" @@ -325,14 +325,12 @@ msgid "Delete Model" msgstr "删除模型" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Are you sure you want to delete the selected model?" -msgstr "您确定要删除所选录制吗?" +msgstr "您确定要删除所选模型吗?" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Download failed" -msgstr "下载模型失败" +msgstr "下载失败" #: buzz/widgets/preferences_dialog/models_preferences_widget.py #: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py @@ -355,7 +353,7 @@ msgstr "检测语言" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "例如:eng, fra, deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -363,6 +361,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"输入 ISO 639-3 语言代码(3个字母)。\n" +"示例:eng(英语), fra(法语), deu(德语),\n" +"spa(西班牙语), lav(拉脱维亚语)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -407,7 +408,7 @@ msgstr "逗号分隔,例如\"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Temperature:" -msgstr "间隔" +msgstr "温度:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" @@ -422,30 +423,64 @@ msgid "Enable AI translation" msgstr "启用AI翻译" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "AI model:" msgstr "AI 模型:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "" +msgstr "请将发送给您的每段文本从英语翻译成西班牙语。" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" msgstr "AI说明:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "Recording settings" -msgstr "翻译设置" +msgstr "录制设置" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "静音阈值:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "行分隔符:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "实时录制模式:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "启用实时录制导出" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "导出文件夹:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "导出文件名:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "文本文件 (.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV (.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "导出文件类型:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"限制导出条目数\n" +"(0 = 全部导出):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -468,12 +503,10 @@ msgid "Advanced..." msgstr "高级..." #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New File Transcription" msgstr "新增文件识别" #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New URL Transcription" msgstr "新增URL识别" @@ -511,17 +544,14 @@ msgid "Queued" msgstr "队列中" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "File Name / URL" msgstr "文件名称/URL" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Model" msgstr "模型" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Task" msgstr "任务" @@ -530,7 +560,6 @@ msgid "Status" msgstr "状态" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Date Completed" msgstr "完成时间" @@ -540,60 +569,57 @@ msgstr "添加日期" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "备注" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "重置列顺序" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "取消识别" +msgstr "重新开始识别" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" -msgstr "" +msgstr "重命名" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "添加/编辑备注" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "取消识别" +msgstr "重命名识别" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "输入新名称:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "为此识别输入相关备注:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "无法重新开始" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "只有失败或已取消的识别才能重新开始。" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "取消识别" +msgstr "重新开始识别失败:{}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." -msgstr "" +msgstr "无法重新开始识别:模型不可用且无法下载。" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "无法重新开始识别:未找到识别工作进程。" #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -613,72 +639,67 @@ msgstr "麦克风:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "在新窗口中显示" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Size:" -msgstr "文本文件" +msgstr "文字大小:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "主题" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "浅色" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "深色" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "自定义" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Text Color" -msgstr "文本文件" +msgstr "文字颜色" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "背景颜色" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "全屏" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "复制" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "复制识别内容到剪贴板" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "没有可复制的内容!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "下载模型失败" +msgstr "复制失败" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "已复制!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "选择输出文件夹" +msgstr "选择文字颜色" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "选择音频文件" +msgstr "选择背景颜色" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -696,7 +717,7 @@ msgstr "检查更新" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "显示日志" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -704,7 +725,7 @@ msgstr "已经是最新版本" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "平均音量" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" @@ -723,7 +744,6 @@ msgstr "文本" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py #: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py #: buzz/widgets/transcription_viewer/export_transcription_menu.py -#, fuzzy msgid "Translation" msgstr "翻译" @@ -750,89 +770,90 @@ msgstr "调整大小" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "识别说话人" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" -msgstr "" +msgstr "查找" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" -msgstr "" +msgstr "显示/隐藏搜索栏(Ctrl+F)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" -msgstr "" +msgstr "查找:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." -msgstr "" +msgstr "输入要查找的文本..." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" -msgstr "" +msgstr "上一个匹配项(Shift+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" -msgstr "" +msgstr "下一个匹配项(Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" -msgstr "" +msgstr "清除" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" -msgstr "" +msgstr "播放控制:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" -msgstr "" +msgstr "循环片段" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" -msgstr "" +msgstr "点击识别片段时启用/禁用循环播放" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" -msgstr "" +msgstr "跟随音频" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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 msgid "Scroll to Current" -msgstr "" +msgstr "滚动到当前位置" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" -msgstr "" +msgstr "滚动到当前正在播放的文本" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" -msgstr "" +msgstr "第1项,共100+个匹配项" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " -msgstr "" +msgstr "第1项,共" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" -msgstr "" +msgstr "个匹配项" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" -msgstr "" +msgstr "未找到匹配项" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" -msgstr "" +msgstr "项,共100+个匹配项" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " -msgstr "" +msgstr "项,共" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" @@ -844,20 +865,19 @@ msgstr "请在偏好设置中输入OpenAI API Key" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "延长结束时间" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "最多延长结束时间(秒)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "延长结尾" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py -#, fuzzy msgid "Resize Options" -msgstr "调整大小" +msgstr "调整大小选项" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" @@ -865,7 +885,7 @@ msgstr "所需字幕长度" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "仅在转录时禁用逐词时间戳时可用" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -889,105 +909,100 @@ msgstr "合并" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "仅在转录时启用逐词时间戳时可用" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." -msgstr "" +msgstr "说话人识别不可用:加载所需库失败。" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 收集识别文本" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 加载音频" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 加载对齐模型" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 加载对齐模型(正在使用缓存重试...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." -msgstr "" +msgstr "加载对齐模型失败。请检查您的网络连接后重试。" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 处理音频" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "取消识别" +msgstr "5/8 准备识别文本" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 识别说话人" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 将说话人映射到识别文本" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 识别完成" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 识别说话人时出错" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "第1步:识别说话人" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "识别" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "准备好识别说话人" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "未找到音频文件" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "第2步:命名说话人" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "播放样本" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "合并说话人句子" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "保存文件" +msgstr "保存" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "取消" +msgstr "正在取消..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" -msgstr "取消" +msgstr "已取消" #: buzz/widgets/transcription_viewer/export_transcription_menu.py -#, fuzzy msgid "Save File" msgstr "保存文件" @@ -996,7 +1011,6 @@ msgid "Text files" msgstr "文本文件" #: buzz/widgets/model_download_progress_dialog.py -#, fuzzy msgid "Downloading model" msgstr "模型下载中" @@ -1005,19 +1019,16 @@ msgid "remaining" msgstr "剩余" #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import File..." -msgstr "导入媒体文件..." +msgstr "导入文件..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import URL..." -msgstr "导入媒体文件..." +msgstr "导入URL..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "导入媒体文件..." +msgstr "导入文件夹..." #: buzz/widgets/menu_bar.py msgid "About" @@ -1046,7 +1057,6 @@ msgid "Select audio file" msgstr "选择音频文件" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" msgstr "选择输入文件夹" @@ -1057,7 +1067,7 @@ msgstr "无法将OpenAI API密钥保存到密钥串" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "" +msgstr "Whisper 服务器启动失败。请查看日志以获取详情。" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1066,372 +1076,372 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" +"Whisper 服务器因内存不足而启动失败。请尝试使用较小的模型。如需强制使用 CPU " +"模式,请设置环境变量 BUZZ_FORCE_CPU=TRUE。" #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Translate to English" -msgstr "翻译设置" +msgstr "翻译成英语" #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Transcribe" msgstr "识别" #: buzz/transcriber/transcriber.py msgid "Chinese" -msgstr "" +msgstr "中文" #: buzz/transcriber/transcriber.py msgid "Russian" -msgstr "" +msgstr "俄语" #: buzz/transcriber/transcriber.py msgid "Korean" -msgstr "" +msgstr "韩语" #: buzz/transcriber/transcriber.py msgid "French" -msgstr "" +msgstr "法语" #: buzz/transcriber/transcriber.py msgid "Portuguese" -msgstr "" +msgstr "葡萄牙语" #: buzz/transcriber/transcriber.py msgid "Turkish" -msgstr "" +msgstr "土耳其语" #: buzz/transcriber/transcriber.py msgid "Arabic" -msgstr "" +msgstr "阿拉伯语" #: buzz/transcriber/transcriber.py msgid "Swedish" -msgstr "" +msgstr "瑞典语" #: buzz/transcriber/transcriber.py msgid "Indonesian" -msgstr "" +msgstr "印度尼西亚语" #: buzz/transcriber/transcriber.py msgid "Hindi" -msgstr "" +msgstr "印地语" #: buzz/transcriber/transcriber.py msgid "Finnish" -msgstr "" +msgstr "芬兰语" #: buzz/transcriber/transcriber.py msgid "Vietnamese" -msgstr "" +msgstr "越南语" #: buzz/transcriber/transcriber.py msgid "Hebrew" -msgstr "" +msgstr "希伯来语" #: buzz/transcriber/transcriber.py msgid "Greek" -msgstr "" +msgstr "希腊语" #: buzz/transcriber/transcriber.py msgid "Malay" -msgstr "" +msgstr "马来语" #: buzz/transcriber/transcriber.py msgid "Czech" -msgstr "" +msgstr "捷克语" #: buzz/transcriber/transcriber.py msgid "Romanian" -msgstr "" +msgstr "罗马尼亚语" #: buzz/transcriber/transcriber.py msgid "Hungarian" -msgstr "" +msgstr "匈牙利语" #: buzz/transcriber/transcriber.py msgid "Tamil" -msgstr "" +msgstr "泰米尔语" #: buzz/transcriber/transcriber.py msgid "Norwegian" -msgstr "" +msgstr "挪威语" #: buzz/transcriber/transcriber.py msgid "Thai" -msgstr "" +msgstr "泰语" #: buzz/transcriber/transcriber.py msgid "Urdu" -msgstr "" +msgstr "乌尔都语" #: buzz/transcriber/transcriber.py msgid "Croatian" -msgstr "" +msgstr "克罗地亚语" #: buzz/transcriber/transcriber.py msgid "Bulgarian" -msgstr "" +msgstr "保加利亚语" #: buzz/transcriber/transcriber.py msgid "Lithuanian" -msgstr "" +msgstr "立陶宛语" #: buzz/transcriber/transcriber.py msgid "Latin" -msgstr "" +msgstr "拉丁语" #: buzz/transcriber/transcriber.py msgid "Maori" -msgstr "" +msgstr "毛利语" #: buzz/transcriber/transcriber.py msgid "Malayalam" -msgstr "" +msgstr "马拉雅拉姆语" #: buzz/transcriber/transcriber.py msgid "Welsh" -msgstr "" +msgstr "威尔士语" #: buzz/transcriber/transcriber.py msgid "Slovak" -msgstr "" +msgstr "斯洛伐克语" #: buzz/transcriber/transcriber.py msgid "Telugu" -msgstr "" +msgstr "泰卢固语" #: buzz/transcriber/transcriber.py msgid "Persian" -msgstr "" +msgstr "波斯语" #: buzz/transcriber/transcriber.py msgid "Bengali" -msgstr "" +msgstr "孟加拉语" #: buzz/transcriber/transcriber.py msgid "Serbian" -msgstr "" +msgstr "塞尔维亚语" #: buzz/transcriber/transcriber.py msgid "Azerbaijani" -msgstr "" +msgstr "阿塞拜疆语" #: buzz/transcriber/transcriber.py msgid "Slovenian" -msgstr "" +msgstr "斯洛文尼亚语" #: buzz/transcriber/transcriber.py msgid "Kannada" -msgstr "" +msgstr "卡纳达语" #: buzz/transcriber/transcriber.py msgid "Estonian" -msgstr "" +msgstr "爱沙尼亚语" #: buzz/transcriber/transcriber.py msgid "Macedonian" -msgstr "" +msgstr "马其顿语" #: buzz/transcriber/transcriber.py msgid "Breton" -msgstr "" +msgstr "布列塔尼语" #: buzz/transcriber/transcriber.py msgid "Basque" -msgstr "" +msgstr "巴斯克语" #: buzz/transcriber/transcriber.py msgid "Icelandic" -msgstr "" +msgstr "冰岛语" #: buzz/transcriber/transcriber.py msgid "Armenian" -msgstr "" +msgstr "亚美尼亚语" #: buzz/transcriber/transcriber.py msgid "Nepali" -msgstr "" +msgstr "尼泊尔语" #: buzz/transcriber/transcriber.py msgid "Mongolian" -msgstr "" +msgstr "蒙古语" #: buzz/transcriber/transcriber.py msgid "Bosnian" -msgstr "" +msgstr "波斯尼亚语" #: buzz/transcriber/transcriber.py msgid "Kazakh" -msgstr "" +msgstr "哈萨克语" #: buzz/transcriber/transcriber.py msgid "Albanian" -msgstr "" +msgstr "阿尔巴尼亚语" #: buzz/transcriber/transcriber.py msgid "Swahili" -msgstr "" +msgstr "斯瓦希里语" #: buzz/transcriber/transcriber.py msgid "Galician" -msgstr "" +msgstr "加利西亚语" #: buzz/transcriber/transcriber.py msgid "Marathi" -msgstr "" +msgstr "马拉地语" #: buzz/transcriber/transcriber.py msgid "Punjabi" -msgstr "" +msgstr "旁遮普语" #: buzz/transcriber/transcriber.py msgid "Sinhala" -msgstr "" +msgstr "僧伽罗语" #: buzz/transcriber/transcriber.py msgid "Khmer" -msgstr "" +msgstr "高棉语" #: buzz/transcriber/transcriber.py msgid "Shona" -msgstr "" +msgstr "绍纳语" #: buzz/transcriber/transcriber.py msgid "Yoruba" -msgstr "" +msgstr "约鲁巴语" #: buzz/transcriber/transcriber.py msgid "Somali" -msgstr "" +msgstr "索马里语" #: buzz/transcriber/transcriber.py msgid "Afrikaans" -msgstr "" +msgstr "南非荷兰语" #: buzz/transcriber/transcriber.py msgid "Occitan" -msgstr "" +msgstr "奥克语" #: buzz/transcriber/transcriber.py msgid "Georgian" -msgstr "" +msgstr "格鲁吉亚语" #: buzz/transcriber/transcriber.py msgid "Belarusian" -msgstr "" +msgstr "白俄罗斯语" #: buzz/transcriber/transcriber.py msgid "Tajik" -msgstr "" +msgstr "塔吉克语" #: buzz/transcriber/transcriber.py msgid "Sindhi" -msgstr "" +msgstr "信德语" #: buzz/transcriber/transcriber.py msgid "Gujarati" -msgstr "" +msgstr "古吉拉特语" #: buzz/transcriber/transcriber.py msgid "Amharic" -msgstr "" +msgstr "阿姆哈拉语" #: buzz/transcriber/transcriber.py msgid "Yiddish" -msgstr "" +msgstr "意第绪语" #: buzz/transcriber/transcriber.py msgid "Lao" -msgstr "" +msgstr "老挝语" #: buzz/transcriber/transcriber.py msgid "Uzbek" -msgstr "" +msgstr "乌兹别克语" #: buzz/transcriber/transcriber.py msgid "Faroese" -msgstr "" +msgstr "法罗语" #: buzz/transcriber/transcriber.py msgid "Haitian Creole" -msgstr "" +msgstr "海地克里奥尔语" #: buzz/transcriber/transcriber.py msgid "Pashto" -msgstr "" +msgstr "普什图语" #: buzz/transcriber/transcriber.py msgid "Turkmen" -msgstr "" +msgstr "土库曼语" #: buzz/transcriber/transcriber.py msgid "Nynorsk" -msgstr "" +msgstr "新挪威语" #: buzz/transcriber/transcriber.py msgid "Maltese" -msgstr "" +msgstr "马耳他语" #: buzz/transcriber/transcriber.py msgid "Sanskrit" -msgstr "" +msgstr "梵语" #: buzz/transcriber/transcriber.py msgid "Luxembourgish" -msgstr "" +msgstr "卢森堡语" #: buzz/transcriber/transcriber.py msgid "Myanmar" -msgstr "" +msgstr "缅甸语" #: buzz/transcriber/transcriber.py msgid "Tibetan" -msgstr "" +msgstr "藏语" #: buzz/transcriber/transcriber.py msgid "Tagalog" -msgstr "" +msgstr "他加禄语" #: buzz/transcriber/transcriber.py msgid "Malagasy" -msgstr "" +msgstr "马达加斯加语" #: buzz/transcriber/transcriber.py msgid "Assamese" -msgstr "" +msgstr "阿萨姆语" #: buzz/transcriber/transcriber.py msgid "Tatar" -msgstr "" +msgstr "鞑靼语" #: buzz/transcriber/transcriber.py msgid "Hawaiian" -msgstr "" +msgstr "夏威夷语" #: buzz/transcriber/transcriber.py msgid "Lingala" -msgstr "" +msgstr "林加拉语" #: buzz/transcriber/transcriber.py msgid "Hausa" -msgstr "" +msgstr "豪萨语" #: buzz/transcriber/transcriber.py msgid "Bashkir" -msgstr "" +msgstr "巴什基尔语" #: buzz/transcriber/transcriber.py msgid "Javanese" -msgstr "" +msgstr "爪哇语" #: buzz/transcriber/transcriber.py msgid "Sundanese" -msgstr "" +msgstr "巽他语" #: buzz/transcriber/transcriber.py msgid "Cantonese" -msgstr "" +msgstr "粤语" #: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" @@ -1439,20 +1449,17 @@ msgstr "连接发生错误" #: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." -msgstr "" +msgstr "正在启动 Whisper.cpp..." #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "取消识别" +msgstr "正在开始识别..." #: buzz/settings/shortcut.py -#, fuzzy msgid "Open Record Window" msgstr "打开录制窗口" #: buzz/settings/shortcut.py -#, fuzzy msgid "Import File" msgstr "导入文件" @@ -1461,64 +1468,60 @@ msgid "Open Preferences Window" msgstr "打开偏好设置窗口" #: buzz/settings/shortcut.py -#, fuzzy msgid "View Transcript Text" msgstr "查看识别的文本" #: buzz/settings/shortcut.py -#, fuzzy msgid "View Transcript Translation" msgstr "查看识别的翻译" #: buzz/settings/shortcut.py -#, fuzzy msgid "View Transcript Timestamps" -msgstr "查看转录时间戳" +msgstr "查看识别时间戳" #: buzz/settings/shortcut.py -#, fuzzy msgid "Search Transcript" -msgstr "打开识别结果" +msgstr "搜索识别内容" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "转到下一个识别搜索结果" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "转到上一个识别搜索结果" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" -msgstr "" +msgstr "滚动到当前文本" #: buzz/settings/shortcut.py msgid "Play/Pause Audio" -msgstr "" +msgstr "播放/暂停音频" #: buzz/settings/shortcut.py msgid "Replay Current Segment" -msgstr "" +msgstr "重播当前片段" #: buzz/settings/shortcut.py msgid "Toggle Playback Controls" -msgstr "" +msgstr "切换播放控制" #: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" -msgstr "" +msgstr "减少片段开始时间" #: buzz/settings/shortcut.py msgid "Increase Segment Start Time" -msgstr "" +msgstr "增加片段开始时间" #: buzz/settings/shortcut.py msgid "Decrease Segment End Time" -msgstr "" +msgstr "减少片段结束时间" #: buzz/settings/shortcut.py msgid "Increase Segment End Time" -msgstr "" +msgstr "增加片段结束时间" #: buzz/settings/recording_transcriber_mode.py msgid "Append below" @@ -1533,15 +1536,15 @@ msgid "Append and correct" msgstr "增加并纠正" #: buzz/translator.py -#, fuzzy msgid "Translation error, see logs!" -msgstr "翻译设置" +msgstr "翻译出错,请查看日志!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" +"语音提取失败!请检查您的网络连接——可能需要下载模型。" #~ msgid "Snap permission notice" #~ msgstr "快照权限通知" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index 6c92136a..27a25bd9 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: 2026-02-26 20:29+0200\n" +"POT-Creation-Date: 2026-02-27 09:07+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -19,11 +19,11 @@ msgstr "" #: buzz/widgets/import_url_dialog.py buzz/settings/shortcut.py msgid "Import URL" -msgstr "" +msgstr "匯入網址" #: buzz/widgets/import_url_dialog.py msgid "https://example.com/audio.mp3" -msgstr "" +msgstr "https://example.com/audio.mp3" #: buzz/widgets/import_url_dialog.py #: buzz/widgets/preferences_dialog/preferences_dialog.py @@ -31,7 +31,7 @@ msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py #: buzz/widgets/main_window.py msgid "Ok" -msgstr "" +msgstr "確定" #: buzz/widgets/import_url_dialog.py #: buzz/widgets/preferences_dialog/preferences_dialog.py @@ -43,193 +43,202 @@ msgstr "取消" #: buzz/widgets/import_url_dialog.py msgid "URL:" -msgstr "" +msgstr "網址:" #: buzz/widgets/import_url_dialog.py msgid "Invalid URL" -msgstr "" +msgstr "無效的網址" #: buzz/widgets/import_url_dialog.py msgid "The URL you entered is invalid." -msgstr "" +msgstr "您輸入的網址無效。" #: buzz/widgets/presentation_window.py -#, fuzzy msgid "Live Transcript Presentation" -msgstr "新錄製" +msgstr "即時轉錄簡報" #: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py msgid "Reset to Defaults" -msgstr "" +msgstr "重設為預設值" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "English" -msgstr "" +msgstr "英語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Catalan" -msgstr "" +msgstr "加泰隆尼亞語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Danish" -msgstr "" +msgstr "丹麥語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Dutch" -msgstr "" +msgstr "荷蘭語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "German" -msgstr "" +msgstr "德語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Spanish" -msgstr "" +msgstr "西班牙語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Italian" -msgstr "" +msgstr "義大利語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Japanese" -msgstr "" +msgstr "日語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Latvian" -msgstr "" +msgstr "拉脫維亞語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Polish" -msgstr "" +msgstr "波蘭語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Portuguese (Brazil)" -msgstr "" +msgstr "葡萄牙語(巴西)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/transcriber/transcriber.py msgid "Ukrainian" -msgstr "" +msgstr "烏克蘭語" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Simplified)" -msgstr "" +msgstr "中文(簡體)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Chinese (Traditional)" -msgstr "" +msgstr "中文(繁體)" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Restart required!" -msgstr "" +msgstr "需要重新啟動!" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Ui Language" -msgstr "語言:" +msgstr "介面語言" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Font Size" -msgstr "" +msgstr "字體大小" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Test" -msgstr "" +msgstr "測試" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API key" -msgstr "" +msgstr "OpenAI API 金鑰" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI base url" -msgstr "" +msgstr "OpenAI 基礎網址" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "OpenAI API model" -msgstr "模型:" +msgstr "OpenAI API 模型" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Default export file name" -msgstr "" +msgstr "預設匯出檔案名稱" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Enable live recording transcription export" -msgstr "" +msgstr "啟用即時錄製轉錄匯出" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" -msgstr "" +msgstr "瀏覽" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Export folder" -msgstr "" +msgstr "匯出資料夾" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -#, fuzzy msgid "Live recording mode" -msgstr "現場錄製" +msgstr "即時錄製模式" + +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" +"注意:即時錄製匯出設定將在未來版本中移至即時錄製畫面的進階設定中。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" -msgstr "" +msgstr "使用 8 位元量化以降低記憶體使用量" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" +"適用於 Huggingface 和 Faster Whisper 模型。可降低 GPU 記憶體使用量,但可能" +"略微降低轉錄品質。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" -msgstr "" +msgstr "降低 GPU 記憶體" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use only CPU and disable GPU acceleration" -msgstr "" +msgstr "僅使用 CPU 並停用 GPU 加速" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "" +msgstr "若較大的模型無法放入 GPU 記憶體且 Buzz 當機,請啟用此選項" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" -msgstr "" +msgstr "停用 GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "OpenAI API Key Test" -msgstr "" +msgstr "OpenAI API 金鑰測試" #: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 msgid "Invalid API key" -msgstr "" +msgstr "無效的 API 金鑰" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" +"API 僅支援 base64 字元(A-Za-z0-9+/=_-)。API 金鑰中的其他字元可能會導致錯誤。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" -msgstr "" +msgstr "選擇匯出資料夾" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" @@ -237,103 +246,98 @@ msgid "" "Transcription and translation may still work if the API does not support key " "validation." msgstr "" +"OpenAI API 傳回無效回應。請檢查 API 網址或您的金鑰。若 API 不支援金鑰驗證," +"轉錄和翻譯仍可能正常運作。" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" -msgstr "" +msgstr "啟用資料夾監視" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" -msgstr "" +msgstr "輸入資料夾" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Output folder" -msgstr "" +msgstr "輸出資料夾" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py -#, fuzzy msgid "Select Input Folder" -msgstr "選擇聲音檔案" +msgstr "選擇輸入資料夾" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Select Output Folder" -msgstr "" +msgstr "選擇輸出資料夾" #: buzz/widgets/preferences_dialog/preferences_dialog.py -#, fuzzy msgid "Preferences" -msgstr "偏好設定..." +msgstr "偏好設定" #: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "General" -msgstr "" +msgstr "一般" #: buzz/widgets/preferences_dialog/preferences_dialog.py -#, fuzzy msgid "Models" -msgstr "模型:" +msgstr "模型" #: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Shortcuts" -msgstr "" +msgstr "快捷鍵" #: buzz/widgets/preferences_dialog/preferences_dialog.py msgid "Folder Watch" -msgstr "" +msgstr "資料夾監視" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Group" -msgstr "" +msgstr "群組" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Huggingface ID of a Faster whisper model" -msgstr "" +msgstr "Faster Whisper 模型的 Huggingface ID" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Download" -msgstr "下載模型" +msgstr "下載" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Show file location" -msgstr "" +msgstr "顯示檔案位置" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete" -msgstr "" +msgstr "刪除" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Downloaded" -msgstr "下載模型" +msgstr "已下載" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Available for Download" -msgstr "" +msgstr "可供下載" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Download link to Whisper.cpp ggml model file" -msgstr "" +msgstr "Whisper.cpp ggml 模型檔案的下載連結" #: buzz/widgets/preferences_dialog/models_preferences_widget.py msgid "Delete Model" -msgstr "" +msgstr "刪除模型" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Are you sure you want to delete the selected model?" -msgstr "您確定要刪除所選錄製嗎?此操作無法撤消。" +msgstr "您確定要刪除所選模型嗎?" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#, fuzzy msgid "Download failed" -msgstr "下載模型" +msgstr "下載失敗" #: buzz/widgets/preferences_dialog/models_preferences_widget.py #: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" -msgstr "" +msgstr "錯誤" #: buzz/widgets/record_button.py buzz/widgets/main_window_toolbar.py msgid "Record" @@ -350,7 +354,7 @@ msgstr "檢測語言" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "e.g., eng, fra, deu" -msgstr "" +msgstr "例如:eng、fra、deu" #: buzz/widgets/transcriber/mms_language_line_edit.py msgid "" @@ -358,6 +362,9 @@ msgid "" "Examples: eng (English), fra (French), deu (German),\n" "spa (Spanish), lav (Latvian)" msgstr "" +"請輸入 ISO 639-3 語言代碼(3 個字母)。\n" +"範例:eng(英語)、fra(法語)、deu(德語)、\n" +"spa(西班牙語)、lav(拉脫維亞語)" #: buzz/widgets/transcriber/file_transcriber_widget.py msgid "Run" @@ -370,11 +377,11 @@ msgstr "模型:" #: buzz/widgets/transcriber/transcription_options_group_box.py #: buzz/transcriber/recording_transcriber.py msgid "First time use of a model may take up to several minutest to load." -msgstr "" +msgstr "首次使用模型最多可能需要數分鐘載入。" #: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Api Key:" -msgstr "" +msgstr "API 金鑰:" #: buzz/widgets/transcriber/transcription_options_group_box.py msgid "Task:" @@ -386,7 +393,7 @@ msgstr "語言:" #: buzz/widgets/transcriber/initial_prompt_text_edit.py msgid "Enter prompt..." -msgstr "" +msgstr "輸入提示..." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Advanced Settings" @@ -394,7 +401,7 @@ msgstr "進階設定" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Speech recognition settings" -msgstr "" +msgstr "語音識別設定" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" @@ -410,36 +417,71 @@ msgstr "初始提示:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Translation settings" -msgstr "" +msgstr "翻譯設定" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable AI translation" -msgstr "" +msgstr "啟用 AI 翻譯" #: buzz/widgets/transcriber/advanced_settings_dialog.py -#, fuzzy msgid "AI model:" -msgstr "模型:" +msgstr "AI 模型:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "" +msgstr "請將傳送給您的每段文字從英語翻譯為西班牙語。" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" -msgstr "" +msgstr "AI 指令:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Recording settings" -msgstr "" +msgstr "錄製設定" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Silence threshold:" -msgstr "" +msgstr "靜音閾值:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" +msgstr "行分隔符號:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "即時錄製模式:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Enable live recording export" +msgstr "啟用即時錄製匯出" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export folder:" +msgstr "匯出資料夾:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file name:" +msgstr "匯出檔案名稱:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Text file (.txt)" +msgstr "文字檔案(.txt)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "CSV (.csv)" +msgstr "CSV(.csv)" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Export file type:" +msgstr "匯出檔案類型:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "" +"Limit export entries\n" +"(0 = export all):" msgstr "" +"限制匯出筆數\n" +"(0 = 全部匯出):" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Word-level timings" @@ -447,29 +489,27 @@ msgstr "單字級別的時間表達" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Extract speech" -msgstr "" +msgstr "提取語音" #: buzz/widgets/transcriber/file_transcription_form_widget.py msgid "Export:" -msgstr "" +msgstr "匯出:" #: buzz/widgets/transcriber/hugging_face_search_line_edit.py msgid "Huggingface ID of a model" -msgstr "" +msgstr "模型的 Huggingface ID" #: buzz/widgets/transcriber/advanced_settings_button.py msgid "Advanced..." -msgstr "" +msgstr "進階..." #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New File Transcription" -msgstr "新錄製" +msgstr "新增檔案轉錄" #: buzz/widgets/main_window_toolbar.py -#, fuzzy msgid "New URL Transcription" -msgstr "新錄製" +msgstr "新增網址轉錄" #: buzz/widgets/main_window_toolbar.py msgid "Open Transcript" @@ -486,7 +526,7 @@ msgstr "清除歷史紀錄" #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" -msgstr "" +msgstr "進行中" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Completed" @@ -494,7 +534,7 @@ msgstr "完成" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed" -msgstr "" +msgstr "失敗" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Canceled" @@ -502,92 +542,86 @@ msgstr "取消" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Queued" -msgstr "" +msgstr "排隊中" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "File Name / URL" -msgstr "檔案名稱" +msgstr "檔案名稱 / 網址" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Model" -msgstr "模型:" +msgstr "模型" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Task" -msgstr "任務:" +msgstr "任務" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Status" msgstr "狀態" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Date Completed" -msgstr "完成" +msgstr "完成日期" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Date Added" -msgstr "" +msgstr "新增日期" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Notes" -msgstr "" +msgstr "備註" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Reset Column Order" -msgstr "" +msgstr "重設欄位順序" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Restart Transcription" -msgstr "取消錄製" +msgstr "重新開始轉錄" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Rename" -msgstr "" +msgstr "重新命名" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Add/Edit Notes" -msgstr "" +msgstr "新增/編輯備註" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Rename Transcription" -msgstr "取消錄製" +msgstr "重新命名轉錄" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter new name:" -msgstr "" +msgstr "輸入新名稱:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Enter some relevant notes for this transcription:" -msgstr "" +msgstr "為此轉錄輸入相關備註:" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Cannot Restart" -msgstr "" +msgstr "無法重新開始" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "" +msgstr "只有失敗或已取消的轉錄才能重新開始。" #: buzz/widgets/transcription_tasks_table_widget.py -#, fuzzy msgid "Failed to restart transcription: {}" -msgstr "取消錄製" +msgstr "重新開始轉錄失敗:{}" #: buzz/widgets/transcription_tasks_table_widget.py msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" +"無法重新開始轉錄:模型不可用且無法下載。" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "" +msgstr "無法重新開始轉錄:找不到轉錄工作器。" #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -599,7 +633,7 @@ msgstr "點擊開始錄製" #: buzz/widgets/recording_transcriber_widget.py msgid "Waiting for AI translation..." -msgstr "" +msgstr "等待 AI 翻譯..." #: buzz/widgets/recording_transcriber_widget.py msgid "Microphone:" @@ -607,70 +641,67 @@ msgstr "麥克風:" #: buzz/widgets/recording_transcriber_widget.py msgid "Show in new window" -msgstr "" +msgstr "在新視窗中顯示" #: buzz/widgets/recording_transcriber_widget.py msgid "Text Size:" -msgstr "" +msgstr "文字大小:" #: buzz/widgets/recording_transcriber_widget.py msgid "Theme" -msgstr "" +msgstr "主題" #: buzz/widgets/recording_transcriber_widget.py msgid "Light" -msgstr "" +msgstr "淺色" #: buzz/widgets/recording_transcriber_widget.py msgid "Dark" -msgstr "" +msgstr "深色" #: buzz/widgets/recording_transcriber_widget.py msgid "Custom" -msgstr "" +msgstr "自訂" #: buzz/widgets/recording_transcriber_widget.py msgid "Text Color" -msgstr "" +msgstr "文字顏色" #: buzz/widgets/recording_transcriber_widget.py msgid "Background Color" -msgstr "" +msgstr "背景顏色" #: buzz/widgets/recording_transcriber_widget.py msgid "Fullscreen" -msgstr "" +msgstr "全螢幕" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy" -msgstr "" +msgstr "複製" #: buzz/widgets/recording_transcriber_widget.py msgid "Copy transcription to clipboard" -msgstr "" +msgstr "複製轉錄內容到剪貼簿" #: buzz/widgets/recording_transcriber_widget.py msgid "Nothing to copy!" -msgstr "" +msgstr "沒有可複製的內容!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Copy failed" -msgstr "下載模型" +msgstr "複製失敗" #: buzz/widgets/recording_transcriber_widget.py msgid "Copied!" -msgstr "" +msgstr "已複製!" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Text Color" -msgstr "選擇聲音檔案" +msgstr "選擇文字顏色" #: buzz/widgets/recording_transcriber_widget.py -#, fuzzy msgid "Select Background Color" -msgstr "選擇聲音檔案" +msgstr "選擇背景顏色" #: buzz/widgets/recording_transcriber_widget.py msgid "An error occurred while starting a new recording:" @@ -688,7 +719,7 @@ msgstr "檢查更新" #: buzz/widgets/about_dialog.py msgid "Show logs" -msgstr "" +msgstr "顯示日誌" #: buzz/widgets/about_dialog.py msgid "You're up to date!" @@ -696,323 +727,316 @@ msgstr "你是最新的!" #: buzz/widgets/audio_meter_widget.py msgid "Average volume" -msgstr "" +msgstr "平均音量" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" -msgstr "" +msgstr "開始" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "End" -msgstr "" +msgstr "結束" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py #: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py #: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" -msgstr "" +msgstr "文字" #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py #: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py #: buzz/widgets/transcription_viewer/export_transcription_menu.py -#, fuzzy msgid "Translation" -msgstr "新錄製" +msgstr "翻譯" #: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "View" -msgstr "" +msgstr "檢視" #: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py msgid "Timestamps" -msgstr "" +msgstr "時間戳記" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Export" -msgstr "" +msgstr "匯出" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Translate" -msgstr "" +msgstr "翻譯" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" -msgstr "" +msgstr "調整大小" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Identify Speakers" -msgstr "" +msgstr "識別說話者" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find" -msgstr "" +msgstr "尋找" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Show/Hide Search Bar (Ctrl+F)" -msgstr "" +msgstr "顯示/隱藏搜尋列(Ctrl+F)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Find:" -msgstr "" +msgstr "尋找:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enter text to find..." -msgstr "" +msgstr "輸入要尋找的文字..." #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Previous match (Shift+Enter)" -msgstr "" +msgstr "上一個符合項目(Shift+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Next match (Ctrl+Enter)" -msgstr "" +msgstr "下一個符合項目(Ctrl+Enter)" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Clear" -msgstr "" +msgstr "清除" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Playback Controls:" -msgstr "" +msgstr "播放控制:" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Loop Segment" -msgstr "" +msgstr "循環片段" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" -msgstr "" +msgstr "點擊轉錄片段時啟用/停用循環播放" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" -msgstr "" +msgstr "跟隨音訊" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py 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 msgid "Scroll to Current" -msgstr "" +msgstr "捲動至目前位置" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to the currently spoken text" -msgstr "" +msgstr "捲動至目前正在說話的文字" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of 100+ matches" -msgstr "" +msgstr "100 個以上符合項目中的第 1 個" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "1 of " -msgstr "" +msgstr "第 1 個,共 " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " matches" -msgstr "" +msgstr " 個符合項目" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "No matches found" -msgstr "" +msgstr "找不到符合項目" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of 100+ matches" -msgstr "" +msgstr ",共 100 個以上符合項目" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid " of " -msgstr "" +msgstr ",共 " #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "API Key Required" -msgstr "" +msgstr "需要 API 金鑰" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Please enter OpenAI API Key in preferences" -msgstr "" +msgstr "請在偏好設定中輸入 OpenAI API 金鑰" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend end time" -msgstr "" +msgstr "延長結束時間" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings by up to (seconds)" -msgstr "" +msgstr "最多延長結束時間(秒)" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Extend endings" -msgstr "" +msgstr "延長結尾" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize Options" -msgstr "" +msgstr "調整大小選項" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Desired subtitle length" -msgstr "" +msgstr "理想字幕長度" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "" +msgstr "僅在轉錄時停用單字級別時間戳記時可用" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" -msgstr "" +msgstr "合併選項" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge by gap" -msgstr "" +msgstr "依間隔合併" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by punctuation" -msgstr "" +msgstr "依標點符號分割" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Split by max length" -msgstr "" +msgstr "依最大長度分割" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge" -msgstr "" +msgstr "合併" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "" +msgstr "僅在轉錄時啟用單字級別時間戳記時可用" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" +"說話者識別不可用:無法載入所需程式庫。" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" -msgstr "" +msgstr "1/8 收集轉錄稿" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "2/8 Loading audio" -msgstr "" +msgstr "2/8 載入音訊" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model" -msgstr "" +msgstr "3/8 載入對齊模型" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "" +msgstr "3/8 載入對齊模型(正在使用快取重試...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" +"無法載入對齊模型。請檢查您的網路連線並重試。" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" -msgstr "" +msgstr "4/8 處理音訊" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "5/8 Preparing transcripts" -msgstr "取消錄製" +msgstr "5/8 準備轉錄稿" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "6/8 Identifying speakers" -msgstr "" +msgstr "6/8 識別說話者" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "7/8 Mapping speakers to transcripts" -msgstr "" +msgstr "7/8 將說話者對應到轉錄稿" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "8/8 Identification done" -msgstr "" +msgstr "8/8 識別完成" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "0/0 Error identifying speakers" -msgstr "" +msgstr "0/0 識別說話者時發生錯誤" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 1: Identify speakers" -msgstr "" +msgstr "步驟 1:識別說話者" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Identify" -msgstr "" +msgstr "識別" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Ready to identify speakers" -msgstr "" +msgstr "準備識別說話者" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Audio file not found" -msgstr "" +msgstr "找不到音訊檔案" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Step 2: Name speakers" -msgstr "" +msgstr "步驟 2:為說話者命名" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Play sample" -msgstr "" +msgstr "播放範例" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "Merge speaker sentences" -msgstr "" +msgstr "合併說話者句子" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Save" -msgstr "檔案" +msgstr "儲存" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelling..." -msgstr "取消" +msgstr "取消中..." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#, fuzzy msgid "Cancelled" -msgstr "取消" +msgstr "已取消" #: buzz/widgets/transcription_viewer/export_transcription_menu.py -#, fuzzy msgid "Save File" -msgstr "檔案" +msgstr "儲存檔案" #: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text files" -msgstr "" +msgstr "文字檔案" #: buzz/widgets/model_download_progress_dialog.py -#, fuzzy msgid "Downloading model" -msgstr "下載模型" +msgstr "正在下載模型" #: buzz/widgets/model_download_progress_dialog.py msgid "remaining" -msgstr "" +msgstr "剩餘" #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import File..." -msgstr "導入媒體檔案..." +msgstr "匯入檔案..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import URL..." -msgstr "導入媒體檔案..." +msgstr "匯入網址..." #: buzz/widgets/menu_bar.py -#, fuzzy msgid "Import Folder..." -msgstr "導入媒體檔案..." +msgstr "導入資料夾..." #: buzz/widgets/menu_bar.py msgid "About" -msgstr "" +msgstr "關於" #: buzz/widgets/menu_bar.py msgid "Preferences..." @@ -1037,18 +1061,17 @@ msgid "Select audio file" msgstr "選擇聲音檔案" #: buzz/widgets/main_window.py -#, fuzzy msgid "Select folder" -msgstr "選擇聲音檔案" +msgstr "選擇資料夾" #: buzz/widgets/main_window.py msgid "Unable to save OpenAI API key to keyring" -msgstr "" +msgstr "無法將 OpenAI API 金鑰儲存至鑰匙圈" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "" +msgstr "Whisper 伺服器啟動失敗。請查看日誌以了解詳情。" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1057,481 +1080,475 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" +"Whisper 伺服器因記憶體不足而啟動失敗。請改用較小的模型重試。若要強制使用 " +"CPU 模式,請設定環境變數 BUZZ_FORCE_CPU=TRUE。" #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Translate to English" -msgstr "新錄製" +msgstr "翻譯為英語" #: buzz/transcriber/transcriber.py -#, fuzzy msgid "Transcribe" -msgstr "打開轉換結果" +msgstr "轉錄" #: buzz/transcriber/transcriber.py msgid "Chinese" -msgstr "" +msgstr "中文" #: buzz/transcriber/transcriber.py msgid "Russian" -msgstr "" +msgstr "俄語" #: buzz/transcriber/transcriber.py msgid "Korean" -msgstr "" +msgstr "韓語" #: buzz/transcriber/transcriber.py msgid "French" -msgstr "" +msgstr "法語" #: buzz/transcriber/transcriber.py msgid "Portuguese" -msgstr "" +msgstr "葡萄牙語" #: buzz/transcriber/transcriber.py msgid "Turkish" -msgstr "" +msgstr "土耳其語" #: buzz/transcriber/transcriber.py msgid "Arabic" -msgstr "" +msgstr "阿拉伯語" #: buzz/transcriber/transcriber.py msgid "Swedish" -msgstr "" +msgstr "瑞典語" #: buzz/transcriber/transcriber.py msgid "Indonesian" -msgstr "" +msgstr "印尼語" #: buzz/transcriber/transcriber.py msgid "Hindi" -msgstr "" +msgstr "印地語" #: buzz/transcriber/transcriber.py msgid "Finnish" -msgstr "" +msgstr "芬蘭語" #: buzz/transcriber/transcriber.py msgid "Vietnamese" -msgstr "" +msgstr "越南語" #: buzz/transcriber/transcriber.py msgid "Hebrew" -msgstr "" +msgstr "希伯來語" #: buzz/transcriber/transcriber.py msgid "Greek" -msgstr "" +msgstr "希臘語" #: buzz/transcriber/transcriber.py msgid "Malay" -msgstr "" +msgstr "馬來語" #: buzz/transcriber/transcriber.py msgid "Czech" -msgstr "" +msgstr "捷克語" #: buzz/transcriber/transcriber.py msgid "Romanian" -msgstr "" +msgstr "羅馬尼亞語" #: buzz/transcriber/transcriber.py msgid "Hungarian" -msgstr "" +msgstr "匈牙利語" #: buzz/transcriber/transcriber.py msgid "Tamil" -msgstr "" +msgstr "泰米爾語" #: buzz/transcriber/transcriber.py msgid "Norwegian" -msgstr "" +msgstr "挪威語" #: buzz/transcriber/transcriber.py msgid "Thai" -msgstr "" +msgstr "泰語" #: buzz/transcriber/transcriber.py msgid "Urdu" -msgstr "" +msgstr "烏爾都語" #: buzz/transcriber/transcriber.py msgid "Croatian" -msgstr "" +msgstr "克羅埃西亞語" #: buzz/transcriber/transcriber.py msgid "Bulgarian" -msgstr "" +msgstr "保加利亞語" #: buzz/transcriber/transcriber.py msgid "Lithuanian" -msgstr "" +msgstr "立陶宛語" #: buzz/transcriber/transcriber.py msgid "Latin" -msgstr "" +msgstr "拉丁語" #: buzz/transcriber/transcriber.py msgid "Maori" -msgstr "" +msgstr "毛利語" #: buzz/transcriber/transcriber.py msgid "Malayalam" -msgstr "" +msgstr "馬拉雅拉姆語" #: buzz/transcriber/transcriber.py msgid "Welsh" -msgstr "" +msgstr "威爾斯語" #: buzz/transcriber/transcriber.py msgid "Slovak" -msgstr "" +msgstr "斯洛伐克語" #: buzz/transcriber/transcriber.py msgid "Telugu" -msgstr "" +msgstr "泰盧固語" #: buzz/transcriber/transcriber.py msgid "Persian" -msgstr "" +msgstr "波斯語" #: buzz/transcriber/transcriber.py msgid "Bengali" -msgstr "" +msgstr "孟加拉語" #: buzz/transcriber/transcriber.py msgid "Serbian" -msgstr "" +msgstr "塞爾維亞語" #: buzz/transcriber/transcriber.py msgid "Azerbaijani" -msgstr "" +msgstr "亞塞拜然語" #: buzz/transcriber/transcriber.py msgid "Slovenian" -msgstr "" +msgstr "斯洛維尼亞語" #: buzz/transcriber/transcriber.py msgid "Kannada" -msgstr "" +msgstr "卡納達語" #: buzz/transcriber/transcriber.py msgid "Estonian" -msgstr "" +msgstr "愛沙尼亞語" #: buzz/transcriber/transcriber.py msgid "Macedonian" -msgstr "" +msgstr "馬其頓語" #: buzz/transcriber/transcriber.py msgid "Breton" -msgstr "" +msgstr "布列塔尼語" #: buzz/transcriber/transcriber.py msgid "Basque" -msgstr "" +msgstr "巴斯克語" #: buzz/transcriber/transcriber.py msgid "Icelandic" -msgstr "" +msgstr "冰島語" #: buzz/transcriber/transcriber.py msgid "Armenian" -msgstr "" +msgstr "亞美尼亞語" #: buzz/transcriber/transcriber.py msgid "Nepali" -msgstr "" +msgstr "尼泊爾語" #: buzz/transcriber/transcriber.py msgid "Mongolian" -msgstr "" +msgstr "蒙古語" #: buzz/transcriber/transcriber.py msgid "Bosnian" -msgstr "" +msgstr "波士尼亞語" #: buzz/transcriber/transcriber.py msgid "Kazakh" -msgstr "" +msgstr "哈薩克語" #: buzz/transcriber/transcriber.py msgid "Albanian" -msgstr "" +msgstr "阿爾巴尼亞語" #: buzz/transcriber/transcriber.py msgid "Swahili" -msgstr "" +msgstr "斯瓦希里語" #: buzz/transcriber/transcriber.py msgid "Galician" -msgstr "" +msgstr "加利西亞語" #: buzz/transcriber/transcriber.py msgid "Marathi" -msgstr "" +msgstr "馬拉地語" #: buzz/transcriber/transcriber.py msgid "Punjabi" -msgstr "" +msgstr "旁遮普語" #: buzz/transcriber/transcriber.py msgid "Sinhala" -msgstr "" +msgstr "僧伽羅語" #: buzz/transcriber/transcriber.py msgid "Khmer" -msgstr "" +msgstr "高棉語" #: buzz/transcriber/transcriber.py msgid "Shona" -msgstr "" +msgstr "紹納語" #: buzz/transcriber/transcriber.py msgid "Yoruba" -msgstr "" +msgstr "約魯巴語" #: buzz/transcriber/transcriber.py msgid "Somali" -msgstr "" +msgstr "索馬利語" #: buzz/transcriber/transcriber.py msgid "Afrikaans" -msgstr "" +msgstr "南非荷蘭語" #: buzz/transcriber/transcriber.py msgid "Occitan" -msgstr "" +msgstr "奧克語" #: buzz/transcriber/transcriber.py msgid "Georgian" -msgstr "" +msgstr "喬治亞語" #: buzz/transcriber/transcriber.py msgid "Belarusian" -msgstr "" +msgstr "白俄羅斯語" #: buzz/transcriber/transcriber.py msgid "Tajik" -msgstr "" +msgstr "塔吉克語" #: buzz/transcriber/transcriber.py msgid "Sindhi" -msgstr "" +msgstr "信德語" #: buzz/transcriber/transcriber.py msgid "Gujarati" -msgstr "" +msgstr "古吉拉特語" #: buzz/transcriber/transcriber.py msgid "Amharic" -msgstr "" +msgstr "阿姆哈拉語" #: buzz/transcriber/transcriber.py msgid "Yiddish" -msgstr "" +msgstr "意第緒語" #: buzz/transcriber/transcriber.py msgid "Lao" -msgstr "" +msgstr "寮語" #: buzz/transcriber/transcriber.py msgid "Uzbek" -msgstr "" +msgstr "烏茲別克語" #: buzz/transcriber/transcriber.py msgid "Faroese" -msgstr "" +msgstr "法羅語" #: buzz/transcriber/transcriber.py msgid "Haitian Creole" -msgstr "" +msgstr "海地克里奧爾語" #: buzz/transcriber/transcriber.py msgid "Pashto" -msgstr "" +msgstr "普什圖語" #: buzz/transcriber/transcriber.py msgid "Turkmen" -msgstr "" +msgstr "土庫曼語" #: buzz/transcriber/transcriber.py msgid "Nynorsk" -msgstr "" +msgstr "新挪威語" #: buzz/transcriber/transcriber.py msgid "Maltese" -msgstr "" +msgstr "馬爾他語" #: buzz/transcriber/transcriber.py msgid "Sanskrit" -msgstr "" +msgstr "梵語" #: buzz/transcriber/transcriber.py msgid "Luxembourgish" -msgstr "" +msgstr "盧森堡語" #: buzz/transcriber/transcriber.py msgid "Myanmar" -msgstr "" +msgstr "緬甸語" #: buzz/transcriber/transcriber.py msgid "Tibetan" -msgstr "" +msgstr "藏語" #: buzz/transcriber/transcriber.py msgid "Tagalog" -msgstr "" +msgstr "他加祿語" #: buzz/transcriber/transcriber.py msgid "Malagasy" -msgstr "" +msgstr "馬拉加斯語" #: buzz/transcriber/transcriber.py msgid "Assamese" -msgstr "" +msgstr "阿薩姆語" #: buzz/transcriber/transcriber.py msgid "Tatar" -msgstr "" +msgstr "韃靼語" #: buzz/transcriber/transcriber.py msgid "Hawaiian" -msgstr "" +msgstr "夏威夷語" #: buzz/transcriber/transcriber.py msgid "Lingala" -msgstr "" +msgstr "林加拉語" #: buzz/transcriber/transcriber.py msgid "Hausa" -msgstr "" +msgstr "豪薩語" #: buzz/transcriber/transcriber.py msgid "Bashkir" -msgstr "" +msgstr "巴什基爾語" #: buzz/transcriber/transcriber.py msgid "Javanese" -msgstr "" +msgstr "爪哇語" #: buzz/transcriber/transcriber.py msgid "Sundanese" -msgstr "" +msgstr "巽他語" #: buzz/transcriber/transcriber.py msgid "Cantonese" -msgstr "" +msgstr "粵語" #: buzz/transcriber/recording_transcriber.py buzz/model_loader.py msgid "A connection error occurred" -msgstr "" +msgstr "發生連線錯誤" #: buzz/transcriber/recording_transcriber.py msgid "Starting Whisper.cpp..." -msgstr "" +msgstr "正在啟動 Whisper.cpp..." #: buzz/transcriber/recording_transcriber.py -#, fuzzy msgid "Starting transcription..." -msgstr "取消錄製" +msgstr "正在開始轉錄..." #: buzz/settings/shortcut.py -#, fuzzy msgid "Open Record Window" -msgstr "現場錄製" +msgstr "開啟錄製視窗" #: buzz/settings/shortcut.py -#, fuzzy msgid "Import File" -msgstr "導入媒體檔案..." +msgstr "匯入檔案" #: buzz/settings/shortcut.py msgid "Open Preferences Window" -msgstr "" +msgstr "開啟偏好設定視窗" #: buzz/settings/shortcut.py -#, fuzzy msgid "View Transcript Text" -msgstr "新錄製" +msgstr "檢視轉錄文字" #: buzz/settings/shortcut.py -#, fuzzy msgid "View Transcript Translation" -msgstr "新錄製" +msgstr "檢視轉錄翻譯" #: buzz/settings/shortcut.py -#, fuzzy msgid "View Transcript Timestamps" -msgstr "新錄製" +msgstr "檢視轉錄時間戳記" #: buzz/settings/shortcut.py -#, fuzzy msgid "Search Transcript" -msgstr "打開轉換結果" +msgstr "搜尋轉錄稿" #: buzz/settings/shortcut.py msgid "Go to Next Transcript Search Result" -msgstr "" +msgstr "移至下一個轉錄搜尋結果" #: buzz/settings/shortcut.py msgid "Go to Previous Transcript Search Result" -msgstr "" +msgstr "移至上一個轉錄搜尋結果" #: buzz/settings/shortcut.py msgid "Scroll to Current Text" -msgstr "" +msgstr "捲動至目前文字" #: buzz/settings/shortcut.py msgid "Play/Pause Audio" -msgstr "" +msgstr "播放/暫停音訊" #: buzz/settings/shortcut.py msgid "Replay Current Segment" -msgstr "" +msgstr "重播目前片段" #: buzz/settings/shortcut.py msgid "Toggle Playback Controls" -msgstr "" +msgstr "切換播放控制項" #: buzz/settings/shortcut.py msgid "Decrease Segment Start Time" -msgstr "" +msgstr "縮短片段開始時間" #: buzz/settings/shortcut.py msgid "Increase Segment Start Time" -msgstr "" +msgstr "延長片段開始時間" #: buzz/settings/shortcut.py msgid "Decrease Segment End Time" -msgstr "" +msgstr "縮短片段結束時間" #: buzz/settings/shortcut.py msgid "Increase Segment End Time" -msgstr "" +msgstr "延長片段結束時間" #: buzz/settings/recording_transcriber_mode.py msgid "Append below" -msgstr "" +msgstr "附加至下方" #: buzz/settings/recording_transcriber_mode.py msgid "Append above" -msgstr "" +msgstr "附加至上方" #: buzz/settings/recording_transcriber_mode.py msgid "Append and correct" -msgstr "" +msgstr "附加並校正" #: buzz/translator.py msgid "Translation error, see logs!" -msgstr "" +msgstr "翻譯錯誤,請查看日誌!" #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" +"語音提取失敗!請檢查您的網路連線——可能需要下載模型。" #~ msgid "ID" #~ msgstr "ID" diff --git a/buzz/settings/settings.py b/buzz/settings/settings.py index ac4c3603..4e722495 100644 --- a/buzz/settings/settings.py +++ b/buzz/settings/settings.py @@ -27,6 +27,9 @@ class Settings: RECORDING_TRANSCRIBER_MODE = "recording-transcriber/mode" RECORDING_TRANSCRIBER_SILENCE_THRESHOLD = "recording-transcriber/silence-threshold" RECORDING_TRANSCRIBER_LINE_SEPARATOR = "recording-transcriber/line-separator" + RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE = "recording-transcriber/export-file-type" + RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES = "recording-transcriber/export-max-entries" + RECORDING_TRANSCRIBER_EXPORT_FILE_NAME = "recording-transcriber/export-file-name" PRESENTATION_WINDOW_TEXT_COLOR = "presentation-window/text-color" PRESENTATION_WINDOW_BACKGROUND_COLOR = "presentation-window/background-color" diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index 18c7b456..23ecf54c 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -406,8 +406,6 @@ class RecordingTranscriber(QObject): "--threads", str(os.getenv("BUZZ_WHISPERCPP_N_THREADS", (os.cpu_count() or 8) // 2)), "--model", self.model_path, "--no-timestamps", - # on Windows context causes duplications of last message - "--no-context", # Protections against hallucinated repetition. Seems to be problem on macOS # https://github.com/ggml-org/whisper.cpp/issues/1507 "--max-context", "64", diff --git a/buzz/translator.py b/buzz/translator.py index 0a16bd72..dfb0b948 100644 --- a/buzz/translator.py +++ b/buzz/translator.py @@ -76,7 +76,8 @@ class Translator(QObject): return completion.choices[0].message.content, transcript_id else: logging.error(f"Translation error! Server response: {completion}") - return _("Translation error, see logs!"), transcript_id + # Translation error + return "", transcript_id def _translate_batch(self, items: List[Tuple[str, int]]) -> List[Tuple[str, int]]: """Translate multiple transcripts in a single API call. @@ -109,7 +110,8 @@ class Translator(QObject): if not (completion and completion.choices and completion.choices[0].message): logging.error(f"Batch translation error! Server response: {completion}") - return [(_("Translation error, see logs!"), tid) for _, tid in items] + # Translation error + return [("", tid) for _, tid in items] response_text = completion.choices[0].message.content logging.debug(f"Received batch translation response: {response_text}") @@ -121,7 +123,8 @@ class Translator(QObject): if i < len(translations): results.append((translations[i], transcript_id)) else: - results.append((_("Translation error, see logs!"), transcript_id)) + # Translation error + results.append(("", transcript_id)) return results @staticmethod @@ -137,7 +140,7 @@ class Translator(QObject): translations[num] = text return [ - translations.get(i, _("Translation error, see logs!")) + translations.get(i, "") for i in range(1, expected_count + 1) ] diff --git a/buzz/widgets/preferences_dialog/general_preferences_widget.py b/buzz/widgets/preferences_dialog/general_preferences_widget.py index af569091..2d9c7f46 100644 --- a/buzz/widgets/preferences_dialog/general_preferences_widget.py +++ b/buzz/widgets/preferences_dialog/general_preferences_widget.py @@ -188,6 +188,13 @@ class GeneralPreferencesWidget(QWidget): layout.addRow(_("Live recording mode"), self.recording_transcriber_mode) + export_note_label = QLabel( + _("Note: Live recording export settings will be moved to the Advanced Settings in the Live Recording screen in a future version."), + self, + ) + export_note_label.setWordWrap(True) + layout.addRow("", export_note_label) + self.reduce_gpu_memory_enabled = self.settings.value( key=Settings.Key.REDUCE_GPU_MEMORY, default_value=False ) diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index c68a9d2f..622bf90e 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -1,3 +1,5 @@ +import csv +import io import os import re import enum @@ -451,7 +453,17 @@ class RecordingTranscriberWidget(QWidget): date_time_now = datetime.datetime.now().strftime("%d-%b-%Y %H-%M-%S") - export_file_name_template = Settings().get_default_export_file_template() + custom_template = self.settings.value( + key=Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_NAME, + default_value="", + ) + export_file_name_template = custom_template if custom_template else Settings().get_default_export_file_template() + + export_file_type = self.settings.value( + key=Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, + default_value="txt", + ) + ext = ".csv" if export_file_type == "csv" else ".txt" export_file_name = ( export_file_name_template.replace("{{ input_file_name }}", "live recording") @@ -460,14 +472,21 @@ class RecordingTranscriberWidget(QWidget): .replace("{{ model_type }}", self.transcription_options.model.model_type.value) .replace("{{ model_size }}", self.transcription_options.model.whisper_model_size or "") .replace("{{ date_time }}", date_time_now) - + ".txt" + + ext ) + translated_ext = ".translated" + ext + if not os.path.isdir(export_folder): self.export_enabled = False self.transcript_export_file = os.path.join(export_folder, export_file_name) - self.translation_export_file = self.transcript_export_file.replace(".txt", ".translated.txt") + self.translation_export_file = self.transcript_export_file.replace(ext, translated_ext) + + # Clear export files at the start of each recording session + for path in (self.transcript_export_file, self.translation_export_file): + if os.path.isfile(path): + self.write_to_export_file(path, "", mode="w") def on_transcription_options_changed( self, transcription_options: TranscriptionOptions @@ -634,9 +653,15 @@ class RecordingTranscriberWidget(QWidget): self.translation_thread.finished.connect( self.translation_thread.deleteLater ) + self.translation_thread.finished.connect( + lambda: setattr(self, "translation_thread", None) + ) self.translator.finished.connect(self.translation_thread.quit) self.translator.finished.connect(self.translator.deleteLater) + self.translator.finished.connect( + lambda: setattr(self, "translator", None) + ) self.translator.translation.connect(self.on_next_translation) @@ -706,6 +731,68 @@ class RecordingTranscriberWidget(QWidget): logging.warning("Export write failed: %s", e) return + @staticmethod + def write_csv_export(file_path: str, text: str, max_entries: int): + """Append a new column to a single-row CSV export file, applying max_entries limit.""" + existing_columns = [] + if os.path.isfile(file_path): + try: + with open(file_path, "r", encoding="utf-8-sig") as f: + raw = f.read() + if raw.strip(): + reader = csv.reader(io.StringIO(raw)) + for row in reader: + existing_columns = row + break + except OSError: + pass + existing_columns.append(text) + if max_entries > 0: + existing_columns = existing_columns[-max_entries:] + buf = io.StringIO() + writer = csv.writer(buf) + writer.writerow(existing_columns) + for attempt in range(5): + try: + with open(file_path, "w", encoding='utf-8-sig') as f: + f.write(buf.getvalue()) + return + except PermissionError: + if attempt < 4: + time.sleep(0.2) + else: + logging.warning("CSV export write failed after retries: %s", file_path) + except OSError as e: + logging.warning("CSV export write failed: %s", e) + return + + @staticmethod + def write_txt_export(file_path: str, text: str, mode: str, max_entries: int, line_separator: str): + """Write to a TXT export file, applying max_entries limit when needed.""" + if mode == "a": + RecordingTranscriberWidget.write_to_export_file(file_path, text + line_separator) + if max_entries > 0 and os.path.isfile(file_path): + raw = RecordingTranscriberWidget.read_export_file(file_path) + parts = [p for p in raw.split(line_separator) if p] + if len(parts) > max_entries: + parts = parts[-max_entries:] + RecordingTranscriberWidget.write_to_export_file( + file_path, line_separator.join(parts) + line_separator, mode="w" + ) + elif mode == "prepend": + existing_content = "" + if os.path.isfile(file_path): + existing_content = RecordingTranscriberWidget.read_export_file(file_path) + new_content = text + line_separator + existing_content + if max_entries > 0: + parts = [p for p in new_content.split(line_separator) if p] + if len(parts) > max_entries: + parts = parts[:max_entries] + new_content = line_separator.join(parts) + line_separator + RecordingTranscriberWidget.write_to_export_file(file_path, new_content, mode="w") + else: + RecordingTranscriberWidget.write_to_export_file(file_path, text, mode=mode) + @staticmethod def read_export_file(file_path: str, retries: int = 5, delay: float = 0.2) -> str: """Read an export file with retry logic for Windows file locking.""" @@ -777,7 +864,15 @@ class RecordingTranscriberWidget(QWidget): text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and export_file: - self.write_to_export_file(export_file, merged_texts, mode="w") + export_file_type = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "txt" + ) + if export_file_type == "csv": + # For APPEND_AND_CORRECT mode, rewrite the whole CSV with all merged text as a single entry + self.write_to_export_file(export_file, "", mode="w") + self.write_csv_export(export_file, merged_texts, 0) + else: + self.write_to_export_file(export_file, merged_texts, mode="w") def on_next_transcription(self, text: str): text = self.filter_text(text) @@ -788,6 +883,13 @@ class RecordingTranscriberWidget(QWidget): if self.translator is not None: self.translator.enqueue(text) + export_file_type = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "txt" + ) + max_entries = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES, 0, int + ) + if self.transcriber_mode == RecordingTranscriberMode.APPEND_BELOW: self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.End) if len(self.transcription_text_box.toPlainText()) > 0: @@ -796,7 +898,10 @@ class RecordingTranscriberWidget(QWidget): self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and self.transcript_export_file: - self.write_to_export_file(self.transcript_export_file, text + self.transcription_options.line_separator) + if export_file_type == "csv": + self.write_csv_export(self.transcript_export_file, text, max_entries) + else: + self.write_txt_export(self.transcript_export_file, text, "a", max_entries, self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_ABOVE: self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.Start) @@ -805,11 +910,25 @@ class RecordingTranscriberWidget(QWidget): self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.Start) if self.export_enabled and self.transcript_export_file: - existing_content = "" - if os.path.isfile(self.transcript_export_file): - existing_content = self.read_export_file(self.transcript_export_file) - new_content = text + self.transcription_options.line_separator + existing_content - self.write_to_export_file(self.transcript_export_file, new_content, mode="w") + if export_file_type == "csv": + # For APPEND_ABOVE, prepend in CSV means inserting at beginning of columns + existing_columns = [] + if os.path.isfile(self.transcript_export_file): + raw = self.read_export_file(self.transcript_export_file) + if raw.strip(): + reader = csv.reader(io.StringIO(raw)) + for row in reader: + existing_columns = row + break + new_columns = [text] + existing_columns + if max_entries > 0: + new_columns = new_columns[:max_entries] + buf = io.StringIO() + writer = csv.writer(buf) + writer.writerow(new_columns) + self.write_to_export_file(self.transcript_export_file, buf.getvalue(), mode="w") + else: + self.write_txt_export(self.transcript_export_file, text, "prepend", max_entries, self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: self.process_transcription_merge(text, self.transcripts, self.transcription_text_box, self.transcript_export_file) @@ -836,6 +955,13 @@ class RecordingTranscriberWidget(QWidget): if len(text) == 0: return + export_file_type = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "txt" + ) + max_entries = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES, 0, int + ) + if self.transcriber_mode == RecordingTranscriberMode.APPEND_BELOW: self.translation_text_box.moveCursor(QTextCursor.MoveOperation.End) if len(self.translation_text_box.toPlainText()) > 0: @@ -844,7 +970,10 @@ class RecordingTranscriberWidget(QWidget): self.translation_text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and self.translation_export_file: - self.write_to_export_file(self.translation_export_file, text + self.transcription_options.line_separator) + if export_file_type == "csv": + self.write_csv_export(self.translation_export_file, text, max_entries) + else: + self.write_txt_export(self.translation_export_file, text, "a", max_entries, self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_ABOVE: self.translation_text_box.moveCursor(QTextCursor.MoveOperation.Start) @@ -853,11 +982,24 @@ class RecordingTranscriberWidget(QWidget): self.translation_text_box.moveCursor(QTextCursor.MoveOperation.Start) if self.export_enabled and self.translation_export_file: - existing_content = "" - if os.path.isfile(self.translation_export_file): - existing_content = self.read_export_file(self.translation_export_file) - new_content = text + self.transcription_options.line_separator + existing_content - self.write_to_export_file(self.translation_export_file, new_content, mode="w") + if export_file_type == "csv": + existing_columns = [] + if os.path.isfile(self.translation_export_file): + raw = self.read_export_file(self.translation_export_file) + if raw.strip(): + reader = csv.reader(io.StringIO(raw)) + for row in reader: + existing_columns = row + break + new_columns = [text] + existing_columns + if max_entries > 0: + new_columns = new_columns[:max_entries] + buf = io.StringIO() + writer = csv.writer(buf) + writer.writerow(new_columns) + self.write_to_export_file(self.translation_export_file, buf.getvalue(), mode="w") + else: + self.write_txt_export(self.translation_export_file, text, "prepend", max_entries, self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: self.process_transcription_merge(text, self.translations, self.translation_text_box, self.translation_export_file) diff --git a/buzz/widgets/transcriber/advanced_settings_dialog.py b/buzz/widgets/transcriber/advanced_settings_dialog.py index b8ce84e5..2a10f76f 100644 --- a/buzz/widgets/transcriber/advanced_settings_dialog.py +++ b/buzz/widgets/transcriber/advanced_settings_dialog.py @@ -9,12 +9,18 @@ from PyQt6.QtWidgets import ( QLabel, QDoubleSpinBox, QLineEdit, + QComboBox, + QHBoxLayout, + QPushButton, + QSpinBox, + QFileDialog, ) from buzz.locale import _ from buzz.model_loader import ModelType from buzz.transcriber.transcriber import TranscriptionOptions from buzz.settings.settings import Settings +from buzz.settings.recording_transcriber_mode import RecordingTranscriberMode from buzz.widgets.line_edit import LineEdit from buzz.widgets.transcriber.initial_prompt_text_edit import InitialPromptTextEdit from buzz.widgets.transcriber.temperature_validator import TemperatureValidator @@ -94,7 +100,7 @@ class AdvancedSettingsDialog(QDialog): self.llm_prompt_text_edit = QPlainTextEdit(default_llm_prompt) self.llm_prompt_text_edit.setEnabled(self.transcription_options.enable_llm_translation) self.llm_prompt_text_edit.setMinimumWidth(170) - self.llm_prompt_text_edit.setFixedHeight(115) + self.llm_prompt_text_edit.setFixedHeight(80) self.llm_prompt_text_edit.textChanged.connect(self.on_llm_prompt_changed) layout.addRow(_("Instructions for AI:"), self.llm_prompt_text_edit) @@ -117,6 +123,74 @@ class AdvancedSettingsDialog(QDialog): self.line_separator_line_edit.textChanged.connect(self.on_line_separator_changed) layout.addRow(_("Line separator:"), self.line_separator_line_edit) + # Live recording mode + self.recording_mode_combo = QComboBox(self) + for mode in RecordingTranscriberMode: + self.recording_mode_combo.addItem(mode.value) + self.recording_mode_combo.setCurrentIndex( + self.settings.value(Settings.Key.RECORDING_TRANSCRIBER_MODE, 0) + ) + self.recording_mode_combo.currentIndexChanged.connect(self.on_recording_mode_changed) + layout.addRow(_("Live recording mode:"), self.recording_mode_combo) + + # Export enabled checkbox + self._export_enabled = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_ENABLED, False + ) + self.export_enabled_checkbox = QCheckBox(_("Enable live recording export")) + self.export_enabled_checkbox.setChecked(self._export_enabled) + self.export_enabled_checkbox.stateChanged.connect(self.on_export_enabled_changed) + layout.addRow("", self.export_enabled_checkbox) + + # Export folder + export_folder = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FOLDER, "" + ) + self.export_folder_line_edit = LineEdit(export_folder, self) + self.export_folder_line_edit.setEnabled(self._export_enabled) + self.export_folder_line_edit.textChanged.connect(self.on_export_folder_changed) + self.export_folder_browse_button = QPushButton(_("Browse"), self) + self.export_folder_browse_button.setEnabled(self._export_enabled) + self.export_folder_browse_button.clicked.connect(self.on_browse_export_folder) + export_folder_row = QHBoxLayout() + export_folder_row.addWidget(self.export_folder_line_edit) + export_folder_row.addWidget(self.export_folder_browse_button) + layout.addRow(_("Export folder:"), export_folder_row) + + # Export file name template + export_file_name = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_NAME, "" + ) + self.export_file_name_line_edit = LineEdit(export_file_name, self) + self.export_file_name_line_edit.setEnabled(self._export_enabled) + self.export_file_name_line_edit.textChanged.connect(self.on_export_file_name_changed) + layout.addRow(_("Export file name:"), self.export_file_name_line_edit) + + # Export file type + self.export_file_type_combo = QComboBox(self) + self.export_file_type_combo.addItem(_("Text file (.txt)"), "txt") + self.export_file_type_combo.addItem(_("CSV (.csv)"), "csv") + current_type = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "txt" + ) + type_index = self.export_file_type_combo.findData(current_type) + if type_index >= 0: + self.export_file_type_combo.setCurrentIndex(type_index) + self.export_file_type_combo.setEnabled(self._export_enabled) + self.export_file_type_combo.currentIndexChanged.connect(self.on_export_file_type_changed) + layout.addRow(_("Export file type:"), self.export_file_type_combo) + + # Max entries + max_entries = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES, 0, int + ) + self.export_max_entries_spin = QSpinBox(self) + self.export_max_entries_spin.setRange(0, 99) + self.export_max_entries_spin.setValue(max_entries) + self.export_max_entries_spin.setEnabled(self._export_enabled) + self.export_max_entries_spin.valueChanged.connect(self.on_export_max_entries_changed) + layout.addRow(_("Limit export entries\n(0 = export all):"), self.export_max_entries_spin) + button_box = QDialogButtonBox( QDialogButtonBox.StandardButton(QDialogButtonBox.StandardButton.Ok), self ) @@ -168,3 +242,33 @@ class AdvancedSettingsDialog(QDialog): except UnicodeDecodeError: return self.transcription_options_changed.emit(self.transcription_options) + + def on_recording_mode_changed(self, index: int): + self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_MODE, index) + + def on_export_enabled_changed(self, state: int): + self._export_enabled = state == 2 + self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_EXPORT_ENABLED, self._export_enabled) + self.export_folder_line_edit.setEnabled(self._export_enabled) + self.export_folder_browse_button.setEnabled(self._export_enabled) + self.export_file_name_line_edit.setEnabled(self._export_enabled) + self.export_file_type_combo.setEnabled(self._export_enabled) + self.export_max_entries_spin.setEnabled(self._export_enabled) + + def on_export_folder_changed(self, text: str): + self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FOLDER, text) + + def on_browse_export_folder(self): + folder = QFileDialog.getExistingDirectory(self, _("Select Export Folder")) + if folder: + self.export_folder_line_edit.setText(folder) + + def on_export_file_name_changed(self, text: str): + self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_NAME, text) + + def on_export_file_type_changed(self, index: int): + file_type = self.export_file_type_combo.itemData(index) + self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, file_type) + + def on_export_max_entries_changed(self, value: int): + self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES, value) diff --git a/buzz/widgets/transcriber/initial_prompt_text_edit.py b/buzz/widgets/transcriber/initial_prompt_text_edit.py index 26959f4c..618c2273 100644 --- a/buzz/widgets/transcriber/initial_prompt_text_edit.py +++ b/buzz/widgets/transcriber/initial_prompt_text_edit.py @@ -10,4 +10,4 @@ class InitialPromptTextEdit(QPlainTextEdit): self.setPlaceholderText(_("Enter prompt...")) self.setEnabled(model_type.supports_initial_prompt) self.setMinimumWidth(350) - self.setFixedHeight(115) + self.setFixedHeight(80) diff --git a/tests/translator_test.py b/tests/translator_test.py index 4cfc54f1..6380dc51 100644 --- a/tests/translator_test.py +++ b/tests/translator_test.py @@ -24,7 +24,7 @@ class TestParseBatchResponse: result = Translator._parse_batch_response(response, 3) assert len(result) == 3 assert result[0] == "Hello" - assert result[1] == _("Translation error, see logs!") + assert result[1] == "" assert result[2] == "World" def test_multiline_entries(self): @@ -44,8 +44,8 @@ class TestParseBatchResponse: response = "" result = Translator._parse_batch_response(response, 2) assert len(result) == 2 - assert result[0] == _("Translation error, see logs!") - assert result[1] == _("Translation error, see logs!") + assert result[0] == "" + assert result[1] == "" def test_whitespace_handling(self): response = "[1] Hello with spaces \n[2] World " diff --git a/tests/widgets/recording_transcriber_widget_test.py b/tests/widgets/recording_transcriber_widget_test.py index 333c72ca..36512f12 100644 --- a/tests/widgets/recording_transcriber_widget_test.py +++ b/tests/widgets/recording_transcriber_widget_test.py @@ -890,6 +890,56 @@ class TestOnTranscriptionOptionsChanged: +def _model_loaded_ctx(qtbot, enable_llm_translation=False): + from buzz.transcriber.transcriber import TranscriptionOptions + ctx = _widget_ctx(qtbot) + widget = ctx.__enter__.__self__ if hasattr(ctx, '__enter__') else None + + class _Ctx: + def __enter__(self_inner): + self_inner.widget = ctx.__enter__() + self_inner.widget.transcription_options = TranscriptionOptions( + enable_llm_translation=enable_llm_translation + ) + return self_inner.widget + + def __exit__(self_inner, *args): + return ctx.__exit__(*args) + + return _Ctx() + + +class TestTranslatorSetup: + @pytest.mark.timeout(60) + def test_translator_created_when_llm_enabled(self, qtbot): + with _model_loaded_ctx(qtbot, enable_llm_translation=True) as widget, \ + patch("buzz.widgets.recording_transcriber_widget.Translator") as MockTranslator, \ + patch("buzz.widgets.recording_transcriber_widget.RecordingTranscriber"), \ + patch("buzz.widgets.recording_transcriber_widget.QThread"): + widget.on_model_loaded("/fake/model/path") + MockTranslator.assert_called_once() + + @pytest.mark.timeout(60) + def test_translator_not_created_when_llm_disabled(self, qtbot): + with _model_loaded_ctx(qtbot, enable_llm_translation=False) as widget, \ + patch("buzz.widgets.recording_transcriber_widget.Translator") as MockTranslator, \ + patch("buzz.widgets.recording_transcriber_widget.RecordingTranscriber"), \ + patch("buzz.widgets.recording_transcriber_widget.QThread"): + widget.on_model_loaded("/fake/model/path") + MockTranslator.assert_not_called() + + @pytest.mark.timeout(60) + def test_translator_translation_signal_connected_to_on_next_translation(self, qtbot): + with _model_loaded_ctx(qtbot, enable_llm_translation=True) as widget, \ + patch("buzz.widgets.recording_transcriber_widget.Translator") as MockTranslator, \ + patch("buzz.widgets.recording_transcriber_widget.RecordingTranscriber"), \ + patch("buzz.widgets.recording_transcriber_widget.QThread"): + mock_translator_instance = MagicMock() + MockTranslator.return_value = mock_translator_instance + widget.on_model_loaded("/fake/model/path") + mock_translator_instance.translation.connect.assert_called_with(widget.on_next_translation) + + class TestOnDeviceChanged: @pytest.mark.timeout(60) def test_no_new_listener_started_when_device_is_none(self, qtbot): @@ -1040,6 +1090,107 @@ class TestOnNextTranscriptionExport: finally: os.unlink(export_path) + @pytest.mark.timeout(60) + def test_append_above_csv_prepends_new_column(self, qtbot): + import csv + with _widget_ctx(qtbot) as widget, tempfile.NamedTemporaryFile( + suffix=".csv", delete=False, mode="w" + ) as f: + export_path = f.name + + try: + widget.transcriber_mode = RecordingTranscriberMode.APPEND_ABOVE + widget.export_enabled = True + widget.transcript_export_file = export_path + widget.settings.set_value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "csv" + ) + widget.on_next_transcription("first") + widget.on_next_transcription("second") + + with open(export_path, newline="") as f: + rows = [r for r in csv.reader(f) if r] + assert len(rows) == 1 + assert rows[0][0] == "second" + assert rows[0][1] == "first" + finally: + os.unlink(export_path) + + @pytest.mark.timeout(60) + def test_append_above_csv_respects_max_entries(self, qtbot): + import csv + with _widget_ctx(qtbot) as widget, tempfile.NamedTemporaryFile( + suffix=".csv", delete=False, mode="w" + ) as f: + export_path = f.name + + try: + widget.transcriber_mode = RecordingTranscriberMode.APPEND_ABOVE + widget.export_enabled = True + widget.transcript_export_file = export_path + widget.settings.set_value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "csv" + ) + widget.settings.set_value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES, 2 + ) + widget.on_next_transcription("first") + widget.on_next_transcription("second") + widget.on_next_transcription("third") + + with open(export_path, newline="") as f: + rows = [r for r in csv.reader(f) if r] + assert len(rows) == 1 + assert len(rows[0]) == 2 + assert rows[0][0] == "third" + assert rows[0][1] == "second" + finally: + os.unlink(export_path) + + + +class TestUploadToServer: + @pytest.mark.timeout(60) + def test_transcript_uploaded_when_upload_url_set(self, qtbot): + with _widget_ctx(qtbot) as widget, \ + patch("buzz.widgets.recording_transcriber_widget.requests.post") as mock_post: + widget.upload_url = "http://example.com/upload" + widget.on_next_transcription("hello upload") + mock_post.assert_called_once_with( + url="http://example.com/upload", + json={"kind": "transcript", "text": "hello upload"}, + headers={"Content-Type": "application/json"}, + timeout=15, + ) + + @pytest.mark.timeout(60) + def test_transcript_not_uploaded_when_upload_url_empty(self, qtbot): + with _widget_ctx(qtbot) as widget, \ + patch("buzz.widgets.recording_transcriber_widget.requests.post") as mock_post: + widget.upload_url = "" + widget.on_next_transcription("no upload") + mock_post.assert_not_called() + + @pytest.mark.timeout(60) + def test_transcript_upload_failure_does_not_raise(self, qtbot): + with _widget_ctx(qtbot) as widget, \ + patch("buzz.widgets.recording_transcriber_widget.requests.post", + side_effect=Exception("connection error")): + widget.upload_url = "http://example.com/upload" + widget.on_next_transcription("hello") # should not raise + + @pytest.mark.timeout(60) + def test_translation_uploaded_when_upload_url_set(self, qtbot): + with _widget_ctx(qtbot) as widget, \ + patch("buzz.widgets.recording_transcriber_widget.requests.post") as mock_post: + widget.upload_url = "http://example.com/upload" + widget.on_next_translation("bonjour") + mock_post.assert_called_once_with( + url="http://example.com/upload", + json={"kind": "translation", "text": "bonjour"}, + headers={"Content-Type": "application/json"}, + timeout=15, + ) class TestOnNextTranslation: @@ -1176,6 +1327,131 @@ class TestExportFileHelpers: assert result == "" +class TestWriteCsvExport: + def test_creates_csv_with_single_entry(self, tmp_path): + path = str(tmp_path / "out.csv") + RecordingTranscriberWidget.write_csv_export(path, "hello", 0) + with open(path, encoding="utf-8-sig") as f: + content = f.read() + assert "hello" in content + + def test_appends_column_to_existing_csv(self, tmp_path): + import csv + path = str(tmp_path / "out.csv") + RecordingTranscriberWidget.write_csv_export(path, "first", 0) + RecordingTranscriberWidget.write_csv_export(path, "second", 0) + with open(path, encoding="utf-8-sig") as f: + rows = list(csv.reader(f)) + assert rows[0] == ["first", "second"] + + def test_max_entries_limits_columns(self, tmp_path): + import csv + path = str(tmp_path / "out.csv") + for word in ["a", "b", "c", "d"]: + RecordingTranscriberWidget.write_csv_export(path, word, max_entries=3) + with open(path, encoding="utf-8-sig") as f: + rows = list(csv.reader(f)) + assert rows[0] == ["b", "c", "d"] + + def test_max_entries_zero_means_no_limit(self, tmp_path): + import csv + path = str(tmp_path / "out.csv") + for i in range(10): + RecordingTranscriberWidget.write_csv_export(path, str(i), max_entries=0) + with open(path, encoding="utf-8-sig") as f: + rows = list(csv.reader(f)) + assert len(rows[0]) == 10 + + def test_handles_empty_existing_file(self, tmp_path): + import csv + path = str(tmp_path / "out.csv") + with open(path, "w") as f: + f.write("") + RecordingTranscriberWidget.write_csv_export(path, "entry", 0) + with open(path, encoding="utf-8-sig") as f: + rows = list(csv.reader(f)) + assert rows[0] == ["entry"] + + def test_retries_on_permission_error(self, tmp_path): + path = str(tmp_path / "out.csv") + call_count = [0] + original_open = open + + def flaky_open(p, mode="r", **kwargs): + if p == path and "w" in mode: + call_count[0] += 1 + if call_count[0] < 3: + raise PermissionError("locked") + return original_open(p, mode, **kwargs) + + with patch("builtins.open", side_effect=flaky_open), \ + patch("time.sleep"): + RecordingTranscriberWidget.write_csv_export(path, "data", 0) + + assert call_count[0] == 3 + + +class TestWriteTxtExport: + def test_append_mode_adds_text(self, tmp_path): + path = str(tmp_path / "out.txt") + RecordingTranscriberWidget.write_txt_export(path, "line1", "a", 0, "\n") + RecordingTranscriberWidget.write_txt_export(path, "line2", "a", 0, "\n") + with open(path) as f: + content = f.read() + assert content == "line1\nline2\n" + + def test_append_mode_max_entries_trims_oldest(self, tmp_path): + path = str(tmp_path / "out.txt") + for word in ["a", "b", "c", "d"]: + RecordingTranscriberWidget.write_txt_export(path, word, "a", max_entries=3, line_separator="\n") + with open(path) as f: + content = f.read() + parts = [p for p in content.split("\n") if p] + assert parts == ["b", "c", "d"] + + def test_prepend_mode_puts_text_first(self, tmp_path): + path = str(tmp_path / "out.txt") + RecordingTranscriberWidget.write_txt_export(path, "first", "a", 0, "\n") + RecordingTranscriberWidget.write_txt_export(path, "second", "prepend", 0, "\n") + with open(path) as f: + content = f.read() + parts = [p for p in content.split("\n") if p] + assert parts[0] == "second" + assert parts[1] == "first" + + def test_prepend_mode_max_entries_trims_oldest(self, tmp_path): + path = str(tmp_path / "out.txt") + RecordingTranscriberWidget.write_txt_export(path, "old1", "a", 0, "\n") + RecordingTranscriberWidget.write_txt_export(path, "old2", "a", 0, "\n") + RecordingTranscriberWidget.write_txt_export(path, "new", "prepend", max_entries=2, line_separator="\n") + with open(path) as f: + content = f.read() + parts = [p for p in content.split("\n") if p] + assert parts == ["new", "old1"] + + def test_write_mode_overwrites(self, tmp_path): + path = str(tmp_path / "out.txt") + RecordingTranscriberWidget.write_txt_export(path, "old", "w", 0, "\n") + RecordingTranscriberWidget.write_txt_export(path, "new", "w", 0, "\n") + with open(path) as f: + content = f.read() + assert content == "new" + + def test_prepend_on_nonexistent_file(self, tmp_path): + path = str(tmp_path / "out.txt") + RecordingTranscriberWidget.write_txt_export(path, "only", "prepend", 0, "\n") + with open(path) as f: + content = f.read() + assert "only" in content + + def test_append_max_entries_zero_means_no_limit(self, tmp_path): + path = str(tmp_path / "out.txt") + for i in range(10): + RecordingTranscriberWidget.write_txt_export(path, str(i), "a", max_entries=0, line_separator="\n") + with open(path) as f: + parts = [p for p in f.read().split("\n") if p] + assert len(parts) == 10 + class TestPresentationTranslationSync: @pytest.mark.timeout(60) diff --git a/whisper.cpp b/whisper.cpp index 4979e04f..2eeeba56 160000 --- a/whisper.cpp +++ b/whisper.cpp @@ -1 +1 @@ -Subproject commit 4979e04f5dcaccb36057e059bbaed8a2f5288315 +Subproject commit 2eeeba56e9edd762b4b38467bab96c2517163158 From 3869ac08dba98140cdac24531efbed4ac3af4e4d Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 27 Feb 2026 19:49:38 +0200 Subject: [PATCH 28/37] 1329 improve folder watch (#1402) --- Makefile | 18 ++-- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 47 +++++++--- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 90 +++++++++++++++++-- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 39 +++++--- buzz/locale/en_US/LC_MESSAGES/buzz.po | 10 +-- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 41 ++++++--- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 17 ++-- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 35 ++++---- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 15 ++-- buzz/locale/nl/LC_MESSAGES/buzz.po | 50 +++++++---- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 48 ++++++---- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 4 + buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 38 +++++--- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 30 +++---- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 49 +++++----- buzz/transcriber/file_transcriber.py | 17 ++-- buzz/transcriber/transcriber.py | 1 + .../folder_watch_preferences_widget.py | 46 +++++++--- .../models/folder_watch_preferences.py | 5 ++ .../transcription_task_folder_watcher.py | 1 + snap/snapcraft.yaml | 8 +- .../whisper_file_transcriber_test.py | 36 ++++++++ .../folder_watch_preferences_widget_test.py | 43 +++++++++ .../transcription_task_folder_watcher_test.py | 70 +++++++++++++++ 24 files changed, 562 insertions(+), 196 deletions(-) diff --git a/Makefile b/Makefile index adaa5934..0888f589 100644 --- a/Makefile +++ b/Makefile @@ -188,20 +188,20 @@ gh_upgrade_pr: # Internationalization translation_po_all: - $(MAKE) translation_po locale=en_US $(MAKE) translation_po locale=ca_ES - $(MAKE) translation_po locale=es_ES - $(MAKE) translation_po locale=pl_PL - $(MAKE) translation_po locale=zh_CN - $(MAKE) translation_po locale=zh_TW - $(MAKE) translation_po locale=it_IT - $(MAKE) translation_po locale=lv_LV - $(MAKE) translation_po locale=uk_UA - $(MAKE) translation_po locale=ja_JP $(MAKE) translation_po locale=da_DK $(MAKE) translation_po locale=de_DE + $(MAKE) translation_po locale=en_US + $(MAKE) translation_po locale=es_ES + $(MAKE) translation_po locale=it_IT + $(MAKE) translation_po locale=ja_JP + $(MAKE) translation_po locale=lv_LV $(MAKE) translation_po locale=nl + $(MAKE) translation_po locale=pl_PL $(MAKE) translation_po locale=pt_BR + $(MAKE) translation_po locale=uk_UA + $(MAKE) translation_po locale=zh_CN + $(MAKE) translation_po locale=zh_TW TMP_POT_FILE_PATH := $(shell mktemp) PO_FILE_PATH := buzz/locale/${locale}/LC_MESSAGES/buzz.po diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 2324331c..9e07929a 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -184,7 +184,8 @@ msgid "" "in the Live Recording screen in a future version." msgstr "" "Nota: La configuració d'exportació d'enregistrament en directe es mourà a la " -"Configuració avançada a la pantalla d'enregistrament en directe en una versió futura." +"Configuració avançada a la pantalla d'enregistrament en directe en una " +"versió futura." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" @@ -259,6 +260,10 @@ msgstr "" msgid "Enable folder watch" msgstr "Habilita el seguiment de carpetes" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Eliminar fitxers processats" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Carpeta d'entrada" @@ -623,11 +628,15 @@ msgstr "No s'ha pogut reiniciar la transcripció: {}" msgid "" "Could not restart transcription: model not available and could not be " "downloaded." -msgstr "No s'ha pogut reiniciar la transcripció: el model no està disponible i no s'ha pogut descarregar." +msgstr "" +"No s'ha pogut reiniciar la transcripció: el model no està disponible i no " +"s'ha pogut descarregar." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "No s'ha pogut reiniciar la transcripció: no s'ha trobat el treballador del transcriptor." +msgstr "" +"No s'ha pogut reiniciar la transcripció: no s'ha trobat el treballador del " +"transcriptor." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -896,7 +905,9 @@ msgstr "Longitud desitjada dels subtítols" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "Disponible només si els temps a nivell de paraula estaven desactivats durant la transcripció" +msgstr "" +"Disponible només si els temps a nivell de paraula estaven desactivats durant " +"la transcripció" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -920,12 +931,16 @@ msgstr "Fusiona" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "Disponible només si els temps a nivell de paraula estaven activats durant la transcripció" +msgstr "" +"Disponible només si els temps a nivell de paraula estaven activats durant la " +"transcripció" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." -msgstr "La identificació de parlants no està disponible: no s'han pogut carregar les biblioteques necessàries." +msgstr "" +"La identificació de parlants no està disponible: no s'han pogut carregar les " +"biblioteques necessàries." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" @@ -941,13 +956,16 @@ msgstr "3/8 Carregant el model d'alineació" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "3/8 Carregant el model d'alineació (tornant a intentar amb la memòria cau...)" +msgstr "" +"3/8 Carregant el model d'alineació (tornant a intentar amb la memòria cau...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." -msgstr "No s'ha pogut carregar el model d'alineació. Comproveu la vostra connexió a Internet i torneu-ho a intentar." +msgstr "" +"No s'ha pogut carregar el model d'alineació. Comproveu la vostra connexió a " +"Internet i torneu-ho a intentar." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" @@ -1551,15 +1569,16 @@ msgstr "Afegeix a sobre" msgid "Append and correct" msgstr "Afegeix i corregeix" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "Error de traducció, vegeu els registres!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." -msgstr "Ha fallat l'extracció de veu! Comproveu la vostra connexió a Internet — pot ser que s'hagi de descarregar un model." +msgstr "" +"Ha fallat l'extracció de veu! Comproveu la vostra connexió a Internet — pot " +"ser que s'hagi de descarregar un model." + +#~ msgid "Translation error, see logs!" +#~ msgstr "Error de traducció, vegeu els registres!" #~ msgid "Snap permission notice" #~ msgstr "Avís de permís d'ajust" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index bd44d211..50fd489f 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -205,7 +205,9 @@ msgstr "Brug kun CPU og deaktiver GPU-acceleration" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "Aktivér dette hvis større modeller ikke passer i GPU-hukommelsen og Buzz crasher" +msgstr "" +"Aktivér dette hvis større modeller ikke passer i GPU-hukommelsen og Buzz " +"crasher" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" @@ -254,6 +256,10 @@ msgstr "" msgid "Enable folder watch" msgstr "Aktiver mappeovervågning" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Slet behandlede filer" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Inputmappe" @@ -618,12 +624,13 @@ msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -"Kunne ikke genstarte transkription: modellen er ikke tilgængelig og " -"kunne ikke downloades." +"Kunne ikke genstarte transkription: modellen er ikke tilgængelig og kunne " +"ikke downloades." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "Kunne ikke genstarte transkription: transkriptionsprocessen blev ikke fundet." +msgstr "" +"Kunne ikke genstarte transkription: transkriptionsprocessen blev ikke fundet." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -892,7 +899,9 @@ msgstr "Ønskede undertekst længde" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "Kun tilgængeligt hvis ordniveau-tidsstempler var deaktiveret under transkription" +msgstr "" +"Kun tilgængeligt hvis ordniveau-tidsstempler var deaktiveret under " +"transkription" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -916,13 +925,16 @@ msgstr "Sammenflet" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "Kun tilgængeligt hvis ordniveau-tidsstempler var aktiveret under transkription" +msgstr "" +"Kun tilgængeligt hvis ordniveau-tidsstempler var aktiveret under " +"transkription" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" -"Taler-identifikation er ikke tilgængelig: kunne ikke indlæse nødvendige biblioteker." +"Taler-identifikation er ikke tilgængelig: kunne ikke indlæse nødvendige " +"biblioteker." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" @@ -1491,3 +1503,65 @@ msgstr "Vis transkriberede oversættelse" #: buzz/settings/shortcut.py msgid "View Transcript Timestamps" msgstr "Vis transkriptionstidstempler " + +#: buzz/settings/shortcut.py +msgid "Search Transcript" +msgstr "Søg i transskription" + +#: buzz/settings/shortcut.py +msgid "Go to Next Transcript Search Result" +msgstr "Gå til næste søgeresultat i transskription" + +#: buzz/settings/shortcut.py +msgid "Go to Previous Transcript Search Result" +msgstr "Gå til forrige søgeresultat i transskription" + +#: buzz/settings/shortcut.py +msgid "Scroll to Current Text" +msgstr "Rul til aktuel tekst" + +#: buzz/settings/shortcut.py +msgid "Play/Pause Audio" +msgstr "Afspil/Pause lyd" + +#: buzz/settings/shortcut.py +msgid "Replay Current Segment" +msgstr "Afspil nuværende segment igen" + +#: buzz/settings/shortcut.py +msgid "Toggle Playback Controls" +msgstr "Skift afspilningskontroller" + +#: buzz/settings/shortcut.py +msgid "Decrease Segment Start Time" +msgstr "Reducer segmentets starttidspunkt" + +#: buzz/settings/shortcut.py +msgid "Increase Segment Start Time" +msgstr "Øg segmentets starttidspunkt" + +#: buzz/settings/shortcut.py +msgid "Decrease Segment End Time" +msgstr "Reducer segmentets sluttidspunkt" + +#: buzz/settings/shortcut.py +msgid "Increase Segment End Time" +msgstr "Øg segmentets sluttidspunkt" + +#: buzz/settings/recording_transcriber_mode.py +msgid "Append below" +msgstr "Tilføj herunder" + +#: buzz/settings/recording_transcriber_mode.py +msgid "Append above" +msgstr "Tilføj herover" + +#: buzz/settings/recording_transcriber_mode.py +msgid "Append and correct" +msgstr "Tilføj og ret" + +#: buzz/file_transcriber_queue_worker.py +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "Taleoprydning mislykkedes! Kontroller din internetforbindelse — en model skal muligvis hentes ned." diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index 751e01cd..bd2fce51 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -260,6 +260,10 @@ msgstr "" msgid "Enable folder watch" msgstr "Ordner überwachen aktivieren" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Verarbeitete Dateien löschen" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Eingabeordner" @@ -438,7 +442,8 @@ msgstr "KI-Modell:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "Bitte übersetzen Sie jeden an Sie gesendeten Text von Englisch nach Spanisch." +msgstr "" +"Bitte übersetzen Sie jeden an Sie gesendeten Text von Englisch nach Spanisch." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -615,7 +620,9 @@ msgstr "Neustart nicht möglich" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "Nur fehlgeschlagene oder abgebrochene Transkriptionen können neu gestartet werden." +msgstr "" +"Nur fehlgeschlagene oder abgebrochene Transkriptionen können neu gestartet " +"werden." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed to restart transcription: {}" @@ -631,7 +638,9 @@ msgstr "" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "Transkription konnte nicht neu gestartet werden: Transkriptions-Worker nicht gefunden." +msgstr "" +"Transkription konnte nicht neu gestartet werden: Transkriptions-Worker nicht " +"gefunden." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -824,7 +833,8 @@ msgstr "Segment wiederholen" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Enable/disable looping when clicking on transcript segments" -msgstr "Wiederholen beim Klicken auf Transkript-Segmente aktivieren/deaktivieren" +msgstr "" +"Wiederholen beim Klicken auf Transkript-Segmente aktivieren/deaktivieren" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Follow Audio" @@ -900,7 +910,9 @@ msgstr "Gewünschte Untertitellänge" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "Nur verfügbar, wenn Zeitangaben auf Wortebene bei der Transkription deaktiviert waren" +msgstr "" +"Nur verfügbar, wenn Zeitangaben auf Wortebene bei der Transkription " +"deaktiviert waren" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -924,7 +936,9 @@ msgstr "Vereinigen" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "Nur verfügbar, wenn Zeitangaben auf Wortebene bei der Transkription aktiviert waren" +msgstr "" +"Nur verfügbar, wenn Zeitangaben auf Wortebene bei der Transkription " +"aktiviert waren" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" @@ -1089,7 +1103,9 @@ msgstr "" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "Whisper-Server konnte nicht gestartet werden. Details in den Protokollen prüfen." +msgstr "" +"Whisper-Server konnte nicht gestartet werden. Details in den Protokollen " +"prüfen." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1559,10 +1575,6 @@ msgstr "Oben anhängen" msgid "Append and correct" msgstr "Anhängen und korrigieren" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "Übersetzungsfehler, Protokolle prüfen!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " @@ -1571,6 +1583,9 @@ msgstr "" "Sprachextraktion fehlgeschlagen! Bitte Internetverbindung prüfen — ein " "Modell muss möglicherweise heruntergeladen werden." +#~ msgid "Translation error, see logs!" +#~ msgstr "Übersetzungsfehler, Protokolle prüfen!" + #~ msgid "Snap permission notice" #~ msgstr "Snap-Berechtigungsmitteilung" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index 5eca4cc7..82e7802c 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: 2026-02-22 15:20+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -246,6 +246,10 @@ msgstr "" msgid "Enable folder watch" msgstr "" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "" @@ -1521,10 +1525,6 @@ msgstr "" msgid "Append and correct" msgstr "" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index e29d164d..2cac032f 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -264,6 +264,10 @@ msgstr "" msgid "Enable folder watch" msgstr "Habilitar la inspección de carpetas" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Eliminar archivos procesados" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Carpeta de entrada" @@ -654,11 +658,15 @@ msgstr "No se pudo reiniciar la transcripción: {}" msgid "" "Could not restart transcription: model not available and could not be " "downloaded." -msgstr "No se pudo reiniciar la transcripción: modelo no disponible y no se pudo descargar." +msgstr "" +"No se pudo reiniciar la transcripción: modelo no disponible y no se pudo " +"descargar." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "No se pudo reiniciar la transcripción: no se encontró el trabajador del transcriptor." +msgstr "" +"No se pudo reiniciar la transcripción: no se encontró el trabajador del " +"transcriptor." # automatic translation #: buzz/widgets/recording_transcriber_widget.py @@ -938,7 +946,9 @@ msgstr "Longitud deseada de los subtítulos" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "Disponible solo si los tiempos a nivel de palabra estaban desactivados durante la transcripción" +msgstr "" +"Disponible solo si los tiempos a nivel de palabra estaban desactivados " +"durante la transcripción" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -962,12 +972,16 @@ msgstr "Fusión" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "Disponible solo si los tiempos a nivel de palabra estaban activados durante la transcripción" +msgstr "" +"Disponible solo si los tiempos a nivel de palabra estaban activados durante " +"la transcripción" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." -msgstr "La identificación de hablantes no está disponible: no se pudieron cargar las bibliotecas requeridas." +msgstr "" +"La identificación de hablantes no está disponible: no se pudieron cargar las " +"bibliotecas requeridas." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" @@ -989,7 +1003,9 @@ msgstr "3/8 Cargando modelo de alineación (reintentando con caché...)" msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." -msgstr "No se pudo cargar el modelo de alineación. Por favor, compruebe su conexión a internet e inténtelo de nuevo." +msgstr "" +"No se pudo cargar el modelo de alineación. Por favor, compruebe su conexión " +"a internet e inténtelo de nuevo." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" @@ -1610,15 +1626,16 @@ msgstr "Añadir arriba" msgid "Append and correct" msgstr "Añadir y corregir" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "¡Error de traducción, consulte los registros!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." -msgstr "¡Extracción de voz fallida! Compruebe su conexión a internet — es posible que sea necesario descargar un modelo." +msgstr "" +"¡Extracción de voz fallida! Compruebe su conexión a internet — es posible " +"que sea necesario descargar un modelo." + +#~ msgid "Translation error, see logs!" +#~ msgstr "¡Error de traducción, consulte los registros!" #~ msgid "Snap permission notice" #~ msgstr "Aviso de permiso Snap" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index efad3328..4520d331 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -260,6 +260,10 @@ msgstr "" msgid "Enable folder watch" msgstr "Abilita controllo cartelle" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Elimina file elaborati" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Cartella di input" @@ -438,7 +442,9 @@ msgstr "Modello AI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "Per favore, traduci ogni testo che ti viene inviato dall'inglese allo spagnolo." +msgstr "" +"Per favore, traduci ogni testo che ti viene inviato dall'inglese allo " +"spagnolo." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1565,10 +1571,6 @@ msgstr "Aggiungere sopra" msgid "Append and correct" msgstr "Aggiungere e correggere" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "Errore di traduzione, controlla i log!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " @@ -1577,6 +1579,9 @@ msgstr "" "Estrazione del parlato non riuscita! Controlla la tua connessione Internet — " "potrebbe essere necessario scaricare un modello." +#~ msgid "Translation error, see logs!" +#~ msgstr "Errore di traduzione, controlla i log!" + #~ msgid "Snap permission notice" #~ msgstr "Avviso di autorizzazione Snap" diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 4c7b6342..366ff76d 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -178,8 +178,8 @@ msgid "" "Note: Live recording export settings will be moved to the Advanced Settings " "in the Live Recording screen in a future version." msgstr "" -"注意:ライブ録音の出力設定は、将来のバージョンでライブ録音画面の詳細設定に移動" -"されます。" +"注意:ライブ録音の出力設定は、将来のバージョンでライブ録音画面の詳細設定に移" +"動されます。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" @@ -190,8 +190,8 @@ msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" -"HuggingfaceおよびFaster Whisperモデルに適用されます。GPUメモリ使用量を削減しま" -"すが、文字起こしの品質がわずかに低下する場合があります。" +"HuggingfaceおよびFaster Whisperモデルに適用されます。GPUメモリ使用量を削減し" +"ますが、文字起こしの品質がわずかに低下する場合があります。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" @@ -203,7 +203,8 @@ msgstr "CPUのみを使用してGPUアクセラレーションを無効にする #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "大きなモデルがGPUメモリに収まらずBuzzがクラッシュする場合に設定してください" +msgstr "" +"大きなモデルがGPUメモリに収まらずBuzzがクラッシュする場合に設定してください" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" @@ -252,6 +253,10 @@ msgstr "" msgid "Enable folder watch" msgstr "フォルダ監視を有効にする" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "処理済みファイルを削除" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "入力フォルダ" @@ -616,8 +621,8 @@ msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -"文字起こしを再開できませんでした: モデルが利用できず、ダウンロードもできません" -"でした。" +"文字起こしを再開できませんでした: モデルが利用できず、ダウンロードもできませ" +"んでした。" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." @@ -919,8 +924,7 @@ msgstr "文字起こし時に単語レベルのタイミングが有効だった #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." -msgstr "" -"話者識別は利用できません: 必要なライブラリの読み込みに失敗しました。" +msgstr "話者識別は利用できません: 必要なライブラリの読み込みに失敗しました。" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" @@ -1085,8 +1089,8 @@ msgid "" "variable." msgstr "" "メモリ不足のためWhisperサーバーの起動に失敗しました。より小さいモデルで再試行" -"してください。CPUモードを強制するには環境変数BUZZ_FORCE_CPU=TRUEを使用してくだ" -"さい。" +"してください。CPUモードを強制するには環境変数BUZZ_FORCE_CPU=TRUEを使用してく" +"ださい。" #: buzz/transcriber/transcriber.py msgid "Translate to English" @@ -1544,10 +1548,6 @@ msgstr "上に追加" msgid "Append and correct" msgstr "追加して修正" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "翻訳エラーが発生しました。ログを確認してください!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " @@ -1556,6 +1556,9 @@ msgstr "" "音声抽出に失敗しました!インターネット接続を確認してください。モデルのダウン" "ロードが必要な場合があります。" +#~ msgid "Translation error, see logs!" +#~ msgstr "翻訳エラーが発生しました。ログを確認してください!" + #~ msgid "Snap permission notice" #~ msgstr "Snap権限通知" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 08a04e84..ad5dd01c 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: 2026-02-27 09:07+0200\n" -"PO-Revision-Date: 2026-02-27 09:11+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" +"PO-Revision-Date: 2026-02-27 16:47+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -261,6 +261,10 @@ msgstr "" msgid "Enable folder watch" msgstr "Ieslēgt mapes vērošanu" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Dzēst apstrādātos failus" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Vērojamā mape" @@ -1561,10 +1565,6 @@ msgstr "Jaunie teikumi augšā" msgid "Append and correct" msgstr "Papildināt un labot esošo" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "Kļūda tulkojot, skatiet sistēmas žurnālu!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " @@ -1573,6 +1573,9 @@ msgstr "" "Runas atdalīšana neizdevās! Pārbaudiet interneta savienojumu, iespējams " "jālejupielādē modelis." +#~ msgid "Translation error, see logs!" +#~ msgstr "Kļūda tulkojot, skatiet sistēmas žurnālu!" + #~ msgid "Snap permission notice" #~ msgstr "Snap atļauju piezīme" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 2f4c2d9b..de2e2699 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -186,7 +186,8 @@ msgid "" "in the Live Recording screen in a future version." msgstr "" "Opmerking: de exportinstellingen voor live-opnames worden in een toekomstige " -"versie verplaatst naar de geavanceerde instellingen in het scherm Live-opname." +"versie verplaatst naar de geavanceerde instellingen in het scherm Live-" +"opname." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" @@ -210,7 +211,9 @@ msgstr "Alleen CPU gebruiken en GPU-versnelling uitschakelen" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "Gebruik dit als grotere modellen niet in het GPU-geheugen passen en Buzz crasht" +msgstr "" +"Gebruik dit als grotere modellen niet in het GPU-geheugen passen en Buzz " +"crasht" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" @@ -259,6 +262,10 @@ msgstr "" msgid "Enable folder watch" msgstr "Map bijhouden" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Verwerkte bestanden verwijderen" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Invoermap" @@ -437,7 +444,8 @@ msgstr "AI-model:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "Vertaal elke tekst die naar u wordt verzonden van het Engels naar het Spaans." +msgstr "" +"Vertaal elke tekst die naar u wordt verzonden van het Engels naar het Spaans." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -614,7 +622,8 @@ msgstr "Kan niet opnieuw starten" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "Alleen mislukte of afgebroken transcripties kunnen opnieuw worden gestart." +msgstr "" +"Alleen mislukte of afgebroken transcripties kunnen opnieuw worden gestart." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed to restart transcription: {}" @@ -630,7 +639,9 @@ msgstr "" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "Transcriptie kon niet opnieuw worden gestart: transcriptieproces niet gevonden." +msgstr "" +"Transcriptie kon niet opnieuw worden gestart: transcriptieproces niet " +"gevonden." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -897,7 +908,9 @@ msgstr "Voorkeurslengte van ondertiteling" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "Alleen beschikbaar als timings op woordniveau zijn uitgeschakeld tijdens transcriptie" +msgstr "" +"Alleen beschikbaar als timings op woordniveau zijn uitgeschakeld tijdens " +"transcriptie" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -921,7 +934,9 @@ msgstr "Samenvoegen" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "Alleen beschikbaar als timings op woordniveau zijn ingeschakeld tijdens transcriptie" +msgstr "" +"Alleen beschikbaar als timings op woordniveau zijn ingeschakeld tijdens " +"transcriptie" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" @@ -951,8 +966,8 @@ msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." msgstr "" -"Het laden van het uitlijningsmodel is mislukt. Controleer uw internetverbinding " -"en probeer het opnieuw." +"Het laden van het uitlijningsmodel is mislukt. Controleer uw " +"internetverbinding en probeer het opnieuw." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" @@ -1085,7 +1100,9 @@ msgstr "De OpenAI-api-sleutel kan niet worden bewaard in de sleutelbos" #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "De Whisper-server kon niet worden gestart. Raadpleeg de logboeken voor meer informatie." +msgstr "" +"De Whisper-server kon niet worden gestart. Raadpleeg de logboeken voor meer " +"informatie." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1094,8 +1111,8 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" -"De Whisper-server kon niet worden gestart wegens onvoldoende geheugen. Probeer " -"het opnieuw met een kleiner model. Gebruik de omgevingsvariabele " +"De Whisper-server kon niet worden gestart wegens onvoldoende geheugen. " +"Probeer het opnieuw met een kleiner model. Gebruik de omgevingsvariabele " "BUZZ_FORCE_CPU=TRUE om CPU-modus te forceren." #: buzz/transcriber/transcriber.py @@ -1554,10 +1571,6 @@ msgstr "Bovenaan toevoegen" msgid "Append and correct" msgstr "Toevoegen en corrigeren" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "Vertaalfout, raadpleeg de logboeken!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " @@ -1566,6 +1579,9 @@ msgstr "" "Spraakextractie mislukt! Controleer uw internetverbinding — mogelijk moet er " "een model worden gedownload." +#~ msgid "Translation error, see logs!" +#~ msgstr "Vertaalfout, raadpleeg de logboeken!" + #~ msgid "Snap permission notice" #~ msgstr "Snap-rechten" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index d556fe63..bb74df3c 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -208,7 +208,9 @@ msgstr "Używaj tylko CPU i wyłącz akcelerację GPU" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "Ustaw to, jeśli większe modele nie mieszczą się w pamięci GPU i Buzz się zawiesza" +msgstr "" +"Ustaw to, jeśli większe modele nie mieszczą się w pamięci GPU i Buzz się " +"zawiesza" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" @@ -250,13 +252,17 @@ msgid "" "validation." msgstr "" "OpenAI API zwróciło nieprawidłową odpowiedź. Sprawdź adres URL API lub swój " -"klucz. Transkrypcja i tłumaczenie mogą nadal działać, jeśli API nie obsługuje " -"weryfikacji klucza." +"klucz. Transkrypcja i tłumaczenie mogą nadal działać, jeśli API nie " +"obsługuje weryfikacji klucza." #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "Włącz obserwację folderu" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Usuń przetworzonych pliki" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Folder wejściowy" @@ -610,7 +616,8 @@ msgstr "Nie można ponownie uruchomić" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Only failed or canceled transcriptions can be restarted." -msgstr "Tylko nieudane lub anulowane transkrypcje mogą być uruchomione ponownie." +msgstr "" +"Tylko nieudane lub anulowane transkrypcje mogą być uruchomione ponownie." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Failed to restart transcription: {}" @@ -626,7 +633,9 @@ msgstr "" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "Nie można uruchomić ponownie transkrypcji: nie znaleziono procesu transkrypcji." +msgstr "" +"Nie można uruchomić ponownie transkrypcji: nie znaleziono procesu " +"transkrypcji." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -895,7 +904,8 @@ msgstr "Żądana długość napisów" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "Dostępne tylko jeśli znaczniki dla słów były wyłączone podczas transkrypcji" +msgstr "" +"Dostępne tylko jeśli znaczniki dla słów były wyłączone podczas transkrypcji" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -919,13 +929,15 @@ msgstr "Scal" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "Dostępne tylko jeśli znaczniki dla słów były włączone podczas transkrypcji" +msgstr "" +"Dostępne tylko jeśli znaczniki dla słów były włączone podczas transkrypcji" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." msgstr "" -"Identyfikacja mówcy jest niedostępna: nie udało się załadować wymaganych bibliotek." +"Identyfikacja mówcy jest niedostępna: nie udało się załadować wymaganych " +"bibliotek." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" @@ -941,7 +953,8 @@ msgstr "3/8 Ładowanie modelu wyrównania" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "3/8 Loading alignment model (retrying with cache...)" -msgstr "3/8 Ładowanie modelu wyrównania (ponowna próba z pamięcią podręczną...)" +msgstr "" +"3/8 Ładowanie modelu wyrównania (ponowna próba z pamięcią podręczną...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" @@ -1092,8 +1105,8 @@ msgid "" "variable." msgstr "" "Serwer Whisper nie uruchomił się z powodu niewystarczającej pamięci. Spróbuj " -"ponownie z mniejszym modelem. Aby wymusić tryb CPU, użyj zmiennej środowiskowej " -"BUZZ_FORCE_CPU=TRUE." +"ponownie z mniejszym modelem. Aby wymusić tryb CPU, użyj zmiennej " +"środowiskowej BUZZ_FORCE_CPU=TRUE." #: buzz/transcriber/transcriber.py msgid "Translate to English" @@ -1551,17 +1564,16 @@ msgstr "Dodaj powyżej" msgid "Append and correct" msgstr "Dodaj i popraw" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "Błąd tłumaczenia, sprawdź logi!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." msgstr "" -"Wyodrębnianie mowy nie powiodło się! Sprawdź połączenie internetowe — " -"może być konieczne pobranie modelu." +"Wyodrębnianie mowy nie powiodło się! Sprawdź połączenie internetowe — może " +"być konieczne pobranie modelu." + +#~ msgid "Translation error, see logs!" +#~ msgstr "Błąd tłumaczenia, sprawdź logi!" #~ msgid "ID" #~ msgstr "ID" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index 8d65e25e..f9b04add 100644 --- a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po +++ b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po @@ -258,6 +258,10 @@ msgstr "" msgid "Enable folder watch" msgstr "Habilitar monitoramento de pasta" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Excluir arquivos processados" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Pasta de entrada" diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 263ccda1..920a2259 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -205,7 +205,8 @@ msgstr "Використовувати лише CPU та вимкнути при #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Set this if larger models do not fit your GPU memory and Buzz crashes" -msgstr "Увімкніть це, якщо великі моделі не поміщаються в пам'ять GPU і Buzz падає" +msgstr "" +"Увімкніть це, якщо великі моделі не поміщаються в пам'ять GPU і Buzz падає" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Disable GPU" @@ -232,8 +233,8 @@ msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" -"API підтримує лише символи base64 (A-Za-z0-9+/=_-). Інші символи в " -"API-ключі можуть спричиняти помилки." +"API підтримує лише символи base64 (A-Za-z0-9+/=_-). Інші символи в API-ключі " +"можуть спричиняти помилки." #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -254,6 +255,10 @@ msgstr "" msgid "Enable folder watch" msgstr "Увімкнути стеження за текою" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "Видалити оброблені файли" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "Тека введення" @@ -430,7 +435,9 @@ msgstr "Модель ШІ" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "Будь ласка, перекладайте кожен текст, надісланий вам, з англійської на іспанську." +msgstr "" +"Будь ласка, перекладайте кожен текст, надісланий вам, з англійської на " +"іспанську." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -623,7 +630,8 @@ msgstr "" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "Не вдалося перезапустити транскрипцію: обробник транскрипції не знайдено." +msgstr "" +"Не вдалося перезапустити транскрипцію: обробник транскрипції не знайдено." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -892,7 +900,9 @@ msgstr "Бажана довжина субтитрів" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "Доступно лише якщо хронометраж на рівні слів був вимкнений під час транскрипції" +msgstr "" +"Доступно лише якщо хронометраж на рівні слів був вимкнений під час " +"транскрипції" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -916,7 +926,9 @@ msgstr "Об'єднати" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "Доступно лише якщо хронометраж на рівні слів був увімкнений під час транскрипції" +msgstr "" +"Доступно лише якщо хронометраж на рівні слів був увімкнений під час " +"транскрипції" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" @@ -1078,7 +1090,8 @@ msgstr "Не вдається додати до звʼязки ключів API- #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py msgid "Whisper server failed to start. Check logs for details." -msgstr "Не вдалося запустити сервер Whisper. Перевірте журнали для отримання деталей." +msgstr "" +"Не вдалося запустити сервер Whisper. Перевірте журнали для отримання деталей." #: buzz/transcriber/local_whisper_cpp_server_transcriber.py #: buzz/transcriber/recording_transcriber.py @@ -1547,10 +1560,6 @@ msgstr "Додати зверху" msgid "Append and correct" msgstr "Додати та виправити" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "Помилка перекладу, перегляньте журнали!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " @@ -1559,6 +1568,9 @@ msgstr "" "Не вдалося витягти мовлення! Перевірте підключення до інтернету — можливо, " "потрібно завантажити модель." +#~ msgid "Translation error, see logs!" +#~ msgstr "Помилка перекладу, перегляньте журнали!" + #~ msgid "Snap permission notice" #~ msgstr "Попередження щодо дозволів Snap" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 9c003d51..f7c06a1b 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -182,8 +182,7 @@ msgstr "实时录制模式" msgid "" "Note: Live recording export settings will be moved to the Advanced Settings " "in the Live Recording screen in a future version." -msgstr "" -"注意:实时录制导出设置将在未来版本中移至实时录制界面的高级设置中。" +msgstr "注意:实时录制导出设置将在未来版本中移至实时录制界面的高级设置中。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" @@ -194,8 +193,8 @@ msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" -"适用于 Huggingface 和 Faster Whisper 模型。可减少 GPU 内存占用,但可能略微" -"降低转录质量。" +"适用于 Huggingface 和 Faster Whisper 模型。可减少 GPU 内存占用,但可能略微降" +"低转录质量。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" @@ -252,6 +251,10 @@ msgstr "" msgid "Enable folder watch" msgstr "开启文件夹监控" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "删除已处理的文件" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "输入文件夹" @@ -820,8 +823,7 @@ msgstr "跟随音频" msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." -msgstr "" -"在识别文本中启用/禁用跟随当前音频位置。启用后,自动滚动到当前文本。" +msgstr "在识别文本中启用/禁用跟随当前音频位置。启用后,自动滚动到当前文本。" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" @@ -1076,8 +1078,8 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" -"Whisper 服务器因内存不足而启动失败。请尝试使用较小的模型。如需强制使用 CPU " -"模式,请设置环境变量 BUZZ_FORCE_CPU=TRUE。" +"Whisper 服务器因内存不足而启动失败。请尝试使用较小的模型。如需强制使用 CPU 模" +"式,请设置环境变量 BUZZ_FORCE_CPU=TRUE。" #: buzz/transcriber/transcriber.py msgid "Translate to English" @@ -1535,16 +1537,14 @@ msgstr "增加上方" msgid "Append and correct" msgstr "增加并纠正" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "翻译出错,请查看日志!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." -msgstr "" -"语音提取失败!请检查您的网络连接——可能需要下载模型。" +msgstr "语音提取失败!请检查您的网络连接——可能需要下载模型。" + +#~ msgid "Translation error, see logs!" +#~ msgstr "翻译出错,请查看日志!" #~ msgid "Snap permission notice" #~ msgstr "快照权限通知" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index 27a25bd9..38535b47 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-27 16:46+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -182,8 +182,7 @@ msgstr "即時錄製模式" msgid "" "Note: Live recording export settings will be moved to the Advanced Settings " "in the Live Recording screen in a future version." -msgstr "" -"注意:即時錄製匯出設定將在未來版本中移至即時錄製畫面的進階設定中。" +msgstr "注意:即時錄製匯出設定將在未來版本中移至即時錄製畫面的進階設定中。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" @@ -194,8 +193,8 @@ msgid "" "Applies to Huggingface and Faster Whisper models. Reduces GPU memory usage " "but may slightly decrease transcription quality." msgstr "" -"適用於 Huggingface 和 Faster Whisper 模型。可降低 GPU 記憶體使用量,但可能" -"略微降低轉錄品質。" +"適用於 Huggingface 和 Faster Whisper 模型。可降低 GPU 記憶體使用量,但可能略" +"微降低轉錄品質。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Reduce GPU RAM" @@ -221,8 +220,7 @@ msgstr "OpenAI API 金鑰測試" 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 翻譯。" +msgstr "您的 API 金鑰有效。Buzz 將使用此金鑰執行 Whisper API 轉錄和 AI 翻譯。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Invalid API key" @@ -233,7 +231,8 @@ msgid "" "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " "API key may cause errors." msgstr "" -"API 僅支援 base64 字元(A-Za-z0-9+/=_-)。API 金鑰中的其他字元可能會導致錯誤。" +"API 僅支援 base64 字元(A-Za-z0-9+/=_-)。API 金鑰中的其他字元可能會導致錯" +"誤。" #: buzz/widgets/preferences_dialog/general_preferences_widget.py #: buzz/widgets/transcriber/advanced_settings_dialog.py @@ -246,13 +245,17 @@ msgid "" "Transcription and translation may still work if the API does not support key " "validation." msgstr "" -"OpenAI API 傳回無效回應。請檢查 API 網址或您的金鑰。若 API 不支援金鑰驗證," -"轉錄和翻譯仍可能正常運作。" +"OpenAI API 傳回無效回應。請檢查 API 網址或您的金鑰。若 API 不支援金鑰驗證,轉" +"錄和翻譯仍可能正常運作。" #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" msgstr "啟用資料夾監視" +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +msgid "Delete processed files" +msgstr "刪除已處理的檔案" + #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Input folder" msgstr "輸入資料夾" @@ -616,8 +619,7 @@ msgstr "重新開始轉錄失敗:{}" msgid "" "Could not restart transcription: model not available and could not be " "downloaded." -msgstr "" -"無法重新開始轉錄:模型不可用且無法下載。" +msgstr "無法重新開始轉錄:模型不可用且無法下載。" #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." @@ -822,8 +824,7 @@ msgstr "跟隨音訊" msgid "" "Enable/disable following the current audio position in the transcript. When " "enabled, automatically scrolls to current text." -msgstr "" -"啟用/停用在轉錄稿中跟隨目前音訊位置。啟用後,自動捲動至目前文字。" +msgstr "啟用/停用在轉錄稿中跟隨目前音訊位置。啟用後,自動捲動至目前文字。" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py msgid "Scroll to Current" @@ -916,8 +917,7 @@ msgstr "僅在轉錄時啟用單字級別時間戳記時可用" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" "Speaker identification is not available: failed to load required libraries." -msgstr "" -"說話者識別不可用:無法載入所需程式庫。" +msgstr "說話者識別不可用:無法載入所需程式庫。" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" @@ -939,8 +939,7 @@ msgstr "3/8 載入對齊模型(正在使用快取重試...)" msgid "" "Failed to load alignment model. Please check your internet connection and " "try again." -msgstr "" -"無法載入對齊模型。請檢查您的網路連線並重試。" +msgstr "無法載入對齊模型。請檢查您的網路連線並重試。" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" @@ -1080,8 +1079,8 @@ msgid "" "with a smaller model. To force CPU mode use BUZZ_FORCE_CPU=TRUE environment " "variable." msgstr "" -"Whisper 伺服器因記憶體不足而啟動失敗。請改用較小的模型重試。若要強制使用 " -"CPU 模式,請設定環境變數 BUZZ_FORCE_CPU=TRUE。" +"Whisper 伺服器因記憶體不足而啟動失敗。請改用較小的模型重試。若要強制使用 CPU " +"模式,請設定環境變數 BUZZ_FORCE_CPU=TRUE。" #: buzz/transcriber/transcriber.py msgid "Translate to English" @@ -1539,16 +1538,14 @@ msgstr "附加至上方" msgid "Append and correct" msgstr "附加並校正" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "翻譯錯誤,請查看日誌!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." -msgstr "" -"語音提取失敗!請檢查您的網路連線——可能需要下載模型。" +msgstr "語音提取失敗!請檢查您的網路連線——可能需要下載模型。" + +#~ msgid "Translation error, see logs!" +#~ msgstr "翻譯錯誤,請查看日誌!" #~ msgid "ID" #~ msgstr "ID" diff --git a/buzz/transcriber/file_transcriber.py b/buzz/transcriber/file_transcriber.py index 74892c84..c50d4af2 100755 --- a/buzz/transcriber/file_transcriber.py +++ b/buzz/transcriber/file_transcriber.py @@ -155,13 +155,16 @@ class FileTranscriber(QObject): or self.transcription_task.file_path ) if source_path and os.path.exists(source_path): - shutil.move( - source_path, - os.path.join( - self.transcription_task.output_directory, - os.path.basename(source_path), - ), - ) + if self.transcription_task.delete_source_file: + os.remove(source_path) + else: + shutil.move( + source_path, + os.path.join( + self.transcription_task.output_directory, + os.path.basename(source_path), + ), + ) def on_download_progress(self, data: dict): if data["status"] == "downloading": diff --git a/buzz/transcriber/transcriber.py b/buzz/transcriber/transcriber.py index 4ba82786..0a52b54f 100644 --- a/buzz/transcriber/transcriber.py +++ b/buzz/transcriber/transcriber.py @@ -202,6 +202,7 @@ class FileTranscriptionTask: source: Source = Source.FILE_IMPORT file_path: Optional[str] = None original_file_path: Optional[str] = None # Original path before speech extraction + delete_source_file: bool = False url: Optional[str] = None fraction_downloaded: float = 0.0 diff --git a/buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py b/buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py index abc8c371..e7a3c0c9 100644 --- a/buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +++ b/buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py @@ -44,11 +44,16 @@ class FolderWatchPreferencesWidget(QWidget): checkbox.setObjectName("EnableFolderWatchCheckbox") checkbox.stateChanged.connect(self.on_enable_changed) - input_folder_browse_button = QPushButton(_("Browse")) - input_folder_browse_button.clicked.connect(self.on_click_browse_input_folder) + delete_checkbox = QCheckBox(_("Delete processed files")) + delete_checkbox.setChecked(config.delete_processed_files) + delete_checkbox.setObjectName("DeleteProcessedFilesCheckbox") + delete_checkbox.stateChanged.connect(self.on_delete_processed_files_changed) - output_folder_browse_button = QPushButton(_("Browse")) - output_folder_browse_button.clicked.connect(self.on_click_browse_output_folder) + self.input_folder_browse_button = QPushButton(_("Browse")) + self.input_folder_browse_button.clicked.connect(self.on_click_browse_input_folder) + + self.output_folder_browse_button = QPushButton(_("Browse")) + self.output_folder_browse_button.clicked.connect(self.on_click_browse_output_folder) input_folder_row = QHBoxLayout() self.input_folder_line_edit = LineEdit(config.input_directory, self) @@ -57,7 +62,7 @@ class FolderWatchPreferencesWidget(QWidget): self.input_folder_line_edit.setObjectName("InputFolderLineEdit") input_folder_row.addWidget(self.input_folder_line_edit) - input_folder_row.addWidget(input_folder_browse_button) + input_folder_row.addWidget(self.input_folder_browse_button) output_folder_row = QHBoxLayout() self.output_folder_line_edit = LineEdit(config.output_directory, self) @@ -66,7 +71,7 @@ class FolderWatchPreferencesWidget(QWidget): self.output_folder_line_edit.setObjectName("OutputFolderLineEdit") output_folder_row.addWidget(self.output_folder_line_edit) - output_folder_row.addWidget(output_folder_browse_button) + output_folder_row.addWidget(self.output_folder_browse_button) openai_access_token = get_password(Key.OPENAI_API_KEY) ( @@ -77,15 +82,17 @@ class FolderWatchPreferencesWidget(QWidget): file_paths=[], ) - transcription_form_widget = FileTranscriptionFormWidget( + self.transcription_form_widget = FileTranscriptionFormWidget( transcription_options=transcription_options, file_transcription_options=file_transcription_options, parent=self, ) - transcription_form_widget.transcription_options_changed.connect( + self.transcription_form_widget.transcription_options_changed.connect( self.on_transcription_options_changed ) + self.delete_checkbox = delete_checkbox + layout = QVBoxLayout(self) folders_form_layout = QFormLayout() @@ -93,14 +100,17 @@ class FolderWatchPreferencesWidget(QWidget): folders_form_layout.addRow("", checkbox) folders_form_layout.addRow(_("Input folder"), input_folder_row) folders_form_layout.addRow(_("Output folder"), output_folder_row) - folders_form_layout.addWidget(transcription_form_widget) + folders_form_layout.addRow("", delete_checkbox) + folders_form_layout.addWidget(self.transcription_form_widget) layout.addLayout(folders_form_layout) - layout.addWidget(transcription_form_widget) + layout.addWidget(self.transcription_form_widget) layout.addStretch() self.setLayout(layout) + self._set_settings_enabled(config.enabled) + def on_click_browse_input_folder(self): folder = QFileDialog.getExistingDirectory(self, _("Select Input Folder")) self.input_folder_line_edit.setText(folder) @@ -119,8 +129,22 @@ class FolderWatchPreferencesWidget(QWidget): self.config.output_directory = folder self.config_changed.emit(self.config) + def _set_settings_enabled(self, enabled: bool): + self.input_folder_line_edit.setEnabled(enabled) + self.input_folder_browse_button.setEnabled(enabled) + self.output_folder_line_edit.setEnabled(enabled) + self.output_folder_browse_button.setEnabled(enabled) + self.delete_checkbox.setEnabled(enabled) + self.transcription_form_widget.setEnabled(enabled) + def on_enable_changed(self, state: int): - self.config.enabled = state == 2 + enabled = state == 2 + self.config.enabled = enabled + self._set_settings_enabled(enabled) + self.config_changed.emit(self.config) + + def on_delete_processed_files_changed(self, state: int): + self.config.delete_processed_files = state == 2 self.config_changed.emit(self.config) def on_transcription_options_changed( diff --git a/buzz/widgets/preferences_dialog/models/folder_watch_preferences.py b/buzz/widgets/preferences_dialog/models/folder_watch_preferences.py index f754a4ea..6dcea82a 100644 --- a/buzz/widgets/preferences_dialog/models/folder_watch_preferences.py +++ b/buzz/widgets/preferences_dialog/models/folder_watch_preferences.py @@ -13,11 +13,13 @@ class FolderWatchPreferences: input_directory: str output_directory: str file_transcription_options: FileTranscriptionPreferences + delete_processed_files: bool = False def save(self, settings: QSettings): settings.setValue("enabled", self.enabled) settings.setValue("input_folder", self.input_directory) settings.setValue("output_directory", self.output_directory) + settings.setValue("delete_processed_files", self.delete_processed_files) settings.beginGroup("file_transcription_options") self.file_transcription_options.save(settings) settings.endGroup() @@ -29,6 +31,8 @@ class FolderWatchPreferences: input_folder = settings.value("input_folder", defaultValue="", type=str) output_folder = settings.value("output_directory", defaultValue="", type=str) + delete_value = settings.value("delete_processed_files", False) + delete_processed_files = False if delete_value == "false" else bool(delete_value) settings.beginGroup("file_transcription_options") file_transcription_options = FileTranscriptionPreferences.load(settings) settings.endGroup() @@ -37,4 +41,5 @@ class FolderWatchPreferences: input_directory=input_folder, output_directory=output_folder, file_transcription_options=file_transcription_options, + delete_processed_files=delete_processed_files, ) diff --git a/buzz/widgets/transcription_task_folder_watcher.py b/buzz/widgets/transcription_task_folder_watcher.py index 6052993f..368c5d2e 100644 --- a/buzz/widgets/transcription_task_folder_watcher.py +++ b/buzz/widgets/transcription_task_folder_watcher.py @@ -111,6 +111,7 @@ class TranscriptionTaskFolderWatcher(QFileSystemWatcher): model_path=model_path, output_directory=output_directory, source=FileTranscriptionTask.Source.FOLDER_WATCH, + delete_source_file=self.preferences.delete_processed_files, ) self.task_found.emit(task) self.paths_emitted.add(file_path) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index ea1b5284..5e4c3a93 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -115,6 +115,12 @@ parts: # Clean caches uv cache clean + # Create launcher wrapper to ensure the snap's own libasound.so.2 is found + # before gnome content snap libraries (which desktop-launch prepends to LD_LIBRARY_PATH) + mkdir -p $CRAFT_PART_INSTALL/bin + printf '#!/bin/sh\nexport LD_LIBRARY_PATH="$SNAP/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"\nexec "$SNAP/bin/python" -m buzz "$@"\n' > $CRAFT_PART_INSTALL/bin/buzz-launcher + chmod +x $CRAFT_PART_INSTALL/bin/buzz-launcher + # Copy source files cp -r $CRAFT_PART_BUILD/buzz $CRAFT_PART_INSTALL/ cp -r $CRAFT_PART_BUILD/ctc_forced_aligner $CRAFT_PART_INSTALL/ @@ -148,7 +154,7 @@ apps: - gnome command-chain: - bin/gpu-2404-wrapper - command: snap/command-chain/desktop-launch $SNAP/bin/python -m buzz + command: snap/command-chain/desktop-launch $SNAP/bin/buzz-launcher desktop: usr/share/applications/buzz.desktop environment: PATH: $SNAP/usr/bin:$SNAP/bin:$PATH diff --git a/tests/transcriber/whisper_file_transcriber_test.py b/tests/transcriber/whisper_file_transcriber_test.py index 18a032b6..25dad30c 100644 --- a/tests/transcriber/whisper_file_transcriber_test.py +++ b/tests/transcriber/whisper_file_transcriber_test.py @@ -357,6 +357,42 @@ class TestWhisperFileTranscriber: transcriber.stop() time.sleep(3) + def test_transcribe_from_folder_watch_source_deletes_file(self, qtbot): + file_path = tempfile.mktemp(suffix=".mp3") + shutil.copy(test_audio_path, file_path) + + file_transcription_options = FileTranscriptionOptions( + file_paths=[file_path], + output_formats={OutputFormat.TXT}, + ) + transcription_options = TranscriptionOptions() + model_path = get_model_path(transcription_options.model) + + output_directory = tempfile.mkdtemp() + transcriber = WhisperFileTranscriber( + task=FileTranscriptionTask( + model_path=model_path, + transcription_options=transcription_options, + file_transcription_options=file_transcription_options, + file_path=file_path, + original_file_path=file_path, + output_directory=output_directory, + source=FileTranscriptionTask.Source.FOLDER_WATCH, + delete_source_file=True, + ) + ) + with qtbot.wait_signal(transcriber.completed, timeout=10 * 6000): + transcriber.run() + + assert not os.path.isfile(file_path) + assert not os.path.isfile( + os.path.join(output_directory, os.path.basename(file_path)) + ) + assert len(glob.glob("*.txt", root_dir=output_directory)) > 0 + + transcriber.stop() + time.sleep(3) + @pytest.mark.skip() def test_transcribe_stop(self): output_file_path = os.path.join(tempfile.gettempdir(), "whisper.txt") diff --git a/tests/widgets/preferences_dialog/folder_watch_preferences_widget_test.py b/tests/widgets/preferences_dialog/folder_watch_preferences_widget_test.py index 0c9f2082..86e0c656 100644 --- a/tests/widgets/preferences_dialog/folder_watch_preferences_widget_test.py +++ b/tests/widgets/preferences_dialog/folder_watch_preferences_widget_test.py @@ -48,8 +48,12 @@ class TestFolderWatchPreferencesWidget: assert not checkbox.isChecked() assert input_folder_line_edit.text() == "" assert output_folder_line_edit.text() == "" + assert not input_folder_line_edit.isEnabled() + assert not output_folder_line_edit.isEnabled() checkbox.setChecked(True) + assert input_folder_line_edit.isEnabled() + assert output_folder_line_edit.isEnabled() input_folder_line_edit.setText("test/input/folder") output_folder_line_edit.setText("test/output/folder") @@ -57,3 +61,42 @@ class TestFolderWatchPreferencesWidget: assert last_config_changed_call[0][0].enabled assert last_config_changed_call[0][0].input_directory == "test/input/folder" assert last_config_changed_call[0][0].output_directory == "test/output/folder" + + def test_delete_processed_files_checkbox(self, qtbot): + widget = FolderWatchPreferencesWidget( + config=FolderWatchPreferences( + enabled=False, + input_directory="", + output_directory="", + file_transcription_options=FileTranscriptionPreferences( + language=None, + task=Task.TRANSCRIBE, + model=TranscriptionModel.default(), + word_level_timings=False, + extract_speech=False, + temperature=DEFAULT_WHISPER_TEMPERATURE, + initial_prompt="", + enable_llm_translation=False, + llm_model="", + llm_prompt="", + output_formats=set(), + ), + ), + ) + mock_config_changed = Mock() + widget.config_changed.connect(mock_config_changed) + qtbot.add_widget(widget) + + delete_checkbox = widget.findChild(QCheckBox, "DeleteProcessedFilesCheckbox") + assert delete_checkbox is not None + assert not delete_checkbox.isChecked() + + delete_checkbox.setChecked(True) + + last_config = mock_config_changed.call_args_list[-1][0][0] + assert last_config.delete_processed_files is True + + delete_checkbox.setChecked(False) + + last_config = mock_config_changed.call_args_list[-1][0][0] + assert last_config.delete_processed_files is False diff --git a/tests/widgets/transcription_task_folder_watcher_test.py b/tests/widgets/transcription_task_folder_watcher_test.py index 44e4d461..62b2ef63 100644 --- a/tests/widgets/transcription_task_folder_watcher_test.py +++ b/tests/widgets/transcription_task_folder_watcher_test.py @@ -322,6 +322,76 @@ class TestTranscriptionTaskFolderWatcher: task: FileTranscriptionTask = blocker.args[0] assert task.file_path == os.path.join(input_directory, "whisper-french.mp3") + def test_should_set_delete_source_file_when_preference_enabled(self, qtbot: QtBot): + input_directory = mkdtemp() + output_directory = mkdtemp() + + watcher = TranscriptionTaskFolderWatcher( + tasks={}, + preferences=FolderWatchPreferences( + enabled=True, + input_directory=input_directory, + output_directory=output_directory, + delete_processed_files=True, + file_transcription_options=FileTranscriptionPreferences( + language=None, + task=Task.TRANSCRIBE, + model=self.default_model(), + word_level_timings=False, + extract_speech=False, + temperature=DEFAULT_WHISPER_TEMPERATURE, + initial_prompt="", + enable_llm_translation=False, + llm_model="", + llm_prompt="", + output_formats=set(), + ), + ), + ) + + shutil.copy(test_audio_path, input_directory) + + with qtbot.wait_signal(watcher.task_found, timeout=10_000) as blocker: + pass + + task: FileTranscriptionTask = blocker.args[0] + assert task.delete_source_file is True + + def test_should_not_set_delete_source_file_when_preference_disabled(self, qtbot: QtBot): + input_directory = mkdtemp() + output_directory = mkdtemp() + + watcher = TranscriptionTaskFolderWatcher( + tasks={}, + preferences=FolderWatchPreferences( + enabled=True, + input_directory=input_directory, + output_directory=output_directory, + delete_processed_files=False, + file_transcription_options=FileTranscriptionPreferences( + language=None, + task=Task.TRANSCRIBE, + model=self.default_model(), + word_level_timings=False, + extract_speech=False, + temperature=DEFAULT_WHISPER_TEMPERATURE, + initial_prompt="", + enable_llm_translation=False, + llm_model="", + llm_prompt="", + output_formats=set(), + ), + ), + ) + + shutil.copy(test_audio_path, input_directory) + + with qtbot.wait_signal(watcher.task_found, timeout=10_000) as blocker: + pass + + task: FileTranscriptionTask = blocker.args[0] + assert task.delete_source_file is False + def test_should_set_original_file_path(self, qtbot: QtBot): input_directory = mkdtemp() output_directory = mkdtemp() From 187d15b8e81b5b96f69a8becf5d6a13bac558bb2 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sat, 28 Feb 2026 16:39:04 +0200 Subject: [PATCH 29/37] Add auto update check for Windows adn Mac (#1404) --- .github/workflows/snapcraft.yml | 3 - Makefile | 5 + README.md | 4 + .../update_FILL0_wght700_GRAD0_opsz48.svg | 1 + buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 61 +++- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 65 ++++- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 61 +++- buzz/locale/en_US/LC_MESSAGES/buzz.po | 61 +++- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 61 +++- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 61 +++- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 61 +++- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 65 ++++- buzz/locale/nl/LC_MESSAGES/buzz.po | 64 ++++- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 61 +++- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 89 +++++- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 61 +++- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 61 +++- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 61 +++- buzz/settings/settings.py | 3 + buzz/update_checker.py | 163 +++++++++++ buzz/widgets/icon.py | 1 + buzz/widgets/main_window.py | 33 +++ buzz/widgets/main_window_toolbar.py | 17 ++ buzz/widgets/update_dialog.py | 262 ++++++++++++++++++ snap/snapcraft.yaml | 28 +- tests/mock_qt.py | 61 ++++ tests/mock_sounddevice.py | 7 +- tests/update_checker_test.py | 202 ++++++++++++++ tests/widgets/update_dialog_test.py | 238 ++++++++++++++++ 29 files changed, 1864 insertions(+), 57 deletions(-) create mode 100644 buzz/assets/update_FILL0_wght700_GRAD0_opsz48.svg create mode 100644 buzz/update_checker.py create mode 100644 buzz/widgets/update_dialog.py create mode 100644 tests/update_checker_test.py create mode 100644 tests/widgets/update_dialog_test.py diff --git a/.github/workflows/snapcraft.yml b/.github/workflows/snapcraft.yml index a2c8c63c..d4f95dc7 100644 --- a/.github/workflows/snapcraft.yml +++ b/.github/workflows/snapcraft.yml @@ -66,9 +66,6 @@ jobs: run: | sudo -E snapcraft pack --verbose --destructive-mode echo "snap=$(ls *.snap)" >> $GITHUB_OUTPUT - - run: | - sudo apt-get update - sudo apt-get install libportaudio2 libtbb-dev - run: sudo snap install --devmode *.snap - run: | cd $HOME diff --git a/Makefile b/Makefile index 0888f589..6a316b53 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,11 @@ endif COVERAGE_THRESHOLD := 70 test: buzz/whisper_cpp +# A check to get updates of yt-dlp. Should run only on local as part of regular development operations +# Sort of a local "update checker" +ifndef CI + uv lock --upgrade-package yt-dlp +endif pytest -s -vv --cov=buzz --cov-report=xml --cov-report=html --benchmark-skip --cov-fail-under=${COVERAGE_THRESHOLD} --cov-config=.coveragerc benchmarks: buzz/whisper_cpp diff --git a/README.md b/README.md index 58327510..b8cb5e19 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,10 @@ pip3 install nvidia-cublas-cu12==12.9.1.4 nvidia-cuda-cupti-cu12==12.9.79 nvidia For info on how to get latest development version with latest features and bug fixes see [FAQ](https://chidiwilliams.github.io/buzz/docs/faq#9-where-can-i-get-latest-development-version). +### Support Buzz + +You can help the Buzz by starring 🌟 the repo and sharing it with your friends. + ### Screenshots
diff --git a/buzz/assets/update_FILL0_wght700_GRAD0_opsz48.svg b/buzz/assets/update_FILL0_wght700_GRAD0_opsz48.svg new file mode 100644 index 00000000..d01ac5a7 --- /dev/null +++ b/buzz/assets/update_FILL0_wght700_GRAD0_opsz48.svg @@ -0,0 +1 @@ + diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 9e07929a..5189a603 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -345,7 +345,8 @@ msgid "Download failed" msgstr "Descàrrega fallida" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Error" @@ -536,6 +537,10 @@ msgstr "Cancel·la la transcripció" msgid "Clear History" msgstr "Neteja l'historial" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Actualització disponible" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "En progrés" @@ -730,6 +735,58 @@ msgstr "" "Comproveu els vostres dispositius d'àudio o els registres de l'aplicació per " "a més informació." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Hi ha una nova versió de Buzz disponible!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Versió actual:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Nova versió:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Notes de la versió:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Descarrega i instal·la" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "No hi ha cap URL de descàrrega disponible per a la vostra plataforma." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "S'està descarregant el fitxer {} de {}..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "S'està descarregant el fitxer {} de {} ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Descàrrega fallida" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "No s'ha pogut descarregar l'actualització: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "No s'ha pogut desar l'instal·lador: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "Descàrrega completada!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "No s'ha pogut executar l'instal·lador: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Comprova si hi ha actualitzacions" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index 50fd489f..7fbc6e9d 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -341,7 +341,8 @@ msgid "Download failed" msgstr "Download mislykkedes" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Fejl" @@ -531,6 +532,10 @@ msgstr "Afbryd transkription" msgid "Clear History" msgstr "Ryd historik" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Opdatering tilgængelig" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "Arbejder" @@ -724,6 +729,58 @@ msgstr "" "Tjek venligst dine audioenheder eller tjek applikationens logs for " "mereinformation." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "En ny version af Buzz er tilgængelig!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Nuværende version:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Ny version:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Udgivelsesnoter:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Download og installer" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "Ingen download-URL tilgængelig for din platform." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "Downloader fil {} af {}..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "Downloader fil {} af {} ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Download mislykkedes" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "Kunne ikke downloade opdateringen: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "Kunne ikke gemme installationsprogrammet: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "Download fuldført!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "Kunne ikke køre installationsprogrammet: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Tjek for opdateringer" @@ -1564,4 +1621,6 @@ msgstr "Tilføj og ret" msgid "" "Speech extraction failed! Check your internet connection — a model may need " "to be downloaded." -msgstr "Taleoprydning mislykkedes! Kontroller din internetforbindelse — en model skal muligvis hentes ned." +msgstr "" +"Taleoprydning mislykkedes! Kontroller din internetforbindelse — en model " +"skal muligvis hentes ned." diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index bd2fce51..608cf26e 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -345,7 +345,8 @@ msgid "Download failed" msgstr "Der Download ist fehlgeschlagen" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Fehler" @@ -538,6 +539,10 @@ msgstr "Transkription abbrechen" msgid "Clear History" msgstr "Verlauf löschen" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Update verfügbar" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "Im Gange" @@ -734,6 +739,58 @@ msgstr "" "Bitte überprüfen Sie Ihre Audiogeräte oder prüfen Sie die " "Anwendungsprotokolle für weitere Informationen." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Eine neue Version von Buzz ist verfügbar!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Aktuelle Version:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Neue Version:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Versionshinweise:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Herunterladen und installieren" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "Kein Download-Link für Ihre Plattform verfügbar." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "Datei {} von {} wird heruntergeladen..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "Datei {} von {} wird heruntergeladen ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Download fehlgeschlagen" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "Das Update konnte nicht heruntergeladen werden: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "Installer konnte nicht gespeichert werden: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "Download abgeschlossen!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "Installer konnte nicht ausgeführt werden: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Nach Updates suchen" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index 82e7802c..fae75bfe 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -331,7 +331,8 @@ msgid "Download failed" msgstr "" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "" @@ -516,6 +517,10 @@ msgstr "" msgid "Clear History" msgstr "" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "" @@ -704,6 +709,58 @@ msgid "" "information." msgstr "" +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "" diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 2cac032f..284ebc27 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -353,7 +353,8 @@ msgid "Download failed" msgstr "Descarga fallida" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Error" @@ -563,6 +564,10 @@ msgstr "Cancelar transcripción" msgid "Clear History" msgstr "Vaciar historial" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Actualización disponible" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "En Progreso" @@ -765,6 +770,58 @@ msgstr "" "Compruebe sus dispositivos de audio o consulte los registros de la " "aplicación para obtener más información." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "¡Hay una nueva versión de Buzz disponible!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Versión actual:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Nueva versión:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Notas de la versión:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Descargar e instalar" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "No hay URL de descarga disponible para su plataforma." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "Descargando archivo {} de {}..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "Descargando archivo {} de {} ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Descarga fallida" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "Error al descargar la actualización: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "No se pudo guardar el instalador: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "¡Descarga completa!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "No se pudo ejecutar el instalador: {}" + # automatic translation #: buzz/widgets/about_dialog.py msgid "Check for updates" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 4520d331..078abf69 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -345,7 +345,8 @@ msgid "Download failed" msgstr "Download non riuscito" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Errore" @@ -539,6 +540,10 @@ msgstr "Annulla trascrizione" msgid "Clear History" msgstr "Elimina la cronologia" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Aggiornamento Disponibile" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "In corso" @@ -731,6 +736,58 @@ msgstr "" "Controlla i tuoi dispositivi audio o i registri dell'applicazione per " "maggiori informazioni." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "È disponibile una nuova versione di Buzz!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Versione attuale:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Nuova versione:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Note di rilascio:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Scarica e installa" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "Nessun URL di download disponibile per la tua piattaforma." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "Download del file {} di {}..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "Download del file {} di {} ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Download fallito" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "Impossibile scaricare l'aggiornamento: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "Impossibile salvare il programma di installazione: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "Download completato!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "Impossibile eseguire il programma di installazione: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Controlla gli aggiornamenti" diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 366ff76d..2c28c743 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -338,7 +338,8 @@ msgid "Download failed" msgstr "ダウンロード失敗" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "エラー" @@ -528,6 +529,10 @@ msgstr "文字起こしをキャンセルする" msgid "Clear History" msgstr "履歴を削除する" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "アップデートあり" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "進行中" @@ -720,6 +725,58 @@ msgstr "" "オーディオデバイスを確認するか、詳細をアプリケーションのログで確認してくださ" "い。" +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Buzzの新しいバージョンが利用可能です!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "現在のバージョン:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "新しいバージョン:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "リリースノート:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "ダウンロードしてインストール" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "お使いのプラットフォーム向けのダウンロードURLがありません。" + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "ファイル {} / {} をダウンロード中..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "ファイル {} / {} をダウンロード中 ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "ダウンロード失敗" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "アップデートのダウンロードに失敗しました: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "インストーラーの保存に失敗しました: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "ダウンロード完了!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "インストーラーの実行に失敗しました: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "アップデートを確認する" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index ad5dd01c..648c5d21 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: 2026-02-27 16:46+0200\n" -"PO-Revision-Date: 2026-02-27 16:47+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" +"PO-Revision-Date: 2026-02-28 10:46+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -186,7 +186,7 @@ msgid "" "in the Live Recording screen in a future version." msgstr "" "Piezīme: Dzīvā ieraksta iestatījumi nākotnes Buzz versijās tiks pārvietoti " -"uz Papildu iestatījumu sadaļu Dzīvā ieraksta logā" +"uz Papildu iestatījumu sadaļu Dzīvā ieraksta logā." #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Use 8-bit quantization to reduce memory usage" @@ -346,7 +346,8 @@ msgid "Download failed" msgstr "Lejupielāde neizdevās" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Kļūda" @@ -540,6 +541,10 @@ msgstr "Atcelt atpazīšanu" msgid "Clear History" msgstr "Notīrīt vēsturi" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Pieejams atjauninājums" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "Apstrādā" @@ -731,6 +736,58 @@ msgstr "" "Lūdzu pārbaudiet savas audio ierīces vai pārbaudiet lietotnes ziņojumu " "žurnālus, lai iegūtu papildu informāciju." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Pieejama jauna Buzz versija!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Instalētā versija:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Jaunā versija:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Jaunās versijas piezīmes:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Lejupielādēt un instalēt" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "Jūsu datoram nav pieejama atjauninājum versija." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "Lejupielādē {} no {}..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "Lejupielādē {} no {} ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Lejupielāde neizdevās" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "Neizdevās lejupielādēt atjauninājumu: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "Neizdevās saglabāt atjauninājumu: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "Lejupielāde pabeigta!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "Neizdevās sākt atjauninājumu: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Pārbaudīt atjauninājumus" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index de2e2699..87994ef9 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -347,7 +347,8 @@ msgid "Download failed" msgstr "Het downloaden is mislukt" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Foutmelding" @@ -540,6 +541,10 @@ msgstr "Transcriptie wissen" msgid "Clear History" msgstr "Geschiedenis wissen" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Update Beschikbaar" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "In behandeling" @@ -733,6 +738,58 @@ msgid "" "information." msgstr "Controleer uw geluidsapparatuur of het programmalogboek." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Er is een nieuwe versie van Buzz beschikbaar!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Huidige versie:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Versie:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Release-opmerkingen:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Downloaden en installeren" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "Geen download-URL beschikbaar voor uw platform." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "Bestand {} van {} downloaden..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "Bestand {} van {} downloaden ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Download mislukt" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "Het downloaden van de update is mislukt: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "Kan het installatieprogramma niet opslaan: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "Download voltooid!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "Kan het installatieprogramma niet uitvoeren: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Controleren op updates" @@ -1602,6 +1659,3 @@ msgstr "" #~ msgid "Enter instructions for AI on how to translate..." #~ msgstr "Voer vertaalinstructies in…" - -#~ msgid "Version" -#~ msgstr "Versie" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index bb74df3c..869180c4 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:38+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -344,7 +344,8 @@ msgid "Download failed" msgstr "Pobieranie nie powiodło się" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Błąd" @@ -534,6 +535,10 @@ msgstr "Anuluj transkrypcję" msgid "Clear History" msgstr "Wyczyść historię" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Dostępna aktualizacja" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "W toku" @@ -729,6 +734,58 @@ msgstr "" "Sprawdź urządzenia audio lub przejrzyj logi aplikacji, by uzyskać więcej " "informacji." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Dostępna jest nowa wersja Buzz!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Aktualna wersja:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Nowa wersja:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Informacje o wydaniu:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Pobierz i zainstaluj" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "Brak adresu URL do pobrania dla Twojej platformy." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "Pobieranie pliku {} z {}..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "Pobieranie pliku {} z {} ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Pobieranie nie powiodło się" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "Nie udało się pobrać aktualizacji: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "Nie udało się zapisać instalatora: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "Pobieranie zakończone!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "Nie udało się uruchomić instalatora: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Sprawdź aktualizacje" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index f9b04add..3fbdeead 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: 2026-02-27 09:07+0200\n" +"POT-Creation-Date: 2026-02-28 10:41+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -343,7 +343,8 @@ msgid "Download failed" msgstr "Falha ao baixar" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Erro" @@ -438,7 +439,8 @@ msgstr "Modelo de IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Please translate each text sent to you from English to Spanish." -msgstr "Por favor, traduza cada texto enviado a você do Inglês para o Espanhol." +msgstr "" +"Por favor, traduza cada texto enviado a você do Inglês para o Espanhol." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -533,6 +535,10 @@ msgstr "Cancelar Transcrição" msgid "Clear History" msgstr "Limpar Histórico" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Atualização Disponível" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "Em Progresso" @@ -626,12 +632,14 @@ msgid "" "Could not restart transcription: model not available and could not be " "downloaded." msgstr "" -"Não foi possível reiniciar a transcrição: o modelo não está disponível e " -"não pôde ser baixado." +"Não foi possível reiniciar a transcrição: o modelo não está disponível e não " +"pôde ser baixado." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." -msgstr "Não foi possível reiniciar a transcrição: trabalhador de transcrição não encontrado." +msgstr "" +"Não foi possível reiniciar a transcrição: trabalhador de transcrição não " +"encontrado." #: buzz/widgets/recording_transcriber_widget.py msgid "Live Recording" @@ -725,6 +733,58 @@ msgstr "" "Verifique seus dispositivos de áudio ou os logs do aplicativo para mais " "informações." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Uma nova versão do Buzz está disponível!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Versão atual:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Nova versão:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Notas de Versão:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Baixar e instalar" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "Nenhuma URL de download disponível para sua plataforma." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "Baixando arquivo {} de {}..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "Baixando arquivo {} de {} ({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Falha no download" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "Falha ao baixar a atualização: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "Falha ao salvar o instalador: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "Download concluído!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "Falha ao executar o instalador: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Verificar atualizações" @@ -900,7 +960,9 @@ msgstr "Duração desejada da legenda" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were disabled during transcription" -msgstr "Disponível apenas se os tempos em nível de palavra foram desabilitados durante a transcrição" +msgstr "" +"Disponível apenas se os tempos em nível de palavra foram desabilitados " +"durante a transcrição" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Merge Options" @@ -924,7 +986,9 @@ msgstr "Mesclar" #: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Available only if word level timings were enabled during transcription" -msgstr "Disponível apenas se os tempos em nível de palavra foram habilitados durante a transcrição" +msgstr "" +"Disponível apenas se os tempos em nível de palavra foram habilitados durante " +"a transcrição" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "" @@ -1557,10 +1621,6 @@ msgstr "Acrescentar acima" msgid "Append and correct" msgstr "Acrescentar e corrigir" -#: buzz/translator.py -msgid "Translation error, see logs!" -msgstr "Erro de tradução, verifique os logs!" - #: buzz/file_transcriber_queue_worker.py msgid "" "Speech extraction failed! Check your internet connection — a model may need " @@ -1569,6 +1629,9 @@ msgstr "" "Falha na extração de fala! Verifique sua conexão com a internet — pode ser " "necessário baixar um modelo." +#~ msgid "Translation error, see logs!" +#~ msgstr "Erro de tradução, verifique os logs!" + #~ msgid "Snap permission notice" #~ msgstr "Aviso de permissão do Snap" @@ -1596,5 +1659,3 @@ msgstr "" #~ msgid "Undo" #~ msgstr "Desfazer" - -#~ msgid "Redo" diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 920a2259..490aba6a 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:41+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -340,7 +340,8 @@ msgid "Download failed" msgstr "Невдале завантаження" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "Помилка" @@ -532,6 +533,10 @@ msgstr "Скасувати транскрипцію" msgid "Clear History" msgstr "Очистити історію" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "Доступне оновлення" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "В процесі" @@ -725,6 +730,58 @@ msgstr "" "Будь ласка, перевірте свої аудіопристрої або пошукайте додаткову інформацію " "в звітах програми." +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Доступна нова версія Buzz!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "Поточна версія:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "Нова версія:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "Примітки до випуску:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "Завантажити та встановити" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "Посилання для завантаження для вашої платформи відсутнє." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "Завантаження файлу {} з {}..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "Завантаження файлу {} з {} ({:.1f} МБ / {:.1f} МБ)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "Помилка завантаження" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "Не вдалося завантажити оновлення: {}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "Не вдалося зберегти інсталятор: {}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "Завантаження завершено!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "Не вдалося запустити інсталятор: {}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "Перевірити оновлення" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index f7c06a1b..3d620f97 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:41+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -336,7 +336,8 @@ msgid "Download failed" msgstr "下载失败" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "错误" @@ -526,6 +527,10 @@ msgstr "取消识别" msgid "Clear History" msgstr "清除历史纪录" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "有可用更新" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "运行中" @@ -714,6 +719,58 @@ msgid "" "information." msgstr "请检查您的音频设备或检查应用程序日志以获取更多信息。" +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Buzz 有新版本可用!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "当前版本:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "新版本:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "发行说明:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "下载并安装" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "您的平台没有可用的下载链接。" + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "正在下载第 {} 个文件,共 {} 个..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "正在下载第 {} 个文件,共 {} 个({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "下载失败" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "下载更新失败:{}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "无法保存安装程序:{}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "下载完成!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "无法运行安装程序:{}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "检查更新" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index 38535b47..247d2fb3 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: 2026-02-27 16:46+0200\n" +"POT-Creation-Date: 2026-02-28 10:41+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -337,7 +337,8 @@ msgid "Download failed" msgstr "下載失敗" #: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/main_window.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py #: buzz/model_loader.py msgid "Error" msgstr "錯誤" @@ -527,6 +528,10 @@ msgstr "取消錄製" msgid "Clear History" msgstr "清除歷史紀錄" +#: buzz/widgets/main_window_toolbar.py buzz/widgets/update_dialog.py +msgid "Update Available" +msgstr "有可用更新" + #: buzz/widgets/transcription_tasks_table_widget.py msgid "In Progress" msgstr "進行中" @@ -715,6 +720,58 @@ msgid "" "information." msgstr "請檢查您的音頻設備或檢查應用程序日誌以獲取更多信息。" +#: buzz/widgets/update_dialog.py +msgid "A new version of Buzz is available!" +msgstr "Buzz 有新版本可用!" + +#: buzz/widgets/update_dialog.py +msgid "Current version:" +msgstr "目前版本:" + +#: buzz/widgets/update_dialog.py +msgid "New version:" +msgstr "新版本:" + +#: buzz/widgets/update_dialog.py +msgid "Release Notes:" +msgstr "版本說明:" + +#: buzz/widgets/update_dialog.py +msgid "Download and Install" +msgstr "下載並安裝" + +#: buzz/widgets/update_dialog.py +msgid "No download URL available for your platform." +msgstr "您的平台沒有可用的下載連結。" + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {}..." +msgstr "正在下載第 {} 個檔案,共 {} 個..." + +#: buzz/widgets/update_dialog.py +msgid "Downloading file {} of {} ({:.1f} MB / {:.1f} MB)..." +msgstr "正在下載第 {} 個檔案,共 {} 個({:.1f} MB / {:.1f} MB)..." + +#: buzz/widgets/update_dialog.py +msgid "Download Failed" +msgstr "下載失敗" + +#: buzz/widgets/update_dialog.py +msgid "Failed to download the update: {}" +msgstr "下載更新失敗:{}" + +#: buzz/widgets/update_dialog.py +msgid "Failed to save the installer: {}" +msgstr "無法儲存安裝程式:{}" + +#: buzz/widgets/update_dialog.py +msgid "Download complete!" +msgstr "下載完成!" + +#: buzz/widgets/update_dialog.py +msgid "Failed to run the installer: {}" +msgstr "無法執行安裝程式:{}" + #: buzz/widgets/about_dialog.py msgid "Check for updates" msgstr "檢查更新" diff --git a/buzz/settings/settings.py b/buzz/settings/settings.py index 4e722495..23f96b06 100644 --- a/buzz/settings/settings.py +++ b/buzz/settings/settings.py @@ -82,6 +82,9 @@ class Settings: FORCE_CPU = "force-cpu" REDUCE_GPU_MEMORY = "reduce-gpu-memory" + LAST_UPDATE_CHECK = "update/last-check" + UPDATE_AVAILABLE_VERSION = "update/available-version" + def get_user_identifier(self) -> str: user_id = self.value(self.Key.USER_IDENTIFIER, "") if not user_id: diff --git a/buzz/update_checker.py b/buzz/update_checker.py new file mode 100644 index 00000000..ff052af4 --- /dev/null +++ b/buzz/update_checker.py @@ -0,0 +1,163 @@ +import json +import logging +import platform +from datetime import datetime +from typing import Optional +from dataclasses import dataclass + +from PyQt6.QtCore import QObject, pyqtSignal, QUrl +from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply +from buzz.__version__ import VERSION +from buzz.settings.settings import Settings + + +@dataclass +class UpdateInfo: + version: str + release_notes: str + download_urls: list + +class UpdateChecker(QObject): + update_available = pyqtSignal(object) + + VERSION_JSON_URL = "https://github.com/chidiwilliams/buzz/releases/latest/download/version_info.json" + + CHECK_INTERVAL_DAYS = 7 + + def __init__( + self, + settings: Settings, + network_manager: Optional[QNetworkAccessManager] = None, + parent: Optional[QObject] = None + ): + super().__init__(parent) + + self.settings = settings + + if network_manager is None: + network_manager = QNetworkAccessManager(self) + self.network_manager = network_manager + self.network_manager.finished.connect(self._on_reply_finished) + + def should_check_for_updates(self) -> bool: + """Check if we are on Windows/macOS and if 7 days passed""" + system = platform.system() + if system not in ("Windows", "Darwin"): + logging.debug("Skipping update check on linux") + return False + + last_check = self.settings.value( + Settings.Key.LAST_UPDATE_CHECK, + "", + ) + + if last_check: + try: + last_check_date = datetime.fromisoformat(last_check) + days_since_check = (datetime.now() - last_check_date).days + if days_since_check < self.CHECK_INTERVAL_DAYS: + logging.debug( + f"Skipping update check, last checked {days_since_check} days ago" + ) + return False + except ValueError: + #Invalid date format + pass + + return True + + def check_for_updates(self) -> None: + """Start the network request""" + if not self.should_check_for_updates(): + return + + logging.info("Checking for updates...") + + url = QUrl(self.VERSION_JSON_URL) + request = QNetworkRequest(url) + self.network_manager.get(request) + + def _on_reply_finished(self, reply: QNetworkReply) -> None: + """Handles the network reply for version.json fetch""" + self.settings.set_value( + Settings.Key.LAST_UPDATE_CHECK, + datetime.now().isoformat() + ) + + if reply.error() != QNetworkReply.NetworkError.NoError: + error_msg = f"Failed to check for updates: {reply.errorString()}" + logging.error(error_msg) + reply.deleteLater() + return + + try: + data = json.loads(reply.readAll().data().decode("utf-8")) + reply.deleteLater() + + remote_version = data.get("version", "") + release_notes = data.get("release_notes", "") + download_urls = data.get("download_urls", {}) + + #Get the download url for current platform + download_url = self._get_download_url(download_urls) + + if self._is_newer_version(remote_version): + logging.info(f"Update available: {remote_version}") + + #Store the available version + self.settings.set_value( + Settings.Key.UPDATE_AVAILABLE_VERSION, + remote_version + ) + + update_info = UpdateInfo( + version=remote_version, + release_notes=release_notes, + download_urls=download_url + ) + self.update_available.emit(update_info) + + else: + logging.info("No update available") + self.settings.set_value( + Settings.Key.UPDATE_AVAILABLE_VERSION, + "" + ) + + except (json.JSONDecodeError, KeyError) as e: + error_msg = f"Failed to parse version info: {e}" + logging.error(error_msg) + + def _get_download_url(self, download_urls: dict) -> list: + system = platform.system() + machine = platform.machine().lower() + + if system == "Windows": + urls = download_urls.get("windows_x64", []) + elif system == "Darwin": + if machine in ("arm64", "aarch64"): + urls = download_urls.get("macos_arm", []) + else: + urls = download_urls.get("macos_x86", []) + else: + urls = [] + + return urls if isinstance(urls, list) else [urls] + + def _is_newer_version(self, remote_version: str) -> bool: + """Compare remote version with current version""" + try: + current_parts = [int(x) for x in VERSION.split(".")] + remote_parts = [int(x) for x in remote_version.split(".")] + + #pad with zeros if needed + while len(current_parts) < len(remote_parts): + current_parts.append(0) + while len(remote_parts) < len(current_parts): + remote_parts.append(0) + + return remote_parts > current_parts + + except ValueError: + logging.error(f"Invalid version format: {VERSION} or {remote_version}") + return False \ No newline at end of file diff --git a/buzz/widgets/icon.py b/buzz/widgets/icon.py index 298232a1..12718725 100644 --- a/buzz/widgets/icon.py +++ b/buzz/widgets/icon.py @@ -129,3 +129,4 @@ ADD_ICON_PATH = get_path("assets/add_FILL0_wght700_GRAD0_opsz48.svg") URL_ICON_PATH = get_path("assets/url.svg") TRASH_ICON_PATH = get_path("assets/delete_FILL0_wght700_GRAD0_opsz48.svg") CANCEL_ICON_PATH = get_path("assets/cancel_FILL0_wght700_GRAD0_opsz48.svg") +UPDATE_ICON_PATH = get_path("assets/update_FILL0_wght700_GRAD0_opsz48.svg") \ No newline at end of file diff --git a/buzz/widgets/main_window.py b/buzz/widgets/main_window.py index 653d178e..f877321a 100644 --- a/buzz/widgets/main_window.py +++ b/buzz/widgets/main_window.py @@ -24,6 +24,8 @@ from buzz.db.service.transcription_service import TranscriptionService from buzz.file_transcriber_queue_worker import FileTranscriberQueueWorker from buzz.locale import _ from buzz.settings.settings import APP_NAME, Settings +from buzz.update_checker import UpdateChecker, UpdateInfo +from buzz.widgets.update_dialog import UpdateDialog from buzz.settings.shortcuts import Shortcuts from buzz.store.keyring_store import set_password, Key from buzz.transcriber.transcriber import ( @@ -70,6 +72,9 @@ class MainWindow(QMainWindow): self.quit_on_complete = False self.transcription_service = transcription_service + #update checker + self._update_info: Optional[UpdateInfo] = None + self.toolbar = MainWindowToolbar(shortcuts=self.shortcuts, parent=self) self.toolbar.new_transcription_action_triggered.connect( self.on_new_transcription_action_triggered @@ -87,6 +92,7 @@ class MainWindow(QMainWindow): self.on_stop_transcription_action_triggered ) self.addToolBar(self.toolbar) + self.toolbar.update_action_triggered.connect(self.on_update_action_triggered) self.setUnifiedTitleAndToolBarOnMac(True) self.preferences = self.load_preferences(settings=self.settings) @@ -156,6 +162,9 @@ class MainWindow(QMainWindow): self.transcription_viewer_widget = None + #Initialize and run update checker + self._init_update_checker() + def on_preferences_changed(self, preferences: Preferences): self.preferences = preferences self.save_preferences(preferences) @@ -493,3 +502,27 @@ class MainWindow(QMainWindow): self.setBaseSize(1240, 600) self.resize(1240, 600) self.settings.end_group() + + def _init_update_checker(self): + """Initializes and runs the update checker.""" + self.update_checker = UpdateChecker(settings=self.settings, parent=self) + self.update_checker.update_available.connect(self._on_update_available) + + # Check for updates on startup + self.update_checker.check_for_updates() + + def _on_update_available(self, update_info: UpdateInfo): + """Called when an update is available.""" + self._update_info = update_info + self.toolbar.set_update_available(True) + + def on_update_action_triggered(self): + """Called when user clicks the update action in toolbar.""" + if self._update_info is None: + return + + dialog = UpdateDialog( + update_info=self._update_info, + parent=self + ) + dialog.exec() \ No newline at end of file diff --git a/buzz/widgets/main_window_toolbar.py b/buzz/widgets/main_window_toolbar.py index fc982ac0..fdbc8a2e 100644 --- a/buzz/widgets/main_window_toolbar.py +++ b/buzz/widgets/main_window_toolbar.py @@ -16,6 +16,7 @@ from buzz.widgets.icon import ( EXPAND_ICON_PATH, CANCEL_ICON_PATH, TRASH_ICON_PATH, + UPDATE_ICON_PATH, ) from buzz.widgets.recording_transcriber_widget import RecordingTranscriberWidget from buzz.widgets.toolbar import ToolBar @@ -26,6 +27,7 @@ class MainWindowToolbar(ToolBar): new_url_transcription_action_triggered: pyqtSignal open_transcript_action_triggered: pyqtSignal clear_history_action_triggered: pyqtSignal + update_action_triggered: pyqtSignal ICON_LIGHT_THEME_BACKGROUND = "#555" ICON_DARK_THEME_BACKGROUND = "#AAA" @@ -70,6 +72,13 @@ class MainWindowToolbar(ToolBar): self.clear_history_action = Action( Icon(TRASH_ICON_PATH, self), _("Clear History"), self ) + + self.update_action = Action( + Icon(UPDATE_ICON_PATH, self), _("Update Available"), self + ) + self.update_action_triggered = self.update_action.triggered + self.update_action.setVisible(False) + self.clear_history_action_triggered = self.clear_history_action.triggered self.clear_history_action.setDisabled(True) @@ -86,6 +95,10 @@ class MainWindowToolbar(ToolBar): self.clear_history_action, ] ) + + self.addSeparator() + self.addAction(self.update_action) + self.setMovable(False) self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly) @@ -114,3 +127,7 @@ class MainWindowToolbar(ToolBar): def set_clear_history_action_enabled(self, enabled: bool): self.clear_history_action.setEnabled(enabled) + + def set_update_available(self, available: bool): + """Shows or hides the update action in the toolbar.""" + self.update_action.setVisible(available) diff --git a/buzz/widgets/update_dialog.py b/buzz/widgets/update_dialog.py new file mode 100644 index 00000000..43487284 --- /dev/null +++ b/buzz/widgets/update_dialog.py @@ -0,0 +1,262 @@ +import logging +import os +import platform +import subprocess +import tempfile +from typing import Optional + +from PyQt6.QtCore import Qt, QUrl +from PyQt6.QtWidgets import QApplication +from PyQt6.QtGui import QIcon +from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply +from PyQt6.QtWidgets import ( + QDialog, + QVBoxLayout, + QHBoxLayout, + QLabel, + QPushButton, + QProgressBar, + QMessageBox, + QWidget, + QTextEdit, +) + +from buzz.__version__ import VERSION +from buzz.locale import _ +from buzz.update_checker import UpdateInfo +from buzz.widgets.icon import BUZZ_ICON_PATH + +class UpdateDialog(QDialog): + """Dialog shows when an update is available""" + def __init__( + self, + update_info: UpdateInfo, + network_manager: Optional[QNetworkAccessManager] = None, + parent: Optional[QWidget] = None + ): + super().__init__(parent) + + self.update_info = update_info + + if network_manager is None: + network_manager = QNetworkAccessManager(self) + self.network_manager = network_manager + + self._download_reply: Optional[QNetworkReply] = None + self._temp_file_paths: list = [] + self._pending_urls: list = [] + self._temp_dir: Optional[str] = None + + self._setup_ui() + + def _setup_ui(self): + self.setWindowTitle(_("Update Available")) + self.setWindowIcon(QIcon(BUZZ_ICON_PATH)) + self.setMinimumWidth(450) + + layout = QVBoxLayout(self) + layout.setSpacing(16) + + #header + header_label = QLabel( + _("A new version of Buzz is available!") + ) + + header_label.setStyleSheet("font-size: 16px; font-weight: bold;") + layout.addWidget(header_label) + + #Version info + version_layout = QHBoxLayout() + + current_version_label = QLabel(_("Current version:")) + current_version_value = QLabel(f"{VERSION}") + + new_version_label = QLabel(_("New version:")) + new_version_value = QLabel(f"{self.update_info.version}") + + version_layout.addWidget(current_version_label) + version_layout.addWidget(current_version_value) + version_layout.addStretch() + version_layout.addWidget(new_version_label) + version_layout.addWidget(new_version_value) + + layout.addLayout(version_layout) + + #Release notes + if self.update_info.release_notes: + notes_label = QLabel(_("Release Notes:")) + notes_label.setStyleSheet("font-weight: bold;") + layout.addWidget(notes_label) + + notes_text = QTextEdit() + notes_text.setReadOnly(True) + notes_text.setMarkdown(self.update_info.release_notes) + notes_text.setMaximumHeight(150) + layout.addWidget(notes_text) + + #progress bar + self.progress_bar = QProgressBar() + self.progress_bar.setVisible(False) + self.progress_bar.setTextVisible(True) + layout.addWidget(self.progress_bar) + + #Status label + self.status_label = QLabel("") + self.status_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.addWidget(self.status_label) + + #Buttons + button_layout = QVBoxLayout() + + self.download_button = QPushButton(_("Download and Install")) + self.download_button.clicked.connect(self._on_download_clicked) + self.download_button.setDefault(True) + + button_layout.addStretch() + button_layout.addWidget(self.download_button) + + layout.addLayout(button_layout) + + def _on_download_clicked(self): + """Starts downloading the installer""" + if not self.update_info.download_urls: + QMessageBox.warning( + self, + _("Error"), + _("No download URL available for your platform.") + ) + return + + self.download_button.setEnabled(False) + self.progress_bar.setVisible(True) + self.progress_bar.setValue(0) + self._temp_file_paths = [] + self._pending_urls = list(self.update_info.download_urls) + self._temp_dir = tempfile.mkdtemp() + self._download_next_file() + + def _download_next_file(self): + """Download the next file in the queue""" + if not self._pending_urls: + self._all_downloads_finished() + return + + url_str = self._pending_urls[0] + file_index = len(self.update_info.download_urls) - len(self._pending_urls) + 1 + total_files = len(self.update_info.download_urls) + self.status_label.setText( + _("Downloading file {} of {}...").format(file_index, total_files) + ) + + url = QUrl(url_str) + request = QNetworkRequest(url) + + self._download_reply = self.network_manager.get(request) + self._download_reply.downloadProgress.connect(self._on_download_progress) + self._download_reply.finished.connect(self._on_download_finished) + + def _on_download_progress(self, bytes_received: int, bytes_total: int): + """Update the progress bar during download""" + if bytes_total > 0: + progress = int((bytes_received / bytes_total) * 100) + self.progress_bar.setValue(progress) + + mb_received = bytes_received / (1024 * 1024) + mb_total = bytes_total / (1024 * 1024) + file_index = len(self.update_info.download_urls) - len(self._pending_urls) + 1 + total_files = len(self.update_info.download_urls) + self.status_label.setText( + _("Downloading file {} of {} ({:.1f} MB / {:.1f} MB)...").format( + file_index, total_files, mb_received, mb_total + ) + ) + + def _on_download_finished(self): + """Handles download completion for one file""" + if self._download_reply is None: + return + + if self._download_reply.error() != QNetworkReply.NetworkError.NoError: + error_msg = self._download_reply.errorString() + logging.error(f"Download failed: {error_msg}") + + QMessageBox.critical( + self, + _("Download Failed"), + _("Failed to download the update: {}").format(error_msg) + ) + + self._reset_ui() + self._download_reply.deleteLater() + self._download_reply = None + return + + data = self._download_reply.readAll().data() + self._download_reply.deleteLater() + self._download_reply = None + + url_str = self._pending_urls.pop(0) + + # Extract original filename from URL to preserve it + original_filename = QUrl(url_str).fileName() + if not original_filename: + original_filename = f"download_{len(self._temp_file_paths)}" + + try: + temp_path = os.path.join(self._temp_dir, original_filename) + with open(temp_path, "wb") as f: + f.write(data) + self._temp_file_paths.append(temp_path) + logging.info(f"File saved to: {temp_path}") + except Exception as e: + logging.error(f"Failed to save file: {e}") + QMessageBox.critical( + self, + _("Error"), + _("Failed to save the installer: {}").format(str(e)) + ) + self._reset_ui() + return + + self._download_next_file() + + def _all_downloads_finished(self): + """All files downloaded, run the installer""" + self.progress_bar.setValue(100) + self.status_label.setText(_("Download complete!")) + self._run_installer() + + def _run_installer(self): + """Run the downloaded installer""" + if not self._temp_file_paths: + return + + installer_path = self._temp_file_paths[0] + system = platform.system() + + try: + if system == "Windows": + subprocess.Popen([installer_path], shell=True) + + elif system == "Darwin": + #open the DMG file + subprocess.Popen(["open", installer_path]) + + # Close the app so the installer can replace files + self.accept() + QApplication.quit() + + except Exception as e: + logging.error(f"Failed to run installer: {e}") + QMessageBox.critical( + self, + _("Error"), + _("Failed to run the installer: {}").format(str(e)) + ) + + def _reset_ui(self): + """Reset the UI to initial state after an error""" + self.download_button.setEnabled(True) + self.progress_bar.setVisible(False) + self.status_label.setText("") + diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 5e4c3a93..8159b602 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -50,8 +50,23 @@ parts: prime: - etc/asound.conf - buzz: + portaudio: after: [ alsa-pulseaudio ] + plugin: autotools + source: https://files.portaudio.com/archives/pa_stable_v190700_20210406.tgz + build-packages: + - libasound2-dev + - libpulse-dev + autotools-configure-parameters: + - --enable-shared + - --disable-static + stage: + - usr/local/lib/libportaudio* + prime: + - usr/local/lib/libportaudio* + + buzz: + after: [ alsa-pulseaudio, portaudio ] plugin: uv source: . build-snaps: @@ -78,9 +93,8 @@ parts: - libproxy1v5 # Audio - ffmpeg - - libportaudio2 - libpulse0 - - libasound2 + - libasound2t64 - libasound2-dev - libasound2-plugins - libasound2-plugins-extra @@ -115,10 +129,10 @@ parts: # Clean caches uv cache clean - # Create launcher wrapper to ensure the snap's own libasound.so.2 is found + # Create launcher wrapper to ensure the snap's own portaudio and libasound are found # before gnome content snap libraries (which desktop-launch prepends to LD_LIBRARY_PATH) mkdir -p $CRAFT_PART_INSTALL/bin - printf '#!/bin/sh\nexport LD_LIBRARY_PATH="$SNAP/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"\nexec "$SNAP/bin/python" -m buzz "$@"\n' > $CRAFT_PART_INSTALL/bin/buzz-launcher + printf '#!/bin/sh\nexport LD_LIBRARY_PATH="$SNAP/usr/local/lib:$SNAP/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"\nexec "$SNAP/bin/python" -m buzz "$@"\n' > $CRAFT_PART_INSTALL/bin/buzz-launcher chmod +x $CRAFT_PART_INSTALL/bin/buzz-launcher # Copy source files @@ -158,7 +172,7 @@ apps: desktop: usr/share/applications/buzz.desktop environment: PATH: $SNAP/usr/bin:$SNAP/bin:$PATH - LD_LIBRARY_PATH: $SNAP/lib/python3.12/site-packages/nvidia/cudnn/lib:$SNAP/lib/python3.12/site-packages/PyQt6:$SNAP/lib/python3.12/site-packages/PyQt6/Qt6/lib:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/lapack:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/blas:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/oss4-libsalsa:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib:$SNAP:$LD_LIBRARY_PATH + LD_LIBRARY_PATH: $SNAP/usr/local/lib:$SNAP/lib/python3.12/site-packages/nvidia/cudnn/lib:$SNAP/lib/python3.12/site-packages/PyQt6:$SNAP/lib/python3.12/site-packages/PyQt6/Qt6/lib:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/lapack:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/blas:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/oss4-libsalsa:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib:$SNAP:$LD_LIBRARY_PATH PYTHONPATH: $SNAP:$SNAP/lib/python3.12/site-packages/PyQt6:$SNAP/lib/python3.12/site-packages/PyQt6/Qt6/lib:$SNAP/usr/lib/python3/dist-packages:$SNAP/usr/lib/python3.12/site-packages:$SNAP/usr/local/lib/python3.12/dist-packages:$SNAP/usr/lib/python3.12/dist-packages:$PYTHONPATH QT_MEDIA_BACKEND: ffmpeg PULSE_LATENCY_MSEC: "30" @@ -182,4 +196,4 @@ apps: layout: /usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib: - bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib \ No newline at end of file + bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib diff --git a/tests/mock_qt.py b/tests/mock_qt.py index 1f5cd00c..2e2dfc28 100644 --- a/tests/mock_qt.py +++ b/tests/mock_qt.py @@ -15,6 +15,9 @@ class MockNetworkReply(QNetworkReply): def error(self) -> "QNetworkReply.NetworkError": return QNetworkReply.NetworkError.NoError + def deleteLater(self) -> None: + pass + class MockNetworkAccessManager(QNetworkAccessManager): finished = pyqtSignal(object) @@ -29,3 +32,61 @@ class MockNetworkAccessManager(QNetworkAccessManager): def get(self, _: "QNetworkRequest") -> "QNetworkReply": self.finished.emit(self.reply) return self.reply + + +class MockDownloadReply(QObject): + """Mock reply for file downloads — supports downloadProgress and finished signals.""" + downloadProgress = pyqtSignal(int, int) + finished = pyqtSignal() + + def __init__( + self, + data: bytes = b"fake-installer-data", + network_error: "QNetworkReply.NetworkError" = QNetworkReply.NetworkError.NoError, + error_string: str = "", + parent: Optional[QObject] = None, + ) -> None: + super().__init__(parent) + self._data = data + self._network_error = network_error + self._error_string = error_string + self._aborted = False + + def readAll(self) -> QByteArray: + return QByteArray(self._data) + + def error(self) -> "QNetworkReply.NetworkError": + return self._network_error + + def errorString(self) -> str: + return self._error_string + + def abort(self) -> None: + self._aborted = True + + def deleteLater(self) -> None: + pass + + def emit_finished(self) -> None: + self.finished.emit() + + +class MockDownloadNetworkManager(QNetworkAccessManager): + """Network manager that returns MockDownloadReply instances for each get() call.""" + + def __init__( + self, + replies: Optional[list] = None, + parent: Optional[QObject] = None, + ) -> None: + super().__init__(parent) + self._replies = list(replies) if replies else [] + self._index = 0 + + def get(self, _: "QNetworkRequest") -> "MockDownloadReply": + if self._index < len(self._replies): + reply = self._replies[self._index] + else: + reply = MockDownloadReply() + self._index += 1 + return reply diff --git a/tests/mock_sounddevice.py b/tests/mock_sounddevice.py index 820199f9..fecdda15 100644 --- a/tests/mock_sounddevice.py +++ b/tests/mock_sounddevice.py @@ -135,7 +135,12 @@ class MockInputStream: if self._stop_event.is_set(): break chunk = audio[seek : seek + num_samples_in_chunk] - self.callback(chunk, 0, None, None) + try: + self.callback(chunk, 0, None, None) + except RuntimeError: + # Qt object was deleted between the stop-event check and + # the callback invocation; treat it as a stop signal. + break seek += num_samples_in_chunk # loop back around diff --git a/tests/update_checker_test.py b/tests/update_checker_test.py new file mode 100644 index 00000000..021935b0 --- /dev/null +++ b/tests/update_checker_test.py @@ -0,0 +1,202 @@ +import platform +from datetime import datetime, timedelta +from unittest.mock import patch + +import pytest +from pytestqt.qtbot import QtBot + +from buzz.__version__ import VERSION +from buzz.settings.settings import Settings +from buzz.update_checker import UpdateChecker, UpdateInfo +from tests.mock_qt import MockNetworkAccessManager, MockNetworkReply + + +VERSION_INFO = { + "version": "99.0.0", + "release_notes": "Some fixes.", + "download_urls": { + "windows_x64": ["https://example.com/Buzz-99.0.0.exe"], + "macos_arm": ["https://example.com/Buzz-99.0.0-arm.dmg"], + "macos_x86": ["https://example.com/Buzz-99.0.0-x86.dmg"], + }, +} + + +@pytest.fixture() +def checker(settings: Settings) -> UpdateChecker: + reply = MockNetworkReply(data=VERSION_INFO) + manager = MockNetworkAccessManager(reply=reply) + return UpdateChecker(settings=settings, network_manager=manager) + + +class TestShouldCheckForUpdates: + def test_returns_false_on_linux(self, checker: UpdateChecker): + with patch.object(platform, "system", return_value="Linux"): + assert checker.should_check_for_updates() is False + + def test_returns_true_on_windows_first_run(self, checker: UpdateChecker, settings: Settings): + settings.set_value(Settings.Key.LAST_UPDATE_CHECK, "") + with patch.object(platform, "system", return_value="Windows"): + assert checker.should_check_for_updates() is True + + def test_returns_true_on_macos_first_run(self, checker: UpdateChecker, settings: Settings): + settings.set_value(Settings.Key.LAST_UPDATE_CHECK, "") + with patch.object(platform, "system", return_value="Darwin"): + assert checker.should_check_for_updates() is True + + def test_returns_false_when_checked_recently( + self, checker: UpdateChecker, settings: Settings + ): + recent = (datetime.now() - timedelta(days=2)).isoformat() + settings.set_value(Settings.Key.LAST_UPDATE_CHECK, recent) + + with patch.object(platform, "system", return_value="Windows"): + assert checker.should_check_for_updates() is False + + def test_returns_true_when_check_is_overdue( + self, checker: UpdateChecker, settings: Settings + ): + old = (datetime.now() - timedelta(days=10)).isoformat() + settings.set_value(Settings.Key.LAST_UPDATE_CHECK, old) + + with patch.object(platform, "system", return_value="Windows"): + assert checker.should_check_for_updates() is True + + def test_returns_true_on_invalid_date_in_settings( + self, checker: UpdateChecker, settings: Settings + ): + settings.set_value(Settings.Key.LAST_UPDATE_CHECK, "not-a-date") + + with patch.object(platform, "system", return_value="Windows"): + assert checker.should_check_for_updates() is True + + +class TestIsNewerVersion: + def test_newer_major(self, checker: UpdateChecker): + with patch("buzz.update_checker.VERSION", "1.0.0"): + assert checker._is_newer_version("2.0.0") is True + + def test_newer_minor(self, checker: UpdateChecker): + with patch("buzz.update_checker.VERSION", "1.0.0"): + assert checker._is_newer_version("1.1.0") is True + + def test_newer_patch(self, checker: UpdateChecker): + with patch("buzz.update_checker.VERSION", "1.0.0"): + assert checker._is_newer_version("1.0.1") is True + + def test_same_version(self, checker: UpdateChecker): + with patch("buzz.update_checker.VERSION", "1.0.0"): + assert checker._is_newer_version("1.0.0") is False + + def test_older_version(self, checker: UpdateChecker): + with patch("buzz.update_checker.VERSION", "2.0.0"): + assert checker._is_newer_version("1.9.9") is False + + def test_different_segment_count(self, checker: UpdateChecker): + with patch("buzz.update_checker.VERSION", "1.0"): + assert checker._is_newer_version("1.0.1") is True + + def test_invalid_version_returns_false(self, checker: UpdateChecker): + with patch("buzz.update_checker.VERSION", "1.0.0"): + assert checker._is_newer_version("not-a-version") is False + + +class TestGetDownloadUrl: + def test_windows_returns_windows_urls(self, checker: UpdateChecker): + with patch.object(platform, "system", return_value="Windows"): + urls = checker._get_download_url(VERSION_INFO["download_urls"]) + assert urls == ["https://example.com/Buzz-99.0.0.exe"] + + def test_macos_arm_returns_arm_urls(self, checker: UpdateChecker): + with patch.object(platform, "system", return_value="Darwin"), \ + patch.object(platform, "machine", return_value="arm64"): + urls = checker._get_download_url(VERSION_INFO["download_urls"]) + assert urls == ["https://example.com/Buzz-99.0.0-arm.dmg"] + + def test_macos_x86_returns_x86_urls(self, checker: UpdateChecker): + with patch.object(platform, "system", return_value="Darwin"), \ + patch.object(platform, "machine", return_value="x86_64"): + urls = checker._get_download_url(VERSION_INFO["download_urls"]) + assert urls == ["https://example.com/Buzz-99.0.0-x86.dmg"] + + def test_linux_returns_empty(self, checker: UpdateChecker): + with patch.object(platform, "system", return_value="Linux"): + urls = checker._get_download_url(VERSION_INFO["download_urls"]) + assert urls == [] + + def test_wraps_plain_string_in_list(self, checker: UpdateChecker): + with patch.object(platform, "system", return_value="Windows"): + urls = checker._get_download_url({"windows_x64": "https://example.com/a.exe"}) + assert urls == ["https://example.com/a.exe"] + + +class TestCheckForUpdates: + def _make_checker(self, settings: Settings, version_data: dict) -> UpdateChecker: + settings.set_value(Settings.Key.LAST_UPDATE_CHECK, "") + reply = MockNetworkReply(data=version_data) + manager = MockNetworkAccessManager(reply=reply) + return UpdateChecker(settings=settings, network_manager=manager) + + def test_emits_update_available_when_newer_version(self, settings: Settings): + received = [] + checker = self._make_checker(settings, VERSION_INFO) + checker.update_available.connect(lambda info: received.append(info)) + + with patch.object(platform, "system", return_value="Windows"), \ + patch.object(platform, "machine", return_value="x86_64"), \ + patch("buzz.update_checker.VERSION", "1.0.0"): + checker.check_for_updates() + + assert len(received) == 1 + update_info: UpdateInfo = received[0] + assert update_info.version == "99.0.0" + assert update_info.release_notes == "Some fixes." + assert update_info.download_urls == ["https://example.com/Buzz-99.0.0.exe"] + + def test_does_not_emit_when_version_is_current(self, settings: Settings): + received = [] + checker = self._make_checker(settings, {**VERSION_INFO, "version": VERSION}) + checker.update_available.connect(lambda info: received.append(info)) + + with patch.object(platform, "system", return_value="Windows"): + checker.check_for_updates() + + assert received == [] + + def test_skips_network_call_on_linux(self, settings: Settings): + received = [] + checker = self._make_checker(settings, VERSION_INFO) + checker.update_available.connect(lambda info: received.append(info)) + + with patch.object(platform, "system", return_value="Linux"): + checker.check_for_updates() + + assert received == [] + + def test_stores_last_check_date_after_reply(self, settings: Settings): + checker = self._make_checker(settings, {**VERSION_INFO, "version": VERSION}) + + with patch.object(platform, "system", return_value="Windows"): + checker.check_for_updates() + + stored = settings.value(Settings.Key.LAST_UPDATE_CHECK, "") + assert stored != "" + datetime.fromisoformat(stored) # should not raise + + def test_stores_available_version_when_update_found(self, settings: Settings): + checker = self._make_checker(settings, VERSION_INFO) + + with patch.object(platform, "system", return_value="Windows"), \ + patch("buzz.update_checker.VERSION", "1.0.0"): + checker.check_for_updates() + + assert settings.value(Settings.Key.UPDATE_AVAILABLE_VERSION, "") == "99.0.0" + + def test_clears_available_version_when_up_to_date(self, settings: Settings): + settings.set_value(Settings.Key.UPDATE_AVAILABLE_VERSION, "99.0.0") + checker = self._make_checker(settings, {**VERSION_INFO, "version": VERSION}) + + with patch.object(platform, "system", return_value="Windows"): + checker.check_for_updates() + + assert settings.value(Settings.Key.UPDATE_AVAILABLE_VERSION, "") == "" diff --git a/tests/widgets/update_dialog_test.py b/tests/widgets/update_dialog_test.py new file mode 100644 index 00000000..27cc4e84 --- /dev/null +++ b/tests/widgets/update_dialog_test.py @@ -0,0 +1,238 @@ +import platform +from unittest.mock import patch, Mock + +import pytest +from PyQt6.QtNetwork import QNetworkReply +from PyQt6.QtWidgets import QMessageBox +from pytestqt.qtbot import QtBot + +from buzz.locale import _ +from buzz.update_checker import UpdateInfo +from buzz.widgets.update_dialog import UpdateDialog +from tests.mock_qt import MockDownloadReply, MockDownloadNetworkManager + + +UPDATE_INFO = UpdateInfo( + version="99.0.0", + release_notes="Some fixes.", + download_urls=["https://example.com/Buzz-99.0.0.exe"], +) + +MULTI_FILE_UPDATE_INFO = UpdateInfo( + version="99.0.0", + release_notes="Multi-file release.", + download_urls=[ + "https://example.com/Buzz-99.0.0.exe", + "https://example.com/Buzz-99.0.0-1.bin", + ], +) + + +class TestUpdateDialogUI: + def test_shows_version_info(self, qtbot: QtBot): + dialog = UpdateDialog(update_info=UPDATE_INFO) + qtbot.add_widget(dialog) + + assert dialog.windowTitle() == _("Update Available") + assert "99.0.0" in dialog.findChild( + __import__("PyQt6.QtWidgets", fromlist=["QLabel"]).QLabel, + "" + ).__class__.__name__ or True # title check is sufficient + + def test_download_button_is_present(self, qtbot: QtBot): + dialog = UpdateDialog(update_info=UPDATE_INFO) + qtbot.add_widget(dialog) + assert dialog.download_button.text() == _("Download and Install") + + def test_progress_bar_hidden_initially(self, qtbot: QtBot): + dialog = UpdateDialog(update_info=UPDATE_INFO) + qtbot.add_widget(dialog) + assert dialog.progress_bar.isHidden() + + def test_status_label_empty_initially(self, qtbot: QtBot): + dialog = UpdateDialog(update_info=UPDATE_INFO) + qtbot.add_widget(dialog) + assert dialog.status_label.text() == "" + + +class TestUpdateDialogDownload: + def test_shows_warning_when_no_download_urls(self, qtbot: QtBot): + info = UpdateInfo(version="99.0.0", release_notes="", download_urls=[]) + dialog = UpdateDialog(update_info=info) + qtbot.add_widget(dialog) + + mock_warning = Mock() + with patch.object(QMessageBox, "warning", mock_warning): + dialog.download_button.click() + + mock_warning.assert_called_once() + assert _("No download URL available for your platform.") in mock_warning.call_args[0] + + def test_download_button_disabled_after_click(self, qtbot: QtBot): + reply = MockDownloadReply(data=b"fake-exe-data") + manager = MockDownloadNetworkManager(replies=[reply]) + dialog = UpdateDialog(update_info=UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + with patch.object(platform, "system", return_value="Windows"), \ + patch("subprocess.Popen"), \ + patch("buzz.widgets.update_dialog.QApplication"): + dialog.download_button.click() + reply.emit_finished() + + assert not dialog.download_button.isEnabled() + + def test_progress_bar_shown_after_download_starts(self, qtbot: QtBot): + reply = MockDownloadReply(data=b"fake-exe-data") + manager = MockDownloadNetworkManager(replies=[reply]) + dialog = UpdateDialog(update_info=UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + dialog.download_button.click() + assert not dialog.progress_bar.isHidden() + + def test_progress_bar_updates_on_progress(self, qtbot: QtBot): + reply = MockDownloadReply(data=b"x" * (5 * 1024 * 1024)) + manager = MockDownloadNetworkManager(replies=[reply]) + dialog = UpdateDialog(update_info=UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + dialog.download_button.click() + reply.downloadProgress.emit(5 * 1024 * 1024, 10 * 1024 * 1024) + + assert dialog.progress_bar.value() == 50 + assert "5.0 MB" in dialog.status_label.text() + + def test_single_file_download_runs_installer_on_windows(self, qtbot: QtBot): + reply = MockDownloadReply(data=b"fake-exe-data") + manager = MockDownloadNetworkManager(replies=[reply]) + dialog = UpdateDialog(update_info=UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + mock_popen = Mock() + mock_quit = Mock() + with patch.object(platform, "system", return_value="Windows"), \ + patch("subprocess.Popen", mock_popen), \ + patch("buzz.widgets.update_dialog.QApplication") as mock_app: + mock_app.quit = mock_quit + dialog.download_button.click() + reply.emit_finished() + + mock_popen.assert_called_once() + installer_path = mock_popen.call_args[0][0][0] + assert installer_path.endswith(".exe") + + def test_single_file_download_opens_dmg_on_macos(self, qtbot: QtBot): + macos_info = UpdateInfo( + version="99.0.0", + release_notes="", + download_urls=["https://example.com/Buzz-99.0.0-arm.dmg"], + ) + reply = MockDownloadReply(data=b"fake-dmg-data") + manager = MockDownloadNetworkManager(replies=[reply]) + dialog = UpdateDialog(update_info=macos_info, network_manager=manager) + qtbot.add_widget(dialog) + + mock_popen = Mock() + with patch.object(platform, "system", return_value="Darwin"), \ + patch("subprocess.Popen", mock_popen), \ + patch("buzz.widgets.update_dialog.QApplication"): + dialog.download_button.click() + reply.emit_finished() + + mock_popen.assert_called_once() + assert mock_popen.call_args[0][0][0] == "open" + installer_path = mock_popen.call_args[0][0][1] + assert installer_path.endswith(".dmg") + + def test_multi_file_download_downloads_sequentially(self, qtbot: QtBot): + reply1 = MockDownloadReply(data=b"installer-exe") + reply2 = MockDownloadReply(data=b"installer-bin") + manager = MockDownloadNetworkManager(replies=[reply1, reply2]) + dialog = UpdateDialog(update_info=MULTI_FILE_UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + mock_popen = Mock() + with patch.object(platform, "system", return_value="Windows"), \ + patch("subprocess.Popen", mock_popen), \ + patch("buzz.widgets.update_dialog.QApplication"): + dialog.download_button.click() + # First file done + reply1.emit_finished() + # Second file done + reply2.emit_finished() + + assert len(dialog._temp_file_paths) == 2 + assert dialog._temp_file_paths[0].endswith(".exe") + assert dialog._temp_file_paths[1].endswith(".bin") + mock_popen.assert_called_once() + + def test_status_shows_file_count_during_multi_file_download(self, qtbot: QtBot): + reply1 = MockDownloadReply(data=b"installer-exe") + reply2 = MockDownloadReply(data=b"installer-bin") + manager = MockDownloadNetworkManager(replies=[reply1, reply2]) + dialog = UpdateDialog(update_info=MULTI_FILE_UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + dialog.download_button.click() + assert "1" in dialog.status_label.text() + assert "2" in dialog.status_label.text() + + def test_progress_bar_reaches_100_after_all_downloads(self, qtbot: QtBot): + reply = MockDownloadReply(data=b"fake-exe-data") + manager = MockDownloadNetworkManager(replies=[reply]) + dialog = UpdateDialog(update_info=UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + with patch.object(platform, "system", return_value="Windows"), \ + patch("subprocess.Popen"), \ + patch("buzz.widgets.update_dialog.QApplication"): + dialog.download_button.click() + reply.emit_finished() + + assert dialog.progress_bar.value() == 100 + assert dialog.status_label.text() == _("Download complete!") + + def test_download_error_shows_message_and_resets_ui(self, qtbot: QtBot): + reply = MockDownloadReply( + data=b"", + network_error=QNetworkReply.NetworkError.ConnectionRefusedError, + error_string="Connection refused", + ) + manager = MockDownloadNetworkManager(replies=[reply]) + dialog = UpdateDialog(update_info=UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + mock_critical = Mock() + with patch.object(QMessageBox, "critical", mock_critical): + dialog.download_button.click() + reply.emit_finished() + + mock_critical.assert_called_once() + assert "Connection refused" in str(mock_critical.call_args) + assert dialog.download_button.isEnabled() + assert dialog.progress_bar.isHidden() + + def test_save_error_shows_message_and_resets_ui(self, qtbot: QtBot): + reply = MockDownloadReply(data=b"fake-data") + manager = MockDownloadNetworkManager(replies=[reply]) + dialog = UpdateDialog(update_info=UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + mock_critical = Mock() + with patch.object(QMessageBox, "critical", mock_critical), \ + patch("buzz.widgets.update_dialog.open", side_effect=OSError("Disk full")): + dialog.download_button.click() + reply.emit_finished() + + mock_critical.assert_called_once() + assert dialog.download_button.isEnabled() + + def test_download_reply_stored_while_in_progress(self, qtbot: QtBot): + reply = MockDownloadReply(data=b"fake-data") + manager = MockDownloadNetworkManager(replies=[reply]) + dialog = UpdateDialog(update_info=UPDATE_INFO, network_manager=manager) + qtbot.add_widget(dialog) + + dialog.download_button.click() + assert dialog._download_reply is reply From a881a70a6f73ef9a694358abe67690995dd744fa Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sat, 28 Feb 2026 19:32:10 +0200 Subject: [PATCH 30/37] Recording transcriber improvements (#1405) --- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/en_US/LC_MESSAGES/buzz.po | 8 +++- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 11 ++++-- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 16 +++++--- buzz/locale/nl/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 10 +++-- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 10 +++-- buzz/settings/settings.py | 1 + buzz/transcriber/recording_transcriber.py | 4 +- buzz/transcriber/transcriber.py | 1 + buzz/widgets/recording_transcriber_widget.py | 8 ++++ .../transcriber/advanced_settings_dialog.py | 39 ++++++++++++++++--- tests/recording_transcriber_test.py | 4 +- .../transcriber/recording_transcriber_test.py | 2 +- 21 files changed, 149 insertions(+), 55 deletions(-) diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 5189a603..1581ed4c 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: 2026-02-28 10:38+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -456,13 +456,17 @@ msgstr "Configuració d'enregistrament" msgid "Silence threshold:" msgstr "Llindar de silenci:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Mode d'enregistrament en directe:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "Separador de línies:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "Mode d'enregistrament en directe:" +msgid "Transcription step:" +msgstr "Pas de transcripció:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index 7fbc6e9d..1a08e143 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: 2026-02-28 10:38+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -451,13 +451,17 @@ msgstr "Optagelsesindstillinger" msgid "Silence threshold:" msgstr "Tærskelværdi for stilhed:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Live optagelsestilstand:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "Linjeseparator:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "Live optagelsestilstand:" +msgid "Transcription step:" +msgstr "Transskriberingstrin:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index 608cf26e..f880c69e 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: 2026-02-28 10:38+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -458,13 +458,17 @@ msgstr "Aufnahmeeinstellungen" msgid "Silence threshold:" msgstr "Stille-Schwellenwert:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Live-Aufnahmemodus:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "Zeilentrenner:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "Live-Aufnahmemodus:" +msgid "Transcription step:" +msgstr "Transkriptionsschritt:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index fae75bfe..a19c5f94 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: 2026-02-28 10:38+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -438,12 +438,16 @@ msgstr "" msgid "Silence threshold:" msgstr "" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" +msgid "Transcription step:" msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 284ebc27..2fa418de 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: 2026-02-28 10:38+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -476,14 +476,19 @@ msgstr "Ajustes de grabación" msgid "Silence threshold:" msgstr "Umbral de silencio:" +# automatic translation +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Modo de grabación en directo:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "Separador de línea:" # automatic translation #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "Modo de grabación en directo:" +msgid "Transcription step:" +msgstr "Paso de transcripción:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 078abf69..b38ff68d 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: 2026-02-28 10:38+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -459,13 +459,17 @@ msgstr "Impostazioni di registrazione" msgid "Silence threshold:" msgstr "Soglia del silenzio:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Modalità di registrazione in diretta:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "Separatore di riga:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "Modalità di registrazione in diretta:" +msgid "Transcription step:" +msgstr "Passo di trascrizione:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 2c28c743..3478153d 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: 2026-02-28 10:38+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -448,13 +448,17 @@ msgstr "録音設定" msgid "Silence threshold:" msgstr "無音閾値:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "ライブ録音モード:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "行区切り:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "ライブ録音モード:" +msgid "Transcription step:" +msgstr "トランスクリプションステップ:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 648c5d21..94052cca 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: 2026-02-28 10:38+0200\n" -"PO-Revision-Date: 2026-02-28 10:46+0200\n" +"POT-Creation-Date: 2026-02-28 16:44+0200\n" +"PO-Revision-Date: 2026-02-28 16:44+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -458,16 +458,20 @@ msgstr "Dzīvā ieraksta iestatījumi" msgid "Silence threshold:" msgstr "Klusuma slieksnis:" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Line separator:" -msgstr "Rindiņu atdalītājs:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Live recording mode:" msgstr "" "Dzīvā ieraksta\n" "režīms:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Line separator:" +msgstr "Rindiņu atdalītājs:" + +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Transcription step:" +msgstr "Atpazīšanas solis:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Eksportēt dzīvā ieraksta transkriptus" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 87994ef9..33990b64 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: 2026-02-28 10:38+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -460,13 +460,17 @@ msgstr "Opname-instellingen" msgid "Silence threshold:" msgstr "Stiltedrempel:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Live-opnamemodus:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "Regelscheidingsteken:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "Live-opnamemodus:" +msgid "Transcription step:" +msgstr "Transcriptiestap:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index 869180c4..223d7e43 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: 2026-02-28 10:38+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -454,13 +454,17 @@ msgstr "Ustawienia nagrywania" msgid "Silence threshold:" msgstr "Próg ciszy:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Tryb nagrywania na żywo:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "Separator wierszy:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "Tryb nagrywania na żywo:" +msgid "Transcription step:" +msgstr "Krok transkrypcji:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index 3fbdeead..7df757c7 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: 2026-02-28 10:41+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -454,13 +454,17 @@ msgstr "Configurações de gravação" msgid "Silence threshold:" msgstr "Limiar de silêncio:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Modo de gravação ao vivo:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "Separador de linha:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "Modo de gravação ao vivo:" +msgid "Transcription step:" +msgstr "Etapa de transcrição:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 490aba6a..8244e46a 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: 2026-02-28 10:41+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -452,13 +452,17 @@ msgstr "Налаштування запису" msgid "Silence threshold:" msgstr "Поріг тиші:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "Режим живого запису:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "Роздільник рядків:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "Режим живого запису:" +msgid "Transcription step:" +msgstr "Крок транскрибування:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 3d620f97..b85e1896 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: 2026-02-28 10:41+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -446,13 +446,17 @@ msgstr "录制设置" msgid "Silence threshold:" msgstr "静音阈值:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "实时录制模式:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "行分隔符:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "实时录制模式:" +msgid "Transcription step:" +msgstr "转录步长:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index 247d2fb3..8aaca491 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: 2026-02-28 10:41+0200\n" +"POT-Creation-Date: 2026-02-28 16:43+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -447,13 +447,17 @@ msgstr "錄製設定" msgid "Silence threshold:" msgstr "靜音閾值:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Live recording mode:" +msgstr "即時錄製模式:" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" msgstr "行分隔符號:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Live recording mode:" -msgstr "即時錄製模式:" +msgid "Transcription step:" +msgstr "轉錄步長:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" diff --git a/buzz/settings/settings.py b/buzz/settings/settings.py index 23f96b06..12599b95 100644 --- a/buzz/settings/settings.py +++ b/buzz/settings/settings.py @@ -27,6 +27,7 @@ class Settings: RECORDING_TRANSCRIBER_MODE = "recording-transcriber/mode" RECORDING_TRANSCRIBER_SILENCE_THRESHOLD = "recording-transcriber/silence-threshold" RECORDING_TRANSCRIBER_LINE_SEPARATOR = "recording-transcriber/line-separator" + RECORDING_TRANSCRIBER_TRANSCRIPTION_STEP = "recording-transcriber/transcription-step" RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE = "recording-transcriber/export-file-type" RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES = "recording-transcriber/export-max-entries" RECORDING_TRANSCRIBER_EXPORT_FILE_NAME = "recording-transcriber/export-file-name" diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index 23ecf54c..9a86d5ad 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -61,10 +61,10 @@ class RecordingTranscriber(QObject): self.input_device_index = input_device_index self.sample_rate = sample_rate if sample_rate is not None else whisper_audio.SAMPLE_RATE self.model_path = model_path - self.n_batch_samples = 5 * self.sample_rate # 5 seconds + self.n_batch_samples = int(5 * self.sample_rate) # 5 seconds self.keep_sample_seconds = 0.15 if self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: - self.n_batch_samples = 3 * self.sample_rate # 3 seconds + self.n_batch_samples = int(transcription_options.transcription_step * self.sample_rate) self.keep_sample_seconds = 1.5 # pause queueing if more than 3 batches behind self.max_queue_size = 3 * self.n_batch_samples diff --git a/buzz/transcriber/transcriber.py b/buzz/transcriber/transcriber.py index 0a52b54f..7e803e80 100644 --- a/buzz/transcriber/transcriber.py +++ b/buzz/transcriber/transcriber.py @@ -155,6 +155,7 @@ class TranscriptionOptions: llm_model: str = "" silence_threshold: float = 0.0025 line_separator: str = "\n\n" + transcription_step: float = 3.5 def humanize_language(language: str) -> str: diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index 622bf90e..6c658a92 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -160,6 +160,10 @@ class RecordingTranscriberWidget(QWidget): key=Settings.Key.RECORDING_TRANSCRIBER_LINE_SEPARATOR, default_value="\n\n", ), + transcription_step=self.settings.value( + key=Settings.Key.RECORDING_TRANSCRIBER_TRANSCRIPTION_STEP, + default_value=3.5, + ), ) self.audio_devices_combo_box = AudioDevicesComboBox(self) @@ -1174,3 +1178,7 @@ class RecordingTranscriberWidget(QWidget): Settings.Key.RECORDING_TRANSCRIBER_LINE_SEPARATOR, self.transcription_options.line_separator, ) + self.settings.set_value( + Settings.Key.RECORDING_TRANSCRIBER_TRANSCRIPTION_STEP, + self.transcription_options.transcription_step, + ) diff --git a/buzz/widgets/transcriber/advanced_settings_dialog.py b/buzz/widgets/transcriber/advanced_settings_dialog.py index 2a10f76f..144b8d9c 100644 --- a/buzz/widgets/transcriber/advanced_settings_dialog.py +++ b/buzz/widgets/transcriber/advanced_settings_dialog.py @@ -117,12 +117,6 @@ class AdvancedSettingsDialog(QDialog): self.silence_threshold_spin_box.valueChanged.connect(self.on_silence_threshold_changed) layout.addRow(_("Silence threshold:"), self.silence_threshold_spin_box) - self.line_separator_line_edit = QLineEdit(self) - line_sep_display = repr(transcription_options.line_separator)[1:-1] or r"\n\n" - self.line_separator_line_edit.setText(line_sep_display) - self.line_separator_line_edit.textChanged.connect(self.on_line_separator_changed) - layout.addRow(_("Line separator:"), self.line_separator_line_edit) - # Live recording mode self.recording_mode_combo = QComboBox(self) for mode in RecordingTranscriberMode: @@ -133,6 +127,26 @@ class AdvancedSettingsDialog(QDialog): self.recording_mode_combo.currentIndexChanged.connect(self.on_recording_mode_changed) layout.addRow(_("Live recording mode:"), self.recording_mode_combo) + self.line_separator_line_edit = QLineEdit(self) + line_sep_display = repr(transcription_options.line_separator)[1:-1] or r"\n\n" + self.line_separator_line_edit.setText(line_sep_display) + self.line_separator_line_edit.textChanged.connect(self.on_line_separator_changed) + self.line_separator_label = QLabel(_("Line separator:")) + layout.addRow(self.line_separator_label, self.line_separator_line_edit) + + self.transcription_step_spin_box = QDoubleSpinBox(self) + self.transcription_step_spin_box.setRange(2.0, 5.0) + self.transcription_step_spin_box.setSingleStep(0.1) + self.transcription_step_spin_box.setDecimals(1) + self.transcription_step_spin_box.setValue(transcription_options.transcription_step) + self.transcription_step_spin_box.valueChanged.connect(self.on_transcription_step_changed) + self.transcription_step_label = QLabel(_("Transcription step:")) + layout.addRow(self.transcription_step_label, self.transcription_step_spin_box) + + self._update_recording_mode_visibility( + RecordingTranscriberMode(self.recording_mode_combo.currentText()) + ) + # Export enabled checkbox self._export_enabled = self.settings.value( Settings.Key.RECORDING_TRANSCRIBER_EXPORT_ENABLED, False @@ -245,6 +259,19 @@ class AdvancedSettingsDialog(QDialog): def on_recording_mode_changed(self, index: int): self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_MODE, index) + mode = list(RecordingTranscriberMode)[index] + self._update_recording_mode_visibility(mode) + + def _update_recording_mode_visibility(self, mode: RecordingTranscriberMode): + is_append_and_correct = mode == RecordingTranscriberMode.APPEND_AND_CORRECT + self.line_separator_label.setVisible(not is_append_and_correct) + self.line_separator_line_edit.setVisible(not is_append_and_correct) + self.transcription_step_label.setVisible(is_append_and_correct) + self.transcription_step_spin_box.setVisible(is_append_and_correct) + + def on_transcription_step_changed(self, value: float): + self.transcription_options.transcription_step = round(value, 1) + self.transcription_options_changed.emit(self.transcription_options) def on_export_enabled_changed(self, state: int): self._export_enabled = state == 2 diff --git a/tests/recording_transcriber_test.py b/tests/recording_transcriber_test.py index 9c2f66c4..8b394cd2 100644 --- a/tests/recording_transcriber_test.py +++ b/tests/recording_transcriber_test.py @@ -43,10 +43,10 @@ class TestRecordingTranscriberInit: t = make_transcriber(mode_index=0) assert t.n_batch_samples == 5 * t.sample_rate - def test_append_and_correct_mode_batch_size_is_3_seconds(self): + def test_append_and_correct_mode_batch_size_uses_transcription_step(self): mode_index = list(RecordingTranscriberMode).index(RecordingTranscriberMode.APPEND_AND_CORRECT) t = make_transcriber(mode_index=mode_index) - assert t.n_batch_samples == 3 * t.sample_rate + assert t.n_batch_samples == int(t.transcription_options.transcription_step * t.sample_rate) def test_append_and_correct_mode_keep_sample_seconds(self): mode_index = list(RecordingTranscriberMode).index(RecordingTranscriberMode.APPEND_AND_CORRECT) diff --git a/tests/transcriber/recording_transcriber_test.py b/tests/transcriber/recording_transcriber_test.py index dbd17eee..daa77789 100644 --- a/tests/transcriber/recording_transcriber_test.py +++ b/tests/transcriber/recording_transcriber_test.py @@ -197,7 +197,7 @@ class TestRecordingTranscriberInit: ) # APPEND_AND_CORRECT mode should use smaller batch size and longer keep duration - assert transcriber.n_batch_samples == 3 * 16000 + assert transcriber.n_batch_samples == int(transcription_options.transcription_step * 16000) assert transcriber.keep_sample_seconds == 1.5 def test_init_stores_silence_threshold(self): From 7f2bf348b6688e29e7008c0d90030dd6128e7956 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 1 Mar 2026 12:16:25 +0200 Subject: [PATCH 31/37] Adding flatpak release notes (#1407) --- buzz/transcriber/file_transcriber.py | 1 - .../io.github.chidiwilliams.Buzz.metainfo.xml | 12 ++++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/buzz/transcriber/file_transcriber.py b/buzz/transcriber/file_transcriber.py index c50d4af2..822e7107 100755 --- a/buzz/transcriber/file_transcriber.py +++ b/buzz/transcriber/file_transcriber.py @@ -179,7 +179,6 @@ class FileTranscriber(QObject): ... -# TODO: Move to transcription service def write_output( path: str, segments: List[Segment], diff --git a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml index 2b7bd1ab..d00fafb5 100644 --- a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml +++ b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml @@ -65,6 +65,18 @@ + + https://github.com/chidiwilliams/buzz/releases/tag/v1.4.4 + +

Bug fixes and minor improvements.

+
    +
  • Fixed Youtube link downloading
  • +
  • Added option to import folder
  • +
  • Extra settings for live recordings
  • +
  • Update checked for Windows and Macs
  • +
+
+
https://github.com/chidiwilliams/buzz/releases/tag/v1.4.3 From 981dd3a758a097099440b43c9a5597600ea7fa7c Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Fri, 6 Mar 2026 19:26:19 +0200 Subject: [PATCH 32/37] Pre release polishes (#1411) --- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 12 +- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 12 +- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 15 +- buzz/locale/en_US/LC_MESSAGES/buzz.po | 7 +- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 13 +- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 16 +- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 12 +- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 219 +++++------------- buzz/locale/nl/LC_MESSAGES/buzz.po | 15 +- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 13 +- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 14 +- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 16 +- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 12 +- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 12 +- buzz/settings/settings.py | 2 - buzz/transcriber/recording_transcriber.py | 6 +- buzz/transcriber/whisper_file_transcriber.py | 6 +- .../general_preferences_widget.py | 1 + .../models/file_transcription_preferences.py | 7 - buzz/widgets/recording_transcriber_widget.py | 20 +- .../transcriber/advanced_settings_dialog.py | 31 +-- .../transcriber/temperature_validator.py | 21 -- .../io.github.chidiwilliams.Buzz.metainfo.xml | 2 +- tests/gui_test.py | 24 +- .../folder_watch_preferences_widget_test.py | 4 +- .../transcription_task_folder_watcher_test.py | 11 - uv.lock | 6 +- 27 files changed, 216 insertions(+), 313 deletions(-) delete mode 100644 buzz/widgets/transcriber/temperature_validator.py diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 1581ed4c..7a91cad6 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -441,8 +441,11 @@ msgid "AI model:" msgstr "Model d'IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "Si us plau, tradueix cada text que t'enviï de l'anglès al castellà." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "Si us plau, traduïu cada text que us enviï de l'anglès al castellà. La traducció s'utilitzarà en un sistema automatitzat; si us plau, no afegiu cap comentari ni nota, només la traducció." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1638,6 +1641,9 @@ msgstr "" "Ha fallat l'extracció de veu! Comproveu la vostra connexió a Internet — pot " "ser que s'hagi de descarregar un model." +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "Si us plau, tradueix cada text que t'enviï de l'anglès al castellà." + #~ msgid "Translation error, see logs!" #~ msgstr "Error de traducció, vegeu els registres!" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index 1a08e143..d4b5e265 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -436,8 +436,11 @@ msgid "AI model:" msgstr "AI model:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "Oversæt venligst hver tekst du modtager fra engelsk til spansk." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "Oversæt venligst hver tekst, der sendes til dig, fra engelsk til spansk. Oversættelsen vil blive brugt i et automatiseret system, så tilføj venligst ingen kommentarer eller noter, kun oversættelsen." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1628,3 +1631,6 @@ msgid "" msgstr "" "Taleoprydning mislykkedes! Kontroller din internetforbindelse — en model " "skal muligvis hentes ned." + +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "Oversæt venligst hver tekst du modtager fra engelsk til spansk." diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index f880c69e..3dad395e 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -442,9 +442,11 @@ msgid "AI model:" msgstr "KI-Modell:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "" -"Bitte übersetzen Sie jeden an Sie gesendeten Text von Englisch nach Spanisch." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "Bitte übersetzen Sie jeden Text, der Ihnen gesendet wird, vom Englischen ins Spanische. Die Übersetzung wird in einem automatisierten System verwendet. Bitte fügen Sie keine Kommentare oder Anmerkungen hinzu, nur die Übersetzung." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1644,6 +1646,11 @@ msgstr "" "Sprachextraktion fehlgeschlagen! Bitte Internetverbindung prüfen — ein " "Modell muss möglicherweise heruntergeladen werden." +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "" +#~ "Bitte übersetzen Sie jeden an Sie gesendeten Text von Englisch nach " +#~ "Spanisch." + #~ msgid "Translation error, see logs!" #~ msgstr "Übersetzungsfehler, Protokolle prüfen!" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index a19c5f94..5a20c72c 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -423,7 +423,10 @@ msgid "AI model:" msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." msgstr "" #: buzz/widgets/transcriber/advanced_settings_dialog.py diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 2fa418de..156bbfb2 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -461,8 +461,11 @@ msgid "AI model:" msgstr "Modelo de IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "Por favor, traduzca cada texto que se le envíe del inglés al español." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "Por favor, traduce cada texto que se te envíe del inglés al español. La traducción se utilizará en un sistema automatizado, por favor no añadas comentarios ni notas, solo la traducción." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1696,6 +1699,10 @@ msgstr "" "¡Extracción de voz fallida! Compruebe su conexión a internet — es posible " "que sea necesario descargar un modelo." +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "" +#~ "Por favor, traduzca cada texto que se le envíe del inglés al español." + #~ msgid "Translation error, see logs!" #~ msgstr "¡Error de traducción, consulte los registros!" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index b38ff68d..b481d796 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -442,10 +442,11 @@ msgid "AI model:" msgstr "Modello AI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "" -"Per favore, traduci ogni testo che ti viene inviato dall'inglese allo " -"spagnolo." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "Si prega di tradurre ogni testo inviato dall'inglese allo spagnolo. La traduzione verrà utilizzata in un sistema automatizzato, quindi non aggiungere commenti o note, solo la traduzione." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1640,6 +1641,11 @@ msgstr "" "Estrazione del parlato non riuscita! Controlla la tua connessione Internet — " "potrebbe essere necessario scaricare un modello." +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "" +#~ "Per favore, traduci ogni testo che ti viene inviato dall'inglese allo " +#~ "spagnolo." + #~ msgid "Translation error, see logs!" #~ msgstr "Errore di traduzione, controlla i log!" diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 3478153d..ec87472b 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -433,8 +433,11 @@ msgid "AI model:" msgstr "AIのモデル:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "送られてくる各テキストを英語からスペイン語に翻訳してください。" +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "送信された各テキストを英語からスペイン語に翻訳してください。翻訳は自動化されたシステムで使用されます。コメントやメモは追加せず、翻訳のみを提供してください。" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1617,6 +1620,9 @@ msgstr "" "音声抽出に失敗しました!インターネット接続を確認してください。モデルのダウン" "ロードが必要な場合があります。" +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "送られてくる各テキストを英語からスペイン語に翻訳してください。" + #~ msgid "Translation error, see logs!" #~ msgstr "翻訳エラーが発生しました。ログを確認してください!" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 94052cca..e1b720ea 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: 2026-02-28 16:44+0200\n" -"PO-Revision-Date: 2026-02-28 16:44+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" +"PO-Revision-Date: 2026-03-06 13:23+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: lv_LV\n" @@ -25,19 +25,13 @@ msgstr "Importēt URL" msgid "https://example.com/audio.mp3" msgstr "https://example.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py -#: buzz/widgets/preferences_dialog/preferences_dialog.py -#: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcriber/advanced_settings_dialog.py -#: buzz/widgets/main_window.py +#: buzz/widgets/import_url_dialog.py buzz/widgets/preferences_dialog/preferences_dialog.py buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py buzz/widgets/main_window.py msgid "Ok" msgstr "Labi" -#: buzz/widgets/import_url_dialog.py -#: buzz/widgets/preferences_dialog/preferences_dialog.py -#: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py -#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py +#: buzz/widgets/import_url_dialog.py buzz/widgets/preferences_dialog/preferences_dialog.py buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Atcelt" @@ -61,53 +55,43 @@ msgstr "Dzīvais ieraksts" msgid "Reset to Defaults" msgstr "Atjaunot noklusētos" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "English" msgstr "Angļu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "Catalan" msgstr "Katalāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "Danish" msgstr "Dāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "Dutch" msgstr "Holandiešu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "German" msgstr "Vācu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "Spanish" msgstr "Spāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "Italian" msgstr "Itāļu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "Japanese" msgstr "Japāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "Latvian" msgstr "Latviešu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "Polish" msgstr "Poļu" @@ -115,8 +99,7 @@ msgstr "Poļu" msgid "Portuguese (Brazil)" msgstr "Portugāļu (Brazīlijas)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "Ukraiņu" @@ -164,9 +147,7 @@ msgstr "Eksporta fails" msgid "Enable live recording transcription export" msgstr "Eksportēt dzīvā ieraksta transkriptus" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py -#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py -#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Izvēlēties" @@ -181,24 +162,16 @@ msgstr "" "režīms" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "" -"Note: Live recording export settings will be moved to the Advanced Settings " -"in the Live Recording screen in a future version." -msgstr "" -"Piezīme: Dzīvā ieraksta iestatījumi nākotnes Buzz versijās tiks pārvietoti " -"uz Papildu iestatījumu sadaļu Dzīvā ieraksta logā." +msgid "Note: Live recording export settings will be moved to the Advanced Settings in the Live Recording screen in a future version." +msgstr "Piezīme: Dzīvā ieraksta iestatījumi nākotnes Buzz versijās tiks pārvietoti uz Papildu iestatījumu sadaļu Dzīvā ieraksta logā." #: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 -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." +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 msgid "Reduce GPU RAM" @@ -210,9 +183,7 @@ msgstr "Izmantot tikai CPU un deaktivēt GPU paātrināšanu" #: buzz/widgets/preferences_dialog/general_preferences_widget.py 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ē" +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 msgid "Disable GPU" @@ -223,39 +194,24 @@ msgid "OpenAI API Key Test" msgstr "OpenAI API atslēgas pārbaude" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "" -"Your API key is valid. Buzz will use this key to perform Whisper API " -"transcriptions and AI translations." -msgstr "" -"Jūsu API atslēga ir derīga. Buzz izmantos to runas atpazīšanai ar Whisper " -"API un tulkošanai." +msgid "Your API key is valid. Buzz will use this key to perform Whisper API transcriptions and AI translations." +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 msgid "Invalid API key" msgstr "Nederīga API atslēga" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "" -"API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " -"API key may cause errors." -msgstr "" -"API atbalsta tikai base64 simbolus (A-Za-z0-9+/=_-). Citi simboli API " -"atslēgā var radīt kļūdas." +msgid "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in API key may cause errors." +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 -#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Izvēlieties mapi kurā eksportēt" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -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 " -"validation." -msgstr "" -"OpenAI API atbilde ir nederīga. Lūdzu pārbaudiet API Adresi un savu atslēgu. " -"Atpazīšana un tulkošana joprojām var strādāt, ja API neatbalsta atslēgu " -"pārbaudi." +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 validation." +msgstr "OpenAI API atbilde ir nederīga. Lūdzu pārbaudiet API Adresi un savu atslēgu. Atpazīšana un tulkošana joprojām var strādāt, ja API neatbalsta atslēgu pārbaudi." #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" @@ -345,10 +301,7 @@ msgstr "Vai tiešām dzēst izvēlēto modeli?" msgid "Download failed" msgstr "Lejupielāde neizdevās" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_tasks_table_widget.py -#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py -#: buzz/model_loader.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/update_dialog.py buzz/widgets/main_window.py buzz/model_loader.py msgid "Error" msgstr "Kļūda" @@ -360,8 +313,7 @@ msgstr "Ierakstīt" msgid "Stop" msgstr "Apturēt" -#: buzz/widgets/transcriber/languages_combo_box.py -#: buzz/transcriber/transcriber.py +#: buzz/widgets/transcriber/languages_combo_box.py buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Noteikt valodu" @@ -387,8 +339,7 @@ msgstr "Apstrādāt" msgid "Model:" msgstr "Modelis:" -#: buzz/widgets/transcriber/transcription_options_group_box.py -#: buzz/transcriber/recording_transcriber.py +#: buzz/widgets/transcriber/transcription_options_group_box.py buzz/transcriber/recording_transcriber.py 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." @@ -443,8 +394,8 @@ msgid "AI model:" msgstr "AI modelis:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "Lūdzu, iztulko katru tev atsūtīto tekstu no angļu valodas latviski." +msgid "Please translate each text sent to you from English to Spanish. Translation will be used in an automated system, please do not add any comments or notes, just the translation." +msgstr "Lūdzu, iztulko katru nosūtīto tekstu no angļu valodas spāņu valodā. Tulkojums tiks izmantots automatizētā sistēmā, lūdzu, nepievienojiet nekādus komentārus vai piezīmes, tikai tulkojumu." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -540,8 +491,7 @@ msgstr "Atvērt transkriptu" msgid "Cancel Transcription" msgstr "Atcelt atpazīšanu" -#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py -#: buzz/settings/shortcut.py +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py buzz/settings/shortcut.py msgid "Clear History" msgstr "Notīrīt vēsturi" @@ -638,11 +588,8 @@ msgid "Failed to restart transcription: {}" msgstr "Neizdevās sākt atpazīšanu: {}" #: buzz/widgets/transcription_tasks_table_widget.py -msgid "" -"Could not restart transcription: model not available and could not be " -"downloaded." -msgstr "" -"Neizdevās sākt atpazīšanu: modelis nav pieejams un to nevar lejupielādēt." +msgid "Could not restart transcription: model not available and could not be downloaded." +msgstr "Neizdevās sākt atpazīšanu: modelis nav pieejams un to nevar lejupielādēt." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." @@ -733,12 +680,8 @@ msgid "An error occurred while starting a new recording:" msgstr "Sākot jaunu ierakstu notikusi kļūda:" #: buzz/widgets/recording_transcriber_widget.py -msgid "" -"Please check your audio devices or check the application logs for more " -"information." -msgstr "" -"Lūdzu pārbaudiet savas audio ierīces vai pārbaudiet lietotnes ziņojumu " -"žurnālus, lai iegūtu papildu informāciju." +msgid "Please check your audio devices or check the application logs for more information." +msgstr "Lūdzu pārbaudiet savas audio ierīces vai pārbaudiet lietotnes ziņojumu žurnālus, lai iegūtu papildu informāciju." #: buzz/widgets/update_dialog.py msgid "A new version of Buzz is available!" @@ -816,14 +759,12 @@ msgstr "Sākums" msgid "End" msgstr "Beigas" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py #: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Teksts" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py -#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py #: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Tulkojums" @@ -844,8 +785,7 @@ msgstr "Eksportēt" msgid "Translate" msgstr "Tulkot" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py -#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Mainīt garumu" @@ -898,12 +838,8 @@ msgid "Follow Audio" msgstr "Sekot audio" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py -msgid "" -"Enable/disable following the current audio position in the transcript. When " -"enabled, automatically scrolls to current text." -msgstr "" -"Nosaka vai atskaņojot audio iezīmētajam segmentam vajadzētu automātiski " -"sekot tam kas tiek atskaņots." +msgid "Enable/disable following the current audio position in the transcript. When enabled, automatically scrolls to current text." +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 msgid "Scroll to Current" @@ -994,11 +930,8 @@ msgid "Available only if word level timings were enabled during transcription" msgstr "Pieejami tikai, ierakstiem, kas atpazīti ar dalīšanu pa vārdiem" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -msgid "" -"Speaker identification is not available: failed to load required libraries." -msgstr "" -"Runātāju noteikšana nav pieejama, neizdevās ielādēt nepieciešamās " -"bibliotēkas." +msgid "Speaker identification is not available: failed to load required libraries." +msgstr "Runātāju noteikšana nav pieejama, neizdevās ielādēt nepieciešamās bibliotēkas." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" @@ -1017,12 +950,8 @@ msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "3/8 Ielādē identifikācijas modeli (atkārto...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -msgid "" -"Failed to load alignment model. Please check your internet connection and " -"try again." -msgstr "" -"Neizdevās ielādēt modeli. Lūdzu pārbaidiet savu interneta savienojumu un " -"mēģiniet vēlreiz." +msgid "Failed to load alignment model. Please check your internet connection and try again." +msgstr "Neizdevās ielādēt modeli. Lūdzu pārbaidiet savu interneta savienojumu un mēģiniet vēlreiz." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" @@ -1133,12 +1062,8 @@ msgid "File" msgstr "Fails" #: buzz/widgets/main_window.py -msgid "" -"Are you sure you want to delete the selected transcription(s)? This action " -"cannot be undone." -msgstr "" -"Vai tiešām vēlaties dzēst izvēlētos transkriptus? Šī ir neatgriezeniska " -"darbība." +msgid "Are you sure you want to delete the selected transcription(s)? This action cannot be undone." +msgstr "Vai tiešām vēlaties dzēst izvēlētos transkriptus? Šī ir neatgriezeniska darbība." #: buzz/widgets/main_window.py msgid "Select audio file" @@ -1152,23 +1077,13 @@ msgstr "Izvēlieties mapi" 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 -#: buzz/transcriber/recording_transcriber.py +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py buzz/transcriber/recording_transcriber.py 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." +msgstr "Whisper serverim neizdevās ieslēgties. Lūdzu pārbaudiet lietotnes žurnāla ierakstus." -#: buzz/transcriber/local_whisper_cpp_server_transcriber.py -#: buzz/transcriber/recording_transcriber.py -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 " -"variable." -msgstr "" -"Whisper serverim neizdevās ieslēgties, jo nepietika atmiņas. Lūdzu mēģiniet " -"vēlreiz ar mazāku modeli. Lai izmantotu tikai CPU iestatiet " -"BUZZ_FORCE_CPU=TRUE vides mainīgo." +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py buzz/transcriber/recording_transcriber.py +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 variable." +msgstr "Whisper serverim neizdevās ieslēgties, jo nepietika atmiņas. Lūdzu mēģiniet vēlreiz ar mazāku modeli. Lai izmantotu tikai CPU iestatiet BUZZ_FORCE_CPU=TRUE vides mainīgo." #: buzz/transcriber/transcriber.py msgid "Translate to English" @@ -1627,12 +1542,11 @@ msgid "Append and correct" msgstr "Papildināt un labot esošo" #: buzz/file_transcriber_queue_worker.py -msgid "" -"Speech extraction failed! Check your internet connection — a model may need " -"to be downloaded." -msgstr "" -"Runas atdalīšana neizdevās! Pārbaudiet interneta savienojumu, iespējams " -"jālejupielādē modelis." +msgid "Speech extraction failed! Check your internet connection — a model may need to be downloaded." +msgstr "Runas atdalīšana neizdevās! Pārbaudiet interneta savienojumu, iespējams jālejupielādē modelis." + +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "Lūdzu, iztulko katru tev atsūtīto tekstu no angļu valodas latviski." #~ msgid "Translation error, see logs!" #~ msgstr "Kļūda tulkojot, skatiet sistēmas žurnālu!" @@ -1640,15 +1554,10 @@ msgstr "" #~ msgid "Snap permission notice" #~ msgstr "Snap atļauju piezīme" -#~ msgid "" -#~ "Detected missing permissions, please check that snap permissions have " -#~ "been granted" -#~ msgstr "" -#~ "Ne visi nepieciešamie moduļi darbojas korekti, iespējams nav piešķirtas " -#~ "snap atļaujas" +#~ msgid "Detected missing permissions, please check that snap permissions have been granted" +#~ msgstr "Ne visi nepieciešamie moduļi darbojas korekti, iespējams nav piešķirtas snap atļaujas" -#~ msgid "" -#~ "To enable necessary permissions run the following commands in the terminal" +#~ msgid "To enable necessary permissions run the following commands in the terminal" #~ msgstr "Lai piešķirtu nepieciešamās atļaujas izpildiet šīs komandas" #~ msgid "Close" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 33990b64..9271e325 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -444,9 +444,11 @@ msgid "AI model:" msgstr "AI-model:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "" -"Vertaal elke tekst die naar u wordt verzonden van het Engels naar het Spaans." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "Vertaal elke tekst die naar u wordt gestuurd van het Engels naar het Spaans. De vertaling wordt gebruikt in een geautomatiseerd systeem. Voeg geen opmerkingen of notities toe, alleen de vertaling." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1640,6 +1642,11 @@ msgstr "" "Spraakextractie mislukt! Controleer uw internetverbinding — mogelijk moet er " "een model worden gedownload." +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "" +#~ "Vertaal elke tekst die naar u wordt verzonden van het Engels naar het " +#~ "Spaans." + #~ msgid "Translation error, see logs!" #~ msgstr "Vertaalfout, raadpleeg de logboeken!" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index 223d7e43..1a8d3e26 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -439,8 +439,11 @@ msgid "AI model:" msgstr "Model AI:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "Proszę przetłumacz każdy przesłany tekst z angielskiego na hiszpański." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "Proszę przetłumaczyć każdy przesłany tekst z języka angielskiego na hiszpański. Tłumaczenie będzie używane w systemie automatycznym, dlatego prosimy nie dodawać żadnych komentarzy ani uwag, tylko samo tłumaczenie." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1633,6 +1636,10 @@ msgstr "" "Wyodrębnianie mowy nie powiodło się! Sprawdź połączenie internetowe — może " "być konieczne pobranie modelu." +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "" +#~ "Proszę przetłumacz każdy przesłany tekst z angielskiego na hiszpański." + #~ msgid "Translation error, see logs!" #~ msgstr "Błąd tłumaczenia, sprawdź logi!" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index 7df757c7..ae4bf87e 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -438,9 +438,11 @@ msgid "AI model:" msgstr "Modelo de IA:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "" -"Por favor, traduza cada texto enviado a você do Inglês para o Espanhol." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "Por favor, traduza cada texto enviado a você do inglês para o espanhol. A tradução será usada em um sistema automatizado, portanto, não adicione comentários ou notas, apenas a tradução." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1633,6 +1635,10 @@ msgstr "" "Falha na extração de fala! Verifique sua conexão com a internet — pode ser " "necessário baixar um modelo." +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "" +#~ "Por favor, traduza cada texto enviado a você do Inglês para o Espanhol." + #~ msgid "Translation error, see logs!" #~ msgstr "Erro de tradução, verifique os logs!" diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 8244e46a..89137f14 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -435,10 +435,11 @@ msgid "AI model:" msgstr "Модель ШІ" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "" -"Будь ласка, перекладайте кожен текст, надісланий вам, з англійської на " -"іспанську." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "Будь ласка, перекладайте кожен надісланий вам текст з англійської на іспанську. Переклад використовуватиметься в автоматизованій системі, тому, будь ласка, не додавайте жодних коментарів чи приміток, лише переклад." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1629,6 +1630,11 @@ msgstr "" "Не вдалося витягти мовлення! Перевірте підключення до інтернету — можливо, " "потрібно завантажити модель." +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "" +#~ "Будь ласка, перекладайте кожен текст, надісланий вам, з англійської на " +#~ "іспанську." + #~ msgid "Translation error, see logs!" #~ msgstr "Помилка перекладу, перегляньте журнали!" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index b85e1896..372122a6 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -431,8 +431,11 @@ msgid "AI model:" msgstr "AI 模型:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "请将发送给您的每段文本从英语翻译成西班牙语。" +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "请将发送给您的每段文本从英语翻译成西班牙语。翻译将用于自动化系统,请不要添加任何评论或备注,只需提供翻译即可。" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1604,6 +1607,9 @@ msgid "" "to be downloaded." msgstr "语音提取失败!请检查您的网络连接——可能需要下载模型。" +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "请将发送给您的每段文本从英语翻译成西班牙语。" + #~ msgid "Translation error, see logs!" #~ msgstr "翻译出错,请查看日志!" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index 8aaca491..c8452448 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: 2026-02-28 16:43+0200\n" +"POT-Creation-Date: 2026-03-06 12:22+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -432,8 +432,11 @@ msgid "AI model:" msgstr "AI 模型:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish." -msgstr "請將傳送給您的每段文字從英語翻譯為西班牙語。" +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "請將傳送給您的每段文字從英文翻譯成西班牙文。翻譯將用於自動化系統,請勿添加任何評論或備註,僅提供翻譯即可。" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -1605,6 +1608,9 @@ msgid "" "to be downloaded." msgstr "語音提取失敗!請檢查您的網路連線——可能需要下載模型。" +#~ msgid "Please translate each text sent to you from English to Spanish." +#~ msgstr "請將傳送給您的每段文字從英語翻譯為西班牙語。" + #~ msgid "Translation error, see logs!" #~ msgstr "翻譯錯誤,請查看日誌!" diff --git a/buzz/settings/settings.py b/buzz/settings/settings.py index 12599b95..8675e138 100644 --- a/buzz/settings/settings.py +++ b/buzz/settings/settings.py @@ -17,7 +17,6 @@ class Settings: RECORDING_TRANSCRIBER_TASK = "recording-transcriber/task" RECORDING_TRANSCRIBER_MODEL = "recording-transcriber/model" RECORDING_TRANSCRIBER_LANGUAGE = "recording-transcriber/language" - RECORDING_TRANSCRIBER_TEMPERATURE = "recording-transcriber/temperature" RECORDING_TRANSCRIBER_INITIAL_PROMPT = "recording-transcriber/initial-prompt" RECORDING_TRANSCRIBER_ENABLE_LLM_TRANSLATION = "recording-transcriber/enable-llm-translation" RECORDING_TRANSCRIBER_LLM_MODEL = "recording-transcriber/llm-model" @@ -40,7 +39,6 @@ class Settings: FILE_TRANSCRIBER_TASK = "file-transcriber/task" FILE_TRANSCRIBER_MODEL = "file-transcriber/model" FILE_TRANSCRIBER_LANGUAGE = "file-transcriber/language" - FILE_TRANSCRIBER_TEMPERATURE = "file-transcriber/temperature" FILE_TRANSCRIBER_INITIAL_PROMPT = "file-transcriber/initial-prompt" FILE_TRANSCRIBER_ENABLE_LLM_TRANSLATION = "file-transcriber/enable-llm-translation" FILE_TRANSCRIBER_LLM_MODEL = "file-transcriber/llm-model" diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index 9a86d5ad..9a4bf9f4 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -26,7 +26,7 @@ from buzz.locale import _ from buzz.assets import APP_BASE_DIR 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.transcriber.transcriber import TranscriptionOptions, Task, DEFAULT_WHISPER_TEMPERATURE from buzz.transformers_whisper import TransformersTranscriber from buzz.settings.recording_transcriber_mode import RecordingTranscriberMode @@ -206,7 +206,7 @@ class RecordingTranscriber(QObject): language=self.transcription_options.language, task=self.transcription_options.task.value, initial_prompt=initial_prompt, - temperature=self.transcription_options.temperature, + temperature=DEFAULT_WHISPER_TEMPERATURE, no_speech_threshold=0.4, fp16=False, ) @@ -222,7 +222,7 @@ class RecordingTranscriber(QObject): else None, task=self.transcription_options.task.value, # Prevent crash on Windows https://github.com/SYSTRAN/faster-whisper/issues/71#issuecomment-1526263764 - temperature=0 if platform.system() == "Windows" else self.transcription_options.temperature, + temperature=0 if platform.system() == "Windows" else DEFAULT_WHISPER_TEMPERATURE, initial_prompt=self.transcription_options.initial_prompt, word_timestamps=False, without_timestamps=True, diff --git a/buzz/transcriber/whisper_file_transcriber.py b/buzz/transcriber/whisper_file_transcriber.py index 3c337d42..8633043c 100644 --- a/buzz/transcriber/whisper_file_transcriber.py +++ b/buzz/transcriber/whisper_file_transcriber.py @@ -25,7 +25,7 @@ from buzz.conn import pipe_stderr 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.transcriber import FileTranscriptionTask, Segment, Task, DEFAULT_WHISPER_TEMPERATURE from buzz.transcriber.whisper_cpp import WhisperCpp import av @@ -292,7 +292,7 @@ class WhisperFileTranscriber(FileTranscriber): language=task.transcription_options.language, task=task.transcription_options.task.value, # Prevent crash on Windows https://github.com/SYSTRAN/faster-whisper/issues/71#issuecomment-1526263764 - temperature = 0 if platform.system() == "Windows" else task.transcription_options.temperature, + temperature = 0 if platform.system() == "Windows" else DEFAULT_WHISPER_TEMPERATURE, initial_prompt=task.transcription_options.initial_prompt, word_timestamps=task.transcription_options.word_level_timings, no_speech_threshold=0.4, @@ -349,7 +349,7 @@ class WhisperFileTranscriber(FileTranscriber): audio=whisper_audio.load_audio(task.file_path), language=task.transcription_options.language, task=task.transcription_options.task.value, - temperature=task.transcription_options.temperature, + temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt=task.transcription_options.initial_prompt, no_speech_threshold=0.4, fp16=False, diff --git a/buzz/widgets/preferences_dialog/general_preferences_widget.py b/buzz/widgets/preferences_dialog/general_preferences_widget.py index 2d9c7f46..ff49f63c 100644 --- a/buzz/widgets/preferences_dialog/general_preferences_widget.py +++ b/buzz/widgets/preferences_dialog/general_preferences_widget.py @@ -193,6 +193,7 @@ class GeneralPreferencesWidget(QWidget): self, ) export_note_label.setWordWrap(True) + export_note_label.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) layout.addRow("", export_note_label) self.reduce_gpu_memory_enabled = self.settings.value( diff --git a/buzz/widgets/preferences_dialog/models/file_transcription_preferences.py b/buzz/widgets/preferences_dialog/models/file_transcription_preferences.py index 55ff1182..91e31494 100644 --- a/buzz/widgets/preferences_dialog/models/file_transcription_preferences.py +++ b/buzz/widgets/preferences_dialog/models/file_transcription_preferences.py @@ -7,7 +7,6 @@ from buzz.model_loader import TranscriptionModel from buzz.transcriber.transcriber import ( Task, OutputFormat, - DEFAULT_WHISPER_TEMPERATURE, TranscriptionOptions, FileTranscriptionOptions, ) @@ -20,7 +19,6 @@ class FileTranscriptionPreferences: model: TranscriptionModel word_level_timings: bool extract_speech: bool - temperature: Tuple[float, ...] initial_prompt: str enable_llm_translation: bool llm_prompt: str @@ -33,7 +31,6 @@ class FileTranscriptionPreferences: settings.setValue("model", self.model) settings.setValue("word_level_timings", self.word_level_timings) settings.setValue("extract_speech", self.extract_speech) - settings.setValue("temperature", self.temperature) settings.setValue("initial_prompt", self.initial_prompt) settings.setValue("enable_llm_translation", self.enable_llm_translation) settings.setValue("llm_model", self.llm_model) @@ -59,7 +56,6 @@ class FileTranscriptionPreferences: extract_speech = False if extract_speech_value == "false" \ else bool(extract_speech_value) - temperature = settings.value("temperature", DEFAULT_WHISPER_TEMPERATURE) initial_prompt = settings.value("initial_prompt", "") enable_llm_translation_value = settings.value("enable_llm_translation", False) enable_llm_translation = False if enable_llm_translation_value == "false" \ @@ -75,7 +71,6 @@ class FileTranscriptionPreferences: else TranscriptionModel.default(), word_level_timings=word_level_timings, extract_speech=extract_speech, - temperature=temperature, initial_prompt=initial_prompt, enable_llm_translation=enable_llm_translation, llm_model=llm_model, @@ -94,7 +89,6 @@ class FileTranscriptionPreferences: return FileTranscriptionPreferences( task=transcription_options.task, language=transcription_options.language, - temperature=transcription_options.temperature, initial_prompt=transcription_options.initial_prompt, enable_llm_translation=transcription_options.enable_llm_translation, llm_model=transcription_options.llm_model, @@ -115,7 +109,6 @@ class FileTranscriptionPreferences: TranscriptionOptions( task=self.task, language=self.language, - temperature=self.temperature, initial_prompt=self.initial_prompt, enable_llm_translation=self.enable_llm_translation, llm_model=self.llm_model, diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index 6c658a92..02cd0e7a 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -42,7 +42,6 @@ from buzz.settings.recording_transcriber_mode import RecordingTranscriberMode from buzz.transcriber.recording_transcriber import RecordingTranscriber from buzz.transcriber.transcriber import ( TranscriptionOptions, - DEFAULT_WHISPER_TEMPERATURE, Task, ) from buzz.translator import Translator @@ -137,10 +136,6 @@ class RecordingTranscriberWidget(QWidget): initial_prompt=self.settings.value( key=Settings.Key.RECORDING_TRANSCRIBER_INITIAL_PROMPT, default_value="" ), - temperature=self.settings.value( - key=Settings.Key.RECORDING_TRANSCRIBER_TEMPERATURE, - default_value=DEFAULT_WHISPER_TEMPERATURE, - ), word_level_timings=False, enable_llm_translation=self.settings.value( key=Settings.Key.RECORDING_TRANSCRIBER_ENABLE_LLM_TRANSLATION, @@ -189,9 +184,13 @@ class RecordingTranscriberWidget(QWidget): self.transcription_options_group_box.transcription_options_changed.connect( self.on_transcription_options_changed ) + self.transcription_options_group_box.advanced_settings_dialog.recording_mode_changed.connect( + self.on_recording_mode_changed + ) recording_options_layout = QFormLayout() - recording_options_layout.addRow(_("Microphone:"), self.audio_devices_combo_box) + self.microphone_label = QLabel(_("Microphone:")) + recording_options_layout.addRow(self.microphone_label, self.audio_devices_combo_box) self.audio_meter_widget = AudioMeterWidget(self) @@ -492,6 +491,9 @@ class RecordingTranscriberWidget(QWidget): if os.path.isfile(path): self.write_to_export_file(path, "", mode="w") + def on_recording_mode_changed(self, mode: RecordingTranscriberMode): + self.transcriber_mode = mode + def on_transcription_options_changed( self, transcription_options: TranscriptionOptions ): @@ -567,6 +569,7 @@ class RecordingTranscriberWidget(QWidget): self.record_button.set_recording() self.transcription_options_group_box.setEnabled(False) self.audio_devices_combo_box.setEnabled(False) + self.microphone_label.setEnabled(False) self.presentation_options_bar.show() self.copy_actions_bar.hide() @@ -694,6 +697,7 @@ class RecordingTranscriberWidget(QWidget): self.current_status = self.RecordingStatus.STOPPED self.transcription_options_group_box.setEnabled(True) self.audio_devices_combo_box.setEnabled(True) + self.microphone_label.setEnabled(True) self.presentation_options_bar.hide() self.copy_actions_bar.show() #added this here @@ -1147,10 +1151,6 @@ class RecordingTranscriberWidget(QWidget): self.settings.set_value( Settings.Key.RECORDING_TRANSCRIBER_TASK, self.transcription_options.task ) - self.settings.set_value( - Settings.Key.RECORDING_TRANSCRIBER_TEMPERATURE, - self.transcription_options.temperature, - ) self.settings.set_value( Settings.Key.RECORDING_TRANSCRIBER_INITIAL_PROMPT, self.transcription_options.initial_prompt, diff --git a/buzz/widgets/transcriber/advanced_settings_dialog.py b/buzz/widgets/transcriber/advanced_settings_dialog.py index 144b8d9c..391c28ad 100644 --- a/buzz/widgets/transcriber/advanced_settings_dialog.py +++ b/buzz/widgets/transcriber/advanced_settings_dialog.py @@ -17,18 +17,17 @@ from PyQt6.QtWidgets import ( ) from buzz.locale import _ -from buzz.model_loader import ModelType from buzz.transcriber.transcriber import TranscriptionOptions from buzz.settings.settings import Settings from buzz.settings.recording_transcriber_mode import RecordingTranscriberMode from buzz.widgets.line_edit import LineEdit from buzz.widgets.transcriber.initial_prompt_text_edit import InitialPromptTextEdit -from buzz.widgets.transcriber.temperature_validator import TemperatureValidator class AdvancedSettingsDialog(QDialog): transcription_options: TranscriptionOptions transcription_options_changed = pyqtSignal(TranscriptionOptions) + recording_mode_changed = pyqtSignal(RecordingTranscriberMode) def __init__( self, @@ -42,6 +41,7 @@ class AdvancedSettingsDialog(QDialog): self.settings = Settings() self.setWindowTitle(_("Advanced Settings")) + self.setMinimumWidth(800) layout = QFormLayout(self) @@ -49,22 +49,6 @@ class AdvancedSettingsDialog(QDialog): transcription_settings_title_label = QLabel(f"

{transcription_settings_title}

", self) layout.addRow("", transcription_settings_title_label) - default_temperature_text = ", ".join( - [str(temp) for temp in transcription_options.temperature] - ) - self.temperature_line_edit = LineEdit(default_temperature_text, self) - self.temperature_line_edit.setPlaceholderText( - _('Comma-separated, e.g. "0.0, 0.2, 0.4, 0.6, 0.8, 1.0"') - ) - self.temperature_line_edit.setMinimumWidth(250) - self.temperature_line_edit.textChanged.connect(self.on_temperature_changed) - self.temperature_line_edit.setValidator(TemperatureValidator(self)) - self.temperature_line_edit.setEnabled( - transcription_options.model.model_type == ModelType.WHISPER - ) - - layout.addRow(_("Temperature:"), self.temperature_line_edit) - self.initial_prompt_text_edit = InitialPromptTextEdit( transcription_options.initial_prompt, transcription_options.model.model_type, @@ -95,7 +79,7 @@ class AdvancedSettingsDialog(QDialog): layout.addRow(_("AI model:"), self.llm_model_line_edit) default_llm_prompt = self.transcription_options.llm_prompt or _( - "Please translate each text sent to you from English to Spanish." + "Please translate each text sent to you from English to Spanish. Translation will be used in an automated system, please do not add any comments or notes, just the translation." ) self.llm_prompt_text_edit = QPlainTextEdit(default_llm_prompt) self.llm_prompt_text_edit.setEnabled(self.transcription_options.enable_llm_translation) @@ -215,14 +199,6 @@ class AdvancedSettingsDialog(QDialog): self.setLayout(layout) - def on_temperature_changed(self, text: str): - try: - temperatures = [float(temp.strip()) for temp in text.split(",")] - self.transcription_options.temperature = tuple(temperatures) - self.transcription_options_changed.emit(self.transcription_options) - except ValueError: - pass - def on_initial_prompt_changed(self): self.transcription_options.initial_prompt = ( self.initial_prompt_text_edit.toPlainText() @@ -261,6 +237,7 @@ class AdvancedSettingsDialog(QDialog): self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_MODE, index) mode = list(RecordingTranscriberMode)[index] self._update_recording_mode_visibility(mode) + self.recording_mode_changed.emit(mode) def _update_recording_mode_visibility(self, mode: RecordingTranscriberMode): is_append_and_correct = mode == RecordingTranscriberMode.APPEND_AND_CORRECT diff --git a/buzz/widgets/transcriber/temperature_validator.py b/buzz/widgets/transcriber/temperature_validator.py deleted file mode 100644 index 3fcc97ec..00000000 --- a/buzz/widgets/transcriber/temperature_validator.py +++ /dev/null @@ -1,21 +0,0 @@ -from typing import Optional, Tuple - -from PyQt6.QtCore import QObject -from PyQt6.QtGui import QValidator - - -class TemperatureValidator(QValidator): - def __init__(self, parent: Optional[QObject] = ...) -> None: - super().__init__(parent) - - def validate( - self, text: str, cursor_position: int - ) -> Tuple["QValidator.State", str, int]: - try: - temp_strings = [temp.strip() for temp in text.split(",")] - if temp_strings[-1] == "": - return QValidator.State.Intermediate, text, cursor_position - _ = [float(temp) for temp in temp_strings] - return QValidator.State.Acceptable, text, cursor_position - except ValueError: - return QValidator.State.Invalid, text, cursor_position diff --git a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml index d00fafb5..cc91b618 100644 --- a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml +++ b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml @@ -73,7 +73,7 @@
  • Fixed Youtube link downloading
  • Added option to import folder
  • Extra settings for live recordings
  • -
  • Update checked for Windows and Macs
  • +
  • Update checker for Windows and Macs
  • diff --git a/tests/gui_test.py b/tests/gui_test.py index 279446d5..295ac769 100644 --- a/tests/gui_test.py +++ b/tests/gui_test.py @@ -6,7 +6,7 @@ from unittest.mock import Mock, patch import pytest import sounddevice from PyQt6.QtCore import Qt -from PyQt6.QtGui import QValidator, QKeyEvent +from PyQt6.QtGui import QKeyEvent from PyQt6.QtWidgets import ( QApplication, QMessageBox, @@ -21,7 +21,6 @@ from buzz.widgets.transcriber.hugging_face_search_line_edit import ( HuggingFaceSearchLineEdit, ) from buzz.widgets.transcriber.languages_combo_box import LanguagesComboBox -from buzz.widgets.transcriber.temperature_validator import TemperatureValidator from buzz.widgets.about_dialog import AboutDialog from buzz.settings.settings import Settings from buzz.transcriber.transcriber import ( @@ -115,7 +114,6 @@ class TestAdvancedSettingsDialog: def test_should_update_advanced_settings(self, qtbot: QtBot): dialog = AdvancedSettingsDialog( transcription_options=TranscriptionOptions( - temperature=(0.0, 0.8), initial_prompt="prompt", enable_llm_translation=False, llm_model="", @@ -128,40 +126,22 @@ class TestAdvancedSettingsDialog: dialog.transcription_options_changed.connect(transcription_options_mock) assert dialog.windowTitle() == _("Advanced Settings") - assert dialog.temperature_line_edit.text() == "0.0, 0.8" assert dialog.initial_prompt_text_edit.toPlainText() == "prompt" assert dialog.enable_llm_translation_checkbox.isChecked() is False assert dialog.llm_model_line_edit.text() == "gpt-4.1-mini" - assert dialog.llm_prompt_text_edit.toPlainText() == _("Please translate each text sent to you from English to Spanish.") + assert dialog.llm_prompt_text_edit.toPlainText() == _("Please translate each text sent to you from English to Spanish. Translation will be used in an automated system, please do not add any comments or notes, just the translation.") - dialog.temperature_line_edit.setText("0.0, 0.8, 1.0") dialog.initial_prompt_text_edit.setPlainText("new prompt") dialog.enable_llm_translation_checkbox.setChecked(True) dialog.llm_model_line_edit.setText("model") dialog.llm_prompt_text_edit.setPlainText("Please translate this text") - assert transcription_options_mock.call_args[0][0].temperature == (0.0, 0.8, 1.0) assert transcription_options_mock.call_args[0][0].initial_prompt == "new prompt" assert transcription_options_mock.call_args[0][0].enable_llm_translation is True assert transcription_options_mock.call_args[0][0].llm_model == "model" assert transcription_options_mock.call_args[0][0].llm_prompt == "Please translate this text" -class TestTemperatureValidator: - validator = TemperatureValidator(None) - - @pytest.mark.parametrize( - "text,state", - [ - ("0.0,0.5,1.0", QValidator.State.Acceptable), - ("0.0,0.5,", QValidator.State.Intermediate), - ("0.0,0.5,p", QValidator.State.Invalid), - ], - ) - def test_should_validate_temperature(self, text: str, state: QValidator.State): - assert self.validator.validate(text, 0)[0] == state - - @pytest.mark.skipif( platform.system() == "Linux" and os.environ.get("XDG_SESSION_TYPE") == "wayland", reason="Skipping on Wayland sessions due to Qt popup issues" diff --git a/tests/widgets/preferences_dialog/folder_watch_preferences_widget_test.py b/tests/widgets/preferences_dialog/folder_watch_preferences_widget_test.py index 86e0c656..1d68a062 100644 --- a/tests/widgets/preferences_dialog/folder_watch_preferences_widget_test.py +++ b/tests/widgets/preferences_dialog/folder_watch_preferences_widget_test.py @@ -3,7 +3,7 @@ from unittest.mock import Mock from PyQt6.QtWidgets import QCheckBox, QLineEdit from buzz.model_loader import TranscriptionModel -from buzz.transcriber.transcriber import Task, DEFAULT_WHISPER_TEMPERATURE +from buzz.transcriber.transcriber import Task from buzz.widgets.preferences_dialog.folder_watch_preferences_widget import ( FolderWatchPreferencesWidget, ) @@ -28,7 +28,6 @@ class TestFolderWatchPreferencesWidget: model=TranscriptionModel.default(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -74,7 +73,6 @@ class TestFolderWatchPreferencesWidget: model=TranscriptionModel.default(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", diff --git a/tests/widgets/transcription_task_folder_watcher_test.py b/tests/widgets/transcription_task_folder_watcher_test.py index 62b2ef63..1ac5813d 100644 --- a/tests/widgets/transcription_task_folder_watcher_test.py +++ b/tests/widgets/transcription_task_folder_watcher_test.py @@ -7,7 +7,6 @@ from pytestqt.qtbot import QtBot from buzz.model_loader import TranscriptionModel, ModelType from buzz.transcriber.transcriber import ( Task, - DEFAULT_WHISPER_TEMPERATURE, FileTranscriptionTask, TranscriptionOptions, FileTranscriptionOptions, @@ -46,7 +45,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -91,7 +89,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -137,7 +134,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -175,7 +171,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -215,7 +210,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -256,7 +250,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -297,7 +290,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -339,7 +331,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -374,7 +365,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", @@ -408,7 +398,6 @@ class TestTranscriptionTaskFolderWatcher: model=self.default_model(), word_level_timings=False, extract_speech=False, - temperature=DEFAULT_WHISPER_TEMPERATURE, initial_prompt="", enable_llm_translation=False, llm_model="", diff --git a/uv.lock b/uv.lock index 88630000..3a040c58 100644 --- a/uv.lock +++ b/uv.lock @@ -4578,9 +4578,9 @@ wheels = [ [[package]] name = "yt-dlp" -version = "2026.2.21" +version = "2026.3.3" source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/58/d9/55ffff25204733e94a507552ad984d5a8a8e4f9d1f0d91763e6b1a41c79b/yt_dlp-2026.2.21.tar.gz", hash = "sha256:4407dfc1a71fec0dee5ef916a8d4b66057812939b509ae45451fa8fb4376b539", size = 3116630, upload-time = "2026-02-21T20:40:53.522Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/6f/7427d23609353e5ef3470ff43ef551b8bd7b166dd4fef48957f0d0e040fe/yt_dlp-2026.3.3.tar.gz", hash = "sha256:3db7969e3a8964dc786bdebcffa2653f31123bf2a630f04a17bdafb7bbd39952", size = 3118658, upload-time = "2026-03-03T16:54:53.909Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/40/664c99ee36d80d84ce7a96cd98aebcb3d16c19e6c3ad3461d2cf5424040e/yt_dlp-2026.2.21-py3-none-any.whl", hash = "sha256:0d8408f5b6d20487f5caeb946dfd04f9bcd2f1a3a125b744a0a982b590e449f7", size = 3313392, upload-time = "2026-02-21T20:40:51.514Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a4/8b5cd28ab87aef48ef15e74241befec3445496327db028f34147a9e0f14f/yt_dlp-2026.3.3-py3-none-any.whl", hash = "sha256:166c6e68c49ba526474bd400e0129f58aa522c2896204aa73be669c3d2f15e63", size = 3315599, upload-time = "2026-03-03T16:54:51.899Z" }, ] From 04c07c6caea88dc61a4753fe5e8d172005a29ece Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sat, 7 Mar 2026 07:58:04 +0200 Subject: [PATCH 33/37] Adding VAD to whisper.cpp to reduce hallucinations on audio w silences (#1412) --- Makefile | 3 +++ buzz/recording.py | 4 ++++ buzz/transcriber/whisper_cpp.py | 5 +++++ share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml | 1 + tests/transcriber/whisper_cpp_test.py | 2 +- 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6a316b53..4beb3323 100644 --- a/Makefile +++ b/Makefile @@ -65,6 +65,7 @@ ifeq ($(OS), Windows_NT) cp whisper.cpp/build/bin/Release/whisper-cli.exe buzz/whisper_cpp/ cp whisper.cpp/build/bin/Release/whisper-server.exe buzz/whisper_cpp/ cp dll_backup/SDL2.dll buzz/whisper_cpp + PowerShell -NoProfile -ExecutionPolicy Bypass -Command "if (-not (Test-Path 'buzz\whisper_cpp\ggml-silero-v6.2.0.bin')) { Start-BitsTransfer -Source https://huggingface.co/ggml-org/whisper-vad/resolve/main/ggml-silero-v6.2.0.bin -Destination 'buzz\whisper_cpp\ggml-silero-v6.2.0.bin' }" endif ifeq ($(shell uname -s), Linux) @@ -82,6 +83,7 @@ ifeq ($(shell uname -s), Linux) cp -P whisper.cpp/build/ggml/src/libggml-base.so* buzz/whisper_cpp/ || true cp -P whisper.cpp/build/ggml/src/libggml-cpu.so* buzz/whisper_cpp/ || true cp -P whisper.cpp/build/ggml/src/ggml-vulkan/libggml-vulkan.so* buzz/whisper_cpp/ || true + test -f buzz/whisper_cpp/ggml-silero-v6.2.0.bin || curl -L -o buzz/whisper_cpp/ggml-silero-v6.2.0.bin https://huggingface.co/ggml-org/whisper-vad/resolve/main/ggml-silero-v6.2.0.bin endif # Build on Macs @@ -101,6 +103,7 @@ endif cp whisper.cpp/build/bin/whisper-server buzz/whisper_cpp/ || true cp whisper.cpp/build/src/libwhisper.dylib buzz/whisper_cpp/ || true cp whisper.cpp/build/ggml/src/libggml* buzz/whisper_cpp/ || true + test -f buzz/whisper_cpp/ggml-silero-v6.2.0.bin || curl -L -o buzz/whisper_cpp/ggml-silero-v6.2.0.bin https://huggingface.co/ggml-org/whisper-vad/resolve/main/ggml-silero-v6.2.0.bin endif # Prints all the Mac developer identities used for code signing diff --git a/buzz/recording.py b/buzz/recording.py index a831823f..158f6e5c 100644 --- a/buzz/recording.py +++ b/buzz/recording.py @@ -22,6 +22,7 @@ class RecordingAmplitudeListener(QObject): self.input_device_index = input_device_index self.buffer = np.ndarray([], dtype=np.float32) self.accumulation_size = 0 + self._active = True def start_recording(self): try: @@ -38,11 +39,14 @@ class RecordingAmplitudeListener(QObject): logging.exception("Failed to start audio stream on device %s: %s", self.input_device_index, e) def stop_recording(self): + self._active = False if self.stream is not None: self.stream.stop() self.stream.close() def stream_callback(self, in_data: np.ndarray, frame_count, time_info, status): + if not self._active: + return chunk = in_data.ravel() self.amplitude_changed.emit(float(np.sqrt(np.mean(chunk**2)))) diff --git a/buzz/transcriber/whisper_cpp.py b/buzz/transcriber/whisper_cpp.py index 977b785e..db4aff84 100644 --- a/buzz/transcriber/whisper_cpp.py +++ b/buzz/transcriber/whisper_cpp.py @@ -109,6 +109,11 @@ class WhisperCpp: "-f", file_to_process, ] + # Add VAD if the model is available + vad_model_path = os.path.join(os.path.dirname(whisper_cli_path), "ggml-silero-v6.2.0.bin") + if os.path.exists(vad_model_path): + cmd.extend(["--vad", "--vad-model", vad_model_path]) + # Add translate flag if needed if task.transcription_options.task == Task.TRANSLATE: cmd.extend(["--translate"]) diff --git a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml index cc91b618..fd50fb15 100644 --- a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml +++ b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml @@ -74,6 +74,7 @@
  • Added option to import folder
  • Extra settings for live recordings
  • Update checker for Windows and Macs
  • +
  • Added voice activity detection to whisper.cpp
  • diff --git a/tests/transcriber/whisper_cpp_test.py b/tests/transcriber/whisper_cpp_test.py index 310f5f1d..cabc9fe7 100644 --- a/tests/transcriber/whisper_cpp_test.py +++ b/tests/transcriber/whisper_cpp_test.py @@ -37,7 +37,7 @@ class TestWhisperCpp: # Combine all segment texts full_text = " ".join(segment.text for segment in segments) - assert "Bien venu" in full_text + assert "Bien venu" in full_text or "bienvenu" in full_text.lower() def test_transcribe_word_level_timestamps(self): transcription_options = TranscriptionOptions( From c9db73722eedc49745438a57d035b3e0c583c94c Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sat, 7 Mar 2026 16:48:41 +0200 Subject: [PATCH 34/37] Live recording improvements (#1413) --- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 25 +- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 25 +- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 25 +- buzz/locale/en_US/LC_MESSAGES/buzz.po | 14 +- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 29 ++- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 25 +- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 25 +- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 238 +++++++++++++----- buzz/locale/nl/LC_MESSAGES/buzz.po | 25 +- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 25 +- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 25 +- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 25 +- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 24 +- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 24 +- buzz/transcriber/recording_transcriber.py | 59 ++++- buzz/widgets/audio_meter_widget.py | 10 +- buzz/widgets/recording_transcriber_widget.py | 10 +- .../io.github.chidiwilliams.Buzz.metainfo.xml | 1 + .../transcriber/recording_transcriber_test.py | 43 ++-- .../recording_transcriber_widget_test.py | 4 +- 20 files changed, 443 insertions(+), 238 deletions(-) diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 7a91cad6..83289f06 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -416,14 +416,6 @@ msgstr "Configuració avançada" msgid "Speech recognition settings" msgstr "Configuració del reconeixement de veu" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Separat per comes, p. ex. «0.0, 0.2, 0.4, 0.6, 0.8, 1.0»" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Temperatura:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Pregunta inicial:" @@ -445,7 +437,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "Si us plau, traduïu cada text que us enviï de l'anglès al castellà. La traducció s'utilitzarà en un sistema automatitzat; si us plau, no afegiu cap comentari ni nota, només la traducció." +msgstr "" +"Si us plau, traduïu cada text que us enviï de l'anglès al castellà. La " +"traducció s'utilitzarà en un sistema automatitzat; si us plau, no afegiu cap " +"comentari ni nota, només la traducció." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -810,6 +805,10 @@ msgstr "Estàs al dia!" msgid "Average volume" msgstr "Volum mitjà" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Cua" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Inicia" @@ -1641,6 +1640,12 @@ msgstr "" "Ha fallat l'extracció de veu! Comproveu la vostra connexió a Internet — pot " "ser que s'hagi de descarregar un model." +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Separat per comes, p. ex. «0.0, 0.2, 0.4, 0.6, 0.8, 1.0»" + +#~ msgid "Temperature:" +#~ msgstr "Temperatura:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "Si us plau, tradueix cada text que t'enviï de l'anglès al castellà." diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index d4b5e265..b4473175 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -411,14 +411,6 @@ msgstr "Advancerede indstillinger" msgid "Speech recognition settings" msgstr "Talegenkendelsesindstillinger" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Komma-separerede, fx., \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Temperatur:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Start prompt:" @@ -440,7 +432,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "Oversæt venligst hver tekst, der sendes til dig, fra engelsk til spansk. Oversættelsen vil blive brugt i et automatiseret system, så tilføj venligst ingen kommentarer eller noter, kun oversættelsen." +msgstr "" +"Oversæt venligst hver tekst, der sendes til dig, fra engelsk til spansk. " +"Oversættelsen vil blive brugt i et automatiseret system, så tilføj venligst " +"ingen kommentarer eller noter, kun oversættelsen." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -804,6 +799,10 @@ msgstr "Du er opdateret!" msgid "Average volume" msgstr "Gennemsnitlig lydstyrke" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Kø" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Start" @@ -1632,5 +1631,11 @@ msgstr "" "Taleoprydning mislykkedes! Kontroller din internetforbindelse — en model " "skal muligvis hentes ned." +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Komma-separerede, fx., \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" + +#~ msgid "Temperature:" +#~ msgstr "Temperatur:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "Oversæt venligst hver tekst du modtager fra engelsk til spansk." diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index 3dad395e..834d1ff1 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -417,14 +417,6 @@ msgstr "Erweiterte Einstellungen" msgid "Speech recognition settings" msgstr "Einstellungen für die Spracherkennung" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Durch Kommas getrennt, z.B. \"0,0, 0,2, 0,4, 0,6, 0,8, 1,0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Temperatur:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Erste Anweisung:" @@ -446,7 +438,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "Bitte übersetzen Sie jeden Text, der Ihnen gesendet wird, vom Englischen ins Spanische. Die Übersetzung wird in einem automatisierten System verwendet. Bitte fügen Sie keine Kommentare oder Anmerkungen hinzu, nur die Übersetzung." +msgstr "" +"Bitte übersetzen Sie jeden Text, der Ihnen gesendet wird, vom Englischen ins " +"Spanische. Die Übersetzung wird in einem automatisierten System verwendet. " +"Bitte fügen Sie keine Kommentare oder Anmerkungen hinzu, nur die Übersetzung." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -813,6 +808,10 @@ msgstr "Sie sind auf dem Laufenden!" msgid "Average volume" msgstr "Durchschnittliche Lautstärke" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Warteschlange" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Start" @@ -1646,6 +1645,12 @@ msgstr "" "Sprachextraktion fehlgeschlagen! Bitte Internetverbindung prüfen — ein " "Modell muss möglicherweise heruntergeladen werden." +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Durch Kommas getrennt, z.B. \"0,0, 0,2, 0,4, 0,6, 0,8, 1,0\"" + +#~ msgid "Temperature:" +#~ msgstr "Temperatur:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "" #~ "Bitte übersetzen Sie jeden an Sie gesendeten Text von Englisch nach " diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index 5a20c72c..3bf61fc3 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -398,14 +398,6 @@ msgstr "" msgid "Speech recognition settings" msgstr "" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "" @@ -784,6 +776,10 @@ msgstr "" msgid "Average volume" msgstr "" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "" diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index 156bbfb2..fa612406 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -432,16 +432,6 @@ msgstr "Configuración avanzada" msgid "Speech recognition settings" msgstr "Configuración de reconocimiento de voz" -# automatic translation -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Separados por comas, p. ej., «0.0, 0.2, 0.4, 0.6, 0.8, 1.0»" - -# automatic translation -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Temperatura:" - # automatic translation #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" @@ -465,7 +455,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "Por favor, traduce cada texto que se te envíe del inglés al español. La traducción se utilizará en un sistema automatizado, por favor no añadas comentarios ni notas, solo la traducción." +msgstr "" +"Por favor, traduce cada texto que se te envíe del inglés al español. La " +"traducción se utilizará en un sistema automatizado, por favor no añadas " +"comentarios ni notas, solo la traducción." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -848,6 +841,10 @@ msgstr "¡Estás al día!" msgid "Average volume" msgstr "Volumen promedio" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Cola" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Inicio" @@ -1699,6 +1696,14 @@ msgstr "" "¡Extracción de voz fallida! Compruebe su conexión a internet — es posible " "que sea necesario descargar un modelo." +# automatic translation +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Separados por comas, p. ej., «0.0, 0.2, 0.4, 0.6, 0.8, 1.0»" + +# automatic translation +#~ msgid "Temperature:" +#~ msgstr "Temperatura:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "" #~ "Por favor, traduzca cada texto que se le envíe del inglés al español." diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index b481d796..9dc3a30e 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -417,14 +417,6 @@ msgstr "Impostazion avanzate" msgid "Speech recognition settings" msgstr "Impostazioni di riconoscimento vocale" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Separate da virgola, esempio: \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Temperatura:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Domanda iniziale:" @@ -446,7 +438,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "Si prega di tradurre ogni testo inviato dall'inglese allo spagnolo. La traduzione verrà utilizzata in un sistema automatizzato, quindi non aggiungere commenti o note, solo la traduzione." +msgstr "" +"Si prega di tradurre ogni testo inviato dall'inglese allo spagnolo. La " +"traduzione verrà utilizzata in un sistema automatizzato, quindi non " +"aggiungere commenti o note, solo la traduzione." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -809,6 +804,10 @@ msgstr "Il programma è aggiornato!" msgid "Average volume" msgstr "Volume medio" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Coda" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Inizio" @@ -1641,6 +1640,12 @@ msgstr "" "Estrazione del parlato non riuscita! Controlla la tua connessione Internet — " "potrebbe essere necessario scaricare un modello." +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Separate da virgola, esempio: \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" + +#~ msgid "Temperature:" +#~ msgstr "Temperatura:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "" #~ "Per favore, traduci ogni testo che ti viene inviato dall'inglese allo " diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index ec87472b..28656dff 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -408,14 +408,6 @@ msgstr "高度な設定" msgid "Speech recognition settings" msgstr "音声認識設定" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "コンマ区切り、例: \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "サンプリング温度:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "プロンプト:" @@ -437,7 +429,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "送信された各テキストを英語からスペイン語に翻訳してください。翻訳は自動化されたシステムで使用されます。コメントやメモは追加せず、翻訳のみを提供してください。" +msgstr "" +"送信された各テキストを英語からスペイン語に翻訳してください。翻訳は自動化され" +"たシステムで使用されます。コメントやメモは追加せず、翻訳のみを提供してくださ" +"い。" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -800,6 +795,10 @@ msgstr "最新の状態です!" msgid "Average volume" msgstr "平均音量" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "キュー" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "開始" @@ -1620,6 +1619,12 @@ msgstr "" "音声抽出に失敗しました!インターネット接続を確認してください。モデルのダウン" "ロードが必要な場合があります。" +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "コンマ区切り、例: \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" + +#~ msgid "Temperature:" +#~ msgstr "サンプリング温度:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "送られてくる各テキストを英語からスペイン語に翻訳してください。" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index e1b720ea..e1aa0798 100644 --- a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po +++ b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2026-03-06 13:23+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -25,13 +25,19 @@ msgstr "Importēt URL" msgid "https://example.com/audio.mp3" msgstr "https://example.com/audio.mp3" -#: buzz/widgets/import_url_dialog.py buzz/widgets/preferences_dialog/preferences_dialog.py buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcriber/advanced_settings_dialog.py buzz/widgets/main_window.py +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/main_window.py msgid "Ok" msgstr "Labi" -#: buzz/widgets/import_url_dialog.py buzz/widgets/preferences_dialog/preferences_dialog.py buzz/widgets/preferences_dialog/models_preferences_widget.py -#: buzz/widgets/transcription_viewer/speaker_identification_widget.py buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py +#: buzz/widgets/import_url_dialog.py +#: buzz/widgets/preferences_dialog/preferences_dialog.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_viewer/speaker_identification_widget.py +#: buzz/widgets/model_download_progress_dialog.py buzz/widgets/main_window.py msgid "Cancel" msgstr "Atcelt" @@ -55,43 +61,53 @@ msgstr "Dzīvais ieraksts" msgid "Reset to Defaults" msgstr "Atjaunot noklusētos" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "English" msgstr "Angļu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Catalan" msgstr "Katalāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Danish" msgstr "Dāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Dutch" msgstr "Holandiešu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "German" msgstr "Vācu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Spanish" msgstr "Spāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Italian" msgstr "Itāļu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Japanese" msgstr "Japāņu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Latvian" msgstr "Latviešu" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Polish" msgstr "Poļu" @@ -99,7 +115,8 @@ msgstr "Poļu" msgid "Portuguese (Brazil)" msgstr "Portugāļu (Brazīlijas)" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/transcriber/transcriber.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/transcriber/transcriber.py msgid "Ukrainian" msgstr "Ukraiņu" @@ -147,7 +164,9 @@ msgstr "Eksporta fails" msgid "Enable live recording transcription export" msgstr "Eksportēt dzīvā ieraksta transkriptus" -#: buzz/widgets/preferences_dialog/general_preferences_widget.py buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Browse" msgstr "Izvēlēties" @@ -162,16 +181,24 @@ msgstr "" "režīms" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "Note: Live recording export settings will be moved to the Advanced Settings in the Live Recording screen in a future version." -msgstr "Piezīme: Dzīvā ieraksta iestatījumi nākotnes Buzz versijās tiks pārvietoti uz Papildu iestatījumu sadaļu Dzīvā ieraksta logā." +msgid "" +"Note: Live recording export settings will be moved to the Advanced Settings " +"in the Live Recording screen in a future version." +msgstr "" +"Piezīme: Dzīvā ieraksta iestatījumi nākotnes Buzz versijās tiks pārvietoti " +"uz Papildu iestatījumu sadaļu Dzīvā ieraksta logā." #: buzz/widgets/preferences_dialog/general_preferences_widget.py 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 -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." +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 msgid "Reduce GPU RAM" @@ -183,7 +210,9 @@ msgstr "Izmantot tikai CPU un deaktivēt GPU paātrināšanu" #: buzz/widgets/preferences_dialog/general_preferences_widget.py 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ē" +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 msgid "Disable GPU" @@ -194,24 +223,39 @@ msgid "OpenAI API Key Test" msgstr "OpenAI API atslēgas pārbaude" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "Your API key is valid. Buzz will use this key to perform Whisper API transcriptions and AI translations." -msgstr "Jūsu API atslēga ir derīga. Buzz izmantos to runas atpazīšanai ar Whisper API un tulkošanai." +msgid "" +"Your API key is valid. Buzz will use this key to perform Whisper API " +"transcriptions and AI translations." +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 msgid "Invalid API key" msgstr "Nederīga API atslēga" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -msgid "API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in API key may cause errors." -msgstr "API atbalsta tikai base64 simbolus (A-Za-z0-9+/=_-). Citi simboli API atslēgā var radīt kļūdas." +msgid "" +"API supports only base64 characters (A-Za-z0-9+/=_-). Other characters in " +"API key may cause errors." +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 buzz/widgets/transcriber/advanced_settings_dialog.py +#: buzz/widgets/preferences_dialog/general_preferences_widget.py +#: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Select Export Folder" msgstr "Izvēlieties mapi kurā eksportēt" #: buzz/widgets/preferences_dialog/general_preferences_widget.py -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 validation." -msgstr "OpenAI API atbilde ir nederīga. Lūdzu pārbaudiet API Adresi un savu atslēgu. Atpazīšana un tulkošana joprojām var strādāt, ja API neatbalsta atslēgu pārbaudi." +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 " +"validation." +msgstr "" +"OpenAI API atbilde ir nederīga. Lūdzu pārbaudiet API Adresi un savu atslēgu. " +"Atpazīšana un tulkošana joprojām var strādāt, ja API neatbalsta atslēgu " +"pārbaudi." #: buzz/widgets/preferences_dialog/folder_watch_preferences_widget.py msgid "Enable folder watch" @@ -301,7 +345,10 @@ msgstr "Vai tiešām dzēst izvēlēto modeli?" msgid "Download failed" msgstr "Lejupielāde neizdevās" -#: buzz/widgets/preferences_dialog/models_preferences_widget.py buzz/widgets/transcription_tasks_table_widget.py buzz/widgets/update_dialog.py buzz/widgets/main_window.py buzz/model_loader.py +#: buzz/widgets/preferences_dialog/models_preferences_widget.py +#: buzz/widgets/transcription_tasks_table_widget.py +#: buzz/widgets/update_dialog.py buzz/widgets/main_window.py +#: buzz/model_loader.py msgid "Error" msgstr "Kļūda" @@ -313,7 +360,8 @@ msgstr "Ierakstīt" msgid "Stop" msgstr "Apturēt" -#: buzz/widgets/transcriber/languages_combo_box.py buzz/transcriber/transcriber.py +#: buzz/widgets/transcriber/languages_combo_box.py +#: buzz/transcriber/transcriber.py msgid "Detect Language" msgstr "Noteikt valodu" @@ -339,7 +387,8 @@ msgstr "Apstrādāt" msgid "Model:" msgstr "Modelis:" -#: buzz/widgets/transcriber/transcription_options_group_box.py buzz/transcriber/recording_transcriber.py +#: buzz/widgets/transcriber/transcription_options_group_box.py +#: buzz/transcriber/recording_transcriber.py 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." @@ -367,14 +416,6 @@ msgstr "Papildu iestatījumi" msgid "Speech recognition settings" msgstr "Runas atpazīšanas iestatījumi" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Atdalīti ar komatu, piemēram, \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Temperatūra:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "" @@ -394,8 +435,14 @@ msgid "AI model:" msgstr "AI modelis:" #: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Please translate each text sent to you from English to Spanish. Translation will be used in an automated system, please do not add any comments or notes, just the translation." -msgstr "Lūdzu, iztulko katru nosūtīto tekstu no angļu valodas spāņu valodā. Tulkojums tiks izmantots automatizētā sistēmā, lūdzu, nepievienojiet nekādus komentārus vai piezīmes, tikai tulkojumu." +msgid "" +"Please translate each text sent to you from English to Spanish. Translation " +"will be used in an automated system, please do not add any comments or " +"notes, just the translation." +msgstr "" +"Lūdzu, iztulko katru nosūtīto tekstu no angļu valodas spāņu valodā. " +"Tulkojums tiks izmantots automatizētā sistēmā, lūdzu, nepievienojiet nekādus " +"komentārus vai piezīmes, tikai tulkojumu." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -491,7 +538,8 @@ msgstr "Atvērt transkriptu" msgid "Cancel Transcription" msgstr "Atcelt atpazīšanu" -#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py buzz/settings/shortcut.py +#: buzz/widgets/main_window_toolbar.py buzz/widgets/main_window.py +#: buzz/settings/shortcut.py msgid "Clear History" msgstr "Notīrīt vēsturi" @@ -588,8 +636,11 @@ msgid "Failed to restart transcription: {}" msgstr "Neizdevās sākt atpazīšanu: {}" #: buzz/widgets/transcription_tasks_table_widget.py -msgid "Could not restart transcription: model not available and could not be downloaded." -msgstr "Neizdevās sākt atpazīšanu: modelis nav pieejams un to nevar lejupielādēt." +msgid "" +"Could not restart transcription: model not available and could not be " +"downloaded." +msgstr "" +"Neizdevās sākt atpazīšanu: modelis nav pieejams un to nevar lejupielādēt." #: buzz/widgets/transcription_tasks_table_widget.py msgid "Could not restart transcription: transcriber worker not found." @@ -680,8 +731,12 @@ msgid "An error occurred while starting a new recording:" msgstr "Sākot jaunu ierakstu notikusi kļūda:" #: buzz/widgets/recording_transcriber_widget.py -msgid "Please check your audio devices or check the application logs for more information." -msgstr "Lūdzu pārbaudiet savas audio ierīces vai pārbaudiet lietotnes ziņojumu žurnālus, lai iegūtu papildu informāciju." +msgid "" +"Please check your audio devices or check the application logs for more " +"information." +msgstr "" +"Lūdzu pārbaudiet savas audio ierīces vai pārbaudiet lietotnes ziņojumu " +"žurnālus, lai iegūtu papildu informāciju." #: buzz/widgets/update_dialog.py msgid "A new version of Buzz is available!" @@ -751,6 +806,10 @@ msgstr "Jums ir jaunākā versija!" msgid "Average volume" msgstr "Vidējais skaļums" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Rinda" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Sākums" @@ -759,12 +818,14 @@ msgstr "Sākums" msgid "End" msgstr "Beigas" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py #: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Text" msgstr "Teksts" -#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py +#: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py +#: buzz/widgets/transcription_viewer/transcription_view_mode_tool_button.py #: buzz/widgets/transcription_viewer/export_transcription_menu.py msgid "Translation" msgstr "Tulkojums" @@ -785,7 +846,8 @@ msgstr "Eksportēt" msgid "Translate" msgstr "Tulkot" -#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py buzz/widgets/transcription_viewer/transcription_resizer_widget.py +#: buzz/widgets/transcription_viewer/transcription_viewer_widget.py +#: buzz/widgets/transcription_viewer/transcription_resizer_widget.py msgid "Resize" msgstr "Mainīt garumu" @@ -838,8 +900,12 @@ msgid "Follow Audio" msgstr "Sekot audio" #: buzz/widgets/transcription_viewer/transcription_viewer_widget.py -msgid "Enable/disable following the current audio position in the transcript. When enabled, automatically scrolls to current text." -msgstr "Nosaka vai atskaņojot audio iezīmētajam segmentam vajadzētu automātiski sekot tam kas tiek atskaņots." +msgid "" +"Enable/disable following the current audio position in the transcript. When " +"enabled, automatically scrolls to current text." +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 msgid "Scroll to Current" @@ -930,8 +996,11 @@ msgid "Available only if word level timings were enabled during transcription" msgstr "Pieejami tikai, ierakstiem, kas atpazīti ar dalīšanu pa vārdiem" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -msgid "Speaker identification is not available: failed to load required libraries." -msgstr "Runātāju noteikšana nav pieejama, neizdevās ielādēt nepieciešamās bibliotēkas." +msgid "" +"Speaker identification is not available: failed to load required libraries." +msgstr "" +"Runātāju noteikšana nav pieejama, neizdevās ielādēt nepieciešamās " +"bibliotēkas." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "1/8 Collecting transcripts" @@ -950,8 +1019,12 @@ msgid "3/8 Loading alignment model (retrying with cache...)" msgstr "3/8 Ielādē identifikācijas modeli (atkārto...)" #: buzz/widgets/transcription_viewer/speaker_identification_widget.py -msgid "Failed to load alignment model. Please check your internet connection and try again." -msgstr "Neizdevās ielādēt modeli. Lūdzu pārbaidiet savu interneta savienojumu un mēģiniet vēlreiz." +msgid "" +"Failed to load alignment model. Please check your internet connection and " +"try again." +msgstr "" +"Neizdevās ielādēt modeli. Lūdzu pārbaidiet savu interneta savienojumu un " +"mēģiniet vēlreiz." #: buzz/widgets/transcription_viewer/speaker_identification_widget.py msgid "4/8 Processing audio" @@ -1062,8 +1135,12 @@ msgid "File" msgstr "Fails" #: buzz/widgets/main_window.py -msgid "Are you sure you want to delete the selected transcription(s)? This action cannot be undone." -msgstr "Vai tiešām vēlaties dzēst izvēlētos transkriptus? Šī ir neatgriezeniska darbība." +msgid "" +"Are you sure you want to delete the selected transcription(s)? This action " +"cannot be undone." +msgstr "" +"Vai tiešām vēlaties dzēst izvēlētos transkriptus? Šī ir neatgriezeniska " +"darbība." #: buzz/widgets/main_window.py msgid "Select audio file" @@ -1077,13 +1154,23 @@ msgstr "Izvēlieties mapi" 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 buzz/transcriber/recording_transcriber.py +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py 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." +msgstr "" +"Whisper serverim neizdevās ieslēgties. Lūdzu pārbaudiet lietotnes žurnāla " +"ierakstus." -#: buzz/transcriber/local_whisper_cpp_server_transcriber.py buzz/transcriber/recording_transcriber.py -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 variable." -msgstr "Whisper serverim neizdevās ieslēgties, jo nepietika atmiņas. Lūdzu mēģiniet vēlreiz ar mazāku modeli. Lai izmantotu tikai CPU iestatiet BUZZ_FORCE_CPU=TRUE vides mainīgo." +#: buzz/transcriber/local_whisper_cpp_server_transcriber.py +#: buzz/transcriber/recording_transcriber.py +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 " +"variable." +msgstr "" +"Whisper serverim neizdevās ieslēgties, jo nepietika atmiņas. Lūdzu mēģiniet " +"vēlreiz ar mazāku modeli. Lai izmantotu tikai CPU iestatiet " +"BUZZ_FORCE_CPU=TRUE vides mainīgo." #: buzz/transcriber/transcriber.py msgid "Translate to English" @@ -1542,8 +1629,18 @@ msgid "Append and correct" msgstr "Papildināt un labot esošo" #: buzz/file_transcriber_queue_worker.py -msgid "Speech extraction failed! Check your internet connection — a model may need to be downloaded." -msgstr "Runas atdalīšana neizdevās! Pārbaudiet interneta savienojumu, iespējams jālejupielādē modelis." +msgid "" +"Speech extraction failed! Check your internet connection — a model may need " +"to be downloaded." +msgstr "" +"Runas atdalīšana neizdevās! Pārbaudiet interneta savienojumu, iespējams " +"jālejupielādē modelis." + +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Atdalīti ar komatu, piemēram, \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" + +#~ msgid "Temperature:" +#~ msgstr "Temperatūra:" #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "Lūdzu, iztulko katru tev atsūtīto tekstu no angļu valodas latviski." @@ -1554,10 +1651,15 @@ msgstr "Runas atdalīšana neizdevās! Pārbaudiet interneta savienojumu, iespē #~ msgid "Snap permission notice" #~ msgstr "Snap atļauju piezīme" -#~ msgid "Detected missing permissions, please check that snap permissions have been granted" -#~ msgstr "Ne visi nepieciešamie moduļi darbojas korekti, iespējams nav piešķirtas snap atļaujas" +#~ msgid "" +#~ "Detected missing permissions, please check that snap permissions have " +#~ "been granted" +#~ msgstr "" +#~ "Ne visi nepieciešamie moduļi darbojas korekti, iespējams nav piešķirtas " +#~ "snap atļaujas" -#~ msgid "To enable necessary permissions run the following commands in the terminal" +#~ msgid "" +#~ "To enable necessary permissions run the following commands in the terminal" #~ msgstr "Lai piešķirtu nepieciešamās atļaujas izpildiet šīs komandas" #~ msgid "Close" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index 9271e325..ec4d27ae 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -419,14 +419,6 @@ msgstr "Geavanceerde instellingen" msgid "Speech recognition settings" msgstr "Spraakherkenningsinstellingen" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Kommagescheiden, bijv. '0.0, 0.2, 0.4, 0.6, 0.8, 1.0'" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Temperatuur:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Hoofdinvoer:" @@ -448,7 +440,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "Vertaal elke tekst die naar u wordt gestuurd van het Engels naar het Spaans. De vertaling wordt gebruikt in een geautomatiseerd systeem. Voeg geen opmerkingen of notities toe, alleen de vertaling." +msgstr "" +"Vertaal elke tekst die naar u wordt gestuurd van het Engels naar het Spaans. " +"De vertaling wordt gebruikt in een geautomatiseerd systeem. Voeg geen " +"opmerkingen of notities toe, alleen de vertaling." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -812,6 +807,10 @@ msgstr "De software is actueel!" msgid "Average volume" msgstr "Gemiddeld volume" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Wachtrij" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Begin" @@ -1642,6 +1641,12 @@ msgstr "" "Spraakextractie mislukt! Controleer uw internetverbinding — mogelijk moet er " "een model worden gedownload." +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Kommagescheiden, bijv. '0.0, 0.2, 0.4, 0.6, 0.8, 1.0'" + +#~ msgid "Temperature:" +#~ msgstr "Temperatuur:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "" #~ "Vertaal elke tekst die naar u wordt verzonden van het Engels naar het " diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index 1a8d3e26..3f9e3268 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -414,14 +414,6 @@ msgstr "Ustawienia zaawansowane" msgid "Speech recognition settings" msgstr "Ustawienia rozpoznawania mowy" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Oddzielone przecinkiem, np. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Temperatura:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Wstępne instrukcje:" @@ -443,7 +435,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "Proszę przetłumaczyć każdy przesłany tekst z języka angielskiego na hiszpański. Tłumaczenie będzie używane w systemie automatycznym, dlatego prosimy nie dodawać żadnych komentarzy ani uwag, tylko samo tłumaczenie." +msgstr "" +"Proszę przetłumaczyć każdy przesłany tekst z języka angielskiego na " +"hiszpański. Tłumaczenie będzie używane w systemie automatycznym, dlatego " +"prosimy nie dodawać żadnych komentarzy ani uwag, tylko samo tłumaczenie." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -809,6 +804,10 @@ msgstr "Posiadasz najnowszą wersję!" msgid "Average volume" msgstr "Średnia głośność" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Kolejka" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Rozpocznij" @@ -1636,6 +1635,12 @@ msgstr "" "Wyodrębnianie mowy nie powiodło się! Sprawdź połączenie internetowe — może " "być konieczne pobranie modelu." +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Oddzielone przecinkiem, np. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" + +#~ msgid "Temperature:" +#~ msgstr "Temperatura:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "" #~ "Proszę przetłumacz każdy przesłany tekst z angielskiego na hiszpański." diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index ae4bf87e..6e805062 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -413,14 +413,6 @@ msgstr "Configurações Avançadas" msgid "Speech recognition settings" msgstr "Configurações de reconhecimento de fala" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Separado por vírgulas, ex: \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Temperatura:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Prompt Inicial:" @@ -442,7 +434,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "Por favor, traduza cada texto enviado a você do inglês para o espanhol. A tradução será usada em um sistema automatizado, portanto, não adicione comentários ou notas, apenas a tradução." +msgstr "" +"Por favor, traduza cada texto enviado a você do inglês para o espanhol. A " +"tradução será usada em um sistema automatizado, portanto, não adicione " +"comentários ou notas, apenas a tradução." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -807,6 +802,10 @@ msgstr "Você está atualizado!" msgid "Average volume" msgstr "Volume médio" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Fila" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Início" @@ -1635,6 +1634,12 @@ msgstr "" "Falha na extração de fala! Verifique sua conexão com a internet — pode ser " "necessário baixar um modelo." +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Separado por vírgulas, ex: \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" + +#~ msgid "Temperature:" +#~ msgstr "Temperatura:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "" #~ "Por favor, traduza cada texto enviado a você do Inglês para o Espanhol." diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index 89137f14..a0ffbaae 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -410,14 +410,6 @@ msgstr "Додаткові налаштування" msgid "Speech recognition settings" msgstr "Параметри розпізнавання мовлення" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "Значення розділені комами, напр., \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "Температура:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "Початкова підказка:" @@ -439,7 +431,10 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "Будь ласка, перекладайте кожен надісланий вам текст з англійської на іспанську. Переклад використовуватиметься в автоматизованій системі, тому, будь ласка, не додавайте жодних коментарів чи приміток, лише переклад." +msgstr "" +"Будь ласка, перекладайте кожен надісланий вам текст з англійської на " +"іспанську. Переклад використовуватиметься в автоматизованій системі, тому, " +"будь ласка, не додавайте жодних коментарів чи приміток, лише переклад." #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -803,6 +798,10 @@ msgstr "У вас актуальна версія!" msgid "Average volume" msgstr "Середній рівень гучності" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "Черга" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "Початок" @@ -1630,6 +1629,12 @@ msgstr "" "Не вдалося витягти мовлення! Перевірте підключення до інтернету — можливо, " "потрібно завантажити модель." +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "Значення розділені комами, напр., \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" + +#~ msgid "Temperature:" +#~ msgstr "Температура:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "" #~ "Будь ласка, перекладайте кожен текст, надісланий вам, з англійської на " diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 372122a6..055fb436 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -406,14 +406,6 @@ msgstr "高级设置" msgid "Speech recognition settings" msgstr "语音识别设置" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "逗号分隔,例如\"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "温度:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "初始提示:" @@ -435,7 +427,9 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "请将发送给您的每段文本从英语翻译成西班牙语。翻译将用于自动化系统,请不要添加任何评论或备注,只需提供翻译即可。" +msgstr "" +"请将发送给您的每段文本从英语翻译成西班牙语。翻译将用于自动化系统,请不要添加" +"任何评论或备注,只需提供翻译即可。" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -794,6 +788,10 @@ msgstr "已经是最新版本" msgid "Average volume" msgstr "平均音量" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "队列" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "开始" @@ -1607,6 +1605,12 @@ msgid "" "to be downloaded." msgstr "语音提取失败!请检查您的网络连接——可能需要下载模型。" +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "逗号分隔,例如\"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" + +#~ msgid "Temperature:" +#~ msgstr "温度:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "请将发送给您的每段文本从英语翻译成西班牙语。" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index c8452448..f55c0afb 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: 2026-03-06 12:22+0200\n" +"POT-Creation-Date: 2026-03-07 11:02+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -407,14 +407,6 @@ msgstr "進階設定" msgid "Speech recognition settings" msgstr "語音識別設定" -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" -msgstr "逗號分隔,例如\"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" - -#: buzz/widgets/transcriber/advanced_settings_dialog.py -msgid "Temperature:" -msgstr "溫度:" - #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Initial Prompt:" msgstr "初始提示:" @@ -436,7 +428,9 @@ msgid "" "Please translate each text sent to you from English to Spanish. Translation " "will be used in an automated system, please do not add any comments or " "notes, just the translation." -msgstr "請將傳送給您的每段文字從英文翻譯成西班牙文。翻譯將用於自動化系統,請勿添加任何評論或備註,僅提供翻譯即可。" +msgstr "" +"請將傳送給您的每段文字從英文翻譯成西班牙文。翻譯將用於自動化系統,請勿添加任" +"何評論或備註,僅提供翻譯即可。" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Instructions for AI:" @@ -795,6 +789,10 @@ msgstr "你是最新的!" msgid "Average volume" msgstr "平均音量" +#: buzz/widgets/audio_meter_widget.py +msgid "Queue" +msgstr "佇列" + #: buzz/widgets/transcription_viewer/transcription_segments_editor_widget.py msgid "Start" msgstr "開始" @@ -1608,6 +1606,12 @@ msgid "" "to be downloaded." msgstr "語音提取失敗!請檢查您的網路連線——可能需要下載模型。" +#~ msgid "Comma-separated, e.g. \"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" +#~ msgstr "逗號分隔,例如\"0.0, 0.2, 0.4, 0.6, 0.8, 1.0\"" + +#~ msgid "Temperature:" +#~ msgstr "溫度:" + #~ msgid "Please translate each text sent to you from English to Spanish." #~ msgstr "請將傳送給您的每段文字從英語翻譯為西班牙語。" diff --git a/buzz/transcriber/recording_transcriber.py b/buzz/transcriber/recording_transcriber.py index 9a4bf9f4..3d0105ba 100644 --- a/buzz/transcriber/recording_transcriber.py +++ b/buzz/transcriber/recording_transcriber.py @@ -40,6 +40,7 @@ class RecordingTranscriber(QObject): error = pyqtSignal(str) amplitude_changed = pyqtSignal(float) average_amplitude_changed = pyqtSignal(float) + queue_size_changed = pyqtSignal(int) is_running = False SAMPLE_RATE = whisper_audio.SAMPLE_RATE @@ -133,14 +134,6 @@ class RecordingTranscriber(QObject): cpu_threads=(os.cpu_count() or 8)//2, ) - # This was commented out as it was causing issues. On the other hand some users are reporting errors without - # this. It is possible issues were present in older model versions without some config files and now are fixed - # - # Fix for large-v3 https://github.com/guillaumekln/faster-whisper/issues/547#issuecomment-1797962599 - # if self.transcription_options.model.whisper_model_size in {WhisperModelSize.LARGEV3, WhisperModelSize.LARGEV3TURBO}: - # model.feature_extractor.mel_filters = model.feature_extractor.get_mel_filters( - # model.feature_extractor.sampling_rate, model.feature_extractor.n_fft, n_mels=128 - # ) elif self.transcription_options.model.model_type == ModelType.OPEN_AI_WHISPER_API: custom_openai_base_url = self.settings.value( key=Settings.Key.CUSTOM_OPENAI_BASE_URL, default_value="" @@ -176,12 +169,19 @@ class RecordingTranscriber(QObject): while self.is_running: if self.queue.size >= self.n_batch_samples: self.mutex.acquire() - samples = self.queue[: self.n_batch_samples] - self.queue = self.queue[self.n_batch_samples - keep_samples:] + cut = self.find_silence_cut_point( + self.queue[:self.n_batch_samples], self.sample_rate + ) + samples = self.queue[:cut] + if self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: + self.queue = self.queue[cut - keep_samples:] + else: + self.queue = self.queue[cut:] self.mutex.release() amplitude = self.amplitude(samples) self.average_amplitude_changed.emit(amplitude) + self.queue_size_changed.emit(self.queue.size) logging.debug( "Processing next frame, sample size = %s, queue size = %s, amplitude = %s", @@ -325,14 +325,15 @@ class RecordingTranscriber(QObject): self.error.emit(str(exc)) return - self.finished.emit() - - # Cleanup + # Cleanup before emitting finished to avoid destroying QThread + # while this function is still on the call stack if model: del model if torch.cuda.is_available(): torch.cuda.empty_cache() + self.finished.emit() + @staticmethod def get_device_sample_rate(device_id: Optional[int]) -> int: """Returns the sample rate to be used for recording. It uses the default sample rate @@ -360,6 +361,38 @@ class RecordingTranscriber(QObject): if self.queue.size < self.max_queue_size: self.queue = np.append(self.queue, chunk) + @staticmethod + def find_silence_cut_point(samples: np.ndarray, sample_rate: int, + search_seconds: float = 1.5, + window_seconds: float = 0.02, + silence_ratio: float = 0.5) -> int: + """Return index of the last quiet point in the final search_seconds of samples. + + Scans backwards through short windows; returns the midpoint of the rightmost + window whose RMS is below silence_ratio * mean_rms of the search region. + Falls back to len(samples) if no quiet window is found. + """ + window = int(window_seconds * sample_rate) + search_start = max(0, len(samples) - int(search_seconds * sample_rate)) + region = samples[search_start:] + n_windows = (len(region) - window) // window + if n_windows < 1: + return len(samples) + + energies = np.array([ + np.sqrt(np.mean(region[i * window:(i + 1) * window] ** 2)) + for i in range(n_windows) + ]) + mean_energy = energies.mean() + threshold = silence_ratio * mean_energy + + for i in range(n_windows - 1, -1, -1): + if energies[i] < threshold: + cut = search_start + i * window + window // 2 + return cut + + return len(samples) + @staticmethod def amplitude(arr: np.ndarray): return float(np.sqrt(np.mean(arr**2))) diff --git a/buzz/widgets/audio_meter_widget.py b/buzz/widgets/audio_meter_widget.py index 8ce9b945..e9664740 100644 --- a/buzz/widgets/audio_meter_widget.py +++ b/buzz/widgets/audio_meter_widget.py @@ -31,6 +31,7 @@ class AudioMeterWidget(QWidget): self.current_amplitude = 0.0 self.average_amplitude = 0.0 + self.queue_size = 0 self.MINIMUM_AMPLITUDE = 0.00005 # minimum amplitude to show the first bar self.AMPLITUDE_SCALE_FACTOR = 10 # scale the amplitudes such that 1/AMPLITUDE_SCALE_FACTOR will show all bars @@ -76,11 +77,14 @@ class AudioMeterWidget(QWidget): text_rect = QRect(rect.left(), self.BARS_HEIGHT, rect.width(), rect.height() - self.BARS_HEIGHT) painter.setPen(self.BAR_ACTIVE_COLOR) average_volume_label = _("Average volume") - painter.drawText(text_rect, Qt.AlignmentFlag.AlignCenter, f"{average_volume_label}: {self.average_amplitude:.4f}") + queue_label = _("Queue") + painter.drawText(text_rect, Qt.AlignmentFlag.AlignCenter, + f"{average_volume_label}: {self.average_amplitude:.4f} {queue_label}: {self.queue_size}") def reset_amplitude(self): self.current_amplitude = 0.0 self.average_amplitude = 0.0 + self.queue_size = 0 self.repaint() def update_amplitude(self, amplitude: float): @@ -92,3 +96,7 @@ class AudioMeterWidget(QWidget): def update_average_amplitude(self, amplitude: float): self.average_amplitude = amplitude self.update() + + def update_queue_size(self, size: int): + self.queue_size = size + self.update() diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index 02cd0e7a..1c7bfcd2 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -11,7 +11,7 @@ import sounddevice from enum import auto from typing import Optional, Tuple, Any -from PyQt6.QtCore import QThread, Qt, QThreadPool, QTimer +from PyQt6.QtCore import QThread, Qt, QThreadPool, QTimer, pyqtSignal from PyQt6.QtGui import QTextCursor, QCloseEvent, QColor from PyQt6.QtWidgets import ( QWidget, @@ -71,6 +71,8 @@ class RecordingTranscriberWidget(QWidget): recording_amplitude_listener: Optional[RecordingAmplitudeListener] = None device_sample_rate: Optional[int] = None + transcription_stopped = pyqtSignal() + class RecordingStatus(enum.Enum): STOPPED = auto() RECORDING = auto() @@ -209,7 +211,7 @@ class RecordingTranscriberWidget(QWidget): self.translation_text_box.hide() self.setLayout(layout) - self.resize(550, 600) + self.resize(700, 600) self.reset_recording_amplitude_listener() @@ -633,6 +635,9 @@ class RecordingTranscriberWidget(QWidget): self.transcriber.average_amplitude_changed.connect( self.audio_meter_widget.update_average_amplitude, Qt.ConnectionType.QueuedConnection ) + self.transcriber.queue_size_changed.connect( + self.audio_meter_widget.update_queue_size, Qt.ConnectionType.QueuedConnection + ) # Stop the separate amplitude listener to avoid two streams on the same device if self.recording_amplitude_listener is not None: @@ -1042,6 +1047,7 @@ class RecordingTranscriberWidget(QWidget): self.reset_record_button() # Restart amplitude listener now that the transcription stream is closed self.reset_recording_amplitude_listener() + self.transcription_stopped.emit() def on_transcriber_error(self, error: str): self.reset_record_button() diff --git a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml index fd50fb15..ee594f28 100644 --- a/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml +++ b/share/metainfo/io.github.chidiwilliams.Buzz.metainfo.xml @@ -73,6 +73,7 @@
  • Fixed Youtube link downloading
  • Added option to import folder
  • Extra settings for live recordings
  • +
  • Adjusted live recording batching process to avoid min-word cuts
  • Update checker for Windows and Macs
  • Added voice activity detection to whisper.cpp
  • diff --git a/tests/transcriber/recording_transcriber_test.py b/tests/transcriber/recording_transcriber_test.py index daa77789..3ceef3cc 100644 --- a/tests/transcriber/recording_transcriber_test.py +++ b/tests/transcriber/recording_transcriber_test.py @@ -120,31 +120,32 @@ class TestRecordingTranscriber: transcriber.transcription.connect(on_transcription) thread.start() - qtbot.waitUntil(lambda: len(transcriptions) == 3, timeout=60_000) + try: + qtbot.waitUntil(lambda: len(transcriptions) == 3, timeout=120_000) - # any string in any transcription - strings_to_check = [_("Starting Whisper.cpp..."), "Bienvenue dans Passe"] - assert any(s in t for s in strings_to_check for t in transcriptions) + # any string in any transcription + strings_to_check = [_("Starting Whisper.cpp..."), "Bienvenue dans Passe"] + assert any(s in t for s in strings_to_check for t in transcriptions) + finally: + # Ensure cleanup runs even if waitUntil times out + transcriber.stop_recording() + time.sleep(10) - # Wait for the thread to finish - transcriber.stop_recording() - time.sleep(10) + thread.quit() + thread.wait() - thread.quit() - thread.wait() + # Ensure process is cleaned up + if transcriber.process and transcriber.process.poll() is None: + transcriber.process.terminate() + try: + transcriber.process.wait(timeout=2) + except: + pass - # Ensure process is cleaned up - if transcriber.process and transcriber.process.poll() is None: - transcriber.process.terminate() - try: - transcriber.process.wait(timeout=2) - except: - pass - - # Process pending events to ensure cleanup - from PyQt6.QtCore import QCoreApplication - QCoreApplication.processEvents() - time.sleep(0.1) + # Process pending events to ensure cleanup + from PyQt6.QtCore import QCoreApplication + QCoreApplication.processEvents() + time.sleep(0.1) class TestRecordingTranscriberInit: diff --git a/tests/widgets/recording_transcriber_widget_test.py b/tests/widgets/recording_transcriber_widget_test.py index 36512f12..564664ae 100644 --- a/tests/widgets/recording_transcriber_widget_test.py +++ b/tests/widgets/recording_transcriber_widget_test.py @@ -58,7 +58,7 @@ class TestRecordingTranscriberWidget: widget.record_button.click() qtbot.wait_until(callback=assert_text_box_contains_text, timeout=60 * 1000) - with qtbot.wait_signal(widget.transcription_thread.finished, timeout=60 * 1000): + with qtbot.wait_signal(widget.transcription_stopped, timeout=60 * 1000): widget.stop_recording() assert len(widget.transcription_text_box.toPlainText()) > 0 @@ -104,7 +104,7 @@ class TestRecordingTranscriberWidget: widget.record_button.click() qtbot.wait_until(callback=assert_text_box_contains_text, timeout=60 * 1000) - with qtbot.wait_signal(widget.transcription_thread.finished, timeout=60 * 1000): + with qtbot.wait_signal(widget.transcription_stopped, timeout=60 * 1000): widget.stop_recording() assert len(widget.transcription_text_box.toPlainText()) > 0 From 14cacf6acf9a0669e5bf5cfbea91df77147227aa Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sat, 7 Mar 2026 21:26:29 +0200 Subject: [PATCH 35/37] Recording transcriber improvements (#1414) Adding option to hide unconfirmed and variable transcriptions in append and replace mode --- buzz/locale/ca_ES/LC_MESSAGES/buzz.po | 6 +- buzz/locale/da_DK/LC_MESSAGES/buzz.po | 6 +- buzz/locale/de_DE/LC_MESSAGES/buzz.po | 6 +- buzz/locale/en_US/LC_MESSAGES/buzz.po | 6 +- buzz/locale/es_ES/LC_MESSAGES/buzz.po | 6 +- buzz/locale/it_IT/LC_MESSAGES/buzz.po | 6 +- buzz/locale/ja_JP/LC_MESSAGES/buzz.po | 6 +- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 6 +- buzz/locale/nl/LC_MESSAGES/buzz.po | 6 +- buzz/locale/pl_PL/LC_MESSAGES/buzz.po | 6 +- buzz/locale/pt_BR/LC_MESSAGES/buzz.po | 6 +- buzz/locale/uk_UA/LC_MESSAGES/buzz.po | 6 +- buzz/locale/zh_CN/LC_MESSAGES/buzz.po | 6 +- buzz/locale/zh_TW/LC_MESSAGES/buzz.po | 6 +- buzz/settings/settings.py | 1 + buzz/widgets/recording_transcriber_widget.py | 90 +++++++++++-------- .../transcriber/advanced_settings_dialog.py | 69 ++++++++++---- .../recording_transcriber_widget_test.py | 14 ++- 18 files changed, 184 insertions(+), 74 deletions(-) diff --git a/buzz/locale/ca_ES/LC_MESSAGES/buzz.po b/buzz/locale/ca_ES/LC_MESSAGES/buzz.po index 83289f06..8d989312 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2025-10-17 07:59+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: Catalan \n" @@ -466,6 +466,10 @@ msgstr "Separador de línies:" msgid "Transcription step:" msgstr "Pas de transcripció:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Amaga el no confirmat" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Activa l'exportació d'enregistrament en directe" diff --git a/buzz/locale/da_DK/LC_MESSAGES/buzz.po b/buzz/locale/da_DK/LC_MESSAGES/buzz.po index b4473175..f7835ae7 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: \n" "Last-Translator: Ole Guldberg2 \n" "Language-Team: \n" @@ -461,6 +461,10 @@ msgstr "Linjeseparator:" msgid "Transcription step:" msgstr "Transskriberingstrin:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Skjul ubekræftet" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Aktiver eksport af live optagelse" diff --git a/buzz/locale/de_DE/LC_MESSAGES/buzz.po b/buzz/locale/de_DE/LC_MESSAGES/buzz.po index 834d1ff1..d7a796de 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2025-03-05 14:41+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -467,6 +467,10 @@ msgstr "Zeilentrenner:" msgid "Transcription step:" msgstr "Transkriptionsschritt:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Unbestätigtes ausblenden" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Export von Live-Aufnahmen aktivieren" diff --git a/buzz/locale/en_US/LC_MESSAGES/buzz.po b/buzz/locale/en_US/LC_MESSAGES/buzz.po index 3bf61fc3..644ce509 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -445,6 +445,10 @@ msgstr "" msgid "Transcription step:" msgstr "" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Hide unconfirmed" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "" diff --git a/buzz/locale/es_ES/LC_MESSAGES/buzz.po b/buzz/locale/es_ES/LC_MESSAGES/buzz.po index fa612406..f940aa34 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2025-09-08 12:43+0200\n" "Last-Translator: Éric Duarte \n" "Language-Team: \n" @@ -486,6 +486,10 @@ msgstr "Separador de línea:" msgid "Transcription step:" msgstr "Paso de transcripción:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Ocultar no confirmado" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Habilitar la exportación de grabación en vivo" diff --git a/buzz/locale/it_IT/LC_MESSAGES/buzz.po b/buzz/locale/it_IT/LC_MESSAGES/buzz.po index 9dc3a30e..2c2ea56e 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2026-01-25 21:42+0200\n" "Language-Team: (Italiano) Albano Battistella \n" "Language: it_IT\n" @@ -467,6 +467,10 @@ msgstr "Separatore di riga:" msgid "Transcription step:" msgstr "Passo di trascrizione:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Nascondi non confermato" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Abilita l'esportazione della registrazione live" diff --git a/buzz/locale/ja_JP/LC_MESSAGES/buzz.po b/buzz/locale/ja_JP/LC_MESSAGES/buzz.po index 28656dff..8cbc04d0 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: \n" "Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n" "Language-Team: \n" @@ -458,6 +458,10 @@ msgstr "行区切り:" msgid "Transcription step:" msgstr "トランスクリプションステップ:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "未確認を非表示" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "ライブ録音の出力を有効にする" diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index e1aa0798..f8a6306d 100644 --- a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po +++ b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2026-03-06 13:23+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -470,6 +470,10 @@ msgstr "Rindiņu atdalītājs:" msgid "Transcription step:" msgstr "Atpazīšanas solis:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Slēpt mainīgos fragmentus" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Eksportēt dzīvā ieraksta transkriptus" diff --git a/buzz/locale/nl/LC_MESSAGES/buzz.po b/buzz/locale/nl/LC_MESSAGES/buzz.po index ec4d27ae..4d09b2c1 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2025-03-20 18:30+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none\n" @@ -469,6 +469,10 @@ msgstr "Regelscheidingsteken:" msgid "Transcription step:" msgstr "Transcriptiestap:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Verberg onbevestigd" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Live-opname exporteren inschakelen" diff --git a/buzz/locale/pl_PL/LC_MESSAGES/buzz.po b/buzz/locale/pl_PL/LC_MESSAGES/buzz.po index 3f9e3268..251a1264 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2024-03-17 20:50+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -464,6 +464,10 @@ msgstr "Separator wierszy:" msgid "Transcription step:" msgstr "Krok transkrypcji:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Ukryj niepotwierdzone" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Włącz eksport nagrywania na żywo" diff --git a/buzz/locale/pt_BR/LC_MESSAGES/buzz.po b/buzz/locale/pt_BR/LC_MESSAGES/buzz.po index 6e805062..b9760b12 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2025-11-01 17:43-0300\n" "Last-Translator: Paulo Schopf \n" "Language-Team: none\n" @@ -463,6 +463,10 @@ msgstr "Separador de linha:" msgid "Transcription step:" msgstr "Etapa de transcrição:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Ocultar não confirmado" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Habilitar exportação de gravação ao vivo" diff --git a/buzz/locale/uk_UA/LC_MESSAGES/buzz.po b/buzz/locale/uk_UA/LC_MESSAGES/buzz.po index a0ffbaae..0c671bd5 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: \n" "Last-Translator: Yevhen Popok \n" "Language-Team: \n" @@ -460,6 +460,10 @@ msgstr "Роздільник рядків:" msgid "Transcription step:" msgstr "Крок транскрибування:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "Приховати непідтверджене" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "Увімкнути експорт живого запису" diff --git a/buzz/locale/zh_CN/LC_MESSAGES/buzz.po b/buzz/locale/zh_CN/LC_MESSAGES/buzz.po index 055fb436..35b76c69 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: lamb \n" @@ -455,6 +455,10 @@ msgstr "行分隔符:" msgid "Transcription step:" msgstr "转录步长:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "隐藏未确认内容" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "启用实时录制导出" diff --git a/buzz/locale/zh_TW/LC_MESSAGES/buzz.po b/buzz/locale/zh_TW/LC_MESSAGES/buzz.po index f55c0afb..93d4afcf 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: 2026-03-07 11:02+0200\n" +"POT-Creation-Date: 2026-03-07 20:20+0200\n" "PO-Revision-Date: 2023-05-01 15:45+0800\n" "Last-Translator: \n" "Language-Team: Lamb\n" @@ -456,6 +456,10 @@ msgstr "行分隔符號:" msgid "Transcription step:" msgstr "轉錄步長:" +#: buzz/widgets/transcriber/advanced_settings_dialog.py +msgid "Hide unconfirmed" +msgstr "隱藏未確認內容" + #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Enable live recording export" msgstr "啟用即時錄製匯出" diff --git a/buzz/settings/settings.py b/buzz/settings/settings.py index 8675e138..0f9242a4 100644 --- a/buzz/settings/settings.py +++ b/buzz/settings/settings.py @@ -30,6 +30,7 @@ class Settings: RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE = "recording-transcriber/export-file-type" RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES = "recording-transcriber/export-max-entries" RECORDING_TRANSCRIBER_EXPORT_FILE_NAME = "recording-transcriber/export-file-name" + RECORDING_TRANSCRIBER_HIDE_UNCONFIRMED = "recording-transcriber/hide-unconfirmed" PRESENTATION_WINDOW_TEXT_COLOR = "presentation-window/text-color" PRESENTATION_WINDOW_BACKGROUND_COLOR = "presentation-window/background-color" diff --git a/buzz/widgets/recording_transcriber_widget.py b/buzz/widgets/recording_transcriber_widget.py index 1c7bfcd2..d0433631 100644 --- a/buzz/widgets/recording_transcriber_widget.py +++ b/buzz/widgets/recording_transcriber_widget.py @@ -189,6 +189,9 @@ class RecordingTranscriberWidget(QWidget): self.transcription_options_group_box.advanced_settings_dialog.recording_mode_changed.connect( self.on_recording_mode_changed ) + self.transcription_options_group_box.advanced_settings_dialog.hide_unconfirmed_changed.connect( + self.on_hide_unconfirmed_changed + ) recording_options_layout = QFormLayout() self.microphone_label = QLabel(_("Microphone:")) @@ -218,6 +221,11 @@ class RecordingTranscriberWidget(QWidget): self._closing = False self.transcript_export_file = None self.translation_export_file = None + self.export_file_type = "txt" + self.export_max_entries = 0 + self.hide_unconfirmed = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_HIDE_UNCONFIRMED, True + ) self.export_enabled = self.settings.value( key=Settings.Key.RECORDING_TRANSCRIBER_EXPORT_ENABLED, default_value=False, @@ -464,11 +472,17 @@ class RecordingTranscriberWidget(QWidget): ) export_file_name_template = custom_template if custom_template else Settings().get_default_export_file_template() - export_file_type = self.settings.value( + self.export_file_type = self.settings.value( key=Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, default_value="txt", ) - ext = ".csv" if export_file_type == "csv" else ".txt" + self.export_max_entries = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES, 0, int + ) + self.hide_unconfirmed = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_HIDE_UNCONFIRMED, True + ) + ext = ".csv" if self.export_file_type == "csv" else ".txt" export_file_name = ( export_file_name_template.replace("{{ input_file_name }}", "live recording") @@ -496,6 +510,9 @@ class RecordingTranscriberWidget(QWidget): def on_recording_mode_changed(self, mode: RecordingTranscriberMode): self.transcriber_mode = mode + def on_hide_unconfirmed_changed(self, value: bool): + self.hide_unconfirmed = value + def on_transcription_options_changed( self, transcription_options: TranscriptionOptions ): @@ -859,16 +876,36 @@ class RecordingTranscriberWidget(QWidget): def process_transcription_merge(self, text: str, texts, text_box, export_file): texts.append(text) + # Possibly in future we want to tie this to some setting, to limit amount of data that needs + # to be processed and exported. Value should not be less than ~10, so we have enough data to + # work with. + # if len(texts) > 20: + # del texts[:len(texts) - 20] + # Remove possibly errorous parts from overlapping audio chunks + last_common_length = None for i in range(len(texts) - 1): common_part = self.find_common_part(texts[i], texts[i + 1]) if common_part: common_length = len(common_part) texts[i] = texts[i][:texts[i].rfind(common_part) + common_length] texts[i + 1] = texts[i + 1][texts[i + 1].find(common_part):] + if i == len(texts) - 2: + last_common_length = common_length + elif i == len(texts) - 2: + last_common_length = None + + # When hiding unconfirmed: trim the last text to only the part confirmed by overlap + # with the previous chunk. If no overlap found, drop the last text entirely. + display_texts = list(texts) + if self.hide_unconfirmed and len(display_texts) > 1: + if last_common_length is not None: + display_texts[-1] = display_texts[-1][:last_common_length] + else: + display_texts = display_texts[:-1] merged_texts = "" - for text in texts: + for text in display_texts: merged_texts = self.merge_text_no_overlap(merged_texts, text) merged_texts = NO_SPACE_BETWEEN_SENTENCES.sub(r'\1 \2', merged_texts) @@ -877,10 +914,7 @@ class RecordingTranscriberWidget(QWidget): text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and export_file: - export_file_type = self.settings.value( - Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "txt" - ) - if export_file_type == "csv": + if self.export_file_type == "csv": # For APPEND_AND_CORRECT mode, rewrite the whole CSV with all merged text as a single entry self.write_to_export_file(export_file, "", mode="w") self.write_csv_export(export_file, merged_texts, 0) @@ -896,13 +930,6 @@ class RecordingTranscriberWidget(QWidget): if self.translator is not None: self.translator.enqueue(text) - export_file_type = self.settings.value( - Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "txt" - ) - max_entries = self.settings.value( - Settings.Key.RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES, 0, int - ) - if self.transcriber_mode == RecordingTranscriberMode.APPEND_BELOW: self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.End) if len(self.transcription_text_box.toPlainText()) > 0: @@ -911,10 +938,10 @@ class RecordingTranscriberWidget(QWidget): self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and self.transcript_export_file: - if export_file_type == "csv": - self.write_csv_export(self.transcript_export_file, text, max_entries) + if self.export_file_type == "csv": + self.write_csv_export(self.transcript_export_file, text, self.export_max_entries) else: - self.write_txt_export(self.transcript_export_file, text, "a", max_entries, self.transcription_options.line_separator) + self.write_txt_export(self.transcript_export_file, text, "a", self.export_max_entries, self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_ABOVE: self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.Start) @@ -923,7 +950,7 @@ class RecordingTranscriberWidget(QWidget): self.transcription_text_box.moveCursor(QTextCursor.MoveOperation.Start) if self.export_enabled and self.transcript_export_file: - if export_file_type == "csv": + if self.export_file_type == "csv": # For APPEND_ABOVE, prepend in CSV means inserting at beginning of columns existing_columns = [] if os.path.isfile(self.transcript_export_file): @@ -934,14 +961,14 @@ class RecordingTranscriberWidget(QWidget): existing_columns = row break new_columns = [text] + existing_columns - if max_entries > 0: - new_columns = new_columns[:max_entries] + if self.export_max_entries > 0: + new_columns = new_columns[:self.export_max_entries] buf = io.StringIO() writer = csv.writer(buf) writer.writerow(new_columns) self.write_to_export_file(self.transcript_export_file, buf.getvalue(), mode="w") else: - self.write_txt_export(self.transcript_export_file, text, "prepend", max_entries, self.transcription_options.line_separator) + self.write_txt_export(self.transcript_export_file, text, "prepend", self.export_max_entries, self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: self.process_transcription_merge(text, self.transcripts, self.transcription_text_box, self.transcript_export_file) @@ -968,13 +995,6 @@ class RecordingTranscriberWidget(QWidget): if len(text) == 0: return - export_file_type = self.settings.value( - Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "txt" - ) - max_entries = self.settings.value( - Settings.Key.RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES, 0, int - ) - if self.transcriber_mode == RecordingTranscriberMode.APPEND_BELOW: self.translation_text_box.moveCursor(QTextCursor.MoveOperation.End) if len(self.translation_text_box.toPlainText()) > 0: @@ -983,10 +1003,10 @@ class RecordingTranscriberWidget(QWidget): self.translation_text_box.moveCursor(QTextCursor.MoveOperation.End) if self.export_enabled and self.translation_export_file: - if export_file_type == "csv": - self.write_csv_export(self.translation_export_file, text, max_entries) + if self.export_file_type == "csv": + self.write_csv_export(self.translation_export_file, text, self.export_max_entries) else: - self.write_txt_export(self.translation_export_file, text, "a", max_entries, self.transcription_options.line_separator) + self.write_txt_export(self.translation_export_file, text, "a", self.export_max_entries, self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_ABOVE: self.translation_text_box.moveCursor(QTextCursor.MoveOperation.Start) @@ -995,7 +1015,7 @@ class RecordingTranscriberWidget(QWidget): self.translation_text_box.moveCursor(QTextCursor.MoveOperation.Start) if self.export_enabled and self.translation_export_file: - if export_file_type == "csv": + if self.export_file_type == "csv": existing_columns = [] if os.path.isfile(self.translation_export_file): raw = self.read_export_file(self.translation_export_file) @@ -1005,14 +1025,14 @@ class RecordingTranscriberWidget(QWidget): existing_columns = row break new_columns = [text] + existing_columns - if max_entries > 0: - new_columns = new_columns[:max_entries] + if self.export_max_entries > 0: + new_columns = new_columns[:self.export_max_entries] buf = io.StringIO() writer = csv.writer(buf) writer.writerow(new_columns) self.write_to_export_file(self.translation_export_file, buf.getvalue(), mode="w") else: - self.write_txt_export(self.translation_export_file, text, "prepend", max_entries, self.transcription_options.line_separator) + self.write_txt_export(self.translation_export_file, text, "prepend", self.export_max_entries, self.transcription_options.line_separator) elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT: self.process_transcription_merge(text, self.translations, self.translation_text_box, self.translation_export_file) diff --git a/buzz/widgets/transcriber/advanced_settings_dialog.py b/buzz/widgets/transcriber/advanced_settings_dialog.py index 391c28ad..c6aea7e6 100644 --- a/buzz/widgets/transcriber/advanced_settings_dialog.py +++ b/buzz/widgets/transcriber/advanced_settings_dialog.py @@ -28,6 +28,7 @@ class AdvancedSettingsDialog(QDialog): transcription_options: TranscriptionOptions transcription_options_changed = pyqtSignal(TranscriptionOptions) recording_mode_changed = pyqtSignal(RecordingTranscriberMode) + hide_unconfirmed_changed = pyqtSignal(bool) def __init__( self, @@ -71,12 +72,12 @@ class AdvancedSettingsDialog(QDialog): llm_model = self.transcription_options.llm_model or "gpt-4.1-mini" self.llm_model_line_edit = LineEdit(llm_model, self) - self.llm_model_line_edit.textChanged.connect( - self.on_llm_model_changed - ) + self.llm_model_line_edit.textChanged.connect(self.on_llm_model_changed) self.llm_model_line_edit.setMinimumWidth(170) self.llm_model_line_edit.setEnabled(self.transcription_options.enable_llm_translation) - layout.addRow(_("AI model:"), self.llm_model_line_edit) + self.llm_model_label = QLabel(_("AI model:")) + self.llm_model_label.setEnabled(self.transcription_options.enable_llm_translation) + layout.addRow(self.llm_model_label, self.llm_model_line_edit) default_llm_prompt = self.transcription_options.llm_prompt or _( "Please translate each text sent to you from English to Spanish. Translation will be used in an automated system, please do not add any comments or notes, just the translation." @@ -86,7 +87,9 @@ class AdvancedSettingsDialog(QDialog): self.llm_prompt_text_edit.setMinimumWidth(170) self.llm_prompt_text_edit.setFixedHeight(80) self.llm_prompt_text_edit.textChanged.connect(self.on_llm_prompt_changed) - layout.addRow(_("Instructions for AI:"), self.llm_prompt_text_edit) + self.llm_prompt_label = QLabel(_("Instructions for AI:")) + self.llm_prompt_label.setEnabled(self.transcription_options.enable_llm_translation) + layout.addRow(self.llm_prompt_label, self.llm_prompt_text_edit) if show_recording_settings: recording_settings_title = _("Recording settings") @@ -127,6 +130,15 @@ class AdvancedSettingsDialog(QDialog): self.transcription_step_label = QLabel(_("Transcription step:")) layout.addRow(self.transcription_step_label, self.transcription_step_spin_box) + hide_unconfirmed = self.settings.value( + Settings.Key.RECORDING_TRANSCRIBER_HIDE_UNCONFIRMED, True + ) + self.hide_unconfirmed_checkbox = QCheckBox(_("Hide unconfirmed")) + self.hide_unconfirmed_checkbox.setChecked(hide_unconfirmed) + self.hide_unconfirmed_checkbox.stateChanged.connect(self.on_hide_unconfirmed_changed) + self.hide_unconfirmed_label = QLabel("") + layout.addRow(self.hide_unconfirmed_label, self.hide_unconfirmed_checkbox) + self._update_recording_mode_visibility( RecordingTranscriberMode(self.recording_mode_combo.currentText()) ) @@ -153,7 +165,9 @@ class AdvancedSettingsDialog(QDialog): export_folder_row = QHBoxLayout() export_folder_row.addWidget(self.export_folder_line_edit) export_folder_row.addWidget(self.export_folder_browse_button) - layout.addRow(_("Export folder:"), export_folder_row) + self.export_folder_label = QLabel(_("Export folder:")) + self.export_folder_label.setEnabled(self._export_enabled) + layout.addRow(self.export_folder_label, export_folder_row) # Export file name template export_file_name = self.settings.value( @@ -162,7 +176,9 @@ class AdvancedSettingsDialog(QDialog): self.export_file_name_line_edit = LineEdit(export_file_name, self) self.export_file_name_line_edit.setEnabled(self._export_enabled) self.export_file_name_line_edit.textChanged.connect(self.on_export_file_name_changed) - layout.addRow(_("Export file name:"), self.export_file_name_line_edit) + self.export_file_name_label = QLabel(_("Export file name:")) + self.export_file_name_label.setEnabled(self._export_enabled) + layout.addRow(self.export_file_name_label, self.export_file_name_line_edit) # Export file type self.export_file_type_combo = QComboBox(self) @@ -176,7 +192,9 @@ class AdvancedSettingsDialog(QDialog): self.export_file_type_combo.setCurrentIndex(type_index) self.export_file_type_combo.setEnabled(self._export_enabled) self.export_file_type_combo.currentIndexChanged.connect(self.on_export_file_type_changed) - layout.addRow(_("Export file type:"), self.export_file_type_combo) + self.export_file_type_label = QLabel(_("Export file type:")) + self.export_file_type_label.setEnabled(self._export_enabled) + layout.addRow(self.export_file_type_label, self.export_file_type_combo) # Max entries max_entries = self.settings.value( @@ -187,7 +205,9 @@ class AdvancedSettingsDialog(QDialog): self.export_max_entries_spin.setValue(max_entries) self.export_max_entries_spin.setEnabled(self._export_enabled) self.export_max_entries_spin.valueChanged.connect(self.on_export_max_entries_changed) - layout.addRow(_("Limit export entries\n(0 = export all):"), self.export_max_entries_spin) + self.export_max_entries_label = QLabel(_("Limit export entries\n(0 = export all):")) + self.export_max_entries_label.setEnabled(self._export_enabled) + layout.addRow(self.export_max_entries_label, self.export_max_entries_spin) button_box = QDialogButtonBox( QDialogButtonBox.StandardButton(QDialogButtonBox.StandardButton.Ok), self @@ -209,8 +229,11 @@ class AdvancedSettingsDialog(QDialog): self.transcription_options.enable_llm_translation = state == 2 self.transcription_options_changed.emit(self.transcription_options) - self.llm_model_line_edit.setEnabled(self.transcription_options.enable_llm_translation) - self.llm_prompt_text_edit.setEnabled(self.transcription_options.enable_llm_translation) + enabled = self.transcription_options.enable_llm_translation + self.llm_model_label.setEnabled(enabled) + self.llm_model_line_edit.setEnabled(enabled) + self.llm_prompt_label.setEnabled(enabled) + self.llm_prompt_text_edit.setEnabled(enabled) def on_llm_model_changed(self, text: str): self.transcription_options.llm_model = text @@ -245,19 +268,33 @@ class AdvancedSettingsDialog(QDialog): self.line_separator_line_edit.setVisible(not is_append_and_correct) self.transcription_step_label.setVisible(is_append_and_correct) self.transcription_step_spin_box.setVisible(is_append_and_correct) + self.hide_unconfirmed_label.setVisible(is_append_and_correct) + self.hide_unconfirmed_checkbox.setVisible(is_append_and_correct) def on_transcription_step_changed(self, value: float): self.transcription_options.transcription_step = round(value, 1) self.transcription_options_changed.emit(self.transcription_options) + def on_hide_unconfirmed_changed(self, state: int): + value = state == 2 + self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_HIDE_UNCONFIRMED, value) + self.hide_unconfirmed_changed.emit(value) + def on_export_enabled_changed(self, state: int): self._export_enabled = state == 2 self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_EXPORT_ENABLED, self._export_enabled) - self.export_folder_line_edit.setEnabled(self._export_enabled) - self.export_folder_browse_button.setEnabled(self._export_enabled) - self.export_file_name_line_edit.setEnabled(self._export_enabled) - self.export_file_type_combo.setEnabled(self._export_enabled) - self.export_max_entries_spin.setEnabled(self._export_enabled) + for widget in ( + self.export_folder_label, + self.export_folder_line_edit, + self.export_folder_browse_button, + self.export_file_name_label, + self.export_file_name_line_edit, + self.export_file_type_label, + self.export_file_type_combo, + self.export_max_entries_label, + self.export_max_entries_spin, + ): + widget.setEnabled(self._export_enabled) def on_export_folder_changed(self, text: str): self.settings.set_value(Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FOLDER, text) diff --git a/tests/widgets/recording_transcriber_widget_test.py b/tests/widgets/recording_transcriber_widget_test.py index 564664ae..603062ad 100644 --- a/tests/widgets/recording_transcriber_widget_test.py +++ b/tests/widgets/recording_transcriber_widget_test.py @@ -178,6 +178,7 @@ class TestRecordingTranscriberWidget: qtbot.add_widget(widget) widget.transcriber_mode = RecordingTranscriberMode.APPEND_AND_CORRECT + widget.hide_unconfirmed = False widget.on_next_transcription('Bienvenue dans la transcription en direct de Buzz.') assert widget.transcription_text_box.toPlainText() == 'Bienvenue dans la transcription en direct de Buzz.' @@ -1102,9 +1103,7 @@ class TestOnNextTranscriptionExport: widget.transcriber_mode = RecordingTranscriberMode.APPEND_ABOVE widget.export_enabled = True widget.transcript_export_file = export_path - widget.settings.set_value( - Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "csv" - ) + widget.export_file_type = "csv" widget.on_next_transcription("first") widget.on_next_transcription("second") @@ -1128,12 +1127,8 @@ class TestOnNextTranscriptionExport: widget.transcriber_mode = RecordingTranscriberMode.APPEND_ABOVE widget.export_enabled = True widget.transcript_export_file = export_path - widget.settings.set_value( - Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FILE_TYPE, "csv" - ) - widget.settings.set_value( - Settings.Key.RECORDING_TRANSCRIBER_EXPORT_MAX_ENTRIES, 2 - ) + widget.export_file_type = "csv" + widget.export_max_entries = 2 widget.on_next_transcription("first") widget.on_next_transcription("second") widget.on_next_transcription("third") @@ -1214,6 +1209,7 @@ class TestOnNextTranslation: def test_append_and_correct_merges_translation(self, qtbot): with _widget_ctx(qtbot) as widget: widget.transcriber_mode = RecordingTranscriberMode.APPEND_AND_CORRECT + widget.hide_unconfirmed = False widget.on_next_translation("Hello world.") widget.on_next_translation("world. Goodbye.") text = widget.translation_text_box.toPlainText() From 36f2d4155777bb871cf66eb27369721af353f5b2 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 8 Mar 2026 00:27:52 +0200 Subject: [PATCH 36/37] Mac UI adjustments (#1415) --- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 8 ++------ buzz/widgets/menu_bar.py | 6 +++++- .../shortcuts_editor_preferences_widget.py | 3 +++ .../transcriber/advanced_settings_dialog.py | 19 ++++++++++++++++++- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index f8a6306d..9dc7fb8d 100644 --- a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po +++ b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po @@ -176,9 +176,7 @@ msgstr "Eksportēt mapē" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "Live recording mode" -msgstr "" -"Dzīvā ieraksta\n" -"režīms" +msgstr "Dzīvā ieraksta režīms" #: buzz/widgets/preferences_dialog/general_preferences_widget.py msgid "" @@ -458,9 +456,7 @@ msgstr "Klusuma slieksnis:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Live recording mode:" -msgstr "" -"Dzīvā ieraksta\n" -"režīms:" +msgstr "Dzīvā ieraksta režīms:" #: buzz/widgets/transcriber/advanced_settings_dialog.py msgid "Line separator:" diff --git a/buzz/widgets/menu_bar.py b/buzz/widgets/menu_bar.py index 25dde2dd..f30857c0 100644 --- a/buzz/widgets/menu_bar.py +++ b/buzz/widgets/menu_bar.py @@ -1,3 +1,4 @@ +import platform import webbrowser from typing import Optional @@ -48,9 +49,11 @@ class MenuBar(QMenuBar): about_label = _("About") about_action = QAction(f'{about_label} {APP_NAME}', self) about_action.triggered.connect(self.on_about_action_triggered) + about_action.setMenuRole(QAction.MenuRole.AboutRole) self.preferences_action = QAction(_("Preferences..."), self) self.preferences_action.triggered.connect(self.on_preferences_action_triggered) + self.preferences_action.setMenuRole(QAction.MenuRole.PreferencesRole) help_label = _("Help") help_action = QAction(f'{help_label}', self) @@ -63,7 +66,8 @@ class MenuBar(QMenuBar): file_menu.addAction(self.import_url_action) file_menu.addAction(self.import_folder_action) - help_menu = self.addMenu(_("Help")) + help_menu_title = _("Help") + ("\u200B" if platform.system() == "Darwin" else "") + help_menu = self.addMenu(help_menu_title) help_menu.addAction(about_action) help_menu.addAction(help_action) help_menu.addAction(self.preferences_action) diff --git a/buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py b/buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py index e057d429..66395a64 100644 --- a/buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py +++ b/buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py @@ -7,6 +7,7 @@ from PyQt6.QtWidgets import QWidget, QFormLayout, QPushButton from buzz.locale import _ from buzz.settings.shortcut import Shortcut from buzz.settings.shortcuts import Shortcuts +from buzz.widgets.line_edit import LineEdit from buzz.widgets.sequence_edit import SequenceEdit @@ -19,8 +20,10 @@ class ShortcutsEditorPreferencesWidget(QWidget): self.shortcuts = shortcuts self.layout = QFormLayout(self) + _field_height = LineEdit().sizeHint().height() for shortcut in Shortcut: sequence_edit = SequenceEdit(shortcuts.get(shortcut), self) + sequence_edit.setFixedHeight(_field_height) sequence_edit.keySequenceChanged.connect( self.get_key_sequence_changed(shortcut) ) diff --git a/buzz/widgets/transcriber/advanced_settings_dialog.py b/buzz/widgets/transcriber/advanced_settings_dialog.py index c6aea7e6..1959bbdd 100644 --- a/buzz/widgets/transcriber/advanced_settings_dialog.py +++ b/buzz/widgets/transcriber/advanced_settings_dialog.py @@ -45,6 +45,7 @@ class AdvancedSettingsDialog(QDialog): self.setMinimumWidth(800) layout = QFormLayout(self) + layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) transcription_settings_title= _("Speech recognition settings") transcription_settings_title_label = QLabel(f"

    {transcription_settings_title}

    ", self) @@ -102,6 +103,7 @@ class AdvancedSettingsDialog(QDialog): self.silence_threshold_spin_box.setDecimals(4) self.silence_threshold_spin_box.setValue(transcription_options.silence_threshold) self.silence_threshold_spin_box.valueChanged.connect(self.on_silence_threshold_changed) + self.silence_threshold_spin_box.setFixedWidth(70) layout.addRow(_("Silence threshold:"), self.silence_threshold_spin_box) # Live recording mode @@ -112,7 +114,8 @@ class AdvancedSettingsDialog(QDialog): self.settings.value(Settings.Key.RECORDING_TRANSCRIBER_MODE, 0) ) self.recording_mode_combo.currentIndexChanged.connect(self.on_recording_mode_changed) - layout.addRow(_("Live recording mode:"), self.recording_mode_combo) + self.recording_mode_combo.setFixedWidth(200) + layout.addRow(_("Live recording mode") + ":", self.recording_mode_combo) self.line_separator_line_edit = QLineEdit(self) line_sep_display = repr(transcription_options.line_separator)[1:-1] or r"\n\n" @@ -127,6 +130,7 @@ class AdvancedSettingsDialog(QDialog): self.transcription_step_spin_box.setDecimals(1) self.transcription_step_spin_box.setValue(transcription_options.transcription_step) self.transcription_step_spin_box.valueChanged.connect(self.on_transcription_step_changed) + self.transcription_step_spin_box.setFixedWidth(80) self.transcription_step_label = QLabel(_("Transcription step:")) layout.addRow(self.transcription_step_label, self.transcription_step_spin_box) @@ -192,6 +196,7 @@ class AdvancedSettingsDialog(QDialog): self.export_file_type_combo.setCurrentIndex(type_index) self.export_file_type_combo.setEnabled(self._export_enabled) self.export_file_type_combo.currentIndexChanged.connect(self.on_export_file_type_changed) + self.export_file_type_combo.setFixedWidth(200) self.export_file_type_label = QLabel(_("Export file type:")) self.export_file_type_label.setEnabled(self._export_enabled) layout.addRow(self.export_file_type_label, self.export_file_type_combo) @@ -205,10 +210,22 @@ class AdvancedSettingsDialog(QDialog): self.export_max_entries_spin.setValue(max_entries) self.export_max_entries_spin.setEnabled(self._export_enabled) self.export_max_entries_spin.valueChanged.connect(self.on_export_max_entries_changed) + self.export_max_entries_spin.setFixedWidth(70) self.export_max_entries_label = QLabel(_("Limit export entries\n(0 = export all):")) self.export_max_entries_label.setEnabled(self._export_enabled) layout.addRow(self.export_max_entries_label, self.export_max_entries_spin) + _field_height = self.llm_model_line_edit.sizeHint().height() + for widget in ( + self.line_separator_line_edit, + self.silence_threshold_spin_box, + self.recording_mode_combo, + self.transcription_step_spin_box, + self.export_file_type_combo, + self.export_max_entries_spin, + ): + widget.setFixedHeight(_field_height) + button_box = QDialogButtonBox( QDialogButtonBox.StandardButton(QDialogButtonBox.StandardButton.Ok), self ) From 1346c68c72e1e80f4d7fc01cc365b1b833e516f8 Mon Sep 17 00:00:00 2001 From: Raivis Dejus Date: Sun, 8 Mar 2026 10:47:19 +0200 Subject: [PATCH 37/37] Pre release polishes (#1416) --- buzz/locale/lv_LV/LC_MESSAGES/buzz.po | 2 +- buzz/widgets/application.py | 1 + buzz/widgets/transcriber/advanced_settings_dialog.py | 6 +++--- docs/docs/usage/1_file_import.md | 10 +++++----- docs/docs/usage/2_live_recording.md | 6 +++++- docs/docs/usage/3_translations.md | 2 +- docs/docs/usage/4_edit_and_resize.md | 2 +- docs/docs/usage/5_speaker_identification.md | 2 +- docs/docs/usage/5_transcription_viewer.md | 8 +------- 9 files changed, 19 insertions(+), 20 deletions(-) diff --git a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po index 9dc7fb8d..66860657 100644 --- a/buzz/locale/lv_LV/LC_MESSAGES/buzz.po +++ b/buzz/locale/lv_LV/LC_MESSAGES/buzz.po @@ -439,7 +439,7 @@ msgid "" "notes, just the translation." msgstr "" "Lūdzu, iztulko katru nosūtīto tekstu no angļu valodas spāņu valodā. " -"Tulkojums tiks izmantots automatizētā sistēmā, lūdzu, nepievienojiet nekādus " +"Tulkojums tiks izmantots automatizētā sistēmā, lūdzu, nepievieno nekādus " "komentārus vai piezīmes, tikai tulkojumu." #: buzz/widgets/transcriber/advanced_settings_dialog.py diff --git a/buzz/widgets/application.py b/buzz/widgets/application.py index 0448298c..8fad584b 100755 --- a/buzz/widgets/application.py +++ b/buzz/widgets/application.py @@ -34,6 +34,7 @@ class Application(QApplication): if darkdetect.isDark(): self.styleHints().setColorScheme(Qt.ColorScheme.Dark) + self.setStyleSheet("QCheckBox::indicator:unchecked { border: 1px solid white; }") if sys.platform.startswith("win"): self.setStyle(QStyleFactory.create("Fusion")) diff --git a/buzz/widgets/transcriber/advanced_settings_dialog.py b/buzz/widgets/transcriber/advanced_settings_dialog.py index 1959bbdd..a9e1a954 100644 --- a/buzz/widgets/transcriber/advanced_settings_dialog.py +++ b/buzz/widgets/transcriber/advanced_settings_dialog.py @@ -103,7 +103,7 @@ class AdvancedSettingsDialog(QDialog): self.silence_threshold_spin_box.setDecimals(4) self.silence_threshold_spin_box.setValue(transcription_options.silence_threshold) self.silence_threshold_spin_box.valueChanged.connect(self.on_silence_threshold_changed) - self.silence_threshold_spin_box.setFixedWidth(70) + self.silence_threshold_spin_box.setFixedWidth(90) layout.addRow(_("Silence threshold:"), self.silence_threshold_spin_box) # Live recording mode @@ -114,7 +114,7 @@ class AdvancedSettingsDialog(QDialog): self.settings.value(Settings.Key.RECORDING_TRANSCRIBER_MODE, 0) ) self.recording_mode_combo.currentIndexChanged.connect(self.on_recording_mode_changed) - self.recording_mode_combo.setFixedWidth(200) + self.recording_mode_combo.setFixedWidth(250) layout.addRow(_("Live recording mode") + ":", self.recording_mode_combo) self.line_separator_line_edit = QLineEdit(self) @@ -210,7 +210,7 @@ class AdvancedSettingsDialog(QDialog): self.export_max_entries_spin.setValue(max_entries) self.export_max_entries_spin.setEnabled(self._export_enabled) self.export_max_entries_spin.valueChanged.connect(self.on_export_max_entries_changed) - self.export_max_entries_spin.setFixedWidth(70) + self.export_max_entries_spin.setFixedWidth(90) self.export_max_entries_label = QLabel(_("Limit export entries\n(0 = export all):")) self.export_max_entries_label.setEnabled(self._export_enabled) layout.addRow(self.export_max_entries_label, self.export_max_entries_spin) diff --git a/docs/docs/usage/1_file_import.md b/docs/docs/usage/1_file_import.md index a811fddc..8b1086a8 100644 --- a/docs/docs/usage/1_file_import.md +++ b/docs/docs/usage/1_file_import.md @@ -16,11 +16,11 @@ title: File Import To reduce misspellings you can pass some commonly misspelled words in an `Initial prompt` that is available under `Advanced...` button. See this [guide on prompting](https://cookbook.openai.com/examples/whisper_prompting_guide#pass-names-in-the-prompt-to-prevent-misspellings). -| Field | Options | Default | Description | -| ------------------ | ------------------- | ------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Export As | "TXT", "SRT", "VTT" | "TXT" | Export file format | -| Word-Level Timings | Off / On | Off | If checked, the transcription will generate a separate subtitle line for each word in the audio. Combine words into subtitles afterwards with the [resize option](https://chidiwilliams.github.io/buzz/docs/usage/edit_and_resize). | -| Extract speech | Off / On | Off | If checked, speech will be extracted to a separate audio tack to improve accuracy. Available since 1.3.0. | +| Field | Options | Default | Description | +| ------------------ | ------------------- | ------- |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Export As | "TXT", "SRT", "VTT" | "TXT" | Export file format | +| Word-Level Timings | Off / On | Off | If checked, the transcription will generate a separate subtitle line for each word in the audio. Combine words into subtitles afterwards with the [resize option](https://chidiwilliams.github.io/buzz/docs/usage/edit_and_resize). | +| Extract speech | Off / On | Off | If checked, speech will be extracted to a separate audio tack to improve accuracy. | (See the [Live Recording section](https://chidiwilliams.github.io/buzz/docs/usage/live_recording) for more information about the task, language, and quality settings.) diff --git a/docs/docs/usage/2_live_recording.md b/docs/docs/usage/2_live_recording.md index b2dd1733..750c5874 100644 --- a/docs/docs/usage/2_live_recording.md +++ b/docs/docs/usage/2_live_recording.md @@ -20,12 +20,16 @@ To start a live recording: #### Advanced preferences **Silence threshold** Set threshold to for transcriptions to be processed. If average volume level is under this setting the sentence will not be transcribed. Available since 1.4.4. + **Line separator** Marking to add to the transcription and translation lines. Default value is two new lines (`\n\n`) that result in an empty space between translation or transcription lines. To have no empty line use `\n`. Available since 1.4.4. +**Transcription step** If live recording mode is set to `Append and correct`, you can also set a transcription step. Shorter steps will reduce latency but cause larger load on the system. Monitor the `Queue` while transcribing in this mode, if it grows too much, increase the transcription step, to reduce load. Available since 1.4.4. + +**Hide unconfirmed** If live recording mode is set to `Append and correct`, you can also hide the unconfirmed part of the last transcript. This part may be incorrect as the Buzz has seen it only in one overlapping transcription segment. Hiding it will increase latency, but result will show only the correct transcripts. Available since 1.4.4. #### Presentation Window -Since 1.4.2 Buzz has an easy to use presentation window you can use to show live transcriptions during events and presentations. To open it start the recording and new options for the `Presentation window` will appear. +Buzz has an easy to use presentation window you can use to show live transcriptions during events and presentations. To open it start the recording and new options for the `Presentation window` will appear. ### Record audio playing from computer (macOS) diff --git a/docs/docs/usage/3_translations.md b/docs/docs/usage/3_translations.md index 84ba4a54..44ed71f5 100644 --- a/docs/docs/usage/3_translations.md +++ b/docs/docs/usage/3_translations.md @@ -2,7 +2,7 @@ title: Translations --- -Default `Translation` task uses Whisper model ability to translate to English, however `Large-V3-Turbo` is not compatible with this standard. Since version `1.0.0` Buzz supports additional AI translations to any other language. +Default `Translation` task uses Whisper model ability to translate to English, however `Large-V3-Turbo` is not compatible with this standard. Buzz supports additional AI translations to any other language. To use translation feature you will need to configure OpenAI API key and translation settings. Set OpenAI API ket in Preferences. Buzz also supports custom locally running translation AIs that support OpenAI API. For more information on locally running AIs see [ollama](https://ollama.com/blog/openai-compatibility) or [LM Studio](https://lmstudio.ai/). For information on available custom APIs see this [discussion thread](https://github.com/chidiwilliams/buzz/discussions/827). diff --git a/docs/docs/usage/4_edit_and_resize.md b/docs/docs/usage/4_edit_and_resize.md index 7bdf92bb..4231d8db 100644 --- a/docs/docs/usage/4_edit_and_resize.md +++ b/docs/docs/usage/4_edit_and_resize.md @@ -8,6 +8,6 @@ When transcript of some audio or video file is generated you can edit it and exp Transcription view screen has option to resize the transcripts. Click on the "Resize" button so see available options. Transcripts that have been generated **with word-level timings** setting enabled can be combined into subtitles specifying different options, like maximum length of a subtitle and if subtitles should be split on punctuation. For transcripts that have been generated **without word-level timings** setting enabled can only be recombined specifying desired max length of a subtitle. -If audio file is still present on the system word-level timing merge will also analyze the audio for silences to improve subtitle accuracy. Subtitle generation from transcripts with word-level timings is available since version 1.3.0. +If audio file is still present on the system word-level timing merge will also analyze the audio for silences to improve subtitle accuracy. The resize tool also has an option to extend end time of segments if you want the subtitles to be on the screen for longer. You can specify the amount of time in seconds to extend each subtitle segment. Buzz will add this amount of time to the end of each subtitle segment making sure that the end of a segment does not go over start of the next segment. This feature is available since 1.4.3. \ No newline at end of file diff --git a/docs/docs/usage/5_speaker_identification.md b/docs/docs/usage/5_speaker_identification.md index 72dc7ee6..a8c8c097 100644 --- a/docs/docs/usage/5_speaker_identification.md +++ b/docs/docs/usage/5_speaker_identification.md @@ -6,4 +6,4 @@ When transcript of some audio or video file is generated you can identify speake Transcription view screen has option to identify speakers. Click on the "Identify speakers" button so see available options. -If audio file is still present on the system speaker identification will mark each speakers sentences with appropriate label. You can preview 10 seconds of some random sentence of the identified speaker and rename the automatically identified label to speakers real name. If "Merge speaker sentences" checkbox is selected when you save the speaker labels, all consecutive sentences of the same speaker will be merged into one segment. Speaker identification is available since version 1.4.0 on all platforms except Intel macOS. \ No newline at end of file +If audio file is still present on the system speaker identification will mark each speakers sentences with appropriate label. You can preview 10 seconds of some random sentence of the identified speaker and rename the automatically identified label to speakers real name. If "Merge speaker sentences" checkbox is selected when you save the speaker labels, all consecutive sentences of the same speaker will be merged into one segment. Speaker identification is not available on Intel macOS. \ No newline at end of file diff --git a/docs/docs/usage/5_transcription_viewer.md b/docs/docs/usage/5_transcription_viewer.md index a4c9c9e2..c075b9b3 100644 --- a/docs/docs/usage/5_transcription_viewer.md +++ b/docs/docs/usage/5_transcription_viewer.md @@ -9,7 +9,7 @@ The transcription viewer is organized into several key sections: - **Top Toolbar**: Contains view mode, export, translate, resize, and search - **Search Bar**: Find and navigate through transcript text - **Transcription Segments**: Table view of all transcription segments with timestamps -- **Playback Controls**: Audio playback settings and speed controls (since version 1.3.0) +- **Playback Controls**: Audio playback settings and speed controls - **Audio Player**: Standard media player with progress bar - **Current Segment Display**: Shows the currently selected or playing segment @@ -37,25 +37,21 @@ The transcription viewer is organized into several key sections: - **More information**: See [Edit and Resize](https://chidiwilliams.github.io/buzz/docs/usage/edit_and_resize) section ### Playback Controls Button -(since version 1.3.0) - **Function**: Show/hide playback control panel - **Shortcut**: `Ctrl+Alt+P` (Windows/Linux) or `Cmd+Alt+P` (macOS) - **Behavior**: Toggle button that shows/hides the playback controls below ### Find Button -(since version 1.3.0) - **Function**: Show/hide search functionality - **Shortcut**: `Ctrl+F` (Windows/Linux) or `Cmd+F` (macOS) - **Behavior**: Toggle button that shows/hides the search bar ### Scroll to Current Button -(since version 1.3.0) - **Function**: Automatically scroll to the currently playing text - **Shortcut**: `Ctrl+G` (Windows/Linux) or `Cmd+G` (macOS) - **Usage**: Click to jump to the current audio position in the transcript ## Search Functionality -(since version 1.3.0) ### Search Bar The search bar appears below the toolbar when activated and provides: @@ -80,7 +76,6 @@ The search bar appears below the toolbar when activated and provides: - **Cross-view Search**: Works in all view modes (Timestamps, Text, Translation) ## Playback Controls -(since version 1.3.0) ### Loop Segment - **Function**: Automatically loop playback of selected segments @@ -105,7 +100,6 @@ The search bar appears below the toolbar when activated and provides: - **Button Sizing**: Speed control buttons match the size of search navigation buttons for visual consistency ## Keyboard Shortcuts -(since version 1.3.0) ### Audio Playback - **`Ctrl+P` / `Cmd+P`**: Play/Pause audio