Implemented presentation window for live transcripts #1306 (#1323)

Co-authored-by: Raivis Dejus <orvils@gmail.com>
This commit is contained in:
David Olowomeye 2025-12-23 19:29:34 +00:00 committed by GitHub
commit 6e54b5cb02
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
29 changed files with 2171 additions and 166 deletions

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.75 1C6.33579 1 6 1.33579 6 1.75V3.50559C5.96824 3.53358 5.93715 3.56276 5.9068 3.59311L1.66416 7.83575C0.883107 8.6168 0.883107 9.88313 1.66416 10.6642L5.19969 14.1997C5.98074 14.9808 7.24707 14.9808 8.02812 14.1997L12.2708 9.95707C13.0518 9.17602 13.0518 7.90969 12.2708 7.12864L8.73522 3.59311C8.39027 3.24816 7.95066 3.05555 7.5 3.0153V1.75C7.5 1.33579 7.16421 1 6.75 1ZM6 5.62123V6.25C6 6.66421 6.33579 7 6.75 7C7.16421 7 7.5 6.66421 7.5 6.25V4.54033C7.56363 4.56467 7.62328 4.60249 7.67456 4.65377L11.2101 8.1893C11.2995 8.27875 11.348 8.39366 11.3555 8.51071H3.11052L6 5.62123ZM6.26035 13.1391L3.132 10.0107H10.0958L6.96746 13.1391C6.77219 13.3343 6.45561 13.3343 6.26035 13.1391Z" fill="#212121"/>
<path d="M2 17.5V12.4143L3.5 13.9143V17.5C3.5 18.0523 3.94772 18.5 4.5 18.5H19.5C20.0523 18.5 20.5 18.0523 20.5 17.5V6.5C20.5 5.94771 20.0523 5.5 19.5 5.5H12.0563L10.5563 4H19.5C20.8807 4 22 5.11929 22 6.5V17.5C22 18.8807 20.8807 20 19.5 20H4.5C3.11929 20 2 18.8807 2 17.5Z" fill="#212121"/>
<path d="M11 14.375C11 13.8816 11.1541 13.4027 11.3418 12.9938C11.5325 12.5784 11.7798 12.1881 12.0158 11.8595C12.2531 11.5289 12.4888 11.247 12.6647 11.0481C12.7502 10.9515 12.9062 10.7867 12.9642 10.7254L12.9697 10.7197C13.2626 10.4268 13.7374 10.4268 14.0303 10.7197L14.3353 11.0481C14.5112 11.247 14.7469 11.5289 14.9842 11.8595C15.2202 12.1881 15.4675 12.5784 15.6582 12.9938C15.8459 13.4027 16 13.8816 16 14.375C16 15.7654 14.9711 17 13.5 17C12.0289 17 11 15.7654 11 14.375ZM13.7658 12.7343C13.676 12.6092 13.5858 12.4916 13.5 12.3844C13.4142 12.4916 13.324 12.6092 13.2342 12.7343C13.0327 13.015 12.8425 13.32 12.7051 13.6195C12.5647 13.9253 12.5 14.1808 12.5 14.375C12.5 15.0663 12.9809 15.5 13.5 15.5C14.0191 15.5 14.5 15.0663 14.5 14.375C14.5 14.1808 14.4353 13.9253 14.2949 13.6195C14.1575 13.32 13.9673 13.015 13.7658 12.7343Z" fill="#212121"/>
</svg>

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.7092 2.29502C21.8041 2.3904 21.8757 2.50014 21.9241 2.61722C21.9727 2.73425 21.9996 2.8625 22 2.997L22 3V9C22 9.55228 21.5523 10 21 10C20.4477 10 20 9.55228 20 9V5.41421L14.7071 10.7071C14.3166 11.0976 13.6834 11.0976 13.2929 10.7071C12.9024 10.3166 12.9024 9.68342 13.2929 9.29289L18.5858 4H15C14.4477 4 14 3.55228 14 3C14 2.44772 14.4477 2 15 2H20.9998C21.2749 2 21.5242 2.11106 21.705 2.29078L21.7092 2.29502Z" fill="#000000"/>
<path d="M10.7071 14.7071L5.41421 20H9C9.55228 20 10 20.4477 10 21C10 21.5523 9.55228 22 9 22H3.00069L2.997 22C2.74301 21.9992 2.48924 21.9023 2.29502 21.7092L2.29078 21.705C2.19595 21.6096 2.12432 21.4999 2.07588 21.3828C2.02699 21.2649 2 21.1356 2 21V15C2 14.4477 2.44772 14 3 14C3.55228 14 4 14.4477 4 15V18.5858L9.29289 13.2929C9.68342 12.9024 10.3166 12.9024 10.7071 13.2929C11.0976 13.6834 11.0976 14.3166 10.7071 14.7071Z" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 14 14" role="img" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"><path d="M 7.5291661,11.795909 C 7.4168129,11.419456 7.3406864,10.225625 7.3406864,9.29222 c 0,-0.11438 -0.029767,-0.221667 -0.081573,-0.314893 0.051933,-0.115773 0.08132,-0.24358 0.08132,-0.378226 l 0,-1.709364 c 0,-0.511733 -0.416226,-0.927959 -0.9279585,-0.927959 l -0.8772919,0 C 5.527203,5.856265 5.52163,5.751005 5.518336,5.648406 5.514666,5.556066 5.513396,5.470313 5.513016,5.385826 5.511876,5.296776 5.5132694,5.224073 5.517196,5.160866 5.524666,5.024193 5.541009,4.891827 5.565076,4.773647 5.591043,4.646981 5.619669,4.564774 5.630689,4.535134 c 0.0019,-0.0052 0.0038,-0.01013 0.00557,-0.01533 0.00709,-0.02039 0.0133,-0.03559 0.017227,-0.04446 C 6.0127121,3.789698 5.750766,2.938499 5.0665137,2.5737 4.8642273,2.466034 4.6367344,2.409034 4.4084814,2.408147 4.1801018,2.409034 3.9526089,2.466037 3.7504492,2.5737 3.066197,2.938499 2.8042508,3.789698 3.1634768,4.475344 c 0.00393,0.0087 0.01026,0.02394 0.017227,0.04446 0.00177,0.0052 0.00367,0.01013 0.00557,0.01533 0.01102,0.02951 0.039647,0.111847 0.065613,0.238513 0.024067,0.11818 0.040533,0.250546 0.04788,0.387219 0.00393,0.06321 0.00532,0.135914 0.00418,0.22496 -5.066e-4,0.08449 -0.00165,0.17024 -0.00532,0.26258 -0.00329,0.102599 -0.00887,0.207859 -0.016847,0.313372 l -0.8772919,0 c -0.5117324,0 -0.9279584,0.416226 -0.9279584,0.927959 l 0,1.709364 c 0,0.134646 0.029387,0.262453 0.08132,0.378226 -0.051807,0.09323 -0.081573,0.200513 -0.081573,0.314893 0,0.933278 -0.076126,2.127236 -0.1884796,2.503689 C 1.0571435,11.985782 1.0131902,12.254315 1.0562568,12.453434 1.1748167,13 1.7477291,13 1.9359554,13 c 0.437506,0 1.226258,-0.07676 1.2595712,-0.08005 0.05092,-0.0051 0.1001932,-0.01596 0.1468065,-0.03179 0.049907,0.01241 0.1018398,0.01913 0.1546597,0.01925 l 0.9114918,0.0044 0.9114918,-0.0044 c 0.05282,-1.27e-4 0.1047532,-0.007 0.1546598,-0.01925 0.046613,0.01583 0.095886,0.02673 0.1468064,0.03179 C 5.6547556,12.92315 6.4436346,13 6.8810138,13 c 0.1882264,0 0.7612654,0 0.8796986,-0.546566 0.043067,-0.199119 -7.6e-4,-0.467652 -0.2315463,-0.657525 z m -1.833117,0.502486 -0.3480794,-1.518478 -0.1741664,1.503658 -1.6846638,-7.6e-4 -0.3680927,-0.885399 0,0.900979 c 0,0 -1.7672504,0.173279 -1.3861111,0 0.3811394,-0.173154 0.3811394,-2.980082 0.3811394,-2.980082 l 2.2924095,0 2.2924095,0 c 0,0 0,2.806928 0.3811394,2.980082 0.381266,0.173279 -1.3859844,0 -1.3859844,0 z M 10.219055,1 7.3387864,1 5.8932688,5.377719 l 0.9449318,0 c 0.3536527,0 0.6674055,0.17138 0.8650052,0.434593 l 0.04864,-0.18392 0.9107318,-2.702555 0.2962729,-0.0016 0.9543051,2.889769 -2.2085564,0 C 7.839499,5.994632 7.9204389,6.217692 7.9204389,6.459878 l 0,1.257038 2.3962751,0 0.423193,1.60917 2.218563,0 L 10.219055,1 Z"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="-0.5 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.93994 9.39998V5.48999C8.93994 5.20999 9.15994 4.98999 9.43994 4.98999H20.9999C21.2799 4.98999 21.4999 5.20999 21.4999 5.48999V13.09C21.4999 13.37 21.2799 13.59 20.9999 13.59L17.0599 13.6" stroke="#0F0F0F" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.7301 8.72998L16.4301 10.03" stroke="#0F0F0F" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3 11.4H14.56C14.84 11.4 15.06 11.62 15.06 11.9V19.51C15.06 19.79 14.84 20.01 14.56 20.01H3C2.72 20.01 2.5 19.79 2.5 19.51V11.9C2.5 11.63 2.72 11.4 3 11.4Z" stroke="#0F0F0F" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M19.32 10.03V7.64001C19.32 7.36001 19.1 7.14001 18.82 7.14001H16.42" stroke="#0F0F0F" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: buzz\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2025-10-17 07:59+0200\n"
"Last-Translator: Éric Duarte <contacto@ericdq.com>\n"
"Language-Team: Catalan <jmas@softcatala.org>\n"
@ -53,6 +53,11 @@ msgstr "URL no vàlida"
msgid "The URL you entered is invalid."
msgstr "L'URL que heu introduït no és vàlid."
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "Veure la traducció de transcripció"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "Restableix als valors predeterminats"
@ -578,27 +583,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Enregistrament en directe"
#: buzz/widgets/recording_transcriber_widget.py:149
#: 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:152
#: 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:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Micròfon:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "Fitxers de text"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "Fitxers de text"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "Selecciona la carpeta d'exportació"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "Selecciona un fitxer d'àudio"
#: buzz/widgets/recording_transcriber_widget.py:788
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:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -924,14 +977,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1309,11 +1362,11 @@ msgstr "Cantonès"
msgid "A connection error occurred"
msgstr "S'ha produït un error de connexió"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr "Començant Whisper.cpp..."
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "Cancel·la la transcripció"

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: \n"
"Last-Translator: Ole Guldberg2 <xalt7x.service@gmail.com>\n"
"Language-Team: \n"
@ -50,6 +50,11 @@ msgstr "Ugyldig URL"
msgid "The URL you entered is invalid."
msgstr "Den URL du har angivet er ikke gyldig."
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "Vis transkriberede oversættelse"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "Gendan standard-indstillinger"
@ -575,27 +580,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Live optagelse"
#: buzz/widgets/recording_transcriber_widget.py:149
#: buzz/widgets/recording_transcriber_widget.py:163
msgid "Click Record to begin..."
msgstr "Klik Optage for at begynde..."
#: buzz/widgets/recording_transcriber_widget.py:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr "Venter på AI oversættelse..."
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Mikrofon:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "Tekst filer"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "Tekst filer"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "Vælg eksport-mappe"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "Vælg audio-fil"
#: buzz/widgets/recording_transcriber_widget.py:788
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:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -918,12 +971,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1299,11 +1352,11 @@ msgstr ""
msgid "A connection error occurred"
msgstr "Der er opstået en forbindelsesfejl"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr ""
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "Afbryd transkription"

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2025-03-05 14:41+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -52,6 +52,11 @@ msgstr "Ungültige URL"
msgid "The URL you entered is invalid."
msgstr "Die von Ihnen eingegebene URL ist ungültig."
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "Übersetzung des Transkripts anzeigen"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "Auf Standardeinstellungen zurücksetzen"
@ -576,27 +581,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Live-Aufnahme"
#: buzz/widgets/recording_transcriber_widget.py:149
#: 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:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr "Warten auf KI-Übersetzung..."
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Mikrofon:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "Textdateien"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "Textdateien"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "Exportordner auswählen"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "Audiodatei auswählen"
#: buzz/widgets/recording_transcriber_widget.py:788
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:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -920,12 +973,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1301,11 +1354,11 @@ msgstr "Kantonesisch"
msgid "A connection error occurred"
msgstr "Ein Verbindungsfehler ist aufgetreten"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr ""
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "Transkription abbrechen"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -53,6 +53,10 @@ msgstr ""
msgid "The URL you entered is invalid."
msgstr ""
#: buzz/widgets/presentation_window.py:23
msgid "Live Transcript Presentation"
msgstr ""
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr ""
@ -561,27 +565,71 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:149
#: buzz/widgets/recording_transcriber_widget.py:163
msgid "Click Record to begin..."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
msgid "Text Size:"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
msgid "Text Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
msgid "Select Text Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:373
msgid "Select Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:788
msgid "An error occurred while starting a new recording:"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -898,12 +946,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1278,11 +1326,11 @@ msgstr ""
msgid "A connection error occurred"
msgstr ""
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr ""
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
msgid "Starting transcription..."
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2025-09-08 12:43+0200\n"
"Last-Translator: Éric Duarte <contacto@ericdq.com>\n"
"Language-Team: \n"
@ -53,6 +53,12 @@ msgstr "URL inválido"
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
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "Ver la traducción de la transcripción"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "Reestablecer los Valores por Defecto"
@ -609,31 +615,80 @@ msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
# automatic translation
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Grabación en vivo"
# automatic translation
#: buzz/widgets/recording_transcriber_widget.py:149
#: buzz/widgets/recording_transcriber_widget.py:163
msgid "Click Record to begin..."
msgstr "Pulse en Grabar para comenzar..."
#: buzz/widgets/recording_transcriber_widget.py:152
#: 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:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Micrófono:"
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "Archivos de texto"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "Archivos de texto"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "Seleccione Exportar carpeta"
# automatic translation
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "Seleccionar archivo de audio"
# automatic translation
#: buzz/widgets/recording_transcriber_widget.py:788
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:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -975,14 +1030,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1361,12 +1416,12 @@ msgstr "Cantonés"
msgid "A connection error occurred"
msgstr "Se ha producido un error de conexión"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr "Iniciando Whisper.cpp..."
# automatic translation
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "Cancelar transcripción"

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: buzz\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2025-11-09 20:22+0200\n"
"Language-Team: (Italiano) Albano Battistella <albanobattistella@gmail.com>\n"
"Language: it_IT\n"
@ -52,6 +52,11 @@ msgstr "URL non valido"
msgid "The URL you entered is invalid."
msgstr "L'URL inserito non è valido."
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "Visualizza la trascrizione della traduzione"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "Ripristina impostazioni predefinite"
@ -579,27 +584,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Registrazione in diretta"
#: buzz/widgets/recording_transcriber_widget.py:149
#: 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:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr "In attesa della traduzione AI..."
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Microfono:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "File di testo"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "File di testo"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "Seleziona la cartella di esportazione"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "Seleziona file audio"
#: buzz/widgets/recording_transcriber_widget.py:788
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:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -927,13 +980,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1311,11 +1364,11 @@ msgstr "Cantonese"
msgid "A connection error occurred"
msgstr "Si è verificato un errore di connessione"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr "Avvio di Whisper.cpp..."
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
msgid "Starting transcription..."
msgstr "Inizio trascrizione..."

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: \n"
"Last-Translator: nunawa <71294849+nunawa@users.noreply.github.com>\n"
"Language-Team: \n"
@ -48,6 +48,11 @@ msgstr "無効なURL"
msgid "The URL you entered is invalid."
msgstr "入力されたURLは無効です。"
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "文字起こしの翻訳を表示する"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "デフォルトに戻す"
@ -571,27 +576,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "ライブ録音"
#: buzz/widgets/recording_transcriber_widget.py:149
#: buzz/widgets/recording_transcriber_widget.py:163
msgid "Click Record to begin..."
msgstr "クリックで録音を開始..."
#: buzz/widgets/recording_transcriber_widget.py:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr "AI翻訳を待っています..."
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "マイク:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "テキストファイル"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "テキストファイル"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "出力フォルダを選択"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "音声ファイルを選択"
#: buzz/widgets/recording_transcriber_widget.py:788
msgid "An error occurred while starting a new recording:"
msgstr "新規録音開始時にエラーが発生しました:"
#: buzz/widgets/recording_transcriber_widget.py:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -913,12 +966,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1294,11 +1347,11 @@ msgstr ""
msgid "A connection error occurred"
msgstr "接続エラーが発生しました"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr ""
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "文字起こしをキャンセルする"

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"PO-Revision-Date: 2025-12-22 09:26+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2025-12-23 19:24+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: lv_LV\n"
@ -53,6 +53,10 @@ msgstr "Adrese nav derīga"
msgid "The URL you entered is invalid."
msgstr "Jūsu ievadītā URL adrese nav derīga."
#: buzz/widgets/presentation_window.py:23
msgid "Live Transcript Presentation"
msgstr "Dzīvais ieraksts"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "Atjaunot noklusētos"
@ -582,27 +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:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Dzīvā ierakstīšana"
#: buzz/widgets/recording_transcriber_widget.py:149
#: 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:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr "Gaida MI tulkojumu..."
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Mikrofons:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr "Rādīt jaunā logā"
#: buzz/widgets/recording_transcriber_widget.py:231
msgid "Text Size:"
msgstr "Teksta izmērs:"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr "Stils"
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr "Gaišais"
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr "Tumšais"
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr "Pielāgots"
#: buzz/widgets/recording_transcriber_widget.py:265
msgid "Text Color"
msgstr "Teksta krāsa"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr "Fona krāsa"
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr "Pilnekrāns"
#: buzz/widgets/recording_transcriber_widget.py:355
msgid "Select Text Color"
msgstr "Izvēlieties teksta krāsu"
#: buzz/widgets/recording_transcriber_widget.py:373
msgid "Select Background Color"
msgstr "Izvēlieties fona krāsu"
#: buzz/widgets/recording_transcriber_widget.py:788
msgid "An error occurred while starting a new recording:"
msgstr "Sākot jaunu ierakstu notikusi kļūda:"
#: buzz/widgets/recording_transcriber_widget.py:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -927,14 +975,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1312,11 +1360,11 @@ msgstr "Kantonas"
msgid "A connection error occurred"
msgstr "Notika savienojuma kļūda"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr "Palaiž Whisper.cpp..."
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
msgid "Starting transcription..."
msgstr "Sāk atpazīšanu..."

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2025-03-20 18:30+0100\n"
"Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n"
"Language-Team: none\n"
@ -55,6 +55,11 @@ msgstr "Ongeldige url"
msgid "The URL you entered is invalid."
msgstr "De ingevoerde url is ongeldig."
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "Getranscribeerde vertaling bekijken"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "Standaardwaarden"
@ -578,27 +583,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Live-opname"
#: buzz/widgets/recording_transcriber_widget.py:149
#: 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:152
#: 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:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Microfoon:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "Tekstbestanden"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "Tekstbestanden"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "Kies een exportmap"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "Kies een audiobestand"
#: buzz/widgets/recording_transcriber_widget.py:788
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:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -919,12 +972,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1300,11 +1353,11 @@ msgstr "Kantonees"
msgid "A connection error occurred"
msgstr "Er is een verbindingsfout opgetreden"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr ""
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "Transcriptie wissen"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2024-03-17 20:50+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -53,6 +53,11 @@ msgstr "Nieprawidłowy URL"
msgid "The URL you entered is invalid."
msgstr "Wprowadzony URL nie jest prawidłowy"
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "Nowa transkrypcja"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr ""
@ -583,27 +588,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Nagrywanie na żywo"
#: buzz/widgets/recording_transcriber_widget.py:149
#: buzz/widgets/recording_transcriber_widget.py:163
msgid "Click Record to begin..."
msgstr "Naciśnij Nagraj, aby zacząć..."
#: buzz/widgets/recording_transcriber_widget.py:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Mikrofon:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "Pliki tekstowe"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "Pliki tekstowe"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "Wybierz plik audio"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "Wybierz plik audio"
#: buzz/widgets/recording_transcriber_widget.py:788
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:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -931,12 +984,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1313,11 +1366,11 @@ msgstr ""
msgid "A connection error occurred"
msgstr ""
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr ""
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "Anuluj transkrypcję"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Buzz\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2025-11-01 17:43-0300\n"
"Last-Translator: Paulo Schopf <pschopf@gmail.com>\n"
"Language-Team: none\n"
@ -53,6 +53,11 @@ msgstr "URL inválida"
msgid "The URL you entered is invalid."
msgstr "A URL inserida é inválida."
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "Ver Tradução da Transcrição"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "Redefinir para o Padrão"
@ -576,27 +581,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Gravação ao Vivo"
#: buzz/widgets/recording_transcriber_widget.py:149
#: 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:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr "Aguardando tradução da IA..."
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Microfone:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "Arquivos de texto"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "Arquivos de texto"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "Selecionar Pasta de Exportação"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "Selecionar arquivo de áudio"
#: buzz/widgets/recording_transcriber_widget.py:788
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:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -922,12 +975,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1305,11 +1358,11 @@ msgstr "Cantonês"
msgid "A connection error occurred"
msgstr "Ocorreu um erro de conexão"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr "Iniciando Whisper.cpp..."
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "Iniciando transcrição..."

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: \n"
"Last-Translator: Yevhen Popok <xalt7x.service@gmail.com>\n"
"Language-Team: \n"
@ -50,6 +50,11 @@ msgstr "Недійсна адреса"
msgid "The URL you entered is invalid."
msgstr "Адреса, яку ви ввели, є недійсною"
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "Переглянути переклад транскрипції"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "Типові значення"
@ -573,27 +578,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "Живий запис"
#: buzz/widgets/recording_transcriber_widget.py:149
#: buzz/widgets/recording_transcriber_widget.py:163
msgid "Click Record to begin..."
msgstr "Натисніть на Запис, щоб розпочати..."
#: buzz/widgets/recording_transcriber_widget.py:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr "Очікування перекладу від ШІ..."
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "Мікрофон:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "Текстові файли"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "Текстові файли"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "Виберіть теку для експорту"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "Вибрати аудіофайл"
#: buzz/widgets/recording_transcriber_widget.py:788
msgid "An error occurred while starting a new recording:"
msgstr "При старті нового запису виникла помилка:"
#: buzz/widgets/recording_transcriber_widget.py:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -915,12 +968,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1296,11 +1349,11 @@ msgstr ""
msgid "A connection error occurred"
msgstr "Виникла помилка зʼєднання"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr ""
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "Скасувати транскрипцію"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2023-05-01 15:45+0800\n"
"Last-Translator: \n"
"Language-Team: lamb \n"
@ -53,6 +53,11 @@ msgstr "无效的网址"
msgid "The URL you entered is invalid."
msgstr "输入的网址无效"
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "查看识别的翻译"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr "恢复默认"
@ -586,27 +591,75 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "实时录制"
#: buzz/widgets/recording_transcriber_widget.py:149
#: buzz/widgets/recording_transcriber_widget.py:163
msgid "Click Record to begin..."
msgstr "点击开始录制"
#: buzz/widgets/recording_transcriber_widget.py:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr "等待AI翻译..."
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "麦克风:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
#, fuzzy
msgid "Text Size:"
msgstr "文本文件"
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
#, fuzzy
msgid "Text Color"
msgstr "文本文件"
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "选择输出文件夹"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "选择音频文件"
#: buzz/widgets/recording_transcriber_widget.py:788
msgid "An error occurred while starting a new recording:"
msgstr "开始新录制时出错"
#: buzz/widgets/recording_transcriber_widget.py:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -931,12 +984,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1313,11 +1366,11 @@ msgstr ""
msgid "A connection error occurred"
msgstr "连接发生错误"
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr ""
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "取消识别"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-22 09:24+0200\n"
"POT-Creation-Date: 2025-12-23 19:21+0200\n"
"PO-Revision-Date: 2023-05-01 15:45+0800\n"
"Last-Translator: \n"
"Language-Team: Lamb\n"
@ -53,6 +53,11 @@ msgstr ""
msgid "The URL you entered is invalid."
msgstr ""
#: buzz/widgets/presentation_window.py:23
#, fuzzy
msgid "Live Transcript Presentation"
msgstr "新錄製"
#: buzz/widgets/preferences_dialog/shortcuts_editor_preferences_widget.py:29
msgid "Reset to Defaults"
msgstr ""
@ -581,27 +586,73 @@ msgstr ""
msgid "Could not restart transcription: transcriber worker not found."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:83
#: buzz/widgets/recording_transcriber_widget.py:97
msgid "Live Recording"
msgstr "現場錄製"
#: buzz/widgets/recording_transcriber_widget.py:149
#: buzz/widgets/recording_transcriber_widget.py:163
msgid "Click Record to begin..."
msgstr "點擊開始錄製"
#: buzz/widgets/recording_transcriber_widget.py:152
#: buzz/widgets/recording_transcriber_widget.py:166
msgid "Waiting for AI translation..."
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:164
#: buzz/widgets/recording_transcriber_widget.py:178
msgid "Microphone:"
msgstr "麥克風:"
#: buzz/widgets/recording_transcriber_widget.py:579
#: buzz/widgets/recording_transcriber_widget.py:225
msgid "Show in new window"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:231
msgid "Text Size:"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:247
msgid "Theme"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Light"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Dark"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:251
msgid "Custom"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:265
msgid "Text Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:275
msgid "Background Color"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:284
msgid "Fullscreen"
msgstr ""
#: buzz/widgets/recording_transcriber_widget.py:355
#, fuzzy
msgid "Select Text Color"
msgstr "選擇聲音檔案"
#: buzz/widgets/recording_transcriber_widget.py:373
#, fuzzy
msgid "Select Background Color"
msgstr "選擇聲音檔案"
#: buzz/widgets/recording_transcriber_widget.py:788
msgid "An error occurred while starting a new recording:"
msgstr "開始新錄製出錯"
#: buzz/widgets/recording_transcriber_widget.py:583
#: buzz/widgets/recording_transcriber_widget.py:792
msgid ""
"Please check your audio devices or check the application logs for more "
"information."
@ -925,12 +976,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:417
#: buzz/transcriber/recording_transcriber.py:427
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:421
#: buzz/transcriber/recording_transcriber.py:431
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 "
@ -1307,11 +1358,11 @@ msgstr ""
msgid "A connection error occurred"
msgstr ""
#: buzz/transcriber/recording_transcriber.py:353
#: buzz/transcriber/recording_transcriber.py:358
msgid "Starting Whisper.cpp..."
msgstr ""
#: buzz/transcriber/recording_transcriber.py:408
#: buzz/transcriber/recording_transcriber.py:418
#, fuzzy
msgid "Starting transcription..."
msgstr "取消錄製"

View file

@ -26,6 +26,11 @@ class Settings:
RECORDING_TRANSCRIBER_EXPORT_FOLDER = "recording-transcriber/export-folder"
RECORDING_TRANSCRIBER_MODE = "recording-transcriber/mode"
PRESENTATION_WINDOW_TEXT_COLOR = "presentation-window/text-color"
PRESENTATION_WINDOW_BACKGROUND_COLOR = "presentation-window/background-color"
PRESENTATION_WINDOW_TEXT_SIZE = "presentation-window/text-size"
PRESENTATION_WINDOW_THEME = "presentation-window/theme"
FILE_TRANSCRIBER_TASK = "file-transcriber/task"
FILE_TRANSCRIBER_MODEL = "file-transcriber/model"
FILE_TRANSCRIBER_LANGUAGE = "file-transcriber/language"

View file

@ -350,6 +350,11 @@ class RecordingTranscriber(QObject):
self.process.wait(5000)
def start_local_whisper_server(self):
# Reduce verbose HTTP client logging from OpenAI/httpx
logging.getLogger("httpx").setLevel(logging.WARNING)
logging.getLogger("httpcore").setLevel(logging.WARNING)
logging.getLogger("openai").setLevel(logging.WARNING)
self.transcription.emit(_("Starting Whisper.cpp..."))
self.process = None
@ -368,7 +373,12 @@ class RecordingTranscriber(QObject):
"--threads", str(os.getenv("BUZZ_WHISPERCPP_N_THREADS", (os.cpu_count() or 8) // 2)),
"--model", self.model_path,
"--no-timestamps",
"--no-context", # on Windows context causes duplications of last message
# 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",
"--entropy-thold", "2.8",
"--suppress-nst"
]

View file

@ -96,8 +96,8 @@ class WhisperCpp:
# Build the command
cmd = [
whisper_cli_path,
"-m", task.model_path,
"-l", language,
"--model", task.model_path,
"--language", language,
"--print-progress",
"--suppress-nst",
# Protections against hallucinated repetition. Seems to be problem on macOS
@ -105,7 +105,7 @@ class WhisperCpp:
"--max-context", "64",
"--entropy-thold", "2.8",
"--output-json-full",
"-t", str(os.getenv("BUZZ_WHISPERCPP_N_THREADS", (os.cpu_count() or 8) // 2)),
"--threads", str(os.getenv("BUZZ_WHISPERCPP_N_THREADS", (os.cpu_count() or 8) // 2)),
"-f", file_to_process,
]

View file

@ -99,6 +99,25 @@ class ScrollToCurrentIcon(Icon):
get_path("assets/visibility_FILL0_wght700_GRAD0_opsz48.svg"), parent
)
class NewWindowIcon(Icon):
def __init__(self, parent: QWidget):
super().__init__(get_path("assets/icons/new-window.svg"), parent)
class FullscreenIcon(Icon):
def __init__(self, parent: QWidget):
super().__init__(get_path("assets/icons/fullscreen.svg"), parent)
class ColorBackgroundIcon(Icon):
def __init__(self, parent: QWidget):
super().__init__(get_path("assets/icons/color-background.svg"), parent)
class TextColorIcon(Icon):
def __init__(self, parent: QWidget):
super().__init__(get_path("assets/icons/gui-text-color.svg"), parent)
BUZZ_ICON_PATH = get_path("assets/buzz.ico")
BUZZ_LARGE_ICON_PATH = get_path("assets/buzz-icon-1024.png")

View file

@ -0,0 +1,60 @@
from PyQt6.QtGui import QIcon, QPixmap, QPainter, QPalette
from PyQt6.QtCore import QSize
from PyQt6.QtSvg import QSvgRenderer
import os
from buzz.assets import APP_BASE_DIR
class PresentationIcon:
"Icons for presentation window controls"
def __init__(self, parent, svg_path: str, color: str = None):
self.parent = parent
self.svg_path = svg_path
self.color = color or self.get_default_color()
def get_default_color(self) -> str:
"""Get default icon color based on theme"""
palette = self.parent.palette()
is_dark = palette.window().color().black() > 127
return "#EEE" if is_dark else "#555"
def get_icon(self) -> QIcon:
"""Load SVG icon and return as QIcon"""
#Load from asset first
full_path = os.path.join(APP_BASE_DIR, "assets", "icons", os.path.basename(self.svg_path))
if not os.path.exists(full_path):
pixmap = QPixmap(24, 24)
pixmap.fill(self.color)
return QIcon(pixmap)
#Load SVG
renderer = QSvgRenderer(full_path)
pixmap = QPixmap(24, 24)
pixmap.fill(Qt.GlobalColor.transparent)
painter = QPainter(pixmap)
renderer.render(painter)
painter.end()
return QIcon(pixmap)

View file

@ -0,0 +1,189 @@
import logging
from typing import Optional
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QTextCursor
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextBrowser
from platformdirs import user_cache_dir
from buzz.locale import _
from buzz.settings.settings import Settings
import os
class PresentationWindow(QWidget):
"""Window for displaying live transcripts in presentation mode"""
def __init__(self, parent: Optional[QWidget] = None):
super().__init__(parent)
self.settings = Settings()
self._current_transcript = ""
self._current_translation = ""
self.window_style = ""
self.setWindowTitle(_("Live Transcript Presentation"))
self.setWindowFlag(Qt.WindowType.Window)
# Window size
self.resize(800, 600)
# Create layout
layout = QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
# Text display widget
self.transcript_display = QTextBrowser(self)
self.transcript_display.setReadOnly(True)
# Translation display (hidden first)
self.translation_display = QTextBrowser(self)
self.translation_display.setReadOnly(True)
self.translation_display.hide()
# Add to layout
layout.addWidget(self.transcript_display)
layout.addWidget(self.translation_display)
self.load_settings()
def load_settings(self):
"""Load and apply saved presentation settings"""
theme = self.settings.value(
Settings.Key.PRESENTATION_WINDOW_THEME,
"light"
)
# Load text size
text_size = self.settings.value(
Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE,
24,
int
)
# Load colors based on theme
if theme == "light":
text_color = "#000000"
bg_color = "#FFFFFF"
elif theme == "dark":
text_color = "#FFFFFF"
bg_color = "#000000"
else:
text_color = self.settings.value(
Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR,
"#000000"
)
bg_color = self.settings.value(
Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR,
"#FFFFFF"
)
self.apply_styling(text_color, bg_color, text_size)
# Refresh content with new styling
if self._current_transcript:
self.update_transcripts(self._current_transcript)
if self._current_translation:
self.update_translations(self._current_translation)
def apply_styling(self, text_color: str, bg_color: str, text_size: int):
"""Apply text color, background color and font size"""
# Load custom CSS if it exists
css_file_path = self.get_css_file_path()
if os.path.exists(css_file_path):
try:
with open(css_file_path, "r", encoding="utf-8") as f:
self.window_style = f.read()
except Exception as e:
logging.warning(f"Failed to load custom CSS: {e}")
else:
self.window_style = f"""
body {{
color: {text_color};
background-color: {bg_color};
font-size: {text_size}pt;
font-family: Arial, sans-serif;
padding: 0;
margin: 20px;
}}
"""
def update_transcripts(self, text: str):
"""Update the transcript display with new text"""
if not text:
return
self._current_transcript = text
escaped_text = text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
html_text = escaped_text.replace("\n", "<br>")
html_content = f"""
<html>
<head>
<style>
{self.window_style}
</style>
</head>
<body>
{html_text}
</body>
</html>
"""
self.transcript_display.setHtml(html_content)
self.transcript_display.moveCursor(QTextCursor.MoveOperation.End)
def update_translations(self, text: str):
"""Update the translation display with new text"""
if not text:
return
self._current_translation = text
self.translation_display.show()
escaped_text = text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
html_text = escaped_text.replace("\n", "<br>")
html_content = f"""
<html>
<head>
<style>
{self.window_style}
</style>
</head>
<body>
{html_text}
</body>
</html>
"""
self.translation_display.setHtml(html_content)
self.translation_display.moveCursor(QTextCursor.MoveOperation.End)
def toggle_fullscreen(self):
"""Toggle fullscreen mode"""
if self.isFullScreen():
self.showNormal()
else:
self.showFullScreen()
def keyPressEvent(self, event):
"""Handle keyboard events"""
# ESC Key exits fullscreen
if event.key() == Qt.Key.Key_Escape and self.isFullScreen():
self.showNormal()
event.accept()
else:
super().keyPressEvent(event)
def get_css_file_path(self) -> str:
"""Get path to custom CSS file"""
cache_dir = user_cache_dir("Buzz")
os.makedirs(cache_dir, exist_ok=True)
return os.path.join(cache_dir, "presentation_window_style.css")

View file

@ -8,9 +8,20 @@ import sounddevice
from enum import auto
from typing import Optional, Tuple, Any
from PyQt6.QtCore import QThread, Qt, QThreadPool
from PyQt6.QtGui import QTextCursor, QCloseEvent
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QFormLayout, QHBoxLayout, QMessageBox
from PyQt6.QtCore import QThread, Qt, QThreadPool, QTimer
from PyQt6.QtGui import QTextCursor, QCloseEvent, QColor
from PyQt6.QtWidgets import (
QWidget,
QVBoxLayout,
QFormLayout,
QHBoxLayout,
QMessageBox,
QPushButton,
QComboBox,
QLabel,
QSpinBox,
QColorDialog
)
from buzz.dialogs import show_model_download_error_dialog
from buzz.locale import _
@ -39,6 +50,8 @@ from buzz.widgets.text_display_box import TextDisplayBox
from buzz.widgets.transcriber.transcription_options_group_box import (
TranscriptionOptionsGroupBox,
)
from buzz.widgets.presentation_window import PresentationWindow
from buzz.widgets.icon import NewWindowIcon, FullscreenIcon, ColorBackgroundIcon, TextColorIcon
REAL_CHARS_REGEX = re.compile(r'\w')
NO_SPACE_BETWEEN_SENTENCES = re.compile(r'([.!?。!?])([A-Z])')
@ -190,6 +203,180 @@ class RecordingTranscriberWidget(QWidget):
default_value=False,
)
#Presentation window
self.presentation_window: Optional[PresentationWindow] = None
self.presentation_options_bar = self.create_presentation_options_bar()
layout.insertWidget(3, self.presentation_options_bar)
self.presentation_options_bar.hide()
def create_presentation_options_bar(self) -> QWidget:
"""Crete the presentation options bar widget"""
bar = QWidget(self)
layout = QHBoxLayout(bar)
layout.setContentsMargins(5, 5, 5, 5)
layout.setSpacing(10)
self.show_presentation_button = QPushButton(bar)
self.show_presentation_button.setIcon(NewWindowIcon(bar))
self.show_presentation_button.setToolTip(_("Show in new window"))
self.show_presentation_button.clicked.connect(self.on_show_presentation_clicked)
layout.addWidget(self.show_presentation_button)
layout.addStretch() #Push other controls to the right
text_size_label = QLabel(_("Text Size:"), bar)
layout.addWidget(text_size_label)
self.text_size_spinbox = QSpinBox(bar)
self.text_size_spinbox.setRange(12, 72) #12pt to 72pt
saved_text_size = self.settings.value(
Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE,
24,
int
)
self.text_size_spinbox.setValue(saved_text_size)
self.text_size_spinbox.valueChanged.connect(self.on_text_size_changed)
layout.addWidget(self.text_size_spinbox)
#Theme selector
theme_label = QLabel(_("Theme"), bar)
layout.addWidget(theme_label)
self.theme_combo = QComboBox(bar)
self.theme_combo.addItems([_("Light"), _("Dark"), _("Custom")])
#Load saved theme
saved_theme = self.settings.value(
Settings.Key.PRESENTATION_WINDOW_THEME,
"light"
)
theme_index = {"light": 0, "dark": 1, "custom": 2}.get(saved_theme, 0)
self.theme_combo.setCurrentIndex(theme_index)
self.theme_combo.currentIndexChanged.connect(self.on_theme_changed)
layout.addWidget(self.theme_combo)
#Color buttons hidden first, show when custom is selected
self.text_color_button = QPushButton(bar)
self.text_color_button.setIcon(TextColorIcon(bar))
self.text_color_button.setToolTip(_("Text Color"))
self.text_color_button.clicked.connect(self.on_text_color_clicked)
self.text_color_button.hide()
if saved_theme == "custom":
self.text_color_button.show()
layout.addWidget(self.text_color_button)
self.bg_color_button = QPushButton(bar)
self.bg_color_button.setIcon(ColorBackgroundIcon(bar))
self.bg_color_button.setToolTip(_("Background Color"))
self.bg_color_button.clicked.connect(self.on_bg_color_clicked)
self.bg_color_button.hide()
if saved_theme == "custom":
self.bg_color_button.show()
layout.addWidget(self.bg_color_button)
self.fullscreen_button = QPushButton(bar)
self.fullscreen_button.setIcon(FullscreenIcon(bar))
self.fullscreen_button.setToolTip(_("Fullscreen"))
self.fullscreen_button.clicked.connect(self.on_fullscreen_clicked)
self.fullscreen_button.setEnabled(False)
layout.addWidget(self.fullscreen_button)
return bar
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():
#Create new presentation window
self.presentation_window = PresentationWindow(self)
self.presentation_window.show()
#Enable fullscreen button
self.fullscreen_button.setEnabled(True)
#Sync current content to presentation window
transcript_text = self.transcription_text_box.toPlainText()
if transcript_text:
self.presentation_window.update_transcripts(transcript_text)
if self.transcription_options.enable_llm_translation:
translation_text = self.translation_text_box.toPlainText()
if translation_text:
self.presentation_window.update_translations(translation_text)
else:
#Window already open, bring to front
self.presentation_window.raise_()
self.presentation_window.activateWindow()
def on_text_size_changed(self, value: int):
"""Handle text size change"""
def save_settings():
self.settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, value)
if self.presentation_window:
# reload setting to apply new size
self.presentation_window.load_settings()
#Incase user drags slider, Debounce by waiting 100ms before saving
QTimer.singleShot(100, save_settings)
def on_theme_changed(self, index: int):
"""Handle theme selection change"""
theme = ["light", "dark", "custom"]
selected_theme = theme[index]
self.settings.set_value(Settings.Key.PRESENTATION_WINDOW_THEME, selected_theme)
#Show/hide color buttons based on selection
if selected_theme == "custom":
self.text_color_button.show()
self.bg_color_button.show()
else:
self.text_color_button.hide()
self.bg_color_button.hide()
# Apply theme to presentation window
if self.presentation_window:
self.presentation_window.load_settings()
def on_text_color_clicked(self):
"""Handle text color button click"""
current_color = QColor(
self.settings.value(
Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR,
"#000000"
)
)
color = QColorDialog.getColor(current_color, self, _("Select Text Color"))
if color.isValid():
color_hex = color.name()
self.settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, color_hex)
if self.presentation_window:
self.presentation_window.load_settings()
def on_bg_color_clicked(self):
"""Handle background color button click"""
current_color = QColor(
self.settings.value(
Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR,
"#FFFFFF"
)
)
color = QColorDialog.getColor(current_color, self, _("Select Background Color"))
if color.isValid():
color_hex = color.name()
self.settings.set_value(Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR, color_hex)
if self.presentation_window:
self.presentation_window.load_settings()
def on_fullscreen_clicked(self):
"""Handle fullscreen button click"""
if self.presentation_window:
self.presentation_window.toggle_fullscreen()
def setup_for_export(self):
export_folder = self.settings.value(
key=Settings.Key.RECORDING_TRANSCRIBER_EXPORT_FOLDER,
@ -276,9 +463,11 @@ class RecordingTranscriberWidget(QWidget):
self.record_button.set_recording()
self.transcription_options_group_box.setEnabled(False)
self.audio_devices_combo_box.setEnabled(False)
self.presentation_options_bar.show()
else: # RecordingStatus.RECORDING
self.stop_recording()
self.set_recording_status_stopped()
self.presentation_options_bar.hide()
def start_recording(self):
self.record_button.setDisabled(True)
@ -384,6 +573,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.presentation_options_bar.hide()
def on_download_model_error(self, error: str):
self.reset_model_download()
@ -500,6 +690,12 @@ class RecordingTranscriberWidget(QWidget):
elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT:
self.process_transcription_merge(text, self.transcripts, self.transcription_text_box, self.transcript_export_file)
#Update presentation window if it is open
if self.presentation_window and self.presentation_window.isVisible():
#Get current merged text from the translation box
current_text = self.transcription_text_box.toPlainText()
self.presentation_window.update_transcripts(current_text)
# Upload to server
if self.upload_url:
try:
@ -545,6 +741,10 @@ class RecordingTranscriberWidget(QWidget):
elif self.transcriber_mode == RecordingTranscriberMode.APPEND_AND_CORRECT:
self.process_transcription_merge(text, self.translations, self.translation_text_box, self.translation_export_file)
if self.presentation_window and self.presentation_window.isVisible():
current_translation = self.translation_text_box.toPlainText()
self.presentation_window.update_translations(current_translation)
# Upload to server
if self.upload_url:
try:
@ -612,6 +812,13 @@ class RecordingTranscriberWidget(QWidget):
self.audio_meter_widget.update_amplitude(amplitude)
def closeEvent(self, event: QCloseEvent) -> None:
#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()

View file

@ -5,7 +5,7 @@ qt_api=pyqt6
log_format = %(asctime)s %(levelname)s %(module)s::%(funcName)s %(message)s
log_date_format = %Y-%m-%d %H:%M:%S
addopts = -x -s -p no:xdist -p no:pytest_parallel
timeout = 600
timeout = 900
timeout_method = thread
testpaths = tests
markers =

View file

@ -64,14 +64,15 @@
<content_rating type="oars-1.1"/>
<releases>
<release version="1.4.0" date="2025-12-20">
<release version="1.4.0" date="2025-12-30">
<url type="details">https://github.com/chidiwilliams/buzz/releases/tag/v1.4.0</url>
<description>
<p>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.</p>
<p>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.</p>
<p>Release details:</p>
<ul>
<li>Speaker identification on finished transcripts</li>
<li>Support for video in transcription viewer</li>
<li>Presentation (projector) window for live transcripts</li>
<li>Ability to add notes and restart transcriptions in main table</li>
<li>Adding support for more than 1000 languages via MMS model family when transcribing with Huggingface transcription type</li>
<li>Adding support for PEFT models when transcribing with Huggingface transcription type</li>

View file

@ -0,0 +1,324 @@
import os
import pytest
import tempfile
from unittest.mock import patch, MagicMock
from pytestqt.qtbot import QtBot
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QKeyEvent
from buzz.widgets.presentation_window import PresentationWindow
from buzz.settings.settings import Settings
from buzz.locale import _
class TestPresentationWindow:
def test_should_set_window_title(self, qtbot: QtBot):
"""Test that the window title is set correctly"""
window = PresentationWindow()
qtbot.add_widget(window)
assert _("Live Transcript Presentation") in window.windowTitle()
window.close()
def test_should_have_window_flag(self, qtbot: QtBot):
"""Test that window has the Window flag set"""
window = PresentationWindow()
qtbot.add_widget(window)
assert window.windowFlags() & Qt.WindowType.Window
window.close()
def test_should_have_transcript_display(self, qtbot: QtBot):
"""Test that the transcript display is created"""
window = PresentationWindow()
qtbot.add_widget(window)
assert window.transcript_display is not None
assert window.transcript_display.isReadOnly()
window.close()
def test_should_have_translation_display_hidden(self, qtbot: QtBot):
"""Test that the translation display is created but hidden initially"""
window = PresentationWindow()
qtbot.add_widget(window)
assert window.translation_display is not None
assert window.translation_display.isReadOnly()
assert not window.translation_display.isVisible()
window.close()
def test_should_have_default_size(self, qtbot: QtBot):
"""Test that the window has default size"""
window = PresentationWindow()
qtbot.add_widget(window)
assert window.width() == 800
assert window.height() == 600
window.close()
class TestPresentationWindowUpdateTranscripts:
def test_update_transcripts_with_text(self, qtbot: QtBot):
"""Test updating transcripts with text"""
window = PresentationWindow()
qtbot.add_widget(window)
window.update_transcripts("Hello world")
assert window._current_transcript == "Hello world"
assert "Hello world" in window.transcript_display.toHtml()
window.close()
def test_update_transcripts_with_empty_text(self, qtbot: QtBot):
"""Test that empty text does not update the display"""
window = PresentationWindow()
qtbot.add_widget(window)
window.update_transcripts("")
assert window._current_transcript == ""
window.close()
def test_update_transcripts_escapes_html(self, qtbot: QtBot):
"""Test that special HTML characters are escaped"""
window = PresentationWindow()
qtbot.add_widget(window)
window.update_transcripts("<script>alert('xss')</script>")
html = window.transcript_display.toHtml()
assert "<script>" not in html
assert "&lt;script&gt;" in html
window.close()
def test_update_transcripts_preserves_newlines(self, qtbot: QtBot):
"""Test that newlines are converted to <br> tags"""
window = PresentationWindow()
qtbot.add_widget(window)
window.update_transcripts("Line 1\nLine 2")
html = window.transcript_display.toHtml()
assert "<br>" in html or "<br/>" in html or "Line 1" in html
window.close()
class TestPresentationWindowUpdateTranslations:
def test_update_translations_with_text(self, qtbot: QtBot):
"""Test updating translations with text"""
window = PresentationWindow()
qtbot.add_widget(window)
window.show()
window.update_translations("Translated text")
assert window._current_translation == "Translated text"
assert window.translation_display.isVisible()
assert "Translated text" in window.translation_display.toHtml()
window.close()
def test_update_translations_with_empty_text(self, qtbot: QtBot):
"""Test that empty text does not update the display"""
window = PresentationWindow()
qtbot.add_widget(window)
window.show()
window.update_translations("")
assert window._current_translation == ""
# translation_display should remain hidden when not updated with real text
assert window.translation_display.isHidden()
window.close()
def test_update_translations_escapes_html(self, qtbot: QtBot):
"""Test that special HTML characters are escaped in translations"""
window = PresentationWindow()
qtbot.add_widget(window)
window.update_translations("<b>bold</b>")
html = window.translation_display.toHtml()
assert "&lt;b&gt;" in html
window.close()
class TestPresentationWindowLoadSettings:
def test_load_settings_light_theme(self, qtbot: QtBot):
"""Test loading light theme settings"""
settings = Settings()
settings.set_value(Settings.Key.PRESENTATION_WINDOW_THEME, "light")
settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, 24)
window = PresentationWindow()
qtbot.add_widget(window)
assert "#000000" in window.window_style or "color:" in window.window_style
window.close()
def test_load_settings_dark_theme(self, qtbot: QtBot):
"""Test loading dark theme settings"""
settings = Settings()
settings.set_value(Settings.Key.PRESENTATION_WINDOW_THEME, "dark")
window = PresentationWindow()
qtbot.add_widget(window)
assert "#FFFFFF" in window.window_style or "#000000" in window.window_style
window.close()
def test_load_settings_custom_theme(self, qtbot: QtBot):
"""Test loading custom theme settings"""
settings = Settings()
settings.set_value(Settings.Key.PRESENTATION_WINDOW_THEME, "custom")
settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, "#FF0000")
settings.set_value(Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR, "#00FF00")
settings.set_value(Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, 32)
window = PresentationWindow()
qtbot.add_widget(window)
assert "#FF0000" in window.window_style or "#00FF00" in window.window_style
window.close()
def test_load_settings_refreshes_content(self, qtbot: QtBot):
"""Test that load_settings refreshes existing content"""
window = PresentationWindow()
qtbot.add_widget(window)
window.update_transcripts("Test transcript")
window.update_translations("Test translation")
# Reload settings
window.load_settings()
# Content should still be present
assert "Test transcript" in window.transcript_display.toHtml()
assert "Test translation" in window.translation_display.toHtml()
window.close()
class TestPresentationWindowApplyStyling:
def test_apply_styling_creates_css(self, qtbot: QtBot):
"""Test that apply_styling creates appropriate CSS"""
window = PresentationWindow()
qtbot.add_widget(window)
window.apply_styling("#123456", "#654321", 48)
assert "#123456" in window.window_style
assert "#654321" in window.window_style
assert "48pt" in window.window_style
window.close()
def test_apply_styling_with_custom_css_file(self, qtbot: QtBot):
"""Test that custom CSS file is loaded when it exists"""
window = PresentationWindow()
qtbot.add_widget(window)
css_path = window.get_css_file_path()
custom_css = "body { color: red; font-size: 100pt; }"
try:
with open(css_path, "w", encoding="utf-8") as f:
f.write(custom_css)
window.apply_styling("#000", "#FFF", 24)
assert window.window_style == custom_css
finally:
if os.path.exists(css_path):
os.remove(css_path)
window.close()
class TestPresentationWindowFullscreen:
def test_toggle_fullscreen_enters_fullscreen(self, qtbot: QtBot):
"""Test that toggle_fullscreen enters fullscreen mode"""
window = PresentationWindow()
qtbot.add_widget(window)
window.show()
assert not window.isFullScreen()
window.toggle_fullscreen()
assert window.isFullScreen()
window.close()
def test_toggle_fullscreen_exits_fullscreen(self, qtbot: QtBot):
"""Test that toggle_fullscreen exits fullscreen mode"""
window = PresentationWindow()
qtbot.add_widget(window)
window.show()
window.showFullScreen()
assert window.isFullScreen()
window.toggle_fullscreen()
assert not window.isFullScreen()
window.close()
class TestPresentationWindowKeyPressEvent:
def test_escape_exits_fullscreen(self, qtbot: QtBot):
"""Test that ESC key exits fullscreen mode"""
window = PresentationWindow()
qtbot.add_widget(window)
window.show()
window.showFullScreen()
assert window.isFullScreen()
# Simulate ESC key press
event = QKeyEvent(
QKeyEvent.Type.KeyPress,
Qt.Key.Key_Escape,
Qt.KeyboardModifier.NoModifier
)
window.keyPressEvent(event)
assert not window.isFullScreen()
window.close()
def test_escape_does_not_affect_normal_mode(self, qtbot: QtBot):
"""Test that ESC key does nothing in normal mode"""
window = PresentationWindow()
qtbot.add_widget(window)
window.show()
assert not window.isFullScreen()
# Simulate ESC key press
event = QKeyEvent(
QKeyEvent.Type.KeyPress,
Qt.Key.Key_Escape,
Qt.KeyboardModifier.NoModifier
)
window.keyPressEvent(event)
assert not window.isFullScreen()
window.close()
class TestPresentationWindowGetCssFilePath:
def test_get_css_file_path_returns_path(self, qtbot: QtBot):
"""Test that get_css_file_path returns a valid path"""
window = PresentationWindow()
qtbot.add_widget(window)
css_path = window.get_css_file_path()
assert css_path.endswith("presentation_window_style.css")
assert "Buzz" in css_path
window.close()
def test_get_css_file_path_creates_directory(self, qtbot: QtBot):
"""Test that get_css_file_path creates the cache directory"""
window = PresentationWindow()
qtbot.add_widget(window)
css_path = window.get_css_file_path()
parent_dir = os.path.dirname(css_path)
assert os.path.isdir(parent_dir)
window.close()

View file

@ -4,12 +4,15 @@ import pytest
import platform
import tempfile
from unittest.mock import patch
from unittest.mock import patch, MagicMock
from pytestqt.qtbot import QtBot
from PyQt6.QtWidgets import QColorDialog
from PyQt6.QtGui import QColor
from buzz.locale import _
from buzz.settings.recording_transcriber_mode import RecordingTranscriberMode
from buzz.widgets.recording_transcriber_widget import RecordingTranscriberWidget
from buzz.widgets.presentation_window import PresentationWindow
from buzz.settings.settings import Settings
from tests.mock_sounddevice import MockSoundDevice, MockInputStream
@ -187,3 +190,438 @@ class TestRecordingTranscriberWidget:
qtbot.wait(500)
widget.close()
class TestRecordingTranscriberWidgetPresentation:
"""Tests for presentation window related functionality"""
@pytest.mark.timeout(60)
def test_presentation_options_bar_created(self, qtbot: QtBot):
"""Test that presentation options bar is created"""
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.presentation_options_bar is not None
assert not widget.presentation_options_bar.isVisible()
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_presentation_options_bar_has_buttons(self, qtbot: QtBot):
"""Test that presentation options bar has all expected buttons"""
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.show_presentation_button is not None
assert widget.fullscreen_button is not None
assert widget.text_size_spinbox is not None
assert widget.theme_combo is not None
assert widget.text_color_button is not None
assert widget.bg_color_button is not None
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_presentation_window_initially_none(self, qtbot: QtBot):
"""Test that presentation window is None initially"""
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.presentation_window is None
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_show_presentation_clicked_creates_window(self, qtbot: QtBot):
"""Test that clicking show presentation button creates the window"""
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.on_show_presentation_clicked()
assert widget.presentation_window is not None
assert isinstance(widget.presentation_window, PresentationWindow)
assert widget.presentation_window.isVisible()
assert widget.fullscreen_button.isEnabled()
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_show_presentation_clicked_syncs_content(self, qtbot: QtBot):
"""Test that clicking show presentation button syncs existing content"""
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)
# Add some text to the transcription box
widget.transcription_text_box.setPlainText("Test transcript text")
widget.on_show_presentation_clicked()
assert widget.presentation_window._current_transcript == "Test transcript text"
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_show_presentation_clicked_brings_existing_to_front(self, qtbot: QtBot):
"""Test that clicking show presentation button brings existing window to front"""
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)
# Create window first
widget.on_show_presentation_clicked()
first_window = widget.presentation_window
# Click again
widget.on_show_presentation_clicked()
# Should be the same window
assert widget.presentation_window is first_window
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_text_size_changed(self, qtbot: QtBot):
"""Test that text size change updates settings"""
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.on_text_size_changed(36)
# Wait for debounce
qtbot.wait(200)
saved_size = settings.value(Settings.Key.PRESENTATION_WINDOW_TEXT_SIZE, 24, int)
assert saved_size == 36
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_theme_changed_light(self, qtbot: QtBot):
"""Test that theme change to light works"""
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.on_theme_changed(0) # light theme
saved_theme = settings.value(Settings.Key.PRESENTATION_WINDOW_THEME, "")
assert saved_theme == "light"
# Color buttons should be hidden for light theme
assert widget.text_color_button.isHidden()
assert widget.bg_color_button.isHidden()
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_theme_changed_dark(self, qtbot: QtBot):
"""Test that theme change to dark works"""
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.on_theme_changed(1) # dark theme
saved_theme = settings.value(Settings.Key.PRESENTATION_WINDOW_THEME, "")
assert saved_theme == "dark"
# Color buttons should be hidden for dark theme
assert widget.text_color_button.isHidden()
assert widget.bg_color_button.isHidden()
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_theme_changed_custom(self, qtbot: QtBot):
"""Test that theme change to custom shows color buttons"""
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.on_theme_changed(2) # custom theme
saved_theme = settings.value(Settings.Key.PRESENTATION_WINDOW_THEME, "")
assert saved_theme == "custom"
# Color buttons should NOT be hidden for custom theme
assert not widget.text_color_button.isHidden()
assert not widget.bg_color_button.isHidden()
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_text_color_clicked(self, qtbot: QtBot):
"""Test that text color button opens color dialog and saves selection"""
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"),
patch("buzz.widgets.recording_transcriber_widget.QColorDialog.getColor",
return_value=QColor("#FF5500"))):
widget = RecordingTranscriberWidget(
custom_sounddevice=MockSoundDevice()
)
qtbot.add_widget(widget)
widget.on_text_color_clicked()
saved_color = settings.value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, "")
assert saved_color == "#ff5500"
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_text_color_clicked_cancel(self, qtbot: QtBot):
"""Test that cancelling color dialog does not save"""
settings = Settings()
original_color = settings.value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, "#000000")
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"),
patch("buzz.widgets.recording_transcriber_widget.QColorDialog.getColor",
return_value=QColor())): # Invalid color = cancelled
widget = RecordingTranscriberWidget(
custom_sounddevice=MockSoundDevice()
)
qtbot.add_widget(widget)
widget.on_text_color_clicked()
saved_color = settings.value(Settings.Key.PRESENTATION_WINDOW_TEXT_COLOR, "")
assert saved_color == original_color
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"""
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"),
patch("buzz.widgets.recording_transcriber_widget.QColorDialog.getColor",
return_value=QColor("#00AA55"))):
widget = RecordingTranscriberWidget(
custom_sounddevice=MockSoundDevice()
)
qtbot.add_widget(widget)
widget.on_bg_color_clicked()
saved_color = settings.value(Settings.Key.PRESENTATION_WINDOW_BACKGROUND_COLOR, "")
assert saved_color == "#00aa55"
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_fullscreen_clicked(self, qtbot: QtBot):
"""Test that fullscreen button toggles presentation window fullscreen"""
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)
# Create presentation window first
widget.on_show_presentation_clicked()
assert not widget.presentation_window.isFullScreen()
widget.on_fullscreen_clicked()
assert widget.presentation_window.isFullScreen()
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_on_fullscreen_clicked_without_window(self, qtbot: QtBot):
"""Test that fullscreen button does nothing without presentation window"""
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)
# Should not raise exception
widget.on_fullscreen_clicked()
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_presentation_window_updates_on_transcription(self, qtbot: QtBot):
"""Test that presentation window updates when new transcription arrives"""
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.on_show_presentation_clicked()
widget.transcriber_mode = RecordingTranscriberMode.APPEND_BELOW
widget.on_next_transcription("Hello world")
assert "Hello world" in widget.presentation_window._current_transcript
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_close_event_closes_presentation_window(self, qtbot: QtBot):
"""Test that closing widget also closes presentation window"""
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.on_show_presentation_clicked()
presentation_window = widget.presentation_window
time.sleep(0.5)
widget.close()
assert widget.presentation_window is None
@pytest.mark.timeout(60)
def test_fullscreen_button_disabled_initially(self, qtbot: QtBot):
"""Test that fullscreen button is disabled when no presentation window"""
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 not widget.fullscreen_button.isEnabled()
time.sleep(0.5)
widget.close()
@pytest.mark.timeout(60)
def test_presentation_bar_shown_when_recording(self, qtbot: QtBot):
"""Test that presentation bar is shown when recording starts"""
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()
)
widget.device_sample_rate = 16_000
qtbot.add_widget(widget)
# Initially hidden
assert widget.presentation_options_bar.isHidden()
# Simulate clicking record by directly calling the handler
# This avoids starting actual recording threads
widget.current_status = widget.RecordingStatus.RECORDING
widget.record_button.set_recording()
widget.transcription_options_group_box.setEnabled(False)
widget.audio_devices_combo_box.setEnabled(False)
widget.presentation_options_bar.show()
# Should no longer be hidden after recording starts
assert not widget.presentation_options_bar.isHidden()
time.sleep(0.5)
widget.close()