Changes of Revision 5

speechnote.changes Changed
x
 
1
@@ -1,4 +1,13 @@
2
 -------------------------------------------------------------------
3
+Tue Jul  1 19:07:25 UTC 2025 - Giacomo Comes <gcomes.obs@gmail.com>
4
+
5
+- Update to version 4.8.1
6
+  * see https://github.com/mkiol/dsnote/releases/tag/v4.8.1
7
+- Update to version 4.8.0
8
+  * see https://github.com/mkiol/dsnote/releases/tag/v4.8.0
9
+- Requires python312
10
+
11
+-------------------------------------------------------------------
12
 Tue May  6 14:23:18 UTC 2025 - Giacomo Comes <gcomes.obs@gmail.com>
13
 
14
 - Requires explicitly python311 for tumbleweed
15
speechnote.spec Changed
201
 
1
@@ -19,8 +19,7 @@
2
 %define __provides_exclude ^(libRHVoice.*\\.so.*|libaprilasr\\.so.*|libbergamot_api.*\\.so.*|libclblast\\.so.*|libespeak-ng\\.so.*|libkenlm\\.so.*|libonnxruntime\\.so.*|libstt\\.so.*|libtensorflowlite\\.so.*|libtflitedelegates\\.so.*|libvosk\\.so.*|libwhisper-.*\\.so.*|mimehandler\\(.*|perl\\(.*)$
3
 %define __requires_exclude ^(libRHVoice.*\\.so.*|libaprilasr\\.so.*|libbergamot_api.*\\.so.*|libclblast\\.so.*|libespeak-ng\\.so.*|libkenlm\\.so.*|libonnxruntime\\.so.*|libstt\\.so.*|libtensorflowlite\\.so.*|libtflitedelegates\\.so.*|libvosk\\.so.*|libwhisper-.*\\.so.*|libamdhip64\\.so.*|libhipblas\\.so.*|librocblas\\.so.*)$
4
 
5
-%define pythons python311
6
-
7
+%define pythons python312
8
 %if 0%{?suse_version} < 1600
9
 %define isLeap15 %nil
10
 %else
11
@@ -34,9 +33,14 @@
12
 
13
 %bcond_with mkl
14
 %bcond_with download
15
+%if %{defined isLeap15}
16
+%bcond_with system_pybind11
17
+%else
18
+%bcond_without system_pybind11
19
+%endif
20
 
21
 Name:           speechnote
22
-Version:        4.7.1
23
+Version:        4.8.1
24
 Release:        0
25
 Summary:        App for note taking, reading and translating
26
 URL:            https://github.com/mkiol/dsnote
27
@@ -44,13 +48,14 @@
28
 Group:          Productivity/Office/Other
29
 Source:         %aname-%version.tar.gz
30
 Source1:        sources.tar.zst
31
-Source2:        libxkbcommon-1.6.0.tar.xz
32
+Source2:        pythonbasic.tar
33
 Source3:        CTranslate2-v4.3.1.tar.zst
34
-Source4:        rhvoice-71a1a8.tar.zst
35
+Source4:        rhvoice-846293.tar.zst
36
 Source5:        bergamot-ada8c3.tar.zst
37
-Source6:        pythonmodules.tar.zst
38
-Source7:        %name.rpmlintrc
39
-Source8:        README.SUSE
40
+Source6:        pythonmodules1.tar.zst
41
+Source7:        pythonmodules2.tar.zst
42
+Source8:        %name.rpmlintrc
43
+Source9:        README.SUSE
44
 BuildRequires:  cmake
45
 BuildRequires:  gcc-c++
46
 BuildRequires:  cmake(Qt5LinguistTools)
47
@@ -59,8 +64,9 @@
48
 BuildRequires:  cmake(Qt5Sql)
49
 BuildRequires:  cmake(Qt5QuickControls2)
50
 BuildRequires:  cmake(Qt5X11Extras)
51
+BuildRequires:  libQt5Gui-private-headers-devel
52
 BuildRequires:  extra-cmake-modules
53
-%if %{defined isLeap15} || %{defined isLeap16}
54
+%if %{defined isLeap15}
55
 BuildRequires:  meson
56
 BuildRequires:  bison
57
 BuildRequires:  pkgconfig(libxml-2.0)
58
@@ -78,7 +84,9 @@
59
 BuildRequires:  libarchive-devel
60
 BuildRequires:  fmt-devel
61
 BuildRequires:  xz-devel
62
+%if %{with system_pybind11}
63
 BuildRequires:  %{python_module pybind11-devel}
64
+%endif
65
 BuildRequires:  librubberband-devel
66
 BuildRequires:  libtag-devel
67
 BuildRequires:  libnumbertext-devel
68
@@ -88,7 +96,7 @@
69
 BuildRequires:  libboost_headers1_75_0-devel
70
 %else
71
 %if %{defined isLeap16}
72
-BuildRequires:  libboost_headers1_84_0-devel
73
+BuildRequires:  libboost_headers1_86_0-devel
74
 %else
75
 BuildRequires:  libboost_headers-devel
76
 %endif
77
@@ -100,12 +108,18 @@
78
 BuildRequires:  yq
79
 BuildRequires:  wget
80
 BuildRequires:  %{python_module pip}
81
-BuildRequires:  %{python_module Cython0}
82
 BuildRequires:  %{python_module wheel}
83
+BuildRequires:  %{python_module setuptools}
84
+%if %{with system_pybind11}
85
+BuildRequires:  %{python_module Cython}
86
 BuildRequires:  %{python_module six}
87
 BuildRequires:  %{python_module Markdown}
88
-BuildRequires:  %{python_module setuptools}
89
+BuildRequires:  %{python_module Pygments}
90
+%endif
91
 BuildRequires:  zstd
92
+BuildRequires:  zip
93
+BuildRequires:  unzip
94
+BuildRequires:  patchelf
95
 BuildRequires:  onednn-devel
96
 %if %{with mkl}
97
 BuildRequires:  intel-oneapi-mkl-devel
98
@@ -124,13 +138,18 @@
99
 Summary:        Extra python modules
100
 Requires:       %{name} = %{version}
101
 Requires:       libdnnl3
102
+Requires:       %pythons
103
+Requires:       %pythons-setuptools
104
+%if %{with system_pybind11}
105
+Requires:       %pythons-six
106
+Requires:       %pythons-Pygments
107
+%endif
108
 AutoReqProv:    no
109
 
110
 %description python-modules
111
 Python modules for %name
112
 
113
 
114
-
115
 %prep
116
 %setup -q -n %{aname}-%{version}
117
 %if %{without download}
118
@@ -141,11 +160,14 @@
119
 mkdir build build/aux external external/pythonsrc
120
 
121
 %if %{without download}
122
+#sources
123
 tar fx %SOURCE1 -C build
124
 
125
+#rhvoice
126
 tar fx %SOURCE4 -C external
127
 sed -i '/GIT_REPOSITORY/d;/GIT_TAG/d;/GIT_SHALLOW/d' cmake/rhvoice.cmake
128
 
129
+#bergamot
130
 tar fx %SOURCE5 -C external
131
 mv external/bergamot external/bergamotfallback
132
 tar fx %SOURCE5 -C external
133
@@ -155,6 +177,7 @@
134
 
135
 srcdownload () {
136
     local n i URL DEST SHA256
137
+    ! yq '.modules | explode(.) | select(.name == "'$2'" )' $3 | grep -qF 'sources:' && return
138
     n=$(yq '.modules | explode(.) | select(.name == "'$2'" )' $3 | yq '.sources' | grep -c -e ^-)
139
     if ((n)); then
140
         for ((i=0;i<n;i++)) ; do
141
@@ -176,13 +199,20 @@
142
                 archive)
143
                     tar fx $1/$DEST -C $1 && mv $1/$DEST $1/..
144
                     ;;
145
+                shell)
146
+                    pushd $1 >/dev/null
147
+                    eval $(yq '.modules | explode(.) | select(.name == "'$2'" )' $3 | yq '.sources'$i'.commands' | grep -v '^- |' | sed 's@$@;@')
148
+                    rm -rf tmp #fix for 1.8.0
149
+                    popd >/dev/null
150
+                    ;;
151
                 patch|file) : ;;
152
-                *) false ;;
153
+                *) echo "yq: unknown type" ; exit 1 ;;
154
             esac
155
         done
156
     fi
157
 }
158
 
159
+#ctranslate2
160
 %if %{with download}
161
 srcdownload build/aux ctranslate2 $PWD/flatpak/net.mkiol.SpeechNote.yaml
162
 %else
163
@@ -190,53 +220,50 @@
164
 %endif
165
 
166
 
167
+#pythonmodules
168
 %if %{with download}
169
 for m in $(yq '.modules.name | explode(.)' flatpak/python3-modules-x86-64.yaml) ; do
170
     srcdownload external/pythonsrc $m $PWD/flatpak/python3-modules-x86-64.yaml
171
 done
172
 %else
173
+%if %{without system_pybind11}
174
+tar fx %SOURCE2 -C external/pythonsrc
175
+%endif
176
 tar fx %SOURCE6 -C external/pythonsrc
177
+tar fx %SOURCE7 -C external/pythonsrc
178
 %endif
179
 
180
-cp %SOURCE8 .
181
+cp %SOURCE9 .
182
 
183
 #rpath /usr/share/dsnote/lib
184
 sed -i '/-rpath/s@/lib@/share/%{aname}&@' CMakeLists.txt
185
 
186
 
187
 %build
188
+%if %{with system_pybind11}
189
 export PKG_CONFIG_PATH=%{python_sitelib}/pybind11/share/pkgconfig
190
-
191
-%if %{defined isLeap15} || %{defined isLeap16}
192
-mkdir xkb
193
-tar fx %SOURCE2 -C xkb
194
-cd xkb/libxkbcommon-1.6.0
195
-mkdir build
196
-%meson -Denable-docs=false -Ddefault_library=static -Denable-x11=true -Denable-tools=false -Denable-bash-completion=false --buildtype=release
197
-%meson_build
198
-DESTDIR=$PWD/build meson install -C x86_64-suse-linux --no-rebuild
199
-PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$PWD/build%{_libdir}/pkgconfig
200
-sed -i '/^prefix=/s@=.*@=${pcfiledir}/../../@' build%{_libdir}/pkgconfig/xkbcommon.pc
201
dsnote-4.7.1.tar.gz/cmake/uroman.cmake Deleted
20
 
1
@@ -1,18 +0,0 @@
2
-set(uroman_source_url "https://github.com/isi-nlp/uroman/archive/refs/tags/v1.2.8.tar.gz")
3
-set(uroman_checksum "08e5058341428f3f4ca2401d409df1f4341c386853c4de836e7ab2c2a750cb88")
4
-
5
-ExternalProject_Add(uroman
6
-    SOURCE_DIR ${external_dir}/uroman
7
-    BINARY_DIR ${PROJECT_BINARY_DIR}/external/uroman
8
-    INSTALL_DIR ${external_share_dir}/uroman
9
-    URL "${uroman_source_url}"
10
-    URL_HASH SHA256=${uroman_checksum}
11
-    CONFIGURE_COMMAND ""
12
-    BUILD_COMMAND ""
13
-    INSTALL_COMMAND mkdir -p <INSTALL_DIR>
14
-        && cp -r <SOURCE_DIR>/bin <INSTALL_DIR>/
15
-        && cp -r <SOURCE_DIR>/data <INSTALL_DIR>/
16
-        && cp -r <SOURCE_DIR>/lib <INSTALL_DIR>/
17
-)
18
-
19
-list(APPEND deps uroman)
20
dsnote-4.7.1.tar.gz/CMakeLists.txt -> dsnote-4.8.1.tar.gz/CMakeLists.txt Changed
201
 
1
@@ -1,10 +1,10 @@
2
-# Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+# Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
 #
5
 # This Source Code Form is subject to the terms of the Mozilla Public
6
 # License, v. 2.0. If a copy of the MPL was not distributed with this
7
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 
9
-cmake_minimum_required(VERSION 3.5)
10
+cmake_minimum_required(VERSION 3.19)
11
 
12
 option(WITH_DESKTOP "enable desktop ui" OFF)
13
 option(WITH_SFOS "enable sfos ui" OFF)
14
@@ -44,7 +44,6 @@
15
 option(BUILD_RHVOICE "download sources of rhvoice lib, build and install shared lib" ON)
16
 option(BUILD_RHVOICE_MODULE "make rhvoice module archive" ON)
17
 option(BUILD_BERGAMOT "download sources of bergamot-translator lib, build and install shared lib" ON)
18
-option(BUILD_UROMAN "download sources of uroman and install uroman lib" ON) # only for x86_64
19
 option(BUILD_RUBBERBAND "download sources of rubberband lib, build and link statically" ON)
20
 option(BUILD_FFMPEG "download sources of ffmpeg libs, build and link statically" ON)
21
 option(BUILD_TAGLIB "download sources of taglib, build and link statically" ON)
22
@@ -53,9 +52,15 @@
23
 option(BUILD_APRILASR "download sources of april-asr lib, build and link statically" ON)
24
 option(BUILD_HTML2MD "download sources of html2md lib, build and link statically" ON)
25
 option(BUILD_MADDY "download sources of maddy lib" ON)
26
-option(BUILD_XDO "download sources of xdo lib" ON)
27
+option(BUILD_XDO "download sources of xdo lib and link statically" ON)
28
+option(BUILD_SAM "download sources of sam and link statically" ON)
29
+option(BUILD_XKBCOMMON "download sources of xkbcommon build and link statically" OFF)
30
 option(BUILD_QQC2_BREEZE_STYLE "download sources of QQC2 Breeze Style, build and install" OFF)
31
 
32
+# options used only for testing
33
+option(DEV_USE_PYTHON311 OFF)
34
+option(DEV_USE_PYTHON312 OFF)
35
+
36
 if(${WITH_DESKTOP} AND ${WITH_SFOS})
37
     message(FATAL_ERROR "options WITH_DESKTOP and WITH_SFOS cannot be set together")
38
 endif()
39
@@ -69,28 +74,41 @@
40
     message(FATAL_ERROR "one of the options should be set (WITH_DESKTOP or WITH_SFOS)")
41
 endif()
42
 
43
-if(NOT ${WITH_PY} AND ${BUILD_UROMAN})
44
-    set(BUILD_UROMAN OFF)
45
-    message(WARNING "disabling BUILD_UROMAN because WITH_PY is off")
46
-endif()
47
-
48
 if(WITH_DESKTOP)
49
     if(WITH_FLATPAK)
50
         set(BUILD_PYTHON_MODULE OFF)
51
-        set(BUILD_QQC2_DESKTOP_STYLE OFF)
52
+        set(BUILD_QQC2_BREEZE_STYLE OFF)
53
     endif()
54
 endif()
55
 
56
 if(WITH_SFOS)
57
-    if (${WITH_PY} AND NOT ${BUILD_PYTHON_MODULE})
58
+    if(${WITH_PY} AND NOT ${BUILD_PYTHON_MODULE})
59
         set(BUILD_PYTHON_MODULE ON)
60
         message(WARNING "enabling BUILD_PYTHON_MODULE because WITH_PY is on")
61
     endif()
62
-    if (WITH_X11_FEATURES)
63
+    if(WITH_X11_FEATURES)
64
         set(WITH_X11_FEATURES OFF)
65
         message(WARNING "disabling WITH_X11_FEATURES on sfos")
66
     endif()
67
-    set(BUILD_QQC2_DESKTOP_STYLE OFF)
68
+    if(BUILD_XDO)
69
+        set(BUILD_XDO OFF)
70
+        message(WARNING "disabling BUILD_XDO on sfos")
71
+    endif()
72
+    if(BUILD_QQC2_BREEZE_STYLE)
73
+        set(BUILD_QQC2_BREEZE_STYLE OFF)
74
+        message(WARNING "disabling BUILD_QQC2_BREEZE_STYLE on sfos")
75
+    endif()
76
+endif()
77
+
78
+if(NOT ${WITH_X11_FEATURES})
79
+    if(BUILD_XDO)
80
+        set(BUILD_XDO OFF)
81
+        message(WARNING "disabling BUILD_XDO because WITH_X11_FEATURES is off")
82
+    endif()
83
+    if(BUILD_QHOTKEY)
84
+        set(BUILD_QHOTKEY OFF)
85
+        message(WARNING "disabling BUILD_QHOTKEY because WITH_X11_FEATURES is off")
86
+    endif()
87
 endif()
88
 
89
 set(id "dsnote")
90
@@ -134,24 +152,26 @@
91
 set(info_license "Mozilla Public License 2.0")
92
 set(info_license_url "http://mozilla.org/MPL/2.0")
93
 set(info_license_spdx "MPL-2.0")
94
-set(info_conf_version "97")
95
-set(info_addon_version "1.3") # if run as a flatpak pkg, the required add-on version
96
+set(info_conf_version "111")
97
+set(info_addon_version "1.4") # if run as a flatpak pkg, the required add-on version
98
+#set(info_version_type "-beta")
99
 set(info_version_type "")
100
 set(info_translators_str "Heimen Stoffels · Bérenger Arnaud · Karry · dashinfantry · \
101
-Åke Engelbrektson · L'Africain · Albano Battistella · Locness3 · DevSJR · Vovkiv · Niklas Halvorsen · Matjaž Jeran")
102
+Åke Engelbrektson · L'Africain · Albano Battistella · Locness3 · DevSJR · Vovkiv · Niklas Halvorsen · \
103
+Matjaž Jeran · Victor Alonso Barberan · Bruno Veilleux · Abdullah Albaroty · 李 阳 · Erdem Uygun · Armin Maier")
104
 set(info_libs_str "Qt · Coqui STT · Vosk · whisper.cpp · WebRTC-VAD · libarchive · RNNoise-nu · \
105
 {fmt} · Piper · RHVoice · ssplit-cpp · nlohmann JSON · eSpeak NG · Bergamot Translator · \
106
-Rubber Band Library · simdjson · uroman · astrunc · FFmpeg · LAME · Vorbis · Opus · TagLib · \
107
-libnumbertext · april-asr · html2md · maddy · libxdo")
108
-if (WITH_DESKTOP)
109
+Rubber Band Library · simdjson · astrunc · FFmpeg · LAME · Vorbis · Opus · TagLib · \
110
+libnumbertext · april-asr · html2md · maddy · SAM")
111
+if(WITH_DESKTOP)
112
     set(info_libs_str "${info_libs_str} · KDBusAddons")
113
 
114
-    if (WITH_X11_FEATURES)
115
-        set(info_libs_str "${info_libs_str} · QHotkey")
116
+    if(WITH_X11_FEATURES)
117
+        set(info_libs_str "${info_libs_str} · QHotkey · libxdo")
118
     endif()
119
 endif()
120
 
121
-project(${id} VERSION 4.7.1)
122
+project(${id} VERSION 4.8.1)
123
 
124
 set(arch_arm32 0)
125
 set(arch_arm64 0)
126
@@ -170,8 +190,9 @@
127
 endif()
128
 
129
 if(WITH_PY)
130
-    if(arch_x8664)
131
-        set(info_libs_str "${info_libs_str} · Hugging Face Transformers · Coqui TTS · faster-whisper · Mimic 3 · Unikud · WhisperSpeech")
132
+    if(WITH_FLATPAK)
133
+        set(info_libs_str "${info_libs_str} · Hugging Face Transformers · Coqui TTS · faster-whisper · \
134
+Mimic 3 · Unikud · WhisperSpeech · Parler-TTS · Kokoro TTS · F5-TTS")
135
     endif()
136
 endif()
137
 
138
@@ -227,6 +248,8 @@
139
 set(lib_install_dir "${install_dir}/lib")
140
 set(bin_install_dir "${install_dir}/bin")
141
 set(rpath_install_dir "${CMAKE_INSTALL_PREFIX}/${lib_install_dir}")
142
+set(resources_dir "${PROJECT_SOURCE_DIR}/resources")
143
+set(resources_install_dir ${install_dir})
144
 set(translations_resource_file "${CMAKE_BINARY_DIR}/translations.qrc")
145
 
146
 set(xz_path "xz")
147
@@ -240,11 +263,12 @@
148
 set(deps_libs "") # libs to link to dsnote_lib and dsnote
149
 
150
 # global config
151
-
152
 set(BUILD_SHARED_LIBS OFF)
153
 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
154
 set(CMAKE_AUTOMOC ON)
155
 set(CMAKE_SKIP_RPATH ON)
156
+set(ENV{PKG_CONFIG_PATH} $ENV{PKG_CONFIG_PATH}:${PROJECT_BINARY_DIR})
157
+message(STATUS "PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}")
158
 
159
 # includes
160
 
161
@@ -366,18 +390,28 @@
162
     ${sources_dir}/audio_device_manager.cpp
163
     ${sources_dir}/audio_device_manager.hpp
164
     ${sources_dir}/cmd_options.hpp
165
+    ${sources_dir}/sam_engine.cpp
166
+    ${sources_dir}/sam_engine.hpp
167
+    ${sources_dir}/parler_engine.cpp
168
+    ${sources_dir}/parler_engine.hpp
169
+    ${sources_dir}/f5_engine.cpp
170
+    ${sources_dir}/f5_engine.hpp
171
+    ${sources_dir}/kokoro_engine.cpp
172
+    ${sources_dir}/kokoro_engine.hpp
173
 )
174
 
175
 if(WITH_DESKTOP)
176
     list(APPEND dsnote_lib_sources
177
         ${sources_dir}/tray_icon.hpp
178
-        ${sources_dir}/tray_icon.cpp)
179
-endif()
180
-
181
-if(WITH_X11_FEATURES)
182
-    list(APPEND dsnote_lib_sources
183
+        ${sources_dir}/tray_icon.cpp
184
         ${sources_dir}/fake_keyboard.hpp
185
-        ${sources_dir}/fake_keyboard.cpp)
186
+        ${sources_dir}/fake_keyboard.cpp
187
+        ${sources_dir}/global_hotkeys_manager.cpp
188
+        ${sources_dir}/global_hotkeys_manager.hpp
189
+        ${sources_dir}/dbus_portal_globalshortcuts_inf.cpp
190
+        ${sources_dir}/dbus_portal_globalshortcuts_inf.h
191
+        ${sources_dir}/dbus_portal_request_inf.cpp
192
+        ${sources_dir}/dbus_portal_request_inf.h)
193
 endif()
194
 
195
 configure_file(config.h.in config.h)
196
@@ -442,10 +476,7 @@
197
     target_link_options(compiler_flags INTERFACE "-pie;-flto;-fno-fat-lto-objects")
198
 endif()
199
 
200
-set(link_opts "-Wl,--disable-new-dtags;-Wl,-pie;-Wl,-rpath,${rpath_install_dir}")
201
dsnote-4.7.1.tar.gz/README.md -> dsnote-4.8.1.tar.gz/README.md Changed
201
 
1
@@ -11,6 +11,7 @@
2
 - How to install(#how-to-install)
3
 - Flatpak packages(#flatpak-packages)
4
 - Beta version(#beta-version)
5
+- Extra features(#extra-features)
6
 - Building from sources(#building-from-sources)
7
 - How to enable a custom model(#how-to-enable-a-custom-model)
8
 - Contributing to Speech Note(#contributing-to-speech-note)
9
@@ -43,84 +44,95 @@
10
     - Coqui TTS(https://github.com/coqui-ai/TTS)
11
     - Mimic 3(https://mycroft.ai/mimic-3)
12
     - WhisperSpeech(https://collabora.github.io/WhisperSpeech/)
13
+    - Kokoro(https://github.com/hexgrad/kokoro)
14
+    - Parler-TTS(https://github.com/huggingface/parler-tts)
15
+    - F5-TTS(https://github.com/SWivid/F5-TTS)
16
+    - S.A.M.(https://discordier.github.io/sam)
17
 - Machine Translation (MT)
18
     - Bergamot Translator(https://github.com/browsermt/bergamot-translator)
19
 
20
 ## Languages and Models
21
 
22
-Following languages are supported:
23
-
24
-| **Lang ID** | **Name**      | **DeepSpeech (STT)** | **Whisper (STT)** | **Vosk (STT)** | **April-ASR (STT)** | **Piper (TTS)** | **RHVoice (TTS)** | **espeak (TTS)** | **MBROLA (TTS)** | **Coqui (TTS)** | **Mimic3 (TTS)** | **WhisperSpeech (TTS)** | **Bergamot (MT)** |
25
-| ----------- | ------------- | -------------------- | ----------------- | -------------- | ------------------- | --------------- | ----------------- | ---------------- | ---------------- | --------------- | ---------------- | ----------------------- | ----------------- |
26
-| af          | Afrikaans     |                      | ●                 |                |                     |                 |                   | ●                |                  |                 | ●                |                         |                   |
27
-| am          | Amharic       | ● (e)                | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
28
-| ar          | Arabic        |                      | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               |                  |                         | ●                 |
29
-| bg          | Bulgarian     |                      | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
30
-| bn          | Bengali       |                      | ●                 |                |                     |                 |                   | ●                |                  | ●               | ●                |                         |                   |
31
-| bs          | Bosnian       |                      | ●                 |                |                     |                 |                   | ●                |                  |                 |                  |                         | ●                 |
32
-| ca          | Catalan       | ●                    | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               |                  |                         | ●                 |
33
-| cs          | Czech         | ●                    | ●                 | ●              |                     | ●               | ●                 | ●                | ●                | ●               |                  |                         | ●                 |
34
-| cy          | Welsh         |                      |                   |                |                     | ●               |                   |                  |                  |                 |                  |                         |                   |
35
-| da          | Danish        |                      | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         | ●                 |
36
-| de          | German        | ●                    | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               | ●                | ●                       | ●                 |
37
-| el          | Greek         | ● (e)                | ●                 |                |                     | ●               |                   | ●                |                  | ●               | ●                |                         | ●                 |
38
-| en          | English       | ●                    | ●                 | ●              | ●                   | ●               | ●                 | ●                |                  | ●               | ●                | ●                       | ●                 |
39
-| eo          | Esperanto     |                      |                   | ●              |                     |                 | ●                 | ●                |                  |                 |                  |                         |                   |
40
-| es          | Spanish       | ●                    | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               | ●                | ●                       | ●                 |
41
-| et          | Estonian      | ● (e)                | ●                 |                |                     |                 |                   | ●                | ●                | ●               |                  |                         | ●                 |
42
-| eu          | Basque        | ● (e)                | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
43
-| fa          | Persian       | ●                    | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               | ●                |                         | ●                 |
44
-| fi          | Finnish       | ●                    | ●                 |                |                     | ●               |                   | ●                |                  | ●               | ●                |                         | ●                 |
45
-| fr          | French        | ●                    | ●                 | ●              | ●                   | ●               |                   | ●                |                  | ●               | ●                | ●                       | ●                 |
46
-| ga          | Irish         |                      |                   |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
47
-| gu          | Gujarati      |                      | ●                 |                |                     |                 |                   | ●                |                  |                 | ●                |                         |                   |
48
-| ha          | Hausa         |                      | ●                 |                |                     |                 |                   |                  |                  |                 | ●                |                         |                   |
49
-| he          | Hebrew        |                      | ●                 |                |                     |                 |                   |                  |                  | ●               |                  |                         |                   |
50
-| hi          | Hindi         |                      | ●                 | ●              |                     |                 |                   | ●                |                  |                 |                  |                         |                   |
51
-| hr          | Croatian      |                      | ●                 |                |                     |                 | ●                 | ●                | ●                | ●               |                  |                         |                   |
52
-| hu          | Hungarian     | ● (e)                | ●                 |                |                     | ●               |                   | ●                | ●                | ●               | ●                |                         | ●                 |
53
-| id          | Indonesian    | ● (e)                | ●                 |                |                     |                 |                   | ●                | ●                | ●               |                  |                         | ●                 |
54
-| is          | Icelandic     |                      | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         | ●                 |
55
-| it          | Italian       | ●                    | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               | ●                | ●                       | ●                 |
56
-| ja          | Japanese      |                      | ●                 | ●              |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
57
-| jv          | Javanese      |                      | ●                 |                |                     |                 |                   |                  |                  |                 | ●                |                         |                   |
58
-| ka          | Georgian      |                      | ●                 |                |                     | ●               | ●                 | ●                |                  |                 |                  |                         |                   |
59
-| kk          | Kazakh        |                      | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               |                  |                         |                   |
60
-| ko          | Korean        |                      | ●                 | ●              |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
61
-| ky          | Kyrgyz        |                      |                   |                |                     |                 | ●                 | ●                |                  |                 |                  |                         |                   |
62
-| la          | Latin         |                      |                   |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
63
-| lb          | Luxembourgish |                      |                   |                |                     | ●               |                   |                  |                  |                 |                  |                         |                   |
64
-| lt          | Lithuanian    |                      | ●                 |                |                     |                 |                   | ●                | ●                | ●               |                  |                         | ●                 |
65
-| lv          | Latvian       | ●                    | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         | ●                 |
66
-| mk          | Macedonian    |                      | ●                 |                |                     |                 | ●                 | ●                |                  |                 |                  |                         |                   |
67
-| mn          | Mongolian     | ● (e)                | ●                 |                |                     |                 |                   |                  |                  | ●               |                  |                         |                   |
68
-| mr          | Marathi       |                      | ●                 |                |                     |                 |                   |                  |                  | ●               |                  |                         |                   |
69
-| ms          | Malay         |                      | ●                 |                |                     |                 |                   | ●                | ●                | ●               |                  |                         |                   |
70
-| mt          | Maltese       |                      | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
71
-| ne          | Nepali        |                      | ●                 |                |                     | ●               |                   | ●                |                  |                 | ●                |                         |                   |
72
-| nl          | Dutch         | ● (e)                | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               | ●                | ●                       | ●                 |
73
-| no          | Norwegian     |                      | ●                 |                |                     | ●               |                   | ●                |                  |                 |                  |                         | ●                 |
74
-| pl          | Polish        | ●                    | ●                 | ●              | ●                   | ●               | ●                 | ●                | ●                | ●               | ●                | ●                       | ●                 |
75
-| pt          | Portuguese    | ● (e)                | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               |                  |                         | ●                 |
76
-| ro          | Romanian      | ● (e)                | ●                 |                |                     | ●               |                   | ●                | ●                | ●               |                  |                         | ●                 |
77
-| ru          | Russian       | ●                    | ●                 | ●              |                     | ●               | ●                 | ●                |                  |                 | ●                |                         | ●                 |
78
-| sk          | Slovak        |                      | ●                 |                |                     | ●               | ●                 | ●                |                  | ●               |                  |                         | ●                 |
79
-| sl          | Slovenian     | ● (e)                | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         | ●                 |
80
-| sq          | Albanian      |                      | ●                 |                |                     |                 | ●                 | ●                |                  | ●               |                  |                         |                   |
81
-| sr          | Serbian       |                      | ●                 |                |                     | ●               | ●                 | ●                |                  |                 |                  |                         | ●                 |
82
-| sv          | Swedish       |                      | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               | ●                |                         | ●                 |
83
-| sw          | Swahili       | ●                    | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         |                   |
84
-| te          | Telugu        |                      | ●                 |                |                     |                 |                   | ●                |                  |                 | ●                |                         |                   |
85
-| th          | Thai          | ● (e)                | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
86
-| tl          | Tagalog       |                      | ●                 | ●              |                     |                 |                   |                  |                  | ●               |                  |                         |                   |
87
-| tn          | Tswana        |                      | ●                 |                |                     |                 |                   | ●                |                  |                 | ●                |                         |                   |
88
-| tr          | Turkish       | ● (e)                | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               |                  |                         | ●                 |
89
-| tt          | Tatar         |                      | ●                 |                |                     |                 | ●                 | ●                |                  | ●               |                  |                         |                   |
90
-| uk          | Ukrainian     | ●                    | ●                 | ●              |                     | ●               | ●                 | ●                |                  | ●               | ●                |                         | ●                 |
91
-| uz          | Uzbek         |                      | ●                 | ●              |                     |                 |                   | ●                |                  | ●               |                  |                         |                   |
92
-| vi          | Vietnamese    |                      | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               |                  |                         | ●                 |
93
-| yo          | Yoruba        | ● (e)                | ●                 |                |                     |                 |                   |                  |                  | ●               | ●                |                         |                   |
94
-| zh          | Chinese       | ●                    | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               |                  |                         | ●                 |
95
+Speech Note installation package does not include checkpoint files for supported models, but instead they can be easily downloaded using the graphical model browser built into the application.
96
+
97
+Following languages and models are supported and enable for download:
98
+
99
+| **Lang ID** | **Name org**     | **Name**      | **DeepSpeech (STT)** | **Whisper (STT)** | **Vosk (STT)** | **April-ASR (STT)** | **Piper (TTS)** | **RHVoice (TTS)** | **espeak (TTS)** | **MBROLA (TTS)** | **Coqui (TTS)** | **Mimic3 (TTS)** | **WhisperSpeech (TTS)** | **Kokoro (TTS)** | **F5-TTS** | **Parler-TTS** | **S.A.M. (TTS)** | **Bergamot (MT)** |
100
+| ----------- | ---------------- | ------------- | -------------------- | ----------------- | -------------- | ------------------- | --------------- | ----------------- | ---------------- | ---------------- | --------------- | ---------------- | ----------------------- | ---------------- | ---------- | -------------- | ---------------- | ----------------- |
101
+| af          | Afrikaans        | Afrikaans     |                      | ●                 |                |                     |                 |                   | ●                |                  |                 | ●                |                         |                  |            |                |                  |                   |
102
+| am          | Amarəñña         | Amharic       | ● (e)                | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
103
+| ar          | عربي             | Arabic        |                      | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               |                  |                         |                  |            |                |                  | ●                 |
104
+| az          | Azərbaycanca     | Azerbaijani   |                      |                   |                |                     |                 |                   |                  |                  |                 |                  |                         |                  |            |                |                  | ●                 |
105
+| be          | Беларуская       | Belarusian    |                      |                   |                |                     |                 |                   |                  |                  |                 |                  |                         |                  |            |                |                  | ●                 |
106
+| bg          | Български        | Bulgarian     |                      | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
107
+| bn          | বাংলা            | Bengali       |                      | ●                 |                |                     |                 |                   | ●                |                  | ●               | ●                |                         |                  |            |                |                  |                   |
108
+| bs          | Bosanski         | Bosnian       |                      | ●                 |                |                     |                 |                   | ●                |                  |                 |                  |                         |                  |            |                |                  | ●                 |
109
+| ca          | Català           | Catalan       | ●                    | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
110
+| cs          | Čeština          | Czech         | ●                    | ●                 | ●              |                     | ●               | ●                 | ●                | ●                | ●               |                  |                         |                  |            |                |                  | ●                 |
111
+| cy          | Cymraeg          | Welsh         |                      |                   |                |                     | ●               |                   |                  |                  |                 |                  |                         |                  |            |                |                  |                   |
112
+| da          | Dansk            | Danish        |                      | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
113
+| de          | Deutsch          | German        | ●                    | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               | ●                | ●                       |                  |            | ●(e)           |                  | ●                 |
114
+| el          | Ελληνικά         | Greek         | ● (e)                | ●                 |                |                     | ●               |                   | ●                |                  | ●               | ●                |                         |                  |            |                |                  | ●                 |
115
+| en          | English          | English       | ●                    | ●                 | ●              | ●                   | ●               | ●                 | ●                |                  | ●               | ●                | ●                       | ●                | ●          | ●              | ●                | ●                 |
116
+| eo          | Esperanto        | Esperanto     |                      |                   | ●              |                     |                 | ●                 | ●                |                  |                 |                  |                         |                  |            |                |                  |                   |
117
+| es          | Español          | Spanish       | ●                    | ●                 | ●              |                     | ●               | ●                 | ●                |                  | ●               | ●                | ●                       | ●                |            | ●(e)           |                  | ●                 |
118
+| et          | Eesti            | Estonian      | ● (e)                | ●                 |                |                     |                 |                   | ●                | ●                | ●               |                  |                         |                  |            |                |                  | ●                 |
119
+| eu          | Euskara          | Basque        | ● (e)                | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
120
+| fa          | فارسی            | Persian       | ●                    | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               | ●                |                         |                  |            |                |                  | ●                 |
121
+| fi          | Suomi            | Finnish       | ●                    | ●                 |                |                     | ●               |                   | ●                |                  | ●               | ●                |                         |                  |            |                |                  | ●                 |
122
+| fr          | Français         | French        | ●                    | ●                 | ●              | ●                   | ●               |                   | ●                |                  | ●               | ●                | ●                       | ●                |            | ●(e)           |                  | ●                 |
123
+| ga          | Gaeilge          | Irish         |                      |                   |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
124
+| gu          | ગુજરાતી          | Gujarati      |                      | ●                 |                |                     |                 |                   | ●                |                  |                 | ●                |                         |                  |            |                |                  |                   |
125
+| ha          | Hausa            | Hausa         |                      | ●                 |                |                     |                 |                   |                  |                  |                 | ●                |                         |                  |            |                |                  |                   |
126
+| he          | עברית            | Hebrew        |                      | ●                 |                |                     |                 |                   |                  |                  | ●               |                  |                         |                  |            |                |                  |                   |
127
+| hi          | हिन्दी           | Hindi         |                      | ●                 | ●              |                     |                 |                   | ●                |                  |                 |                  |                         | ●                |            |                |                  |                   |
128
+| hr          | Hrvatski         | Croatian      |                      | ●                 |                |                     |                 | ●                 | ●                | ●                | ●               |                  |                         |                  |            |                |                  |                   |
129
+| hu          | Magyar           | Hungarian     | ● (e)                | ●                 |                |                     | ●               |                   | ●                | ●                | ●               | ●                |                         |                  |            |                |                  | ●                 |
130
+| id          | Bahasa Indonesia | Indonesian    | ● (e)                | ●                 |                |                     |                 |                   | ●                | ●                | ●               |                  |                         |                  |            |                |                  | ●                 |
131
+| is          | íslenska         | Icelandic     |                      | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
132
+| it          | Italiano         | Italian       | ●                    | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               | ●                | ●                       | ●                |            | ●(e)           |                  | ●                 |
133
+| ja          | 日本語              | Japanese      |                      | ●                 | ●              |                     |                 |                   | ●                |                  | ●               |                  |                         | ●                |            |                |                  | ●                 |
134
+| jv          | Basa Jawa        | Javanese      |                      | ●                 |                |                     |                 |                   |                  |                  |                 | ●                |                         |                  |            |                |                  |                   |
135
+| ka          | ქართული          | Georgian      |                      | ●                 |                |                     | ●               | ●                 | ●                |                  |                 |                  |                         |                  |            |                |                  |                   |
136
+| kk          | Қазақ            | Kazakh        |                      | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
137
+| kn          | ಕನ್ನಡ            | Kannada       |                      |                   |                |                     |                 |                   |                  |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
138
+| ko          | 한국어              | Korean        |                      | ●                 | ●              |                     |                 |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
139
+| ky          | Кыргыз           | Kyrgyz        |                      |                   |                |                     |                 | ●                 | ●                |                  |                 |                  |                         |                  |            |                |                  |                   |
140
+| la          | Latīnum          | Latin         |                      |                   |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
141
+| lb          | Lëtzebuergesch   | Luxembourgish |                      |                   |                |                     | ●               |                   |                  |                  |                 |                  |                         |                  |            |                |                  |                   |
142
+| lt          | Lietuvių         | Lithuanian    |                      | ●                 |                |                     |                 |                   | ●                | ●                | ●               |                  |                         |                  |            |                |                  | ●                 |
143
+| lv          | Latviešu         | Latvian       | ●                    | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
144
+| mk          | Македонски       | Macedonian    |                      | ●                 |                |                     |                 | ●                 | ●                |                  |                 |                  |                         |                  |            |                |                  |                   |
145
+| ml          | മലയാളം           | Malayalam     |                      |                   |                |                     |                 |                   |                  |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
146
+| mn          | Монгол           | Mongolian     | ● (e)                | ●                 |                |                     |                 |                   |                  |                  | ●               |                  |                         |                  |            |                |                  |                   |
147
+| mr          | मराठी            | Marathi       |                      | ●                 |                |                     |                 |                   |                  |                  | ●               |                  |                         |                  |            |                |                  |                   |
148
+| ms          | Melayu           | Malay         |                      | ●                 |                |                     |                 |                   | ●                | ●                | ●               |                  |                         |                  |            |                |                  |                   |
149
+| mt          | Malti            | Maltese       |                      | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
150
+| ne          | नेपाली           | Nepali        |                      | ●                 |                |                     | ●               |                   | ●                |                  |                 | ●                |                         |                  |            |                |                  |                   |
151
+| nl          | Nederlands       | Dutch         | ● (e)                | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               | ●                | ●                       |                  |            | ●(e)           |                  | ●                 |
152
+| no          | Norsk            | Norwegian     |                      | ●                 |                |                     | ●               |                   | ●                |                  |                 |                  |                         |                  |            |                |                  | ●                 |
153
+| pl          | Polski           | Polish        | ●                    | ●                 | ●              | ●                   | ●               | ●                 | ●                | ●                | ●               | ●                | ●                       |                  |            | ●(e)           |                  | ●                 |
154
+| pt          | Português        | Portuguese    | ● (e)                | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               |                  |                         | ●                |            | ●(e)           |                  | ●                 |
155
+| ro          | Română           | Romanian      | ● (e)                | ●                 |                |                     | ●               |                   | ●                | ●                | ●               |                  |                         |                  |            |                |                  | ●                 |
156
+| ru          | Русский          | Russian       | ●                    | ●                 | ●              |                     | ●               | ●                 | ●                |                  |                 | ●                |                         |                  |            |                |                  | ●                 |
157
+| sk          | Slovenčina       | Slovak        |                      | ●                 |                |                     | ●               | ●                 | ●                |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
158
+| sl          | Slovenščina      | Slovenian     | ● (e)                | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
159
+| sq          | Shqip            | Albanian      |                      | ●                 |                |                     |                 | ●                 | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
160
+| sr          | Српски           | Serbian       |                      | ●                 |                |                     | ●               | ●                 | ●                |                  |                 |                  |                         |                  |            |                |                  | ●                 |
161
+| sv          | Svenska          | Swedish       |                      | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               | ●                |                         |                  |            |                |                  | ●                 |
162
+| sw          | Kiswahili        | Swahili       | ●                    | ●                 |                |                     | ●               |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
163
+| ta          | தமிழ்            | Tamil         |                      |                   |                |                     |                 |                   |                  |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
164
+| te          | తెలుగు           | Telugu        |                      | ●                 |                |                     |                 |                   | ●                |                  |                 | ●                |                         |                  |            |                |                  |                   |
165
+| th          | ไทย              | Thai          | ● (e)                | ●                 |                |                     |                 |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
166
+| tl          | Tagalog          | Tagalog       |                      | ●                 | ●              |                     |                 |                   |                  |                  | ●               |                  |                         |                  |            |                |                  |                   |
167
+| tn          | Setswana         | Tswana        |                      | ●                 |                |                     |                 |                   | ●                |                  |                 | ●                |                         |                  |            |                |                  |                   |
168
+| tr          | Türkçe           | Turkish       | ● (e)                | ●                 | ●              |                     | ●               |                   | ●                | ●                | ●               |                  |                         |                  |            |                |                  | ●                 |
169
+| tt          | татарча          | Tatar         |                      | ●                 |                |                     |                 | ●                 | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
170
+| uk          | Українська       | Ukrainian     | ●                    | ●                 | ●              |                     | ●               | ●                 | ●                |                  | ●               | ●                |                         |                  |            |                |                  | ●                 |
171
+| uz          | Oʻzbekcha        | Uzbek         |                      | ●                 | ●              |                     |                 |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  |                   |
172
+| vi          | Tiếng Việt       | Vietnamese    |                      | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               |                  |                         |                  |            |                |                  | ●                 |
173
+| yo          | Yorùbá           | Yoruba        | ● (e)                | ●                 |                |                     |                 |                   |                  |                  | ●               | ●                |                         |                  |            |                |                  |                   |
174
+| zh          | 中文               | Chinese       | ●                    | ●                 | ●              |                     | ●               |                   | ●                |                  | ●               |                  |                         | ●                | ●          |                |                  | ●                 |
175
 
176
 <sup>(e) experimental, most likely doesn't work well</sup>
177
 <br/>
178
@@ -144,13 +156,25 @@
179
 # Optional NVIDIA add-on package
180
 flatpak install net.mkiol.SpeechNote.Addon.nvidia
181
 
182
-# Optional AMD add-on package (not recommended)
183
+# Optional AMD add-on package
184
 flatpak install net.mkiol.SpeechNote.Addon.amd
185
 ```
186
 
187
 - Arch Linux (AUR):
188
+
189
   - dsnote(https://aur.archlinux.org/packages/dsnote)
190
   - dsnote-git(https://aur.archlinux.org/packages/dsnote-git)
191
+
192
+- openSUSE (Packman repository(https://en.opensuse.org/Additional_package_repositories#Packman))
193
+
194
+```sh
195
+# Base package
196
+zypper in speechnote
197
+
198
+# Optional support for Python-based features in Speech Note
199
+zypper in speechnote-python-modules
200
+```
201
dsnote-4.7.1.tar.gz/arch/git/PKGBUILD -> dsnote-4.8.1.tar.gz/arch/git/PKGBUILD Changed
72
 
1
@@ -2,7 +2,7 @@
2
 
3
 _pkgname='dsnote'
4
 pkgname="${_pkgname}-git"
5
-pkgver=r1266.b3206a1
6
+pkgver=r1454.8c105b9
7
 pkgrel=1
8
 pkgdesc="Note taking, reading and translating with offline Speech to Text, Text to Speech and Machine Translation"
9
 arch=(
10
@@ -16,16 +16,17 @@
11
   'fmt'
12
   'glslang'
13
   'hicolor-icon-theme'
14
+  'kconfigwidgets5'
15
   'kdbusaddons5'
16
+  'kiconthemes5'
17
+  'kirigami2'
18
   'libarchive'
19
   'libpulse'
20
   'libxinerama'
21
   'libxtst'
22
   'ocl-icd'
23
   'openblas'
24
-  'perl'
25
   'python>=3.11'
26
-  'qqc2-desktop-style5'
27
   'qt5-base'
28
   'qt5-declarative'
29
   'qt5-multimedia'
30
@@ -34,6 +35,7 @@
31
   'rubberband'
32
   'taglib'
33
   'vulkan-icd-loader'
34
+  'wayland'
35
   'xz'
36
 )
37
 makedepends=(
38
@@ -54,13 +56,15 @@
39
   'python-accelerate: Support for Punctuation and Hebrew Diacritics restoration'
40
   'python-torchaudio: Support for Coqui TTS models'
41
   'python-transformers: Support for Punctuation and Hebrew Diacritics restoration'
42
-  'tts: Support for Coqui TTS models'
43
+  'ydotool: Support for inserting text into active window in Wayland'
44
 )
45
 optdepends_x86_64=(
46
   'amdvlk: Vulkan support for AMD GPU (AMDVLK Open)'
47
+  'coqui-tts: Support for Coqui TTS models'
48
   'cuda: Support for GPU acceleration on NVidia graphic cards'
49
   'cudnn: Support for GPU acceleration on NVidia graphic cards'
50
   'nvidia-utils: Vulkan support for NVidia GPU'
51
+  'python-faster-whisper: Support for FasterWhisper TTS models'
52
   'vulkan-intel: Vulkan support for Intel GPU'
53
   'vulkan-radeon: Vulkan support for AMD RADV'
54
 )
55
@@ -110,9 +114,13 @@
56
   FULL_BUILD=false
57
 
58
   if  "${CARCH}" == "x86_64" ; then
59
-    # Build for CUDA if needed package is found
60
-    pacman -Qi cuda &> /dev/null && $FULL_BUILD && CMAKE+=" -DBUILD_WHISPERCPP_CUBLAS=ON -DCMAKE_CUDA_ARCHITECTURES=native"
61
-    pacman -Qi cuda &> /dev/null && $FULL_BUILD && export CUDA_PATH=/opt/cuda
62
+    pacman -Qi cuda &> /dev/null && HAS_CUDA=true || HAS_CUDA=false
63
+
64
+    if  $HAS_CUDA = true  &&  $FULL_BUILD = true ; then
65
+      CMAKE+=" -DBUILD_WHISPERCPP_CUBLAS=ON -DCMAKE_CUDA_ARCHITECTURES=native"
66
+      export CUDA_PATH=/opt/cuda
67
+      export NVCC_APPEND_FLAGS="-std=c++17 --compress-mode=size --split-compile=0 -Wno-deprecated-gpu-targets"
68
+    fi
69
   fi
70
 
71
   CI_BUILD=false
72
dsnote-4.7.1.tar.gz/arch/release/PKGBUILD -> dsnote-4.8.1.tar.gz/arch/release/PKGBUILD Changed
56
 
1
@@ -2,8 +2,8 @@
2
 
3
 _pkgname='dsnote'
4
 pkgname="${_pkgname}"
5
-pkgver=4.7.0
6
-pkgrel=1
7
+pkgver=4.7.1
8
+pkgrel=2
9
 pkgdesc="Note taking, reading and translating with offline Speech to Text, Text to Speech and Machine Translation"
10
 arch=(
11
   'x86_64'
12
@@ -16,7 +16,10 @@
13
   'fmt'
14
   'glslang'
15
   'hicolor-icon-theme'
16
+  'kconfigwidgets5'
17
   'kdbusaddons5'
18
+  'kiconthemes5'
19
+  'kirigami2'
20
   'libarchive'
21
   'libpulse'
22
   'libxinerama'
23
@@ -25,7 +28,6 @@
24
   'openblas'
25
   'perl'
26
   'python>=3.11'
27
-  'qqc2-desktop-style5'
28
   'qt5-base'
29
   'qt5-declarative'
30
   'qt5-multimedia'
31
@@ -54,13 +56,14 @@
32
   'python-accelerate: Support for Punctuation and Hebrew Diacritics restoration'
33
   'python-torchaudio: Support for Coqui TTS models'
34
   'python-transformers: Support for Punctuation and Hebrew Diacritics restoration'
35
-  'tts: Support for Coqui TTS models'
36
 )
37
 optdepends_x86_64=(
38
   'amdvlk: Vulkan support for AMD GPU (AMDVLK Open)'
39
+  'coqui-tts: Support for Coqui TTS models'
40
   'cuda: Support for GPU acceleration on NVidia graphic cards'
41
   'cudnn: Support for GPU acceleration on NVidia graphic cards'
42
   'nvidia-utils: Vulkan support for NVidia GPU'
43
+  'python-faster-whisper: Support for FasterWhisper TTS models'
44
   'vulkan-intel: Vulkan support for Intel GPU'
45
   'vulkan-radeon: Vulkan support for AMD RADV'
46
 )
47
@@ -69,7 +72,7 @@
48
 conflicts=(${_pkgname}-git)
49
 install=${_pkgname}.install
50
 source=(https://github.com/mkiol/dsnote/archive/refs/tags/v${pkgver}.tar.gz)
51
-sha256sums=('8ca35e5fb082352838e5b883b45a5672c0d3aae958e1e765f0af37ce29d27739')
52
+sha256sums=('6b3c5029b32b272bd5238fb830c3aadce0cec438f7bece13bb304a7e52676b1b')
53
 
54
 build() {
55
   cd "${srcdir}/${_pkgname}-${pkgver}"
56
dsnote-4.7.1.tar.gz/cmake/bergamot.cmake -> dsnote-4.8.1.tar.gz/cmake/bergamot.cmake Changed
17
 
1
@@ -57,6 +57,7 @@
2
             -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
3
             -DBERGAMOTAPI_TARGET_NAME=bergamot_api-fallback
4
             -DCMAKE_VERBOSE_MAKEFILE=ON
5
+            -DCMAKE_POLICY_VERSION_MINIMUM=3.5
6
         BUILD_ALWAYS False
7
     )
8
 
9
@@ -94,6 +95,7 @@
10
         -DUSE_INTRINSICS_ARMV7_NEONVFPV4=ON
11
         -DBUILD_ARCH=${bergamot_build_arch}
12
         -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
13
+        -DCMAKE_POLICY_VERSION_MINIMUM=3.5
14
     BUILD_ALWAYS False
15
 )
16
 
17
dsnote-4.7.1.tar.gz/cmake/dbus_api.cmake -> dsnote-4.8.1.tar.gz/cmake/dbus_api.cmake Changed
19
 
1
@@ -19,8 +19,6 @@
2
     DEPENDS ${info_dbus_app_interface}.xml
3
     COMMENT "generate dbus app adaptor sources"
4
 )
5
-qt5_generate_moc("${PROJECT_BINARY_DIR}/dbus_dsnote_adaptor.h" dbus_dsnote_adaptor.moc)
6
-macro_add_file_dependencies(dbus_dsnote_adaptor.cpp dbus_dsnote_adaptor.moc)
7
 
8
 add_custom_command(
9
     OUTPUT dbus_dsnote_inf.h dbus_dsnote_inf.cpp
10
@@ -28,8 +26,6 @@
11
     DEPENDS ${info_dbus_app_interface}.xml
12
     COMMENT "generate dbus app inf sources"
13
 )
14
-qt5_generate_moc("${PROJECT_BINARY_DIR}/dbus_dsnote_inf.h" dbus_dsnote_inf.moc)
15
-macro_add_file_dependencies(dbus_dsnote_inf.cpp dbus_dsnote_inf.moc)
16
 
17
 list(APPEND dsnote_lib_sources
18
     dbus_dsnote_adaptor.cpp dbus_dsnote_adaptor.h
19
dsnote-4.7.1.tar.gz/cmake/espeak.cmake -> dsnote-4.8.1.tar.gz/cmake/espeak.cmake Changed
21
 
1
@@ -1,5 +1,5 @@
2
-set(mbrola_source_url "https://github.com/numediart/MBROLA/archive/refs/tags/3.3.tar.gz")
3
-set(mbrola_checksum "c01ded2c0a05667e6df2439c1c02b011a5df2bfdf49e24a524630686aea2b558")
4
+set(mbrola_source_url "https://github.com/numediart/MBROLA/archive/bf17e9e1416a647979ac683657a536e8ca5d880e.zip")
5
+set(mbrola_checksum "5a7c02a926dc48ab6d1af0e4c8ab53fc191a7e4337de6df57b6706e140fa3087")
6
 
7
 set(espeak_source_url "https://github.com/rhasspy/espeak-ng/archive/8593723f10cfd9befd50de447f14bf0a9d2a14a4.zip")
8
 set(espeak_checksum "cc8092f23a28ccd79b1c5e62984a4c4ac1959d2d0b8193ac208d728c620bd5ed")
9
@@ -36,8 +36,9 @@
10
         <BINARY_DIR>/autogen.sh &&
11
         <BINARY_DIR>/configure --prefix=<INSTALL_DIR> --libdir=<INSTALL_DIR>/lib --with-pic
12
         --with-pcaudiolib=no --with-sonic=no --with-speechplayer=no
13
-        --with-mbrola=yes --enable-static --with-extdict-ru
14
-    BUILD_COMMAND ${MAKE}
15
+        --with-mbrola=yes --enable-static=yes --enable-shared=yes
16
+        --with-extdict-ru --enable-rpath=no
17
+    BUILD_COMMAND export LD_LIBRARY_PATH=<BINARY_DIR>/src/.libs && make
18
     BUILD_ALWAYS False
19
     INSTALL_COMMAND make DESTDIR=/ install
20
 )
21
dsnote-4.7.1.tar.gz/cmake/ffmpeg.cmake -> dsnote-4.8.1.tar.gz/cmake/ffmpeg.cmake Changed
34
 
1
@@ -22,7 +22,8 @@
2
     INSTALL_DIR ${PROJECT_BINARY_DIR}/external
3
     URL "${nasm_source_url}"
4
     URL_HASH SHA256=${nasm_checksum}
5
-    CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
6
+    CONFIGURE_COMMAND cp -r --no-target-directory <SOURCE_DIR> <BINARY_DIR> &&
7
+        <BINARY_DIR>/configure --prefix=<INSTALL_DIR>
8
     BUILD_COMMAND ${MAKE}
9
     BUILD_ALWAYS False
10
     INSTALL_COMMAND make DESTDIR=/ install
11
@@ -50,9 +51,11 @@
12
     INSTALL_DIR ${PROJECT_BINARY_DIR}/external
13
     URL "${ogg_source_url}"
14
     URL_HASH SHA256=${ogg_checksum}
15
-    CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
16
-        --bindir=<INSTALL_DIR>/bin --libdir=<INSTALL_DIR>/lib
17
-        --enable-static=true --enable-shared=false --with-pic=yes
18
+    CONFIGURE_COMMAND cp -r --no-target-directory <SOURCE_DIR> <BINARY_DIR> &&
19
+        autoreconf -vfi &&
20
+        <BINARY_DIR>/configure --prefix=<INSTALL_DIR>
21
+            --bindir=<INSTALL_DIR>/bin --libdir=<INSTALL_DIR>/lib
22
+            --enable-static=true --enable-shared=false --with-pic=yes
23
     BUILD_COMMAND ${MAKE}
24
     BUILD_ALWAYS False
25
     INSTALL_COMMAND make DESTDIR=/ install
26
@@ -82,6 +85,7 @@
27
     CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
28
         -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_INSTALL_LIBDIR=${external_lib_dir}
29
         -DCMAKE_POSITION_INDEPENDENT_CODE=ON
30
+        -DCMAKE_POLICY_VERSION_MINIMUM=3.5
31
     BUILD_ALWAYS False
32
 )
33
 
34
dsnote-4.7.1.tar.gz/cmake/fmt.cmake -> dsnote-4.8.1.tar.gz/cmake/fmt.cmake Changed
9
 
1
@@ -1,5 +1,5 @@
2
-set(fmt_source_url "https://github.com/fmtlib/fmt/releases/download/10.2.1/fmt-10.2.1.zip")
3
-set(fmt_checksum "312151a2d13c8327f5c9c586ac6cf7cddc1658e8f53edae0ec56509c8fa516c9")
4
+set(fmt_source_url "https://github.com/fmtlib/fmt/releases/download/11.1.3/fmt-11.1.3.zip")
5
+set(fmt_checksum "7df2fd3426b18d552840c071c977dc891efe274051d2e7c47e2c83c3918ba6df")
6
 
7
 ExternalProject_Add(fmt
8
     SOURCE_DIR ${external_dir}/fmt
9
dsnote-4.7.1.tar.gz/cmake/html2md.cmake -> dsnote-4.8.1.tar.gz/cmake/html2md.cmake Changed
17
 
1
@@ -1,5 +1,5 @@
2
-set(html2md_source_url "https://github.com/tim-gromeyer/html2md/archive/refs/tags/v1.5.3.tar.gz")
3
-set(html2md_checksum "9853eeb1d2b1ca34ee7143521d03daacbcfac57a1763180ebd0730595cb46961")
4
+set(html2md_source_url "https://github.com/tim-gromeyer/html2md/archive/refs/tags/v1.6.4.tar.gz")
5
+set(html2md_checksum "e34c80981d6ee5f4a699985dc4a68b0b280542a5c5e5780fdebc3ba0ca30553d")
6
 
7
 ExternalProject_Add(html2md
8
     SOURCE_DIR ${external_dir}/html2md
9
@@ -15,6 +15,7 @@
10
         -DCMAKE_INSTALL_LIBDIR=${external_lib_dir}
11
         -DCMAKE_POSITION_INDEPENDENT_CODE=ON
12
         -DBUILD_EXE=OFF
13
+        -DCMAKE_POLICY_VERSION_MINIMUM=3.5
14
     BUILD_ALWAYS False
15
 )
16
 
17
dsnote-4.7.1.tar.gz/cmake/install_desktop.cmake -> dsnote-4.8.1.tar.gz/cmake/install_desktop.cmake Changed
198
 
1
@@ -7,11 +7,7 @@
2
 install(FILES "${PROJECT_BINARY_DIR}/${info_app_icon_id}.metainfo.xml" DESTINATION share/metainfo)
3
 
4
 configure_file("${desktop_dir}/dbus_app.service.in" "${PROJECT_BINARY_DIR}/dbus_app.service")
5
-if(WITH_FLATPAK)
6
-    install(FILES "${PROJECT_BINARY_DIR}/dbus_app.service" DESTINATION share/dbus-1/services RENAME ${info_dbus_app_service}.service)
7
-else()
8
-    install(FILES "${PROJECT_BINARY_DIR}/dbus_app.service" DESTINATION share/dbus-1/services RENAME ${info_binary_id}.service)
9
-endif()
10
+install(FILES "${PROJECT_BINARY_DIR}/dbus_app.service" DESTINATION share/dbus-1/services RENAME ${info_dbus_app_service}.service)
11
 
12
 install(FILES "${desktop_dir}/icons/${info_binary_id}.svg" DESTINATION share/icons/hicolor/scalable/apps)
13
 install(FILES "${desktop_dir}/icons/16x16/${info_binary_id}.png" DESTINATION share/icons/hicolor/16x16/apps)
14
@@ -23,27 +19,52 @@
15
 install(FILES "${desktop_dir}/icons/256x256/${info_binary_id}.png" DESTINATION share/icons/hicolor/256x256/apps)
16
 install(FILES "${desktop_dir}/icons/512x512/${info_binary_id}.png" DESTINATION share/icons/hicolor/512x512/apps)
17
 
18
+# default voice audio samples for voice cloning
19
+install(FILES "${resources_dir}/voice-1.opus" DESTINATION ${resources_install_dir})
20
+install(FILES "${resources_dir}/voice-2.opus" DESTINATION ${resources_install_dir})
21
+
22
+# beep tones
23
+install(FILES "${resources_dir}/beep-start-listen.wav" DESTINATION ${resources_install_dir})
24
+install(FILES "${resources_dir}/beep-end-listen.wav" DESTINATION ${resources_install_dir})
25
+
26
+function(check_patchelf)
27
+    if(${patchelf_bin} MATCHES "-NOTFOUND$")
28
+        message(FATAL_ERROR "patchelf not found but it is required to install files")
29
+    endif()
30
+endfunction()
31
+
32
 function(strip_all file)
33
     install(CODE "execute_process(COMMAND ${CMAKE_STRIP} --strip-all ${file})")
34
 endfunction()
35
 
36
 function(remove_runpath file)
37
-    install(CODE "execute_process(COMMAND patchelf --remove-rpath ${file})")
38
+    check_patchelf()
39
+    install(CODE "execute_process(COMMAND ${patchelf_bin} --remove-rpath ${file})")
40
+endfunction()
41
+
42
+function(set_runpath file)
43
+    check_patchelf()
44
+    install(CODE "execute_process(COMMAND ${patchelf_bin} --remove-rpath ${file})")
45
+    install(CODE "execute_process(COMMAND ${patchelf_bin} --set-rpath ${rpath_install_dir} ${file})")
46
 endfunction()
47
 
48
 if(BUILD_WHISPERCPP)
49
     set(whispercpp_ver "1.7.1")
50
     strip_all("${external_lib_dir}/libwhisper-openblas.so.${whispercpp_ver}")
51
-    strip_all("${external_lib_dir}/libwhisper-fallback.so.${whispercpp_ver}")
52
+    set_runpath("${external_lib_dir}/libwhisper-openblas.so.${whispercpp_ver}")
53
     install(PROGRAMS "${external_lib_dir}/libwhisper-openblas.so.${whispercpp_ver}" DESTINATION ${lib_install_dir})
54
     install(PROGRAMS "${external_lib_dir}/libwhisper-openblas.so.1" DESTINATION ${lib_install_dir})
55
     install(PROGRAMS "${external_lib_dir}/libwhisper-openblas.so" DESTINATION ${lib_install_dir})
56
     if(${arch_x8664} OR ${arch_arm32})
57
+        strip_all("${external_lib_dir}/libwhisper-fallback.so.${whispercpp_ver}")
58
+        set_runpath("${external_lib_dir}/libwhisper-fallback.so.${whispercpp_ver}")
59
         install(PROGRAMS "${external_lib_dir}/libwhisper-fallback.so.${whispercpp_ver}" DESTINATION ${lib_install_dir})
60
         install(PROGRAMS "${external_lib_dir}/libwhisper-fallback.so.1" DESTINATION ${lib_install_dir})
61
         install(PROGRAMS "${external_lib_dir}/libwhisper-fallback.so" DESTINATION ${lib_install_dir})
62
     endif()
63
     if(arch_x8664)
64
+        strip_all("${external_lib_dir}/libwhisper-fallback1.so.${whispercpp_ver}")
65
+        set_runpath("${external_lib_dir}/libwhisper-fallback1.so.${whispercpp_ver}")
66
         install(PROGRAMS "${external_lib_dir}/libwhisper-fallback1.so.${whispercpp_ver}" DESTINATION ${lib_install_dir})
67
         install(PROGRAMS "${external_lib_dir}/libwhisper-fallback1.so.1" DESTINATION ${lib_install_dir})
68
         install(PROGRAMS "${external_lib_dir}/libwhisper-fallback1.so" DESTINATION ${lib_install_dir})
69
@@ -53,6 +74,7 @@
70
         set(clblast_ver "1.6.3")
71
         strip_all("${external_lib_dir}/libclblast.so.${clblast_ver}")
72
         strip_all("${external_lib_dir}/libwhisper-clblast.so.${whispercpp_clblast_ver}")
73
+        set_runpath("${external_lib_dir}/libwhisper-clblast.so.${whispercpp_clblast_ver}")
74
         install(PROGRAMS "${external_lib_dir}/libclblast.so" DESTINATION ${lib_install_dir})
75
         install(PROGRAMS "${external_lib_dir}/libclblast.so.1" DESTINATION ${lib_install_dir})
76
         install(PROGRAMS "${external_lib_dir}/libclblast.so.${clblast_ver}" DESTINATION ${lib_install_dir})
77
@@ -62,24 +84,28 @@
78
     endif()
79
     if(BUILD_WHISPERCPP_VULKAN)
80
         strip_all("${external_lib_dir}/libwhisper-vulkan.so.${whispercpp_ver}")
81
+        set_runpath("${external_lib_dir}/libwhisper-vulkan.so.${whispercpp_ver}")
82
         install(PROGRAMS "${external_lib_dir}/libwhisper-vulkan.so.${whispercpp_ver}" DESTINATION ${lib_install_dir})
83
         install(PROGRAMS "${external_lib_dir}/libwhisper-vulkan.so.1" DESTINATION ${lib_install_dir})
84
         install(PROGRAMS "${external_lib_dir}/libwhisper-vulkan.so" DESTINATION ${lib_install_dir})
85
     endif()
86
     if(BUILD_WHISPERCPP_CUBLAS)
87
         strip_all("${external_lib_dir}/libwhisper-cublas.so.${whispercpp_ver}")
88
+        set_runpath("${external_lib_dir}/libwhisper-cublas.so.${whispercpp_ver}")
89
         install(PROGRAMS "${external_lib_dir}/libwhisper-cublas.so.${whispercpp_ver}" DESTINATION ${lib_install_dir})
90
         install(PROGRAMS "${external_lib_dir}/libwhisper-cublas.so.1" DESTINATION ${lib_install_dir})
91
         install(PROGRAMS "${external_lib_dir}/libwhisper-cublas.so" DESTINATION ${lib_install_dir})
92
     endif()
93
     if(BUILD_WHISPERCPP_HIPBLAS)
94
         strip_all("${external_lib_dir}/libwhisper-hipblas.so.${whispercpp_ver}")
95
+        set_runpath("${external_lib_dir}/libwhisper-hipblas.so.${whispercpp_ver}")
96
         install(PROGRAMS "${external_lib_dir}/libwhisper-hipblas.so.${whispercpp_ver}" DESTINATION ${lib_install_dir})
97
         install(PROGRAMS "${external_lib_dir}/libwhisper-hipblas.so.1" DESTINATION ${lib_install_dir})
98
         install(PROGRAMS "${external_lib_dir}/libwhisper-hipblas.so" DESTINATION ${lib_install_dir})
99
     endif()
100
     if(BUILD_WHISPERCPP_OPENVINO)
101
         strip_all("${external_lib_dir}/libwhisper-openvino.so.${whispercpp_ver}")
102
+        set_runpath("${external_lib_dir}/libwhisper-openvino.so.${whispercpp_ver}")
103
         install(PROGRAMS "${external_lib_dir}/libwhisper-openvino.so.${whispercpp_ver}" DESTINATION ${lib_install_dir})
104
         install(PROGRAMS "${external_lib_dir}/libwhisper-openvino.so.1" DESTINATION ${lib_install_dir})
105
         install(PROGRAMS "${external_lib_dir}/libwhisper-openvino.so" DESTINATION ${lib_install_dir})
106
@@ -87,11 +113,14 @@
107
 endif()
108
 
109
 if(DOWNLOAD_LIBSTT)
110
-    remove_runpath("${external_lib_dir}/libstt.so")
111
     strip_all("${external_lib_dir}/libstt.so")
112
     strip_all("${external_lib_dir}/libkenlm.so")
113
     strip_all("${external_lib_dir}/libtensorflowlite.so")
114
     strip_all("${external_lib_dir}/libtflitedelegates.so")
115
+    set_runpath("${external_lib_dir}/libstt.so")
116
+    set_runpath("${external_lib_dir}/libkenlm.so")
117
+    set_runpath("${external_lib_dir}/libtensorflowlite.so")
118
+    set_runpath("${external_lib_dir}/libtflitedelegates.so")
119
     install(PROGRAMS "${external_lib_dir}/libstt.so" DESTINATION ${lib_install_dir})
120
     install(PROGRAMS "${external_lib_dir}/libkenlm.so" DESTINATION ${lib_install_dir})
121
     install(PROGRAMS "${external_lib_dir}/libtensorflowlite.so" DESTINATION ${lib_install_dir})
122
@@ -100,6 +129,7 @@
123
 
124
 if(BUILD_OPENBLAS)
125
     strip_all("${external_lib_dir}/libopenblas.so.0.3")
126
+    set_runpath("${external_lib_dir}/libopenblas.so.0.3")
127
     install(PROGRAMS "${external_lib_dir}/libopenblas.so.0.3" DESTINATION ${lib_install_dir})
128
     install(PROGRAMS "${external_lib_dir}/libopenblas.so.0" DESTINATION ${lib_install_dir})
129
     install(PROGRAMS "${external_lib_dir}/libopenblas.so" DESTINATION ${lib_install_dir})
130
@@ -108,6 +138,9 @@
131
 if(BUILD_PIPER OR BUILD_ESPEAK)
132
     strip_all("${external_bin_dir}/mbrola")
133
     strip_all("${external_bin_dir}/espeak-ng")
134
+    set_runpath("${external_bin_dir}/mbrola")
135
+    set_runpath("${external_bin_dir}/espeak")
136
+    set_runpath("${external_bin_dir}/espeak-ng")
137
     install(PROGRAMS "${external_bin_dir}/mbrola" DESTINATION ${bin_install_dir})
138
     install(PROGRAMS "${external_bin_dir}/espeak" DESTINATION ${bin_install_dir})
139
     install(PROGRAMS "${external_bin_dir}/espeak-ng" DESTINATION ${bin_install_dir})
140
@@ -121,6 +154,8 @@
141
 if(BUILD_RHVOICE)
142
     strip_all("${external_lib_dir}/libRHVoice_core.so.1.2.2")
143
     strip_all("${external_lib_dir}/libRHVoice.so.1.2.2")
144
+    set_runpath("${external_lib_dir}/libRHVoice_core.so.1.2.2")
145
+    set_runpath("${external_lib_dir}/libRHVoice.so.1.2.2")
146
     install(PROGRAMS "${external_lib_dir}/libRHVoice_core.so.1.2.2" DESTINATION ${lib_install_dir})
147
     install(PROGRAMS "${external_lib_dir}/libRHVoice_core.so.1" DESTINATION ${lib_install_dir})
148
     install(PROGRAMS "${external_lib_dir}/libRHVoice_core.so" DESTINATION ${lib_install_dir})
149
@@ -135,19 +170,24 @@
150
 
151
 if(BUILD_PIPER)
152
     strip_all("${external_lib_dir}/libonnxruntime.so.1.16.1")
153
+    set_runpath("${external_lib_dir}/libonnxruntime.so.1.16.1")
154
     install(PROGRAMS "${external_lib_dir}/libonnxruntime.so.1.16.1" DESTINATION ${lib_install_dir})
155
     install(PROGRAMS "${external_lib_dir}/libonnxruntime.so" DESTINATION ${lib_install_dir})
156
 endif()
157
 
158
 if(${BUILD_VOSK} OR ${DOWNLOAD_VOSK})
159
+    remove_runpath("${external_lib_dir}/libvosk.so")
160
+    set_runpath("${external_lib_dir}/libvosk.so")
161
     install(PROGRAMS "${external_lib_dir}/libvosk.so" DESTINATION ${lib_install_dir})
162
 endif()
163
 
164
 if(BUILD_BERGAMOT)
165
     strip_all("${external_lib_dir}/libbergamot_api.so")
166
+    set_runpath("${external_lib_dir}/libbergamot_api.so")
167
     install(PROGRAMS "${external_lib_dir}/libbergamot_api.so" DESTINATION ${lib_install_dir})
168
     if(arch_x8664)
169
         strip_all("${external_lib_dir}/libbergamot_api-fallback.so")
170
+        set_runpath("${external_lib_dir}/libbergamot_api-fallback.so")
171
         install(PROGRAMS "${external_lib_dir}/libbergamot_api-fallback.so" DESTINATION ${lib_install_dir})
172
     endif()
173
 endif()
174
@@ -156,14 +196,9 @@
175
     install(DIRECTORY "${external_share_dir}/libnumbertext" DESTINATION ${share_install_dir})
176
 endif()
177
 
178
-if(BUILD_UROMAN)
179
-    if(arch_x8664)
180
-        install(DIRECTORY "${external_share_dir}/uroman" DESTINATION ${share_install_dir})
181
-    endif()
182
-endif()
183
-
184
 if(BUILD_APRILASR)
185
     strip_all("${external_lib_dir}/libaprilasr.so.2023.5.12")
186
+    set_runpath("${external_lib_dir}/libaprilasr.so.2023.5.12")
187
     install(PROGRAMS "${external_lib_dir}/libaprilasr.so.2023.5.12" DESTINATION ${lib_install_dir})
188
     install(PROGRAMS "${external_lib_dir}/libaprilasr.so.2023" DESTINATION ${lib_install_dir})
189
     install(PROGRAMS "${external_lib_dir}/libaprilasr.so" DESTINATION ${lib_install_dir})
190
@@ -171,6 +206,7 @@
191
 
192
 if(BUILD_ESPEAK)
193
     strip_all("${external_lib_dir}/libespeak-ng.so.1.1.51")
194
+    set_runpath("${external_lib_dir}/libespeak-ng.so.1.1.51")
195
     install(PROGRAMS "${external_lib_dir}/libespeak-ng.so.1.1.51" DESTINATION ${lib_install_dir})
196
     install(PROGRAMS "${external_lib_dir}/libespeak-ng.so.1" DESTINATION ${lib_install_dir})
197
     install(PROGRAMS "${external_lib_dir}/libespeak-ng.so" DESTINATION ${lib_install_dir})
198
dsnote-4.7.1.tar.gz/cmake/install_sfos.cmake -> dsnote-4.8.1.tar.gz/cmake/install_sfos.cmake Changed
54
 
1
@@ -11,6 +11,23 @@
2
 configure_file("${sfos_dir}/dbus_app.service.in" "${PROJECT_BINARY_DIR}/dbus_app.service")
3
 install(FILES "${PROJECT_BINARY_DIR}/dbus_app.service" DESTINATION share/dbus-1/services RENAME ${info_dbus_app_service}.service)
4
 
5
+# beep tones
6
+install(FILES "${resources_dir}/beep-start-listen.wav" DESTINATION ${resources_install_dir})
7
+install(FILES "${resources_dir}/beep-end-listen.wav" DESTINATION ${resources_install_dir})
8
+
9
+function(check_patchelf)
10
+    if(${patchelf_bin} MATCHES "-NOTFOUND$")
11
+        message(FATAL_ERROR "patchelf not found but it is required to install files")
12
+    endif()
13
+endfunction()
14
+
15
+function(set_runpath file)
16
+    check_patchelf()
17
+    install(CODE "execute_process(COMMAND ${CMAKE_STRIP} --strip-all ${file})")
18
+    install(CODE "execute_process(COMMAND ${patchelf_bin} --remove-rpath ${file})")
19
+    install(CODE "execute_process(COMMAND ${patchelf_bin} --set-rpath ${rpath_install_dir} ${file})")
20
+endfunction()
21
+
22
 if(BUILD_WHISPERCPP)
23
     set(whispercpp_ver "1.7.1")
24
     install(PROGRAMS "${external_lib_dir}/libwhisper-openblas.so.${whispercpp_ver}" DESTINATION ${lib_install_dir})
25
@@ -29,6 +46,10 @@
26
 endif()
27
 
28
 if(DOWNLOAD_LIBSTT)
29
+    set_runpath("${external_lib_dir}/libstt.so")
30
+    set_runpath("${external_lib_dir}/libkenlm.so")
31
+    set_runpath("${external_lib_dir}/libtensorflowlite.so")
32
+    set_runpath("${external_lib_dir}/libtflitedelegates.so")
33
     install(PROGRAMS "${external_lib_dir}/libstt.so" DESTINATION ${lib_install_dir})
34
     install(PROGRAMS "${external_lib_dir}/libkenlm.so" DESTINATION ${lib_install_dir})
35
     install(PROGRAMS "${external_lib_dir}/libtensorflowlite.so" DESTINATION ${lib_install_dir})
36
@@ -49,6 +70,9 @@
37
 endif()
38
 
39
 if(BUILD_RHVOICE)
40
+    # patchelf seems to break libRHVoice_core.so.1.2.2 and make it "not aligned"
41
+    #set_runpath("${external_lib_dir}/libRHVoice_core.so.1.2.2")
42
+    set_runpath("${external_lib_dir}/libRHVoice.so.1.2.2")
43
     install(PROGRAMS "${external_lib_dir}/libRHVoice_core.so.1.2.2" DESTINATION ${lib_install_dir})
44
     install(PROGRAMS "${external_lib_dir}/libRHVoice_core.so.1" DESTINATION ${lib_install_dir})
45
     install(PROGRAMS "${external_lib_dir}/libRHVoice_core.so" DESTINATION ${lib_install_dir})
46
@@ -67,7 +91,6 @@
47
     else()
48
         set(onnx_ver "1.16.1")
49
     endif()
50
-
51
     install(PROGRAMS "${external_lib_dir}/libonnxruntime.so.${onnx_ver}" DESTINATION ${lib_install_dir})
52
     install(PROGRAMS "${external_lib_dir}/libonnxruntime.so" DESTINATION ${lib_install_dir})
53
 endif()
54
dsnote-4.7.1.tar.gz/cmake/libstt.cmake -> dsnote-4.8.1.tar.gz/cmake/libstt.cmake Changed
10
 
1
@@ -12,7 +12,7 @@
2
 
3
 set(libstt_archive "${PROJECT_BINARY_DIR}/libstt.tar.xz")
4
 
5
-file(DOWNLOAD ${libstt_url} ${libstt_archive} ${external_lib_dir} STATUS libstt_status)
6
+file(DOWNLOAD ${libstt_url} ${libstt_archive} STATUS libstt_status)
7
 file(ARCHIVE_EXTRACT INPUT ${libstt_archive} DESTINATION ${external_lib_dir}
8
     PATTERNS *.so VERBOSE)
9
 file(CHMOD_RECURSE ${external_lib_dir} FILE_PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
10
dsnote-4.7.1.tar.gz/cmake/openblas.cmake -> dsnote-4.8.1.tar.gz/cmake/openblas.cmake Changed
9
 
1
@@ -1,5 +1,5 @@
2
-set(openblas_source_url "https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.27/OpenBLAS-0.3.27.tar.gz")
3
-set(openblas_checksum "aa2d68b1564fe2b13bc292672608e9cdeeeb6dc34995512e65c3b10f4599e897")
4
+set(openblas_source_url "https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.29/OpenBLAS-0.3.29.tar.gz")
5
+set(openblas_checksum "38240eee1b29e2bde47ebb5d61160207dc68668a54cac62c076bb5032013b1eb")
6
 
7
 set(openblas_opts
8
     -DCMAKE_BUILD_TYPE=Release
9
dsnote-4.8.1.tar.gz/cmake/openblas_pkgconfig.cmake Added
33
 
1
@@ -0,0 +1,31 @@
2
+pkg_search_module(openblas openblas)
3
+
4
+if(NOT DEFINED ${openblas_FOUND})
5
+    # check without pkg-config
6
+    set(BLA_STATIC OFF)
7
+    set(BLA_VENDOR "OpenBLAS")
8
+    find_package(BLAS REQUIRED)
9
+
10
+    message(STATUS "can't find openblas using pkg-config, but found openblas package: ${BLAS_LIBRARIES} ${BALS_VERSION}")
11
+
12
+    cmake_path(GET BLAS_LIBRARIES PARENT_PATH openblas_lib_dir)
13
+    message(STATUS "openblas lib dir=${openblas_lib_dir}")
14
+
15
+    # Fedora doesn't provide pkg-config for openblas, so creating one
16
+    file(WRITE "${PROJECT_BINARY_DIR}/openblas.pc" "libdir=${openblas_lib_dir}
17
+libnameprefix=
18
+libnamesuffix=
19
+libsuffix=
20
+includedir=/usr/include/openblas
21
+
22
+openblas_config=USE_64BITINT= NO_CBLAS= NO_LAPACK= NO_LAPACKE= DYNAMIC_ARCH=ON DYNAMIC_OLDER=OFF NO_AFFINITY=ON USE_OPENMP=1 CORE2 MAX_THREADS=64
23
+Name: OpenBLAS
24
+Description: OpenBLAS
25
+Version: ${BALS_VERSION}
26
+URL: https://github.com/OpenMathLib/OpenBLAS
27
+Libs: -fopenmp -L\${libdir\} -l\${libnameprefix}openblas\${libnamesuffix}\${libsuffix}
28
+Cflags: -I\${includedir}
29
+")
30
+    # search again
31
+    pkg_search_module(openblas REQUIRED openblas)
32
+endif()
33
dsnote-4.7.1.tar.gz/cmake/pybind11.cmake -> dsnote-4.8.1.tar.gz/cmake/pybind11.cmake Changed
18
 
1
@@ -1,12 +1,12 @@
2
-set(pybind11_source_url "https://github.com/pybind/pybind11/archive/refs/tags/v2.10.4.tar.gz")
3
-set(pybind11_checksum "812eda11d2a114fc0e841faf9626d2c9")
4
+set(pybind11_source_url "https://github.com/pybind/pybind11/archive/refs/tags/v2.13.6.tar.gz")
5
+set(pybind11_checksum "e08cb87f4773da97fa7b5f035de8763abc656d87d5773e62f6da0587d1f0ec20")
6
 
7
 ExternalProject_Add(pybind11
8
     SOURCE_DIR ${external_dir}/pybind11
9
     BINARY_DIR ${PROJECT_BINARY_DIR}/external/pybind11
10
     INSTALL_DIR ${PROJECT_BINARY_DIR}/external
11
-    URL "${pybind11_source_url}"
12
-    URL_MD5 "${pybind11_checksum}"
13
+    URL ${pybind11_source_url}
14
+    URL_HASH SHA256=${pybind11_checksum}
15
     CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_INSTALL_LIBDIR=${external_lib_dir}
16
         -DCMAKE_INSTALL_INCLUDEDIR=${external_include_dir} -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_SHARED_LIBS=OFF
17
         -DPYBIND11_INSTALL=ON -DPYBIND11_TEST=OFF -DPYBIND11_FINDPYTHON=ON
18
dsnote-4.7.1.tar.gz/cmake/qhotkey.cmake -> dsnote-4.8.1.tar.gz/cmake/qhotkey.cmake Changed
9
 
1
@@ -14,6 +14,7 @@
2
         -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
3
         -DCMAKE_INSTALL_LIBDIR=lib
4
         -DCMAKE_POSITION_INDEPENDENT_CODE=ON
5
+        -DCMAKE_POLICY_VERSION_MINIMUM=3.5
6
     BUILD_ALWAYS False
7
 )
8
 
9
dsnote-4.7.1.tar.gz/cmake/rhvoice.cmake -> dsnote-4.8.1.tar.gz/cmake/rhvoice.cmake Changed
25
 
1
@@ -1,5 +1,5 @@
2
 set(rhvoice_source_url "https://github.com/RHVoice/RHVoice.git")
3
-set(rhvoice_tag "71a1a830d2d860688ffcbb0d27d4de260136d161")
4
+set(rhvoice_tag "846293f4f966381802131ea3c94ff12461b6058a")
5
 
6
 find_package(Boost)
7
 if(NOT ${Boost_FOUND})
8
@@ -20,7 +20,7 @@
9
         "data/languages/Kyrgyz" "data/languages/Macedonian" "data/languages/Russian"
10
         "data/languages/Tatar" "data/languages/Ukrainian" "data/languages/Czech"
11
         "data/languages/Uzbek" "data/languages/Slovak" "data/languages/Serbian"
12
-        "data/languages/Croatian"
13
+        "data/languages/Croatian" "data/languages/Spanish"
14
     UPDATE_COMMAND ""
15
     PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
16
                 -i ${patches_dir}/rhvoice.patch ||
17
@@ -30,6 +30,7 @@
18
         -DCMAKE_INSTALL_INCLUDEDIR=${external_include_dir} -DCMAKE_POSITION_INDEPENDENT_CODE=ON
19
         -DCMAKE_PREFIX_PATH=<INSTALL_DIR> -DWITH_DATA=OFF -DENABLE_MAGE=OFF -DBUILD_CLIENT=OFF
20
         -DBUILD_UTILS=OFF -DBUILD_TESTS=OFF -DBUILD_SERVICE=OFF -DBUILD_SPEECHDISPATCHER_MODULE=OFF
21
+        -DCMAKE_POLICY_VERSION_MINIMUM=3.5
22
     BUILD_ALWAYS False
23
 )
24
 
25
dsnote-4.7.1.tar.gz/cmake/rnnoise.cmake -> dsnote-4.8.1.tar.gz/cmake/rnnoise.cmake Changed
11
 
1
@@ -20,7 +20,8 @@
2
     -Dcelt_iir=rnnoise_celt_iir \
3
     -D_celt_autocorr=rnnoise__celt_autocorr \
4
     -Dcompute_gru=rnnoise_compute_gru \
5
-    -Dcompute_dense=rnnoise_compute_dense")
6
+    -Dcompute_dense=rnnoise_compute_dense \
7
+    -fpie")
8
 
9
 ExternalProject_Add(rnnoise
10
     SOURCE_DIR ${external_dir}/rnnoise
11
dsnote-4.7.1.tar.gz/cmake/rubberband.cmake -> dsnote-4.8.1.tar.gz/cmake/rubberband.cmake Changed
10
 
1
@@ -11,7 +11,7 @@
2
     INSTALL_DIR ${PROJECT_BINARY_DIR}/external
3
     URL ${rubberband_source_url}
4
     URL_HASH SHA256=${rubberband_checksum}
5
-    CONFIGURE_COMMAND PKG_CONFIG_PATH=${external_lib_dir}/pkgconfig
6
+    CONFIGURE_COMMAND PKG_CONFIG_PATH="${external_lib_dir}/pkgconfig"
7
         ${meson_bin} setup --prefix=<INSTALL_DIR> --buildtype=release --libdir=lib
8
         -Dauto_features=disabled
9
         -Dresampler=builtin -Dfft=builtin
10
dsnote-4.8.1.tar.gz/cmake/sam.cmake Added
22
 
1
@@ -0,0 +1,20 @@
2
+set(sam_source_url "https://github.com/s-macke/SAM/archive/a7b36efac730957b59471a42a45fd779f94d77dd.zip")
3
+set(sam_checksum "342e245c84b14945b33dd8b272373eee517d239c612763ec01d3fa3bbee6bcb1")
4
+
5
+ExternalProject_Add(sam
6
+    SOURCE_DIR ${external_dir}/sam
7
+    BINARY_DIR ${PROJECT_BINARY_DIR}/external/sam
8
+    INSTALL_DIR ${PROJECT_BINARY_DIR}/external
9
+    URL "${sam_source_url}"
10
+    URL_HASH SHA256=${sam_checksum}
11
+    PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
12
+                -i ${patches_dir}/sam.patch ||
13
+                    echo "patch cmd failed, likely already patched"
14
+    CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
15
+        -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
16
+        -DCMAKE_POSITION_INDEPENDENT_CODE=ON
17
+    BUILD_ALWAYS False
18
+)
19
+
20
+list(APPEND deps_libs ${external_lib_dir}/libsam_api.a)
21
+list(APPEND deps sam)
22
dsnote-4.7.1.tar.gz/cmake/ssplitcpp.cmake -> dsnote-4.8.1.tar.gz/cmake/ssplitcpp.cmake Changed
21
 
1
@@ -1,15 +1,15 @@
2
 set(ssplitcpp_source_url "https://github.com/ugermann/ssplit-cpp/archive/49a8e12f11945fac82581cf056560965dcb641e6.zip")
3
 set(ssplitcpp_checksum "8255bd212ad639592b4e212b0353509a")
4
 
5
-set(pcre2_source_url "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.tar.bz2")
6
-set(pcre2_checksum "a8e9ab2935d428a4807461f183034abe")
7
+set(pcre2_source_url "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.45/pcre2-10.45.tar.bz2")
8
+set(pcre2_checksum "21547f3516120c75597e5b30a992e27a592a31950b5140e7b8bfde3f192033c4")
9
 
10
 ExternalProject_Add(pcre2
11
     SOURCE_DIR ${external_dir}/pcre2
12
     BINARY_DIR ${PROJECT_BINARY_DIR}/external/pcre2
13
     INSTALL_DIR ${PROJECT_BINARY_DIR}/external
14
-    URL "${pcre2_source_url}"
15
-    URL_MD5 "${pcre2_checksum}"
16
+    URL ${pcre2_source_url}
17
+    URL_HASH SHA256=${pcre2_checksum}
18
     CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
19
         -DCMAKE_INSTALL_LIBDIR=<INSTALL_DIR>/lib
20
         -DCMAKE_LIBRARY_PATH=${external_lib_dir}
21
dsnote-4.7.1.tar.gz/cmake/taglib.cmake -> dsnote-4.8.1.tar.gz/cmake/taglib.cmake Changed
9
 
1
@@ -12,6 +12,7 @@
2
         -DCMAKE_POSITION_INDEPENDENT_CODE=ON
3
         -DBUILD_TESTING=OFF -DBUILD_BINDINGS=OFF -DBUILD_SHARED_LIBS=OFF
4
         -DENABLE_STATIC_RUNTIME=OFF
5
+        -DCMAKE_POLICY_VERSION_MINIMUM=3.5
6
     BUILD_ALWAYS False
7
 )
8
 
9
dsnote-4.7.1.tar.gz/cmake/translations.cmake -> dsnote-4.8.1.tar.gz/cmake/translations.cmake Changed
11
 
1
@@ -1,7 +1,7 @@
2
 # all translations
3
-set(enabled_translations cs de en fr it nl pl ru sv sl zh_CN uk no)
4
+set(enabled_translations ar ca_ES cs de en es fr fr_CA it nl no pl ru sv sl tr_TR uk zh_CN zh_TW)
5
 # finished translations
6
-set(enabled_translations en fr it nl pl ru sv sl uk no)
7
+set(enabled_translations ar ca_ES de en es fr fr_CA it nl no pl ru sv sl tr_TR uk zh_CN zh_TW)
8
 
9
 find_package(Qt5 COMPONENTS Core LinguistTools)
10
 
11
dsnote-4.7.1.tar.gz/cmake/vosk.cmake -> dsnote-4.8.1.tar.gz/cmake/vosk.cmake Changed
28
 
1
@@ -1,6 +1,6 @@
2
 if(BUILD_VOSK)
3
-    set(openfst_source_url "https://github.com/alphacep/openfst/archive/7dfd808194105162f20084bb4d8e4ee4b65266d5.zip")
4
-    set(openfst_checksum "734084e424d42f16424bd5279e4f0786")
5
+    set(openfst_source_url "https://github.com/alphacep/openfst/archive/18e94e63870ebcf79ebb42b7035cd3cb626ec090.zip")
6
+    set(openfst_checksum "7785d14d12789af2eba4bfd32fa3d08be2088e0a0666ada2befce26f6410d954")
7
     set(kaldi_source_url "https://github.com/alphacep/kaldi/archive/2abed6b15990d9438f70863f2b58bd8af8432043.zip")
8
     set(kaldi_checksum "4923c5b7599184c36db3342579676fbc")
9
     set(vosk_source_url "https://github.com/alphacep/vosk-api/archive/128c216c6137a36fbf5b0bf64d03501e91a6eeaa.zip")
10
@@ -21,7 +21,7 @@
11
         BINARY_DIR ${PROJECT_BINARY_DIR}/external/openfst
12
         INSTALL_DIR ${PROJECT_BINARY_DIR}/external
13
         URL "${openfst_source_url}"
14
-        URL_MD5 "${openfst_checksum}"
15
+        URL_HASH SHA256=${openfst_checksum}
16
         PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
17
                     -i ${patches_dir}/openfst.patch ||
18
                         echo "patch cmd failed, likely already patched"
19
@@ -96,7 +96,7 @@
20
 
21
     set(vosk_archive "${PROJECT_BINARY_DIR}/vosk.zip")
22
 
23
-    file(DOWNLOAD ${vosk_url} ${vosk_archive} ${external_lib_dir} STATUS vosk_status)
24
+    file(DOWNLOAD ${vosk_url} ${vosk_archive} STATUS vosk_status)
25
     file(ARCHIVE_EXTRACT INPUT ${vosk_archive} DESTINATION ${external_dir}/vosk)
26
     find_file(vosk_lib_path libvosk.so PATHS ${external_dir}/vosk/*/ REQUIRED NO_DEFAULT_PATH)
27
     find_file(vosk_header_path vosk_api.h PATHS ${external_dir}/vosk/*/ REQUIRED NO_DEFAULT_PATH)
28
dsnote-4.7.1.tar.gz/cmake/whispercpp.cmake -> dsnote-4.8.1.tar.gz/cmake/whispercpp.cmake Changed
197
 
1
@@ -14,6 +14,9 @@
2
     set(BLA_STATIC OFF)
3
     set(BLA_VENDOR "OpenBLAS")
4
     find_package(BLAS REQUIRED)
5
+
6
+    cmake_path(GET BLAS_LIBRARIES PARENT_PATH openblas_lib_dir)
7
+    set(whispercpp_additional_lib_path "${openblas_lib_dir}")
8
 endif()
9
 
10
 set(whispercpp_patch_file "${patches_dir}/whispercpp.patch")
11
@@ -46,6 +49,7 @@
12
             -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_POSITION_INDEPENDENT_CODE=ON
13
             -DCMAKE_INSTALL_LIBDIR=lib
14
             -DTUNERS=OFF
15
+            -DCMAKE_POLICY_VERSION_MINIMUM=3.5
16
         BUILD_ALWAYS False
17
     )
18
 
19
@@ -58,7 +62,9 @@
20
         PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
21
                     -i ${patches_dir}/whispercpp-clblast.patch ||
22
                         echo "patch cmd failed, likely already patched"
23
-        CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
24
+        CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}
25
+            ${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR>
26
+            -DCMAKE_BUILD_TYPE=Release
27
             -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_PREFIX_PATH=<INSTALL_DIR>
28
             -DCMAKE_INSTALL_LIBDIR=lib
29
             -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_SHARED_LIBS=ON
30
@@ -68,6 +74,7 @@
31
             -DCMAKE_C_FLAGS=${whispercpp_flags} -DCMAKE_CXX_FLAGS=${whispercpp_flags}
32
             -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
33
             -DWHISPER_TARGET_NAME=whisper-clblast
34
+            -DCMAKE_LIBRARY_PATH=${whispercpp_additional_lib_path}
35
         BUILD_ALWAYS False
36
     )
37
 
38
@@ -84,7 +91,7 @@
39
 
40
 if(BUILD_WHISPERCPP_CUBLAS)
41
     if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
42
-        set(CMAKE_CUDA_ARCHITECTURES "50\\\\\\\\\\\\;52\\\\\\\\\\\\;53\\\\\\\\\\\\;60\\\\\\\\\\\\;61\\\\\\\\\\\\;62\\\\\\\\\\\\;70\\\\\\\\\\\\;72\\\\\\\\\\\\;75\\\\\\\\\\\\;80\\\\\\\\\\\\;86\\\\\\\\\\\\;87\\\\\\\\\\\\;89\\\\\\\\\\\\;90")
43
+        set(CMAKE_CUDA_ARCHITECTURES "50\\\\\\\\\\\\;52\\\\\\\\\\\\;53\\\\\\\\\\\\;60\\\\\\\\\\\\;61\\\\\\\\\\\\;62\\\\\\\\\\\\;70\\\\\\\\\\\\;72\\\\\\\\\\\\;75\\\\\\\\\\\\;80\\\\\\\\\\\\;86\\\\\\\\\\\\;87\\\\\\\\\\\\;89\\\\\\\\\\\\;90\\\\\\\\\\\\;100")
44
     endif()
45
 
46
     ExternalProject_Add(whispercppcublas
47
@@ -96,7 +103,9 @@
48
         PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
49
                     -i ${whispercpp_patch_file} ||
50
                         echo "patch cmd failed, likely already patched"
51
-        CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
52
+        CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}
53
+            ${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR>
54
+            -DCMAKE_BUILD_TYPE=Release
55
             -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
56
             -DCMAKE_INSTALL_LIBDIR=lib
57
             -DGGML_NATIVE=OFF
58
@@ -107,6 +116,7 @@
59
             -DCMAKE_C_FLAGS=${whispercpp_flags} -DCMAKE_CXX_FLAGS=${whispercpp_flags}
60
             -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
61
             -DWHISPER_TARGET_NAME=whisper-cublas
62
+            -DCMAKE_LIBRARY_PATH=${whispercpp_additional_lib_path}
63
         BUILD_ALWAYS False
64
     )
65
 
66
@@ -137,7 +147,9 @@
67
         PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
68
                     -i ${whispercpp_patch_file} ||
69
                         echo "patch cmd failed, likely already patched"
70
-        CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
71
+        CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}
72
+            ${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR>
73
+            -DCMAKE_BUILD_TYPE=Release
74
             -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
75
             -DCMAKE_INSTALL_LIBDIR=lib
76
             -DGGML_NATIVE=OFF
77
@@ -148,6 +160,7 @@
78
             -DCMAKE_C_FLAGS=${whispercpp_flags} -DCMAKE_CXX_FLAGS=${whispercpp_flags}
79
             -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
80
             -DWHISPER_TARGET_NAME=whisper-hipblas
81
+            -DCMAKE_LIBRARY_PATH=${whispercpp_additional_lib_path}
82
         BUILD_ALWAYS False
83
     )
84
 
85
@@ -178,7 +191,9 @@
86
         PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
87
                     -i ${whispercpp_patch_file} ||
88
                         echo "patch cmd failed, likely already patched"
89
-        CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
90
+        CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}
91
+            ${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR>
92
+            -DCMAKE_BUILD_TYPE=Release
93
             -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
94
             -DCMAKE_INSTALL_LIBDIR=lib
95
             -DGGML_NATIVE=OFF
96
@@ -190,6 +205,7 @@
97
             -DCMAKE_C_FLAGS=${whispercppfallback_flags} -DCMAKE_CXX_FLAGS=${whispercppfallback_flags}
98
             -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
99
             -DWHISPER_TARGET_NAME=whisper-openvino
100
+            -DCMAKE_LIBRARY_PATH=${whispercpp_additional_lib_path}
101
         BUILD_ALWAYS False
102
     )
103
 
104
@@ -217,9 +233,11 @@
105
 if(BUILD_WHISPERCPP_VULKAN)
106
     find_package(Vulkan)
107
     if(NOT ${Vulkan_FOUND})
108
-    message(FATAL_ERROR "Vulkan not found but it is required by whisper.cpp-vulkan")
109
+        message(FATAL_ERROR "Vulkan not found but it is required by whisper.cpp-vulkan")
110
     endif()
111
 
112
+    set(whispercppvulkan_flags "${whispercppfallback_flags} -fpie")
113
+
114
     ExternalProject_Add(whispercppvulkan
115
         SOURCE_DIR ${external_dir}/whispercppvulkan
116
         BINARY_DIR ${PROJECT_BINARY_DIR}/external/whispercppvulkan
117
@@ -229,7 +247,9 @@
118
         PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
119
                     -i ${whispercpp_patch_file} ||
120
                         echo "patch cmd failed, likely already patched"
121
-        CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
122
+        CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}
123
+            ${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR>
124
+            -DCMAKE_BUILD_TYPE=Release
125
             -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
126
             -DCMAKE_PREFIX_PATH=<INSTALL_DIR>
127
             -DCMAKE_INSTALL_LIBDIR=lib
128
@@ -238,9 +258,10 @@
129
             -DGGML_AVX=ON -DGGML_AVX2=OFF -DGGML_FMA=OFF -DGGML_F16C=ON
130
             -DBUILD_SHARED_LIBS=ON
131
             -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_EXAMPLES=OFF
132
-            -DCMAKE_C_FLAGS=${whispercppfallback_flags} -DCMAKE_CXX_FLAGS=${whispercppfallback_flags}
133
+            -DCMAKE_C_FLAGS=${whispercppvulkan_flags} -DCMAKE_CXX_FLAGS=${whispercppvulkan_flags}
134
             -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
135
             -DWHISPER_TARGET_NAME=whisper-vulkan
136
+            -DCMAKE_LIBRARY_PATH=${whispercpp_additional_lib_path}
137
         BUILD_ALWAYS False
138
     )
139
 
140
@@ -258,7 +279,9 @@
141
     PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
142
                 -i ${whispercpp_patch_file} ||
143
                     echo "patch cmd failed, likely already patched"
144
-    CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
145
+    CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}
146
+        ${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR>
147
+        -DCMAKE_BUILD_TYPE=Release
148
         -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
149
         -DCMAKE_PREFIX_PATH=<INSTALL_DIR>
150
         -DCMAKE_INSTALL_LIBDIR=lib
151
@@ -270,6 +293,7 @@
152
         -DCMAKE_C_FLAGS=${whispercppfallback_flags} -DCMAKE_CXX_FLAGS=${whispercppfallback_flags}
153
         -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
154
         -DWHISPER_TARGET_NAME=whisper-fallback1
155
+        -DCMAKE_LIBRARY_PATH=${whispercpp_additional_lib_path}
156
     BUILD_ALWAYS False
157
 )
158
 
159
@@ -282,7 +306,9 @@
160
     PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
161
                 -i ${whispercpp_patch_file} ||
162
                     echo "patch cmd failed, likely already patched"
163
-    CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
164
+    CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}
165
+        ${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR>
166
+        -DCMAKE_BUILD_TYPE=Release
167
         -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
168
         -DCMAKE_PREFIX_PATH=<INSTALL_DIR>
169
         -DCMAKE_INSTALL_LIBDIR=lib
170
@@ -294,6 +320,7 @@
171
         -DCMAKE_C_FLAGS=${whispercppfallback_flags} -DCMAKE_CXX_FLAGS=${whispercppfallback_flags}
172
         -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
173
         -DWHISPER_TARGET_NAME=whisper-fallback
174
+        -DCMAKE_LIBRARY_PATH=${whispercpp_additional_lib_path}
175
     BUILD_ALWAYS False
176
 )
177
 
178
@@ -306,7 +333,9 @@
179
     PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
180
                 -i ${whispercpp_patch_file} ||
181
                     echo "patch cmd failed, likely already patched"
182
-    CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
183
+    CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}
184
+        ${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR>
185
+        -DCMAKE_BUILD_TYPE=Release
186
         -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
187
         -DCMAKE_PREFIX_PATH=<INSTALL_DIR>
188
         -DCMAKE_INSTALL_LIBDIR=lib
189
@@ -318,6 +347,7 @@
190
         -DCMAKE_C_FLAGS=${whispercpp_flags} -DCMAKE_CXX_FLAGS=${whispercpp_flags}
191
         -DCMAKE_INSTALL_RPATH=${rpath_install_dir}
192
         -DWHISPER_TARGET_NAME=whisper-openblas
193
+        -DCMAKE_LIBRARY_PATH=${whispercpp_additional_lib_path}
194
     BUILD_ALWAYS False
195
 )
196
 
197
dsnote-4.7.1.tar.gz/cmake/xdo.cmake -> dsnote-4.8.1.tar.gz/cmake/xdo.cmake Changed
33
 
1
@@ -7,15 +7,27 @@
2
     INSTALL_DIR ${PROJECT_BINARY_DIR}/external
3
     URL ${xdo_source_url}
4
     URL_HASH SHA256=${xdo_checksum}
5
+    PATCH_COMMAND patch --batch --unified -p1 --directory=<SOURCE_DIR>
6
+                -i ${patches_dir}/xdo.patch ||
7
+                    echo "patch cmd failed, likely already patched"
8
     CONFIGURE_COMMAND cp -r --no-target-directory <SOURCE_DIR> <BINARY_DIR>
9
-    BUILD_COMMAND make libxdo.a
10
+    BUILD_COMMAND CPATH=${external_include_dir} make libxdo.a
11
     BUILD_ALWAYS False
12
-    INSTALL_COMMAND make PREFIX=<INSTALL_DIR> install && cp <BINARY_DIR>/libxdo.a ${external_lib_dir}/
13
+    INSTALL_COMMAND PKG_CONFIG_PATH=${external_lib_dir}/pkgconfig
14
+        make PREFIX=<INSTALL_DIR> install &&
15
+        cp <BINARY_DIR>/libxdo.a ${external_lib_dir}/
16
 )
17
 
18
 list(APPEND deps_libs "${external_lib_dir}/libxdo.a")
19
 list(APPEND deps xdo)
20
+if(BUILD_XKBCOMMON)
21
+    ExternalProject_Add_StepDependencies(xdo configure xkbcommon)
22
+endif()
23
 
24
 # libxdo depends on Xtst and Xinerama
25
-find_package(X11 COMPONENTS Xtst Xinerama REQUIRED)
26
-list(APPEND deps_libs X11::Xtst X11::Xinerama)
27
+pkg_search_module(xtst REQUIRED xtst)
28
+list(APPEND deps_libs ${xtst_LIBRARIES})
29
+list(APPEND includes ${xtst_INCLUDE_DIRS})
30
+pkg_search_module(xinerama REQUIRED xinerama)
31
+list(APPEND deps_libs ${xinerama_LIBRARIES})
32
+list(APPEND includes ${xinerama_INCLUDE_DIRS})
33
dsnote-4.8.1.tar.gz/cmake/xkbcommon.cmake Added
36
 
1
@@ -0,0 +1,34 @@
2
+set(xkbcommon_source_url "https://github.com/xkbcommon/libxkbcommon/archive/refs/tags/xkbcommon-1.8.1.tar.gz")
3
+set(xkbcommon_checksum "c65c668810db305c4454ba26a10b6d84a96b5469719fe3c729e1c6542b8d0d87")
4
+
5
+if(${meson_bin} MATCHES "-NOTFOUND$")
6
+   message(FATAL_ERROR "meson not found but it is required to build xkbcommon")
7
+endif()
8
+
9
+set(DSNOTE_XKB_CONFIG_ROOT "/usr/share/X11/xkb" CACHE PATH "Path of xkbcommon config root")
10
+
11
+ExternalProject_Add(xkbcommon
12
+    SOURCE_DIR ${external_dir}/xkbcommon
13
+    BINARY_DIR ${PROJECT_BINARY_DIR}/external/xkbcommon
14
+    INSTALL_DIR ${PROJECT_BINARY_DIR}/external
15
+    URL ${xkbcommon_source_url}
16
+    URL_HASH SHA256=${xkbcommon_checksum}
17
+    CONFIGURE_COMMAND ${meson_bin} setup --prefix=<INSTALL_DIR> --buildtype=release --libdir=lib
18
+        -Denable-wayland=true
19
+        -Denable-tools=false
20
+        -Denable-x11=$<IF:$<BOOL:${WITH_X11_FEATURES}>,true,false>
21
+        -Dxkb-config-root=${DSNOTE_XKB_CONFIG_ROOT}
22
+        -Denable-bash-completion=false
23
+        -Ddefault_library=static
24
+        <BINARY_DIR> <SOURCE_DIR>
25
+    BUILD_COMMAND ninja -C <BINARY_DIR>
26
+    BUILD_ALWAYS False
27
+    INSTALL_COMMAND ninja -C <BINARY_DIR> install
28
+)
29
+
30
+list(APPEND deps_libs "${external_lib_dir}/libxkbcommon.a")
31
+list(APPEND deps xkbcommon)
32
+
33
+if(WITH_X11_FEATURES)
34
+    list(APPEND deps_libs xcb xcb-xkb "${external_lib_dir}/libxkbcommon-x11.a")
35
+endif()
36
dsnote-4.7.1.tar.gz/config/models.json -> dsnote-4.8.1.tar.gz/config/models.json Changed
201
 
1
@@ -350,6 +350,31 @@
2
             "name": "Cymraeg",
3
             "name_en": "Welsh",
4
             "id": "cy"
5
+        },
6
+        {
7
+            "name": "Azərbaycanca",
8
+            "name_en": "Azerbaijani",
9
+            "id": "az"
10
+        },
11
+        {
12
+            "name": "Беларуская",
13
+            "name_en": "Belarusian",
14
+            "id": "be"
15
+        },
16
+        {
17
+            "name": "ಕನ್ನಡ",
18
+            "name_en": "Kannada",
19
+            "id": "kn"
20
+        },
21
+        {
22
+            "name": "മലയാളം",
23
+            "name_en": "Malayalam",
24
+            "id": "ml"
25
+        },
26
+        {
27
+            "name": "தமிழ்",
28
+            "name_en": "Tamil",
29
+            "id": "ta"
30
         }
31
     ,
32
     "models": 
33
@@ -457,7 +482,8 @@
34
                 "name": "Mozilla Public License Version 2.0",
35
                 "url": "https://www.mozilla.org/media/MPL/2.0/index.txt",
36
                 "accept_required": false
37
-            }
38
+            },
39
+            "pack_id": "en_ds"
40
         },
41
         {
42
             "name": "English (Coqui Large)",
43
@@ -488,7 +514,8 @@
44
                 "name": "Mozilla Public License Version 2.0",
45
                 "url": "https://www.mozilla.org/media/MPL/2.0/index.txt",
46
                 "accept_required": false
47
-            }
48
+            },
49
+            "pack_id": "en_ds"
50
         },
51
         {
52
             "name": "Deutsch (DeepSpeech Jaco)",
53
@@ -521,7 +548,8 @@
54
                         "https://github.com/rhasspy/de_deepspeech-jaco/raw/master/model/base.scorer.gz.part-08"
55
                     
56
                 }
57
-            
58
+            ,
59
+            "pack_id": "de_ds"
60
         },
61
         {
62
             "name": "Deutsch (DeepSpeech AA)",
63
@@ -544,7 +572,8 @@
64
                         "https://github.com/coqui-ai/STT-models/releases/download/german/AASHISHAG/v0.9.0/de-aashishag-1-prune-kenlm.scorer"
65
                     
66
                 }
67
-            
68
+            ,
69
+            "pack_id": "de_ds"
70
         },
71
         {
72
             "name": "Deutsch (DeepSpeech Med)",
73
@@ -570,7 +599,8 @@
74
                         "https://github.com/mkiol/dsnote/releases/download/v1.7.0/de-med.scorer.xz"
75
                     
76
                 }
77
-            
78
+            ,
79
+            "pack_id": "de_ds"
80
         },
81
         {
82
             "name": "Español (DeepSpeech Jaco)",
83
@@ -604,7 +634,8 @@
84
                         "https://github.com/rhasspy/es_deepspeech-jaco/raw/master/model/base.scorer.gz.part-09"
85
                     
86
                 }
87
-            
88
+            ,
89
+            "pack_id": "de_ds"
90
         },
91
         {
92
             "name": "Français (DeepSpeech Jaco)",
93
@@ -1251,6 +1282,31 @@
94
             "hidden": true
95
         },
96
         {
97
+            "name": "Multilingual (FasterWhisper CrisperWhisper)",
98
+            "model_id": "multilang_fasterwhisper_crisperwhisper",
99
+            "engine": "stt_fasterwhisper",
100
+            "lang_id": "multilang",
101
+            "checksum": "8145cc54",
102
+            "checksum_quick": "adae19ca",
103
+            "size": "1555161323",
104
+            "comp": "dir",
105
+            "info": "https://github.com/nyrahealth/CrisperWhisper",
106
+            "urls": 
107
+                "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/db1cdb5990df067cf53670d86241330c7ea454cf/faster-whisper-crisper-int8/model.bin",
108
+                "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/db1cdb5990df067cf53670d86241330c7ea454cf/faster-whisper-crisper-int8/config.json",
109
+                "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/db1cdb5990df067cf53670d86241330c7ea454cf/faster-whisper-crisper-int8/tokenizer.json",
110
+                "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/db1cdb5990df067cf53670d86241330c7ea454cf/faster-whisper-crisper-int8/vocabulary.json",
111
+                "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/db1cdb5990df067cf53670d86241330c7ea454cf/faster-whisper-crisper-int8/preprocessor_config.json"
112
+            ,
113
+            "license": {
114
+                "id": "CC BY-NC 4.0",
115
+                "name": "Creative Commons Attribution NonCommertial 4.0 International",
116
+                "url": "https://creativecommons.org/licenses/by-nc/4.0/legalcode.txt",
117
+                "accept_required": true
118
+            },
119
+            "hidden": true
120
+        },
121
+        {
122
             "name": "English (FasterWhisper Tiny)",
123
             "model_id": "en_fasterwhisper_tiny",
124
             "engine": "stt_fasterwhisper",
125
@@ -1264,7 +1320,8 @@
126
                 "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/15d956df6a221df330485e243b2a5ed41f0e2728/faster-whisper-tiny-int8/tokenizer.json",
127
                 "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/15d956df6a221df330485e243b2a5ed41f0e2728/faster-whisper-tiny-int8/vocabulary.json"
128
             ,
129
-            "size": "45679437"
130
+            "size": "45679437",
131
+            "pack_id": "en_fasterwhisper"
132
         },
133
         {
134
             "name": "English (FasterWhisper Base)",
135
@@ -1280,7 +1337,8 @@
136
                 "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/15d956df6a221df330485e243b2a5ed41f0e2728/faster-whisper-base-int8/tokenizer.json",
137
                 "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/15d956df6a221df330485e243b2a5ed41f0e2728/faster-whisper-base-int8/vocabulary.json"
138
             ,
139
-            "size": "82679495"
140
+            "size": "82679495",
141
+            "pack_id": "en_fasterwhisper"
142
         },
143
         {
144
             "name": "English (FasterWhisper Small)",
145
@@ -1296,7 +1354,8 @@
146
                 "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/15d956df6a221df330485e243b2a5ed41f0e2728/faster-whisper-small-int8/tokenizer.json",
147
                 "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/15d956df6a221df330485e243b2a5ed41f0e2728/faster-whisper-small-int8/vocabulary.json"
148
             ,
149
-            "size": "257618046"
150
+            "size": "257618046",
151
+            "pack_id": "en_fasterwhisper"
152
         },
153
         {
154
             "name": "English (FasterWhisper Medium)",
155
@@ -1312,10 +1371,11 @@
156
                 "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/15d956df6a221df330485e243b2a5ed41f0e2728/faster-whisper-medium-int8/tokenizer.json",
157
                 "https://huggingface.co/mukowaty/faster-whisper-int8/resolve/15d956df6a221df330485e243b2a5ed41f0e2728/faster-whisper-medium-int8/vocabulary.json"
158
             ,
159
-            "size": "788456347"
160
+            "size": "788456347",
161
+            "pack_id": "en_fasterwhisper"
162
         },
163
         {
164
-            "name": "English (FasterWhisper-Distil Small)",
165
+            "name": "English (FasterWhisper Distil Small)",
166
             "model_id": "en_fasterwhisper_distil_small",
167
             "engine": "stt_fasterwhisper",
168
             "lang_id": "en",
169
@@ -1333,10 +1393,11 @@
170
                 "id": "MIT",
171
                 "name": "MIT License",
172
                 "accept_required": false
173
-            }
174
+            },
175
+            "pack_id": "en_fasterwhisper_distil"
176
         },
177
         {
178
-            "name": "English (FasterWhisper-Distil Medium)",
179
+            "name": "English (FasterWhisper Distil Medium)",
180
             "model_id": "en_fasterwhisper_distil_medium",
181
             "engine": "stt_fasterwhisper",
182
             "lang_id": "en",
183
@@ -1354,10 +1415,11 @@
184
                 "id": "MIT",
185
                 "name": "MIT License",
186
                 "accept_required": false
187
-            }
188
+            },
189
+            "pack_id": "en_fasterwhisper_distil"
190
         },
191
         {
192
-            "name": "English (FasterWhisper-Distil Large-v2)",
193
+            "name": "English (FasterWhisper Distil Large-v2)",
194
             "model_id": "en_fasterwhisper_distil_large2",
195
             "engine": "stt_fasterwhisper",
196
             "lang_id": "en",
197
@@ -1375,10 +1437,11 @@
198
                 "id": "MIT",
199
                 "name": "MIT License",
200
                 "accept_required": false
201
dsnote-4.7.1.tar.gz/dbus/dsnote.xml.in -> dsnote-4.8.1.tar.gz/dbus/dsnote.xml.in Changed
38
 
1
@@ -84,23 +84,29 @@
2
        start-listening-clipboard
3
        start-listening-translate-clipboard
4
        stop-listening
5
-       start-reading
6
-       start-reading-clipboard
7
-       start-reading-text
8
+       start-reading *
9
+       start-reading-clipboard *
10
+       start-reading-text *
11
        pause-resume-reading
12
        cancel
13
        switch-to-next-stt-model
14
        switch-to-prev-stt-model
15
        switch-to-next-tts-model
16
        switch-to-prev-tts-model
17
-       set-stt-model
18
-       set-tts-model
19
+       set-stt-model *
20
+       set-tts-model *
21
+
22
+      *) Optional @arguments dict used to pass additional options:
23
+        model-id => model ID
24
+        text => text to read
25
+        output-file => output file path
26
   -->
27
   <method name="InvokeAction">
28
     <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantMap"/>
29
+    <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/>
30
     <arg name="action_name" type="s" direction="in" />
31
-    <!-- optional argument (e.g. model-id, text to read) -->
32
-    <arg name="argument" type="v" direction="in" />
33
+    <!-- optional arguments (e.g. model-id, text to read, output-file) -->
34
+    <arg name="arguments" type="a{sv}" direction="in" />
35
     <arg name="result" type="a{sv}" direction="out" />
36
   </method>
37
 
38
dsnote-4.8.1.tar.gz/dbus/org.freedesktop.portal.GlobalShortcuts.xml Added
201
 
1
@@ -0,0 +1,268 @@
2
+<?xml version="1.0"?>
3
+<!--
4
+ Copyright (C) 2022 Aleix Pol Gonzalez <aleixpol@kde.org>
5
+
6
+ This library is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU Lesser General Public
8
+ License as published by the Free Software Foundation; either
9
+ version 2 of the License, or (at your option) any later version.
10
+
11
+ This library is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
+ Lesser General Public License for more details.
15
+
16
+ You should have received a copy of the GNU Lesser General Public
17
+ License along with this library. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ Author: Aleix Pol Gonzalez <aleixpol@kde.org>
20
+-->
21
+
22
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
23
+  <!--
24
+      org.freedesktop.portal.GlobalShortcut:
25
+      @short_description: GlobalShortcut portal backend interface
26
+
27
+      This portal lets applications create global shortcuts sessions, and
28
+      register shortcuts to them. These shortcuts are activated regardless of
29
+      the focused state of the application window.
30
+
31
+      To use this portal, applications have to create a session under which its
32
+      actions will be collected. Then shortcuts can be bound (see
33
+      org.freedesktop.portal.GlobalShortcuts.Bind), and listed (see
34
+      org.freedesktop.portal.GlobalShortcuts.ListShortcuts).
35
+
36
+      All global shortcuts are bound to a session, and all sessions are bound to
37
+      the application that created them.
38
+
39
+      The #org.freedesktop.portal.GlobalShortcuts::Activated and
40
+      #org.freedesktop.portal.GlobalShortcuts::Deactivated signals are emitted,
41
+      respecitvely, whenever a shortcut is activated and deactivated.
42
+
43
+      This documentation describes version 1 of this interface.
44
+  -->
45
+  <interface name="org.freedesktop.portal.GlobalShortcuts">
46
+    <!--
47
+        CreateSession:
48
+        @options: Vardict with optional further information
49
+        @handle: Object path for the #org.freedesktop.portal.Request object representing this call
50
+
51
+        Creates a global shortcuts session.
52
+
53
+        Supported keys in the @options vardict include:
54
+        <variablelist>
55
+          <varlistentry>
56
+            <term>handle_token s</term>
57
+            <listitem><para>
58
+              A string that will be used as the last element of the @handle. Must be a valid
59
+              object path element. See the #org.freedesktop.portal.Request documentation for
60
+              more information about the @handle.
61
+            </para></listitem>
62
+          </varlistentry>
63
+          <varlistentry>
64
+            <term>session_handle_token s</term>
65
+            <listitem><para>
66
+              A string that will be used as the last element of the session handle. Must be a valid
67
+              object path element. See the #org.freedesktop.portal.Session documentation for
68
+              more information about the session handle.
69
+            </para></listitem>
70
+          </varlistentry>
71
+        </variablelist>
72
+
73
+        The following results get returned via the #org.freedesktop.portal.Request::Response signal:
74
+        <variablelist>
75
+          <varlistentry>
76
+            <term>session_handle o</term>
77
+            <listitem><para>
78
+              The session handle. An object path for the
79
+              #org.freedesktop.portal.Session object representing the created
80
+              session.
81
+            </para></listitem>
82
+          </varlistentry>
83
+        </variablelist>
84
+    -->
85
+    <method name="CreateSession">
86
+      <arg type="a{sv}" name="options" direction="in"/>
87
+      <arg type="o" name="handle" direction="out"/>
88
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QVariantMap"/>
89
+    </method>
90
+
91
+    <!--
92
+        BindShortcuts:
93
+        @session_handle: Object path for the #org.freedesktop.impl.portal.Session object representing the session
94
+        @shortcuts: The list of shortcuts to bind
95
+        @parent_window: Identifier for the application window, see <link linkend="parent_window">Common Conventions</link>
96
+        @options: Vardict with optional further information
97
+        @request_handle: Object path for the #org.freedesktop.portal.Request object representing this call
98
+
99
+        Bind the shortcuts. This will typically result the portal presenting a
100
+        dialog showing the shortcuts and allowing users to configure the shortcuts.
101
+        An application can only attempt bind shortcuts of a session once.
102
+
103
+        Each element of the @shortcuts array is a tuple composed of a shortcut id,
104
+        and a vardict with the following keys:
105
+        <variablelist>
106
+          <varlistentry>
107
+            <term>description s</term>
108
+            <listitem><para>
109
+              User-readable text describing what the shortcut does.
110
+            </para></listitem>
111
+          </varlistentry>
112
+          <varlistentry>
113
+            <term>preferred_trigger s</term>
114
+            <listitem><para>
115
+              The preferred shortcut trigger, defined as described by the "shortcuts"
116
+              XDG specification. Optional.
117
+            </para></listitem>
118
+          </varlistentry>
119
+        </variablelist>
120
+
121
+        Supported keys in the @options vardict include:
122
+        <variablelist>
123
+          <varlistentry>
124
+            <term>handle_token s</term>
125
+            <listitem><para>
126
+              A string that will be used as the last element of the
127
+              @handle. Must be a valid object path element. See the
128
+              #org.freedesktop.portal.Request documentation for more
129
+              information about the @handle.
130
+            </para></listitem>
131
+          </varlistentry>
132
+        </variablelist>
133
+
134
+        The following results get returned via the #org.freedesktop.portal.Request::Response signal:
135
+        <variablelist>
136
+          <varlistentry>
137
+            <term>shortcuts a(sa{sv})</term>
138
+            <listitem><para>
139
+              A list of shortcuts. The list of keys it may contain is described
140
+              below, and is different from the @shortcuts variable of this method.
141
+            </para></listitem>
142
+          </varlistentry>
143
+        </variablelist>
144
+
145
+        Each element of the @shortcuts array returned by the
146
+        #org.freedesktop.portal.Request::Response signal is a tuple composed of
147
+        a shortcut id, and a vardict with the following keys:
148
+        <variablelist>
149
+          <varlistentry>
150
+            <term>description s</term>
151
+            <listitem><para>
152
+              User-readable text describing what the shortcut does.
153
+            </para></listitem>
154
+          </varlistentry>
155
+          <varlistentry>
156
+            <term>trigger_description s</term>
157
+            <listitem><para>
158
+              User-readable text describing how to trigger the shortcut for the
159
+              client to render.
160
+            </para></listitem>
161
+          </varlistentry>
162
+        </variablelist>
163
+    -->
164
+    <method name="BindShortcuts">
165
+      <arg type="o" name="session_handle" direction="in"/>
166
+      <arg type="a(sa{sv})" name="shortcuts" direction="in"/>
167
+      <arg type="s" name="parent_window" direction="in"/>
168
+      <arg type="a{sv}" name="options" direction="in"/>
169
+      <arg type="o" name="request_handle" direction="out"/>
170
+
171
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QList&lt;QPair&lt;QString,QVariantMap&gt;&gt;"/>
172
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In3" value="QVariantMap"/>
173
+    </method>
174
+
175
+    <!--
176
+        ListShortcuts:
177
+        @session_handle: Object path for the #org.freedesktop.impl.portal.Session object representing the session
178
+        @options: Vardict with optional further information
179
+
180
+        Lists all shortcuts.
181
+
182
+        Supported keys in the @options vardict include:
183
+        <variablelist>
184
+          <varlistentry>
185
+            <term>handle_token s</term>
186
+            <listitem><para>
187
+              A string that will be used as the last element of the
188
+              @handle. Must be a valid object path element. See the
189
+              #org.freedesktop.portal.Request documentation for more
190
+              information about the @handle.
191
+            </para></listitem>
192
+          </varlistentry>
193
+        </variablelist>
194
+
195
+        The following results get returned via the #org.freedesktop.portal.Request::Response signal:
196
+        <variablelist>
197
+          <varlistentry>
198
+            <term>shortcuts a(sa{sv})</term>
199
+            <listitem><para>
200
+              A list of shortcuts.
201
dsnote-4.8.1.tar.gz/dbus/org.freedesktop.portal.Request.xml Added
88
 
1
@@ -0,0 +1,86 @@
2
+<?xml version="1.0"?>
3
+<!--
4
+ Copyright (C) 2015 Red Hat, Inc.
5
+
6
+ This library is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU Lesser General Public
8
+ License as published by the Free Software Foundation; either
9
+ version 2 of the License, or (at your option) any later version.
10
+
11
+ This library is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
+ Lesser General Public License for more details.
15
+
16
+ You should have received a copy of the GNU Lesser General Public
17
+ License along with this library. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ Author: Alexander Larsson <alexl@redhat.com>
20
+-->
21
+
22
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
23
+  <!--
24
+      org.freedesktop.portal.Request:
25
+      @short_description: Shared request interface
26
+
27
+      The Request interface is shared by all portal interfaces. When a
28
+      portal method is called, the reply includes a handle (i.e. object path)
29
+      for a Request object, which will stay alive for the duration of the
30
+      user interaction related to the method call.
31
+
32
+      The portal indicates that a portal request interaction is over by
33
+      emitting the #org.freedesktop.portal.Request::Response signal on the
34
+      Request object.
35
+
36
+      The application can abort the interaction calling
37
+      org.freedesktop.portal.Request.Close() on the Request object.
38
+
39
+      Since version 0.9 of xdg-desktop-portal, the handle will be of the form
40
+       /org/freedesktop/portal/desktop/request/SENDER/TOKEN,
41
+      where SENDER is the callers unique name, with the initial ':' removed and
42
+      all '.' replaced by '_', and TOKEN is a unique token that the caller provided
43
+      with the handle_token key in the options vardict.
44
+
45
+      This change was made to let applications subscribe to the Response signal before
46
+      making the initial portal call, thereby avoiding a race condition. It is recommended
47
+      that the caller should verify that the returned handle is what it expected, and update
48
+      its signal subscription if it isn't. This ensures that applications will work with both
49
+      old and new versions of xdg-desktop-portal.
50
+
51
+      The token that the caller provides should be unique and not guessable. To avoid clashes
52
+      with calls made from unrelated libraries, it is a good idea to use a per-library prefix
53
+      combined with a random number.
54
+  -->
55
+  <interface name="org.freedesktop.portal.Request">
56
+
57
+    <!--
58
+        Close:
59
+
60
+        Closes the portal request to which this object refers and ends all
61
+        related user interaction (dialogs, etc).
62
+        A Response signal will not be emitted in this case.
63
+    -->
64
+    <method name="Close">
65
+    </method>
66
+
67
+    <!--
68
+        Response:
69
+        @response: Numeric response
70
+        @results: Vardict with results. The keys and values in the vardict depend on the request.
71
+
72
+        Emitted when the user interaction for a portal request is over.
73
+
74
+        The @response indicates how the user interaction ended:
75
+            <simplelist>
76
+              <member>0: Success, the request is carried out</member>
77
+              <member>1: The user cancelled the interaction</member>
78
+              <member>2: The user interaction was ended in some other way</member>
79
+            </simplelist>
80
+    -->
81
+    <signal name="Response">
82
+      <arg type="u" name="response"/>
83
+      <arg type="a{sv}" name="results"/>
84
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="QVariantMap"/>
85
+    </signal>
86
+  </interface>
87
+</node>
88
dsnote-4.7.1.tar.gz/deb/README.md -> dsnote-4.8.1.tar.gz/deb/README.md Changed
32
 
1
@@ -5,7 +5,8 @@
2
     git kirigami2-dev libarchive-dev libboost-all-dev libfmt-dev \
3
     libkf5dbusaddons-dev libkf5qqc2desktopstyle-dev libkf5iconthemes-dev \
4
     liblzma-dev libopenblas-dev libpulse-dev libqt5x11extras5-dev \
5
-    librubberband-dev libtag1-dev libtool libxkbcommon-x11-dev \
6
+    librubberband-dev libtag1-dev libtool libtool-bin libvulkan-dev \
7
+    libxinerama-dev libxkbcommon-x11-dev libxtst-dev \
8
     ocl-icd-opencl-dev patchelf pybind11-dev python3-dev qtbase5-dev \
9
     qtdeclarative5-dev qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev \
10
     zlib1g-dev
11
@@ -16,15 +17,15 @@
12
 $ sudo apt install nvidia-cuda-dev nvidia-cuda-toolkit nvidia-cudnn
13
 ```
14
 
15
-For AMD, follow this guide(https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/native-install/ubuntu.html) and add the repositories for your Ubuntu version (as of now, there is support for 22.04/`jammy` and 24.04/`noble`), then install the necessary packages to build:
16
+Finally, run:
17
 ```
18
-$ sudo apt install rocm-hip-sdk rocm-opencl-runtime
19
+$ ./makedeb.sh
20
 ```
21
 
22
-Finally, run:
23
+Then install the .deb file created in the current directory:
24
 ```
25
-$ ./makedeb.sh
26
+sudo apt install dsnote_*_amd64.deb
27
 ```
28
 
29
-PS: Support for GPU acceleration is experimental and may break. The build is tested on Ubuntu 24.04 only, but may work with older versions (if it does not work, try removing the CUDA/ROCm packages to build without GPU support).
30
+PS: Support for GPU acceleration is experimental and may break. The build is tested on Ubuntu 24.10 only, but may work with the current LTS (24.04) as well (if it does not work, try removing the CUDA packages to build without CUDA support).
31
 
32
dsnote-4.7.1.tar.gz/deb/debian/changelog -> dsnote-4.8.1.tar.gz/deb/debian/changelog Changed
11
 
1
@@ -1,3 +1,9 @@
2
+dsnote (4.7.1-1) unstable; urgency=low
3
+
4
+  * v4.7.1 release.
5
+
6
+ -- LFdev <lfdev+deb@envs.net>  Mon, 27 Jan 2025 19:05:00 -0300
7
+ 
8
 dsnote (4.6.1-1) unstable; urgency=low
9
 
10
   * v4.6.1 release.
11
dsnote-4.7.1.tar.gz/deb/debian/control -> dsnote-4.8.1.tar.gz/deb/debian/control Changed
16
 
1
@@ -1,11 +1,11 @@
2
 Package: dsnote
3
-Version: 4.6.1-1
4
+Version: 4.7.1-1
5
 Architecture: amd64
6
 Homepage: https://github.com/mkiol/dsnote
7
 Maintainer: LFdev <lfdev+deb@envs.net>
8
 Section: misc
9
-Depends: breeze-icon-theme, hicolor-icon-theme, libarchive13, libc6, libfmt9, libkf5dbusaddons5, liblzma5, libopenblas0, libpython3.12, libqt5multimedia5, libqt5multimedia5-plugins, libqt5quickcontrols2-5, libqt5x11extras5, librubberband2, libtag1v5, ocl-icd-libopencl1, perl, python3, qml-module-org-kde-qqc2breezestyle, qml-module-org-kde-qqc2desktopstyle, qml-module-org-kde-quickcharts, qml-module-qtquick-controls, qml-module-qtquick-dialogs, zlib1g
10
-Suggests: intel-opencl-icd, libcudart12, nvidia-cudnn
11
+Depends: breeze-icon-theme, hicolor-icon-theme, libarchive13t64, libc6, libfmt9, libkf5dbusaddons5, liblzma5, libopenblas0, libpython3.12t64, libqt5multimedia5, libqt5multimedia5-plugins, libqt5quickcontrols2-5, libqt5x11extras5, librubberband2, libtag1v5, libvulkan1, libxinerama1, libxtst6, ocl-icd-libopencl1, perl, python3, qml-module-org-kde-qqc2desktopstyle, qml-module-org-kde-quickcharts, qml-module-qtquick-controls, qml-module-qtquick-dialogs, zlib1g
12
+Suggests: intel-opencl-icd, libcudart12, mesa-vulkan-drivers, nvidia-cudnn
13
 Description: Offline note taking, reading and translating
14
  Note taking, reading and translating with offline Speech to Text,
15
  Text to Speech and Machine Translation.
16
dsnote-4.7.1.tar.gz/deb/dsnote.pacscript -> dsnote-4.8.1.tar.gz/deb/dsnote.pacscript Changed
107
 
1
@@ -1,9 +1,9 @@
2
 maintainer=("LFdev <lfdev+deb@envs.net>")
3
-compatible=('*:noble' '*:24.04')
4
+compatible=('*:oracular' '*:24.10')
5
 
6
 _pkgname='dsnote'
7
 pkgname="${_pkgname}"
8
-pkgver=4.6.1
9
+pkgver=4.7.1
10
 pkgrel=1
11
 pkgdesc="Note taking, reading and translating with offline Speech to Text, Text to Speech and Machine Translation"
12
 arch=(
13
@@ -12,23 +12,26 @@
14
 depends=(
15
     'breeze-icon-theme'
16
     'hicolor-icon-theme'
17
-    'libarchive13'
18
+    'libarchive13t64'
19
     'libc6'
20
     'libfmt9'
21
     'libkf5dbusaddons5'
22
     'liblzma5'
23
     'libopenblas0'
24
-    'libpython3.11'
25
+    'libpython3.12t64'
26
     'libqt5multimedia5'
27
     'libqt5multimedia5-plugins'
28
     'libqt5quickcontrols2-5'
29
     'libqt5x11extras5'
30
     'librubberband2'
31
     'libtag1v5'
32
+    'libvulkan1'
33
+    'libxinerama1'
34
+    'libxtst6'
35
     'ocl-icd-libopencl1'
36
     'perl'
37
-    'python3>=3.11'
38
-    'qml-module-org-kde-qqc2breezestyle'
39
+    'python3'
40
+#    'qml-module-org-kde-qqc2breezestyle'
41
     'qml-module-org-kde-qqc2desktopstyle'
42
     'qml-module-org-kde-quickcharts'
43
     'qml-module-qtquick-controls'
44
@@ -56,7 +59,11 @@
45
     'librubberband-dev'
46
     'libtag1-dev'
47
     'libtool'
48
+    'libtool-bin'
49
+    'libvulkan-dev'
50
+    'libxinerama-dev'
51
     'libxkbcommon-x11-dev'
52
+    'libxtst-dev'
53
     'ocl-icd-opencl-dev'
54
     'patchelf'
55
     'pybind11-dev'
56
@@ -69,14 +76,12 @@
57
     'zlib1g-dev'
58
     'nvidia-cuda-dev'     # Support for GPU acceleration on NVidia GPU
59
     'nvidia-cuda-toolkit' # Support for GPU acceleration on NVidia GPU
60
-#    'rocm-hip-sdk'        # Support GPU acceleration on AMD GPU
61
 )
62
 optdepends=(
63
     'intel-opencl-icd: Support for Intel GPU acceleration with OpenCL'
64
     'libcudart12: Support for GPU acceleration on NVidia GPU'
65
+    'mesa-vulkan-drivers: Vulkan support'
66
     'nvidia-cudnn: Support for GPU acceleration on NVidia GPU'
67
-    'rocblas: Support for GPU acceleration on AMD GPU'
68
-    'rocm-opencl-runtime: Support for GPU acceleration on AMD GPU'
69
 )
70
 
71
 conflicts=(${_pkgname}-git)
72
@@ -84,7 +89,7 @@
73
 license=('MPL-2.0')
74
 
75
 source=(https://github.com/mkiol/dsnote/archive/refs/tags/v${pkgver}.tar.gz)
76
-sha256sums=('301ec08dff6afa8ea321c74fc25aa1b42423d3d2ee1da840ac80b40e391332b3')
77
+sha256sums=('6b3c5029b32b272bd5238fb830c3aadce0cec438f7bece13bb304a7e52676b1b')
78
 
79
 build() {
80
     cd "${srcdir}/${_pkgname}-${pkgver}"
81
@@ -102,19 +107,20 @@
82
         -DBUILD_FFMPEG=ON \
83
         -DBUILD_TAGLIB=OFF \
84
         -DBUILD_VOSK=OFF \
85
+        -DBUILD_WHISPERCPP_VULKAN=ON \
86
         -DBUILD_QQC2_BREEZE_STYLE=ON \
87
         -DDOWNLOAD_VOSK=ON \
88
         -DCMAKE_INSTALL_PREFIX=/usr \
89
         -Wno-dev"
90
 
91
-    # Do not build for CUDA if needed packages are not found
92
+    # Build for CUDA if needed packages are found
93
     dpkg -s nvidia-cuda-dev &> /dev/null && CUDA1=true || CUDA1=false
94
     dpkg -s nvidia-cuda-toolkit &> /dev/null && CUDA2=true || CUDA2=false
95
-    $CUDA1 && $CUDA2 || CMAKE+=" -DBUILD_WHISPERCPP_CUBLAS=OFF"
96
+    $CUDA1 && $CUDA2 && CMAKE+=" -DBUILD_WHISPERCPP_CUBLAS=ON -DCMAKE_CUDA_ARCHITECTURES=native"
97
 
98
-    # Do not build for HIP if needed package is not found
99
-    dpkg -s rocm-hip-sdk &> /dev/null && ROCM=true || ROCM=false
100
-    $ROCM || CMAKE+=" -DBUILD_WHISPERCPP_HIPBLAS=OFF"
101
+    TEST_BUILD=true
102
+    # Disable bergamot and RHVoice (shorter build time - for test only)
103
+    $TEST_BUILD && CMAKE+=" -DBUILD_BERGAMOT=OFF -DBUILD_RHVOICE=OFF -DBUILD_RHVOICE_MODULE=OFF"
104
 
105
     cmake ../ $CMAKE
106
 
107
dsnote-4.7.1.tar.gz/deb/makedeb.sh -> dsnote-4.8.1.tar.gz/deb/makedeb.sh Changed
45
 
1
@@ -2,7 +2,7 @@
2
 
3
 set -e
4
 
5
-VERSION="4.6.1"
6
+VERSION="4.7.1"
7
 REV="1"
8
 ARCH="amd64"
9
 LDIR="$(
10
@@ -15,7 +15,7 @@
11
 SOURCEDIR="dsnote-${VERSION}"
12
 SOURCEFILE="v${VERSION}.tar.gz"
13
 SOURCEURL="https://github.com/mkiol/dsnote/archive/refs/tags/${SOURCEFILE}"
14
-SHA256SUM="301ec08dff6afa8ea321c74fc25aa1b42423d3d2ee1da840ac80b40e391332b3"
15
+SHA256SUM="6b3c5029b32b272bd5238fb830c3aadce0cec438f7bece13bb304a7e52676b1b"
16
 
17
 wget -c -q --show-progress "$SOURCEURL"
18
 echo "${SHA256SUM}  ${SOURCEFILE}" | sha256sum --check
19
@@ -37,19 +37,20 @@
20
         -DBUILD_FFMPEG=ON \
21
         -DBUILD_TAGLIB=OFF \
22
         -DBUILD_VOSK=OFF \
23
+        -DBUILD_WHISPERCPP_VULKAN=ON \
24
         -DBUILD_QQC2_BREEZE_STYLE=ON \
25
         -DDOWNLOAD_VOSK=ON \
26
         -DCMAKE_INSTALL_PREFIX=/usr \
27
         -Wno-dev"
28
 
29
-# Do not build for CUDA if needed packages are not found
30
+# Build for CUDA if needed packages are found
31
 dpkg -s nvidia-cuda-dev &> /dev/null && CUDA1=true || CUDA1=false
32
 dpkg -s nvidia-cuda-toolkit &> /dev/null && CUDA2=true || CUDA2=false
33
-$CUDA1 && $CUDA2 || CMAKE+=" -DBUILD_WHISPERCPP_CUBLAS=OFF"
34
+$CUDA1 && $CUDA2 && CMAKE+=" -DBUILD_WHISPERCPP_CUBLAS=ON -DCMAKE_CUDA_ARCHITECTURES=native"
35
 
36
-# Do not build for HIP if needed package is not found
37
-dpkg -s rocm-hip-sdk &> /dev/null && ROCM=true || ROCM=false
38
-$ROCM || CMAKE+=" -DBUILD_WHISPERCPP_HIPBLAS=OFF"
39
+TEST_BUILD=false
40
+# Disable bergamot and RHVoice (shorter build time - for test only)
41
+$TEST_BUILD && CMAKE+=" -DBUILD_BERGAMOT=OFF -DBUILD_RHVOICE=OFF -DBUILD_RHVOICE_MODULE=OFF"
42
 
43
 cmake ../ $CMAKE
44
 
45
dsnote-4.7.1.tar.gz/desktop/dsnote.metainfo.xml.in -> dsnote-4.8.1.tar.gz/desktop/dsnote.metainfo.xml.in Changed
124
 
1
@@ -1,5 +1,5 @@
2
 <?xml version="1.0" encoding="UTF-8"?>
3
-<!-- Copyright 2024 Michal Kosciesza -->
4
+<!-- Copyright 2024-2025 Michal Kosciesza -->
5
 <component type="desktop-application">
6
   <id>@info_app_icon_id@</id>
7
   <metadata_license>CC0-1.0</metadata_license>
8
@@ -98,7 +98,114 @@
9
       <mediatype>application/x-subrip</mediatype>
10
   </provides>
11
   <releases>
12
-    <release version="4.7.1" date="2024-01-05">
13
+    <release version="4.8.1" date="2025-06-29">
14
+      <description>
15
+      <p>Translator:</p>
16
+      <ul>
17
+      <li>Fix: Model download error for Portuguese, Dutch, Persian, Norwegian and Icelandic languages.</li>
18
+      <li>Updated models with improved accuracy: German to English, Dutch to English, English to Ukrainian,
19
+          English to Hungarian, English to Catalan, Catalan to English, English to Lithuanian, English to Latvian,
20
+          English to Slovenian, Slovenian to English, English to Slovak, English to Russian.</li>
21
+      <li>New models: Azerbaijani to English, Belarusian to English, Bengali to English, Gujarati to English,
22
+          Hebrew to English, Hindi to English, Kannada to English, Malayalam to English, Malay to English,
23
+          Albanian to English, Tamil to English.</li>
24
+      </ul>
25
+      <p>Speech to Text:</p>
26
+      <ul>
27
+      <li>New very large 'Vosk' model for German langauge: Tuda-DE Large</li>
28
+      </ul>
29
+      <p>Text to Speech:</p>
30
+      <ul>
31
+      <li>Coqui MMS voices for the following new languages: Kannada, Malayalam, Tamil</li>
32
+      </ul>
33
+      <p>User Interface:</p>
34
+      <ul>
35
+      <li>Speech Note has been translated into German language.</li>
36
+      </ul>
37
+      </description>
38
+    </release>
39
+    <release version="4.8.0" date="2025-06-19">
40
+      <description>
41
+      <p>General:</p>
42
+      <ul>
43
+      <li>Case-sensitive matching in 'Rules'.
44
+          To enable case-sensitive matching in text, use the option 'Case sensitive' in the rule editing form.</li>
45
+      </ul>
46
+      <p>User Interface:</p>
47
+      <ul>
48
+      <li>Speech Note has been translated into Arabic, Catalan, Spanish, Turkish and French-Canadian languages.</li>
49
+      <li>Command line option and DBus API for exporting synthesized speech to an audio file instead of playing it aloud.</li>
50
+      </ul>
51
+      <p>Speech to Text:</p>
52
+      <ul>
53
+      <li>New 'CrisperWhisper' model for 'FasterWhisper' engine.
54
+          CrisperWhisper is designed for fast, precise, and verbatim speech recognition with accurate word-level timestamps.
55
+          Unlike the original Whisper, which tends to omit disfluencies and follows more of a intended transcription style,
56
+          CrisperWhisper aims to transcribe every spoken word exactly as it is, including fillers, pauses, stutters and false starts.
57
+          CrisperWhisper model is enabled only for English and German languages.</li>
58
+      <li>'KBLab Whisper' models for Swedish.
59
+          The National Library of Sweden has released fine-tuned STT models trained on its library collections.
60
+          The models have significantly improved accuracy compared to regular Whisper models.
61
+          Even "Tiny" model provides decent quality.
62
+          KBLab models are available as both 'FasterWhisper' and 'WhisperCpp'.</li>
63
+      <li>Using an existing note as the initial context in decoding.
64
+          This has the potential to improve transcription quality and reduce 'hallucination' problem.
65
+          If you observe a degradation in quality, turn off the 'Use note as context' option.</li>
66
+      <li>Option to pause listening while processing.
67
+          This option can be useful when 'Listening mode' is 'Always on'.
68
+          By default, listening continues even when a piece of audio data is being processed.
69
+          Using this option, you can temporarily pause listening for the duration of processing.</li>
70
+      <li>Option to play an audible tone when starting and stopping listening</li>
71
+      </ul>
72
+      <p>Text to Speech:</p>
73
+      <ul>
74
+      <li>Kokoro TTS engine.
75
+          Kokoro is a compact yet powerful open-source multilingual TTS engine.
76
+          Despite its modest size (trained on less than 100 hours of audio), it delivers impressive results.
77
+          Unlike other engines with comparable quality, Kokoro offers the advantage of running even on devices without GPUs.
78
+          Kokoro voices are enabled for: English, Chinese, Japanese, Hindi, Italian, French, Spanish and Portuguese.</li>
79
+      <li>F5-TTS engine.
80
+          The F5-TTS provides exceptional voice cloning capabilities.
81
+          The currently enabled model works with English and Chinese languages.</li>
82
+      <li>Parler TTS engine. Parler TTS can generate high-quality, natural sounding speech in the style of a given speaker (gender, pitch, speaking style, etc).
83
+          The speaker's characteristics are defined by a text description (prompt).
84
+          Parler TTS primarily supports English, but a multilingual model for French, Spanish, Portuguese, Polish, German, Dutch and Italian is also included.</li>
85
+      <li>S.A.M. TTS engine. S.A.M. is a small speech synthesizer designed for the Commodore 64.
86
+          It features a robotic voice that evokes a strong sense of nostalgia.
87
+          The S.A.M. voice is available in English only.</li>
88
+      <li>'Normalize audio' setting option.
89
+          Use this option to enable/disable audio volume normalization.</li>
90
+      <li>New 'Piper' voices for Dutch, Finnish, German and Luxembourgish</li>
91
+      <li>New 'RHVoice' voice for Spanish</li>
92
+      <li>Updated 'RHVoice' voice for Czech</li>
93
+      </ul>
94
+      <p>Translator:</p>
95
+      <ul>
96
+      <li>New models: English to Chinese, English to Arabic, Arabic to English, English to Korean, English to Japanese</li>
97
+      </ul>
98
+      <p>Accessibility:</p>
99
+      <ul>
100
+      <li>Support for 'Insert into active window' under Wayland.
101
+          Using 'start-listening-active-window' or 'start-listening-translate-active-window'
102
+          actions you can directly insert the decoded text into any window which is currently in focus.
103
+          This feature worked under X11 only but now it is also suppored under Wayland.
104
+          For actions to work, 'ydotool' daemon must be installed and running.</li>
105
+      <li>Support for 'Global keyboard shortcuts' under Wayland.
106
+          Until now, this capability was only available under X11.
107
+          Now integration with 'XDG Desktop Portal' has been added, making global keyboard shortcuts possible also under Wayland.
108
+          For shortcuts to work, your desktop enviroment has to support
109
+          'GlobalShortcuts' interface on 'XDG Desktop Portal' service.</li>
110
+      </ul>
111
+      <p>Flatpak:</p>
112
+      <ul>
113
+      <li>Python support enabled in 'Tiny' or ARM packages.
114
+          Python libraries are not included in Tiny or ARM packages, but using the 'Location of Python libraries' option,
115
+          you can set an external directory that contains the libraries.</li>
116
+      <li>Flatpak runtime update to version 5.15-24.08</li>
117
+      </ul>
118
+      </description>
119
+    </release>
120
+    <release version="4.7.1" date="2025-01-05">
121
       <description>
122
       <p>General:</p>
123
       <ul>
124
dsnote-4.7.1.tar.gz/desktop/qml/AddonInstallDialog.qml -> dsnote-4.8.1.tar.gz/desktop/qml/AddonInstallDialog.qml Changed
27
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2024-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -72,6 +72,9 @@
8
               "<li>WhisperCpp STT</li>" +
9
               "<li>FasterWhisper STT</li>" +
10
               "<li>Coqui TTS</li>" +
11
+              "<li>F5-TTS</li>" +
12
+              "<li>Kokoro TTS</li>" +
13
+              "<li>Parler-TTS</li>" +
14
               "<li>WhisperSpeech TTS</li>" +
15
               "</ul>"
16
     }
17
@@ -86,6 +89,9 @@
18
               "<ul>" +
19
               "<li>WhisperCpp STT</li>" +
20
               "<li>Coqui TTS</li>" +
21
+              "<li>F5-TTS</li>" +
22
+              "<li>Kokoro TTS</li>" +
23
+              "<li>Parler-TTS</li>" +
24
               "<li>WhisperSpeech TTS</li>" +
25
               "</ul>"
26
     }
27
dsnote-4.7.1.tar.gz/desktop/qml/ChangelogPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/ChangelogPage.qml Changed
201
 
1
@@ -18,11 +18,139 @@
2
     }
3
 
4
     RichLabel {
5
-        text: "<p>" + qsTr("General") + ":</p>
6
+        text: "<p>" + qsTr("Translator") + "</p>
7
+        <ul>
8
+        <li>Fix: Model download error for Portuguese, Dutch, Persian, Norwegian and Icelandic languages.</li>
9
+        <li>Updated models with improved accuracy: German to English, Dutch to English, English to Ukrainian,
10
+            English to Hungarian, English to Catalan, Catalan to English, English to Lithuanian, English to Latvian,
11
+            English to Slovenian, Slovenian to English, English to Slovak, English to Russian.</li>
12
+        <li>New models: Azerbaijani to English, Belarusian to English, Bengali to English, Gujarati to English,
13
+            Hebrew to English, Hindi to English, Kannada to English, Malayalam to English, Malay to English,
14
+            Albanian to English, Tamil to English.</li>
15
+        </ul>
16
+        <p>" + qsTr("Speech to Text") + "</p>
17
+        <ul>
18
+        <li>New very large <i>Vosk</i> model for German langauge: <i>Tuda-DE Large</i></li>
19
+        </ul>
20
+        <p>" + qsTr("Text to Speech") + "</p>
21
+        <ul>
22
+        <li>Coqui MMS models for the following new languages: Kannada, Malayalam, Tamil</li>
23
+        </ul>
24
+        <p>" + qsTr("User Interface") + "</p>
25
+        <ul>
26
+        <li><i>Speech Note</i> has been translated into German language.</li>
27
+        </ul>"
28
+    }
29
+
30
+    SectionLabel {
31
+        text: qsTr("Version %1").arg("4.8.0")
32
+    }
33
+
34
+    RichLabel {
35
+        text: "<p>" + qsTr("General") + "</p>
36
+        <ul>
37
+        <li>Case-sensitive matching in <i>Rules</i>.
38
+            To enable case-sensitive matching in text, use the option <i>Case sensitive</i> in the rule editing form.</li>
39
+        </ul>
40
+        <p>" + qsTr("User Interface") + "</p>
41
+        <ul>
42
+        <li><i>Speech Note</i> has been translated into Arabic, Chinese, Catalan, Spanish, Turkish and French-Canadian languages.</li>
43
+        <li>Command line option and DBus API for exporting synthesized speech to an audio file instead of playing it aloud.
44
+            Use <i>--output-file</i> together with <i>start-reading-clipboard</i> and <i>start-reading-text</i> actions.</li>
45
+        </ul>
46
+        <p>" + qsTr("Speech to Text") + "</p>
47
+        <ul>
48
+        <li>New <i><a href='https://huggingface.co/nyrahealth/CrisperWhisper'>CrisperWhisper</a></i> model for <i>FasterWhisper</i> engine.
49
+            <i>CrisperWhisper</i> is designed for fast, precise, and verbatim speech recognition with accurate word-level timestamps.
50
+            Unlike the original Whisper, which tends to omit disfluencies and follows more of a intended transcription style,
51
+            <i>CrisperWhisper</i> aims to transcribe every spoken word exactly as it is, including fillers, pauses, stutters and false starts.
52
+            <i>CrisperWhisper</i> model is enabled only for English and German languages.</li>
53
+        <li><i><a href='https://huggingface.co/KBLab'>KBLab Whisper</a></i> models for Swedish.
54
+            The National Library of Sweden has released fine-tuned STT models trained on its library collections.
55
+            The models have significantly improved accuracy compared to regular Whisper models.
56
+            Even \"Tiny\" model provides decent quality.
57
+            KBLab models are available as both <i>FasterWhisper</i> and <i>WhisperCpp</i>.</li>
58
+        <li><i><a href='https://keyboard.futo.org/voice-input-models'>FUTO<a/></i> Whisper models.
59
+            New models used in the FUTO mobile keyboard app.</li>
60
+        <li>Using an existing note as the initial context in decoding.
61
+            This has the potential to improve transcription quality and reduce \"hallucination\" problem.
62
+            If you observe a degradation in quality, turn off the <i>Use note as context</i> option.</li>
63
+        <li>Option to pause listening while processing.
64
+            This option can be useful when <i>Listening mode</i> is <i>Always on</i>.
65
+            By default, listening continues even when a piece of audio data is being processed.
66
+            Using this option, you can temporarily pause listening for the duration of processing.</li>
67
+        <li>Option to play an audible tone when starting and stopping listening</li>
68
+        </ul>
69
+        <p>" + qsTr("Text to Speech") + "</p>
70
+        <ul>
71
+        <li><i><a href='https://github.com/hexgrad/kokoro'>Kokoro</a></i> TTS engine.
72
+            Kokoro is a compact yet powerful open-source multilingual TTS engine.
73
+            Despite its modest size (trained on less than 100 hours of audio), it delivers impressive results.
74
+            Unlike other engines with comparable quality, Kokoro offers the advantage of running even on devices without GPUs.
75
+            Kokoro voices are enabled for: English, Chinese, Japanese, Hindi, Italian, French, Spanish and Portuguese.</li>
76
+        <li><i><a href='https://github.com/SWivid/F5-TTS'>F5-TTS</a></i> engine.
77
+            The F5-TTS provides exceptional voice cloning capabilities. The currently enabled model works with English and Chinese languages.
78
+            To work well, F5-TTS needs audio samples of the voice along with the transcribed text spoken in the sample.
79
+            Make sure that the text spoken in the audio sample is set correctly in <i>Voice profiles</i> &rarr; <i>Audio sample</i> menu.
80
+            F5-TTS works best with CUDA acceleration. CPU only processing can be very slow.</li>
81
+        <li><i><a href='https://github.com/huggingface/parler-tts'>Parler-TTS</a></i> engine. Parler-TTS can generate high-quality, natural sounding speech in the style of a given speaker (gender, pitch, speaking style, etc).
82
+            The speaker's characteristics are defined by a text description (prompt).
83
+            To use Parler-TTS models, you need to configure a <i>Text voice profile</i>. This can be done in the <i>Voice profiles</i> menu.
84
+            To learn more about the unique features of this engine, check out <a href='https://github.com/huggingface/parler-tts/'>Parler TTS project website</a>.
85
+            Parler-TTS primarily supports English, but a multilingual model for French, Spanish, Portuguese, Polish, German, Dutch and Italian is also included.
86
+            Currently, the multilingual model provides rather poor quality and not entirely usable speech.
87
+            Parler-TTS works best with CUDA acceleration. CPU only processing can be very slow.</li></li>
88
+        <li><i><a href='https://github.com/s-macke/SAM'>S.A.M.</a></i> TTS engine. S.A.M. is a small speech synthesizer designed for the Commodore 64.
89
+            It features a robotic voice that evokes a strong sense of nostalgia.
90
+            The S.A.M. voice is available in English only.</li>
91
+        <li><i>Normalize audio</i> setting option.
92
+            Use this option to enable/disable audio volume normalization.
93
+            The volume is normalized independently for each sentence, which can lead to unstable volume levels in different sentences.
94
+            Disable this option if you observe this problem.</li>
95
+        <li>New <i>Piper</i> voices for Dutch, Finnish, German and Luxembourgish</li>
96
+        <li>New <i>RHVoice</i> voice for Spanish</li>
97
+        <li>Updated <i>RHVoice</i> voice for Czech</li>
98
+        </ul>
99
+        <p>" + qsTr("Translator") + "</p>
100
+        <ul>
101
+        <li>New models: English to Chinese, English to Arabic, Arabic to English, English to Korean, English to Japanese</li>
102
+        </ul>
103
+        <p>" + qsTr("Accessibility") + "</p>
104
+        <ul>
105
+        <li>Support for <i>Insert into active window</i> under Wayland.
106
+            Using <i>start-listening-active-window</i> or <i>start-listening-translate-active-window</i>
107
+            actions you can directly insert the decoded text into any window which is currently in focus.
108
+            This feature worked under X11 only but now it is also suppored under Wayland.
109
+            For actions to work, <i>ydotool</i> daemon must be installed and running.
110
+            If you are using Flatpak, also make sure that the application has permission to access <i>ydotool</i> daemon socket file.</li>
111
+        <li>Support for <i>Global keyboard shortcuts</i> under Wayland.
112
+            Global keyboard shortcuts allow you to start or stop listening and reading using keyboard
113
+            even when the application is not active (e.g. minimized or in the background).
114
+            Until now, this capability was only available under X11.
115
+            Now integration with <i>XDG Desktop Portal</i> has been added, making global keyboard shortcuts possible also under Wayland.
116
+            For shortcuts to work, your desktop enviroment has to support
117
+            <i>GlobalShortcuts</i> interface on <i>XDG Desktop Portal</i> service.</li>
118
+        </ul>
119
+        <p>Flatpak</p>
120
+        <ul>
121
+        <li>Python support enabled in <i>Tiny</i> and ARM packages.
122
+            Python libraries are not included in Tiny or ARM packages, but using the <i>Location of Python libraries</i> option,
123
+            you can set an external directory that contains the libraries.
124
+            Make sure that the Flatpak application has permissions to access this directory.</li>
125
+        <li>Flatpak runtime update to version 5.15-24.08</li>
126
+        </ul>"
127
+    }
128
+
129
+    SectionLabel {
130
+        text: qsTr("Version %1").arg("4.7.1")
131
+    }
132
+
133
+    RichLabel {
134
+        text: "<p>" + qsTr("General") + "</p>
135
         <ul>
136
         <li>Fix: The application failed to start when the processor did not support AVX CPU extension.</li>
137
         </ul>
138
-        <p>" + qsTr("Translator") + ":</p>
139
+        <p>" + qsTr("Translator") + "</p>
140
         <ul>
141
         <li>New models: Korean to English, Japanese to English</li>
142
         <li>Updated models: Chinese to English</li>
143
@@ -34,7 +162,7 @@
144
     }
145
 
146
     RichLabel {
147
-        text: "<p>" + qsTr("General") + ":</p>
148
+        text: "<p>" + qsTr("General") + "</p>
149
         <ul>
150
         <li><i>Rules</i> for text transformations that can be applied after Speech to Text or before Text to Speech.
151
             With <i>Rules</i>, you can easily and flexibly correct errors in decoded text or correct mispronounced words.
152
@@ -45,7 +173,7 @@
153
             When the <i>Replace an existing note</i> option is set, whenever new text is added, it will replace the existing note.</li>
154
         <li>DBus API for integration with external applications</li>
155
         </ul>
156
-        <p>" + qsTr("User Interface") + ":</p>
157
+        <p>" + qsTr("User Interface") + "</p>
158
         <ul>
159
         <li><i>Speech Note</i> has been translated into Slovenian language.</li>
160
         <li>Status indication in the system tray icon.
161
@@ -61,7 +189,7 @@
162
             To see all available command line options, run the command: <i>" + (_settings.is_flatpak() ? "flatpak run net.mkiol.SpeechNote" : "dsnote") + " --help</i></li>
163
         </li>
164
         </ul>
165
-        <p>" + qsTr("Speech to Text") + ":</p>
166
+        <p>" + qsTr("Speech to Text") + "</p>
167
         <ul>
168
         <li>Support for <i>Vulkan</i> GPU acceleration in <i>WhisperCpp</i>.
169
             Vulkan acceleration enables much faster STT decoding with Intel, AMD or NVIDIA graphics cards.
170
@@ -79,18 +207,18 @@
171
         <li>Echo mode. After processing, the decoded text will be immediately read out using the currently set Text to Speech model.
172
             To enable, use the option in the settings (<i>Speech to Text</i> &rarr; <i>Echo mode</i>).</li>
173
         </ul>
174
-        <p>" + qsTr("Text to Speech") + ":</p>
175
+        <p>" + qsTr("Text to Speech") + "</p>
176
         <ul>
177
         <li>New <i>Piper</i> voice for Latvian</li>
178
         <li>New <i>WhisperSpeech Small</i> model for: English, Italian, German, French, Spanish, Dutch and Portuguese</li>
179
         </ul>
180
-        <p>" + qsTr("Translator") + ":</p>
181
+        <p>" + qsTr("Translator") + "</p>
182
         <ul>
183
         <li>New models: English to Finnish, English to Turkish, English to Swedish, Swedish to English,
184
             English to Slovak, English to Indonesian, English to Romanian, English to Greek, Chinese to English</li>
185
         <li>Updated models: English to Catalan, English to Russian, English to Ukrainian, English to Czech</li>
186
         </ul>
187
-        <p>" + qsTr("Accessibility") + ":</p>
188
+        <p>" + qsTr("Accessibility") + "</p>
189
         <ul>
190
         <li>Option to scan special key strokes when setting keyboard shortcuts (X11 only).
191
             If you want to use special keys as shortcuts (so-called \"multimedia keys\"),
192
@@ -128,16 +256,16 @@
193
         <ul>
194
         <li>Fix: The application failed to start when the processor did not support the required CPU extension.</li>
195
         </ul>
196
-        <p>" + qsTr("User Interface") + ":</p>
197
+        <p>" + qsTr("User Interface") + "</p>
198
         <ul>
199
         <li>Swedish translation has been updated.</li>
200
         </ul>
201
dsnote-4.7.1.tar.gz/desktop/qml/DialogPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/DialogPage.qml Changed
25
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -13,15 +13,14 @@
8
     id: root
9
 
10
     default property alias content: column.data
11
-    //property alias listViewItem: listView
12
     property alias listViewStackItem: listViewStack
13
     property alias flickItem: flick
14
     property alias placeholderLabel: _placeholderLabel
15
     property alias footerLabel: _footerLabel
16
     property alias frame: _frame
17
     readonly property bool listViewExists: !listViewStackItem.empty
18
-    readonly property real _rightMargin: scrollBar.visible ? appWin.padding + scrollBar.width : appWin.padding
19
-    readonly property real _leftMargin: appWin.padding
20
+    readonly property real _rightMargin: (!root.mirrored && scrollBar.visible) ? appWin.padding + scrollBar.width : appWin.padding
21
+    readonly property real _leftMargin: (root.mirrored && scrollBar.visible) ? appWin.padding + scrollBar.width : appWin.padding
22
 
23
     implicitHeight: Math.min(
24
                         header.height + flick.contentHeight + (listViewExists ? root.parent.height : 0) + footer.height + 8 * verticalPadding,
25
dsnote-4.7.1.tar.gz/desktop/qml/ExportFilePage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/ExportFilePage.qml Changed
30
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -304,7 +304,8 @@
8
             }
9
 
10
             function save_file() {
11
-                var file_path = _settings.add_ext_to_audio_file_path(pathField1.text.trim())
12
+                var dont_add_extension = root.disable_manual_file_path
13
+                var file_path = dont_add_extension ? pathField1.text.trim() : _settings.add_ext_to_audio_file_path(pathField1.text.trim())
14
                 var title_tag = mtagTitleTextField.text.trim()
15
                 var track_tag = mtagTrackTextField.text.trim()
16
 
17
@@ -608,8 +609,10 @@
18
                     selectExisting: false
19
                     selectMultiple: false
20
                     onAccepted: {
21
-                        pathField1.text =
22
-                                _settings.file_path_from_url(fileWriteDialog1.fileUrl)
23
+                        var dont_add_extension = root.disable_manual_file_path
24
+                        var file_path = _settings.file_path_from_url(fileWriteDialog1.fileUrl)
25
+                        pathField1.text = dont_add_extension ?
26
+                                    file_path.trim() : _settings.add_ext_to_audio_file_path(file_path.trim())
27
                         _settings.update_audio_file_save_path(pathField1.text)
28
                     }
29
                 }
30
dsnote-4.7.1.tar.gz/desktop/qml/GpuComboBox.qml -> dsnote-4.8.1.tar.gz/desktop/qml/GpuComboBox.qml Changed
33
 
1
@@ -18,6 +18,7 @@
2
     property bool use_gpu: false
3
     property var devices
4
     property int device_index: -1
5
+    property bool show_rocm_warning: false
6
 
7
     Layout.fillWidth: true
8
 
9
@@ -67,7 +68,7 @@
10
         color: palette.text
11
         visible: root.enabled && root.use_gpu && root.devices.length > 1 && gpuCombo.displayText.search("ROCm") !== -1
12
         text: qsTr("Tip: If you observe problems with hardware acceleration, try to enable %1 option.")
13
-              .arg("<i>" + qsTr("Other") + "</i> &rarr; <i>" +
14
+              .arg("<i>" + qsTr("Advanced") + "</i> &rarr; <i>" +
15
               qsTr("Override GPU version") + "</i>")
16
         label.textFormat: Text.RichText
17
     }
18
@@ -81,6 +82,14 @@
19
     }
20
 
21
     TipMessage {
22
+        indends: 2
23
+        color: palette.text
24
+        visible: root.show_rocm_warning && root.enabled && root.use_gpu && root.devices.length > 1 && gpuCombo.displayText.search("ROCm") !== -1
25
+        text: qsTr("This engine can be slow when using %1.").arg("ROCm") + " " +
26
+              qsTr("Disable hardware acceleration if you observe problems.")
27
+    }
28
+
29
+    TipMessage {
30
         indends: 1
31
         visible: root.enabled && root.use_gpu && ((_settings.error_flags & Settings.ErrorCudaUnknown) > 0)
32
         text: qsTr("Most likely, NVIDIA kernel module has not been fully initialized.") + " " +
33
dsnote-4.7.1.tar.gz/desktop/qml/HelloPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/HelloPage.qml Changed
16
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -25,7 +25,7 @@
8
                    "<p>" + qsTr("To get started, you first need to set up the languages you want to use.") + "</p>" +
9
                    "<p>&rarr; " +
10
                    qsTr("Click the %1 button, select a language, and then download the model files you intend to use.")
11
-                   .arg("<i>" + qsTr("Languages") + "</i>") + "</p>" +
12
+                   .arg("<i>" + qsTr("Languages and Models") + "</i>") + "</p>" +
13
                    "<p>" +
14
                    qsTr("To switch between %1 and %2 modes, use the toggle buttons in the upper right corner.")
15
                    .arg("<i>" + qsTr("Notepad") + "</i>").arg("<i>" + qsTr("Translator") + "</i>") + "</p>" +
16
dsnote-4.7.1.tar.gz/desktop/qml/HelpDialog.qml -> dsnote-4.8.1.tar.gz/desktop/qml/HelpDialog.qml Changed
42
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2024-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -16,17 +16,22 @@
8
 
9
     standardButtons: Dialog.Close
10
     anchors.centerIn: parent
11
+    bottomInset: appWin.padding
12
     modal: true
13
 
14
     width: flick.width + root.leftPadding + root.rightMargin
15
-    height: flick.height + root.header.height + root.footer.height + root.topPadding + root.bottomPadding
16
+    height: flick.height + root.header.height + root.footer.height + root.topPadding + root.bottomPadding + root.bottomInset
17
+
18
+    Component.onCompleted: {
19
+        footer.bottomPadding += bottomInset
20
+    }
21
 
22
     Flickable {
23
         id: flick
24
 
25
         width: contentWidth
26
         height: Math.min(contentHeight, root.parent.height -
27
-                         root.header.height - root.footer.height - root.topPadding - root.bottomPadding)
28
+                         root.header.height - root.footer.height - root.topPadding - root.bottomPadding - root.bottomInset)
29
         contentWidth: Math.min(column.implicitWidth, root.parent.width - root.leftPadding - root.rightPadding)
30
         contentHeight: column.height
31
         clip: true
32
@@ -39,7 +44,8 @@
33
             id: column
34
 
35
             width: Math.min(column.implicitWidth, root.parent.width - root.leftPadding - root.rightPadding) -
36
-                    (flick.ScrollBar.vertical.visible ? flick.ScrollBar.vertical.width : root.rightPadding)
37
+                    (((!root.mirrored && flick.ScrollBar.vertical.visible) ? flick.ScrollBar.vertical.width : root.rightPadding) + x)
38
+            x: (root.mirrored && flick.ScrollBar.vertical.visible) ? flick.ScrollBar.vertical.width : 0
39
         }
40
     }
41
 }
42
dsnote-4.7.1.tar.gz/desktop/qml/InlineMessage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/InlineMessage.qml Changed
12
 
1
@@ -23,10 +23,6 @@
2
      padding: appWin.padding
3
      implicitHeight: column.height + 2 * appWin.padding
4
 
5
-     Component.onCompleted: {
6
-         if (background && background.color) background.color = palette.toolTipBase
7
-     }
8
-
9
      ColumnLayout {
10
          id: column
11
 
12
dsnote-4.7.1.tar.gz/desktop/qml/LangsPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/LangsPage.qml Changed
68
 
1
@@ -20,9 +20,13 @@
2
     property string packName: ""
3
     readonly property bool langsView: langId.length === 0
4
     readonly property bool packView: packId.length !== 0
5
-    readonly property real _rightMargin: listViewExists && listViewStackItem.currentItem.ScrollBar.vertical.visible ?
6
+    readonly property real _rightMargin: (!root.mirrored && listViewExists && listViewStackItem.currentItem.ScrollBar.vertical.visible) ?
7
                                              appWin.padding + listViewStackItem.currentItem.ScrollBar.vertical.width :
8
                                              appWin.padding
9
+    readonly property real _leftMargin: (root.mirrored && listViewExists && listViewStackItem.currentItem.ScrollBar.vertical.visible) ?
10
+                                             appWin.padding + listViewStackItem.currentItem.ScrollBar.vertical.width :
11
+                                             appWin.padding
12
+
13
     readonly property bool verticalMode: modelTypeTabBar.implicitWidth > (root.width - 2 * appWin.padding)
14
 
15
     title: langsView ? qsTr("Languages") : packView ? packName : langName
16
@@ -40,6 +44,7 @@
17
         modelFilteringWidget.close()
18
         modelFilteringWidget.reset()
19
         modelFilteringWidget.update()
20
+
21
     }
22
 
23
     function switchToModels(langId, langName) {
24
@@ -355,6 +360,7 @@
25
             width: ListView.view.width
26
             text: model.name
27
             onClicked: root.switchToModels(model.id, model.name)
28
+            leftPadding: root._leftMargin
29
 
30
             BusyIndicator {
31
                 visible: !model.available
32
@@ -416,6 +422,7 @@
33
                 text: model.name
34
                 onClicked: root.switchToPack(model.id, model.name)
35
                 Accessible.name: model.name
36
+                leftPadding: root._leftMargin
37
 
38
                 contentItem: RowLayout {
39
                     Text {
40
@@ -426,6 +433,7 @@
41
                         verticalAlignment: Text.AlignVCenter
42
                         Layout.alignment: Qt.AlignVCenter
43
                         Layout.fillWidth: true
44
+                        horizontalAlignment: Text.AlignLeft
45
                     }
46
 
47
                     BusyIndicator {
48
@@ -530,6 +538,19 @@
49
                         Layout.fillWidth: true
50
                     }
51
 
52
+                    Button {
53
+                        visible: model.score === 0
54
+                        icon.name: "applications-science-symbolic"
55
+                        display: AbstractButton.IconOnly
56
+                        flat: true
57
+                        text: qsTr("Experimental")
58
+                        Layout.alignment: Qt.AlignVCenter
59
+
60
+                        ToolTip.visible: hovered || down
61
+                        ToolTip.text: qsTr("This model is experimental and may not work well.")
62
+                        hoverEnabled: true
63
+                    }
64
+
65
                     Label {
66
                         id: availableLabel
67
 
68
dsnote-4.8.1.tar.gz/desktop/qml/LayoutFixer.qml Added
17
 
1
@@ -0,0 +1,15 @@
2
+import QtQuick 2.0
3
+
4
+Timer {
5
+    id: root
6
+
7
+    interval: 1
8
+    onTriggered: {
9
+        appWin.width -= 1
10
+    }
11
+
12
+    function fix() {
13
+        appWin.width += 1
14
+        start()
15
+    }
16
+}
17
dsnote-4.7.1.tar.gz/desktop/qml/MainToolBar.qml -> dsnote-4.8.1.tar.gz/desktop/qml/MainToolBar.qml Changed
59
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -166,14 +166,14 @@
8
                     ToolButton {
9
                         action: Action {
10
                             enabled: !app.busy
11
-                            text: qsTr("Languages")
12
+                            text: qsTr("Languages and Models")
13
                             shortcut: "Ctrl+L"
14
                             onTriggered: appWin.openDialog("LangsPage.qml")
15
                         }
16
 
17
                         ToolTip.visible: hovered
18
                         ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
19
-                        ToolTip.text: qsTr("Languages") + " (Ctrl+L)"
20
+                        ToolTip.text: qsTr("Languages and Models") + " (Ctrl+L)"
21
                         hoverEnabled: true
22
                     }
23
 
24
@@ -230,29 +230,18 @@
25
                         visible: enabled
26
                         Layout.alignment: Qt.AlignLeft
27
                         action: Action {
28
-                            enabled: (app.tts_ref_voice_needed && !_settings.translator_mode) ||
29
-                                     (_settings.translator_mode && (app.tts_for_in_mnt_ref_voice_needed || app.tts_for_out_mnt_ref_voice_needed))
30
-                            text: qsTr("Voice samples")
31
+                            enabled: ((app.tts_ref_voice_needed || app.tts_ref_prompt_needed) && !_settings.translator_mode) ||
32
+                                     (_settings.translator_mode && (app.tts_for_in_mnt_ref_voice_needed || app.tts_for_out_mnt_ref_voice_needed ||
33
+                                                                    app.tts_for_in_mnt_ref_prompt_needed || app.tts_for_out_mnt_ref_prompt_needed))
34
+                            text: qsTr("Voice profiles")
35
                             shortcut: "Ctrl+V"
36
                             onTriggered: appWin.openDialog("VoiceMgmtPage.qml")
37
                         }
38
 
39
                         ToolTip.visible: hovered
40
                         ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
41
-                        ToolTip.text: qsTr("Voice samples") + " (Ctrl+V)"
42
+                        ToolTip.text: qsTr("Voice profiles") + " (Ctrl+V)"
43
                         hoverEnabled: true
44
-
45
-                        Dot {
46
-                            visible: app.available_tts_ref_voices.length === 0 && ((app.tts_ref_voice_needed && !_settings.translator_mode) ||
47
-                                                                                   (_settings.translator_mode && (app.tts_for_in_mnt_ref_voice_needed || app.tts_for_out_mnt_ref_voice_needed)))
48
-                            size: menuButton.height / 5
49
-                            anchors {
50
-                                right: voicesButton.right
51
-                                rightMargin: size / 2
52
-                                top: voicesButton.top
53
-                                topMargin: size / 2
54
-                            }
55
-                        }
56
                     }
57
 
58
                     ToolButton {
59
dsnote-4.7.1.tar.gz/desktop/qml/ModelFilteringWidget.qml -> dsnote-4.8.1.tar.gz/desktop/qml/ModelFilteringWidget.qml Changed
49
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -64,7 +64,12 @@
8
             case 8: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineTtsPiper; break
9
             case 9: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineTtsRhvoice; break
10
             case 10: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineTtsWhisperSpeech; break
11
-            case 11: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineOther; break
12
+            case 11: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineTtsParler; break
13
+            case 12: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineTtsF5; break
14
+            case 13: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineTtsKokoro; break
15
+            case 14: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineTtsSam; break
16
+            case 15: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineMnt; break
17
+            case 16: root.models_model.featureFilterFlags = ModelsListModel.FeatureEngineOther; break
18
             }
19
         } else if (speed_checkBox.checked) {
20
             switch(index) {
21
@@ -83,6 +88,7 @@
22
             case 0: root.models_model.featureFilterFlags = ModelsListModel.FeatureSttIntermediateResults; break
23
             case 1: root.models_model.featureFilterFlags = ModelsListModel.FeatureSttPunctuation; break
24
             case 2: root.models_model.featureFilterFlags = ModelsListModel.FeatureTtsVoiceCloning; break
25
+            case 3: root.models_model.featureFilterFlags = ModelsListModel.FeatureTtsPrompt; break
26
             }
27
         } else {
28
             root.models_model.featureFilterFlags = ModelsListModel.FeatureDefault
29
@@ -291,6 +297,11 @@
30
                     "Piper TTS",
31
                     "RHVoice TTS",
32
                     "WhisperSpeech TTS",
33
+                    "Parler-TTS",
34
+                    "F5-TTS",
35
+                    "Kokoro TTS",
36
+                    "SAM TTS",
37
+                    "Bergamot MT",
38
                     qsTr("Other")
39
                 
40
 
41
@@ -473,6 +484,7 @@
42
                     qsTr("Intermediate Results") + " STT",
43
                     qsTr("Punctuation") + " STT",
44
                     qsTr("Voice Cloning") + " TTS",
45
+                    qsTr("Voice Text Description") + " TTS",
46
 
47
                 
48
 
49
dsnote-4.7.1.tar.gz/desktop/qml/ModelInfoPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/ModelInfoPage.qml Changed
115
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -140,6 +140,14 @@
8
                         return "Coqui"
9
                     else if (f & ModelsListModel.FeatureEngineTtsMimic3)
10
                         return "Mimic3"
11
+                    else if (f & ModelsListModel.FeatureEngineTtsWhisperSpeech)
12
+                        return "WhisperSpeech"
13
+                    else if (f & ModelsListModel.FeatureEngineTtsParler)
14
+                        return "Parler-TTS"
15
+                    else if (f & ModelsListModel.FeatureEngineTtsF5)
16
+                        return "F5-TTS"
17
+                    else if (f & ModelsListModel.FeatureEngineTtsSam)
18
+                        return "S.A.M."
19
                     return ""
20
                 }
21
                 font.bold: true
22
@@ -162,10 +170,15 @@
23
                         if (f & ModelsListModel.FeatureHwOpenVino)
24
                             return "NVIDIA CUDA, AMD ROCm, Vulkan, OpenVINO, OpenCL"
25
                         return "NVIDIA CUDA, AMD ROCm, Vulkan, OpenCL"
26
-                    } else if (f & ModelsListModel.FeatureEngineSttFasterWhisper)
27
+                    }
28
+                    if (f & ModelsListModel.FeatureEngineSttFasterWhisper) {
29
                         return "NVIDIA CUDA"
30
-                    else if (f & ModelsListModel.FeatureEngineTtsCoqui)
31
+                    }
32
+                    if ((f & ModelsListModel.FeatureEngineTtsCoqui) ||
33
+                             (f & ModelsListModel.FeatureEngineTtsParler) ||
34
+                             (f & ModelsListModel.FeatureEngineTtsF5)) {
35
                         return "NVIDIA CUDA, AMD ROCm"
36
+                    }
37
                     return ""
38
                 }
39
                 font.bold: true
40
@@ -238,6 +251,8 @@
41
                         text += qsTr("Punctuation") + " · "
42
                     if (f & ModelsListModel.FeatureTtsVoiceCloning)
43
                         text += qsTr("Voice Cloning")
44
+                    if (f & ModelsListModel.FeatureTtsPrompt)
45
+                        text += qsTr("Voice Text Description")
46
 
47
                     if (text.length > 3 && texttext.length - 1 === ' ')
48
                         text = text.substring(0, text.length - 3)
49
@@ -250,6 +265,32 @@
50
             }
51
 
52
             Label {
53
+                visible: root.model.info.length !== 0
54
+                text: qsTr("Model card")
55
+                Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
56
+            }
57
+
58
+            RichLabel {
59
+                visible: root.model.info.length !== 0
60
+                text: "<a href='" + root.model.info + "'>" + root.model.info + "</a>"
61
+                font.bold: true
62
+                Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
63
+            }
64
+
65
+            Label {
66
+                visible: root.model.download_urls.length !== 0
67
+                text: qsTr("Total download size")
68
+                Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
69
+            }
70
+
71
+            Label {
72
+                visible: root.model.download_urls.length !== 0
73
+                text: root.model.download_size
74
+                font.bold: true
75
+                Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
76
+            }
77
+
78
+            Label {
79
                 visible: licenseLabel.visible
80
                 text: qsTr("License")
81
                 Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
82
@@ -275,16 +316,13 @@
83
             }
84
 
85
             Label {
86
-                visible: root.model.download_urls.length !== 0
87
-                text: qsTr("Total download size")
88
-                Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
89
-            }
90
-
91
-            Label {
92
-                visible: root.model.download_urls.length !== 0
93
-                text: root.model.download_size
94
-                font.bold: true
95
-                Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
96
+                Layout.columnSpan: 2
97
+                Layout.topMargin: appWin.padding
98
+                visible: root.model.score === 0
99
+                text: qsTr("This model is experimental and may not work well.")
100
+                font.italic: true
101
+                color: "red"
102
+                Layout.alignment: Qt.AlignVCenter
103
             }
104
 
105
             Label {
106
@@ -293,7 +331,7 @@
107
                 visible: root.model.download_urls.length === 0
108
                 text: qsTr("The model does not have any files to download.")
109
                 font.italic: true
110
-                Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
111
+                Layout.alignment: Qt.AlignVCenter
112
             }
113
         }
114
 
115
dsnote-4.7.1.tar.gz/desktop/qml/Notepad.qml -> dsnote-4.8.1.tar.gz/desktop/qml/Notepad.qml Changed
91
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -19,7 +19,7 @@
8
     property bool readOnly: false
9
     readonly property string placeholderText: qsTr("Neither Speech to Text nor Text to Speech model has been set up yet.") + " " +
10
                                               qsTr("Go to the %1 to download models for the languages you intend to use.")
11
-                                                .arg("<i>" + qsTr("Languages") + "</i>")
12
+                                                .arg("<i>" + qsTr("Languages and Models") + "</i>")
13
 
14
     Connections {
15
         target: app
16
@@ -123,6 +123,9 @@
17
     DuoComboButton {
18
         id: listenReadCombos
19
 
20
+        readonly property bool refVoiceNeeded: app.tts_ref_voice_needed && app.available_tts_ref_voice_names.length !== 0
21
+        readonly property bool refPromptNeeded: app.tts_ref_prompt_needed && _settings.tts_voice_prompts.length !== 0
22
+
23
         Layout.fillWidth: true
24
         verticalMode: width < appWin.height * (app.tts_ref_voice_needed ? 1.4 : 1.0)
25
         first {
26
@@ -174,14 +177,15 @@
27
         second {
28
             icon.name: "audio-speakers-symbolic"
29
             enabled: app.tts_configured && app.state === DsnoteApp.StateIdle
30
-            comboToolTip: app.tts_ref_voice_needed && app.available_tts_ref_voices.length === 0 ?
31
-                              qsTr("This model requires a voice sample.") + " " +
32
-                              qsTr("Create one in %1.").arg("<i>" + qsTr("Voice samples") + "</i>") : qsTr("Text to Speech model")
33
-            combo2ToolTip: qsTr("Voice sample")
34
+            comboToolTip: listenReadCombos.second.comboRedBorder ?
35
+                              qsTr("This model requires a voice profile.") + " " +
36
+                              qsTr("Create one in %1.").arg("<i>" + qsTr("Voice profiles") + "</i>") : qsTr("Text to Speech model")
37
+            combo2ToolTip: qsTr("Voice profile")
38
             combo3ToolTip: qsTr("Speech speed")
39
             comboPlaceholderText: qsTr("No Text to Speech model")
40
-            combo2PlaceholderText: qsTr("No voice sample")
41
-            comboRedBorder: app.tts_ref_voice_needed && app.available_tts_ref_voices.length === 0
42
+            combo2PlaceholderText: qsTr("No voice profile")
43
+            comboRedBorder: (app.tts_ref_voice_needed && app.available_tts_ref_voice_names.length === 0) ||
44
+                            (app.tts_ref_prompt_needed && _settings.tts_voice_prompts.length === 0)
45
             showSeparator: !listenReadCombos.verticalMode
46
             combo {
47
                 enabled: listenReadCombos.second.enabled &&
48
@@ -192,13 +196,21 @@
49
                 currentIndex: app.active_tts_model_idx
50
             }
51
             combo2 {
52
-                visible: app.tts_ref_voice_needed && app.available_tts_ref_voices.length !== 0
53
+                visible: listenReadCombos.refVoiceNeeded || listenReadCombos.refPromptNeeded
54
                 enabled: listenReadCombos.second.enabled &&
55
                          !listenReadCombos.second.off &&
56
                          app.state === DsnoteApp.StateIdle
57
-                model: app.available_tts_ref_voices
58
-                onActivated: app.set_active_tts_ref_voice_idx(index)
59
-                currentIndex: app.active_tts_ref_voice_idx
60
+                model: listenReadCombos.refVoiceNeeded ? app.available_tts_ref_voice_names :
61
+                                                         _settings.tts_voice_prompt_names
62
+                onActivated: {
63
+                    if (listenReadCombos.refVoiceNeeded)
64
+                        app.set_active_tts_ref_voice_idx(index)
65
+                    else
66
+                        _settings.tts_active_voice_prompt_idx = index
67
+                }
68
+                currentIndex: listenReadCombos.refVoiceNeeded ?
69
+                                  app.active_tts_ref_voice_idx :
70
+                                  _settings.tts_active_voice_prompt_idx
71
             }
72
             combo3 {
73
                 visible: true
74
@@ -237,11 +249,12 @@
75
             }
76
             buttonToolTip: qsTr("Read") + " (Ctrl+Alt+Shift+R)"
77
             button {
78
+                enabled: listenReadCombos.second.enabled &&
79
+                         !listenReadCombos.second.off &&
80
+                         app.note.length !== 0 &&
81
+                         (!app.tts_ref_voice_needed || app.available_tts_ref_voice_names.length !== 0) &&
82
+                         (!app.tts_ref_prompt_needed || _settings.tts_voice_prompts.length !== 0)
83
                 action: Action {
84
-                    enabled: listenReadCombos.second.enabled &&
85
-                             !listenReadCombos.second.off &&
86
-                             app.note.length !== 0 &&
87
-                             (!app.tts_ref_voice_needed || app.available_tts_ref_voices.length !== 0)
88
                     text: qsTr("Read")
89
                     shortcut: "Ctrl+Alt+Shift+R"
90
                     onTriggered: app.play_speech()
91
dsnote-4.7.1.tar.gz/desktop/qml/RuleEditPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/RuleEditPage.qml Changed
93
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2024-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -25,6 +25,8 @@
8
     readonly property string ruleReplace: rule ? rule4 : ""
9
     readonly property int ruleType: rule ? rule1 : Settings.TransRuleTypeReplaceSimple
10
     readonly property string ruleLangs: rule ? rule5 : ""
11
+    readonly property bool ruleCaseSensitive: rule ? rule0 & Settings.TransRuleCaseSensitive: false
12
+    readonly property string ruleTestText: (rule && rule.length > 6) ? rule6 : ""
13
     readonly property bool canSave: _patternForm.textField.text.length > 0
14
     readonly property int effectiveWidth: root.implicitWidth - root._leftMargin - root._rightMargin - appWin.padding
15
 
16
@@ -58,6 +60,13 @@
17
         else
18
             flags &= ~Settings.TransRuleTargetTts
19
 
20
+        if (caseSensitiveCheckBox.checked)
21
+            flags |= Settings.TransRuleCaseSensitive
22
+        else
23
+            flags &= ~Settings.TransRuleCaseSensitive
24
+
25
+        var test_text = _testTextArea.textArea1.text.trim()
26
+
27
         app.update_trans_rule(
28
                    /*index=*/root.ruleIndex,
29
                    /*flags=*/flags,
30
@@ -65,12 +74,20 @@
31
                    /*pattern=*/_patternForm.textField.text,
32
                    /*replace=*/_replaceForm.textField.text,
33
                    /*langs=*/langsCheckBox.checked ? "" : langsTextField.text.trim(),
34
-                   /*type=*/_typeForm.type)
35
+                   /*type=*/_typeForm.type,
36
+                   /*test_text=*/test_text)
37
         appWin.openDialog("RuleMgmtPage.qml")
38
     }
39
 
40
     function testRule() {
41
+        var flags = rule ? rule0 : 0
42
+        if (caseSensitiveCheckBox.checked)
43
+            flags |= Settings.TransRuleCaseSensitive
44
+        else
45
+            flags &= ~Settings.TransRuleCaseSensitive
46
+
47
         var result = app.test_trans_rule(
48
+                    /*flags=*/flags,
49
                     /*text=*/_testTextArea.textArea1.text,
50
                     /*pattern=*/_patternForm.textField.text,
51
                     /*replace=*/_replaceForm.textField.text,
52
@@ -163,12 +180,18 @@
53
 
54
         RowLayout {
55
             anchors {
56
+                left: parent.left
57
+                leftMargin: root.leftPadding + appWin.padding
58
                 right: parent.right
59
                 rightMargin: root.rightPadding + appWin.padding
60
                 bottom: parent.bottom
61
                 bottomMargin: root.bottomPadding
62
             }
63
 
64
+            Item {
65
+                Layout.fillWidth: true
66
+            }
67
+
68
             Button {
69
                 text: qsTr("Save")
70
                 enabled: root.canSave
71
@@ -215,7 +238,20 @@
72
                 color: _testTextArea.dimColor
73
             }
74
 
75
-            Component.onCompleted: _testTextArea.textArea1.text = app.trans_rules_test_text
76
+            Component.onCompleted: {
77
+                if (root.ruleTestText.length === 0)
78
+                    _testTextArea.textArea1.text = app.trans_rules_test_text
79
+                else
80
+                    _testTextArea.textArea1.text = root.ruleTestText
81
+            }
82
+        }
83
+
84
+        CheckBox {
85
+            id: caseSensitiveCheckBox
86
+
87
+            checked: root.ruleCaseSensitive
88
+            text: qsTr("Case sensitive")
89
+            onCheckedChanged: root.testRule()
90
         }
91
 
92
         ComboBoxForm {
93
dsnote-4.7.1.tar.gz/desktop/qml/RuleMgmtPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/RuleMgmtPage.qml Changed
31
 
1
@@ -15,6 +15,12 @@
2
     id: root
3
 
4
     readonly property bool verticalMode: width < appWin.height
5
+    readonly property real _rightMargin: (!root.mirrored && listViewExists && listViewStackItem.currentItem.ScrollBar.vertical.visible) ?
6
+                                             appWin.padding + listViewStackItem.currentItem.ScrollBar.vertical.width :
7
+                                             appWin.padding
8
+    readonly property real _leftMargin: (root.mirrored && listViewExists && listViewStackItem.currentItem.ScrollBar.vertical.visible) ?
9
+                                             appWin.padding + listViewStackItem.currentItem.ScrollBar.vertical.width :
10
+                                             appWin.padding
11
 
12
     title: qsTr("Rules")
13
 
14
@@ -36,7 +42,7 @@
15
 
16
     onOpened: {
17
         if ((_settings.hint_done_flags & Settings.HintDoneRules) == 0) {
18
-            helpDialog.open()
19
+            appWin.openPopup(helpDialog)
20
         }
21
     }
22
 
23
@@ -146,6 +152,7 @@
24
 
25
             width: root.listViewStackItem.currentItem.width
26
             height: deleteButton.height
27
+            leftPadding: root._leftMargin
28
 
29
             RowLayout {
30
                 anchors.verticalCenter: parent.verticalCenter
31
dsnote-4.7.1.tar.gz/desktop/qml/ScrollTextArea.qml -> dsnote-4.8.1.tar.gz/desktop/qml/ScrollTextArea.qml Changed
32
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -29,10 +29,12 @@
8
     property bool canReadAll: false
9
     property bool canTranslateSelected: false
10
     property bool canTranslateAll: false
11
-    readonly property bool _fitContent: scrollView.availableHeight - 4 * appWin.padding >= scrollView.contentHeight
12
-    readonly property bool _contextActive: _textFormatCombo.hovered || copyButton.hovered || clearButton.hovered ||
13
-                                           undoButton.hovered || redoButton.hovered || pasteButton.hovered ||
14
-                                           _fitContent
15
+    // readonly property bool _fitContent: scrollView.availableHeight - 4 * appWin.padding >= scrollView.contentHeight
16
+    // readonly property bool _contextActive: _textFormatCombo.hovered || copyButton.hovered || clearButton.hovered ||
17
+    //                                        undoButton.hovered || redoButton.hovered || pasteButton.hovered ||
18
+    //                                        _fitContent
19
+    readonly property bool _fitContent: true
20
+    readonly property bool _contextActive: true
21
     signal clearClicked()
22
     signal copyClicked()
23
     signal undoFallbackClicked()
24
@@ -77,6 +79,7 @@
25
             Component.onCompleted: cursorIndicator.update(-1)
26
             onTextChanged: cursorIndicator.update(cursorPosition)
27
             Accessible.name: root.name
28
+            bottomPadding: _textFormatCombo.height + 2 * appWin.padding
29
 
30
             Rectangle {
31
                 id: cursorIndicator
32
dsnote-4.7.1.tar.gz/desktop/qml/SettingsAccessebilityPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/SettingsAccessebilityPage.qml Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2024-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -17,8 +17,17 @@
8
 
9
     property bool verticalMode: parent ? parent.verticalMode : false
10
 
11
+    Component.onCompleted: {
12
+        app.update_feature_statuses()
13
+    }
14
+
15
+    BusyIndicator {
16
+        visible: app.busy
17
+        running: visible
18
+    }
19
+
20
     CheckBox {
21
-        visible: app.feature_global_shortcuts
22
+        visible: app.feature_hotkeys
23
         checked: _settings.hotkeys_enabled
24
         text: qsTranslate("SettingsPage", "Use global keyboard shortcuts")
25
         onCheckedChanged: {
26
@@ -30,203 +39,56 @@
27
         ToolTip.text: qsTranslate("SettingsPage", "Shortcuts allow you to start or stop listening and reading using keyboard.") + " " +
28
                       qsTranslate("SettingsPage", "Speech to Text result can be appended to the current note, inserted into any active window (currently in focus) or copied to the clipboard.") + " " +
29
                       qsTranslate("SettingsPage", "Text to Speech reading can be from current note or from text in the clipboard.") + " " +
30
-                      qsTranslate("SettingsPage", "Keyboard shortcuts function even when the application is not active (e.g. minimized or in the background).") + " " +
31
-                      qsTranslate("SettingsPage", "This feature only works under X11.")
32
+                      qsTranslate("SettingsPage", "Keyboard shortcuts function even when the application is not active (e.g. minimized or in the background).")
33
         hoverEnabled: true
34
     }
35
 
36
-    CheckBox {
37
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
38
-        checked: _settings.use_toggle_for_hotkey
39
-        text: qsTranslate("SettingsPage", "Toggle behavior")
40
-        onCheckedChanged: {
41
-            _settings.use_toggle_for_hotkey = checked
42
-        }
43
-        Layout.leftMargin: appWin.padding
44
-
45
-        ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
46
-        ToolTip.visible: hovered
47
-        ToolTip.text: qsTranslate("SettingsPage", "Start listening/reading shortcuts will also stop listening/reading if they are triggered while listening/reading is active.")
48
-        hoverEnabled: true
49
-    }
50
-
51
-    ShortcutForm {
52
-        indends: 1
53
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
54
-        label: qsTranslate("SettingsPage", "Start listening")
55
-        text: _settings.hotkey_start_listening
56
-        onTextChanged: _settings.hotkey_start_listening = text
57
-        onResetClicked: {
58
-            _settings.reset_hotkey_start_listening()
59
-            text = _settings.hotkey_start_listening
60
-        }
61
-    }
62
-
63
-    ShortcutForm {
64
-        indends: 1
65
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
66
-        label: qsTranslate("SettingsPage", "Start listening, always translate")
67
-        text: _settings.hotkey_start_listening_translate
68
-        onTextChanged: _settings.hotkey_start_listening_translate = text
69
-        onResetClicked: {
70
-            _settings.reset_hotkey_start_listening_translate()
71
-            text = _settings.hotkey_start_listening_translate
72
-        }
73
-    }
74
-
75
-    ShortcutForm {
76
-        indends: 1
77
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts && app.feature_text_active_window
78
-        label: qsTranslate("SettingsPage", "Start listening, text to active window")
79
-        text: _settings.hotkey_start_listening_active_window
80
-        onTextChanged: _settings.hotkey_start_listening_active_window = text
81
-        onResetClicked: {
82
-            _settings.reset_hotkey_start_listening_active_window()
83
-            text = _settings.hotkey_start_listening_active_window
84
-        }
85
-    }
86
+    Button {
87
+        id: gsConfButton
88
 
89
-    ShortcutForm {
90
-        indends: 1
91
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts && app.feature_text_active_window
92
-        label: qsTranslate("SettingsPage", "Start listening, always translate, text to active window")
93
-        text: _settings.hotkey_start_listening_translate_active_window
94
-        onTextChanged: _settings.hotkey_start_listening_translate_active_window = text
95
-        onResetClicked: {
96
-            _settings.reset_hotkey_start_listening_translate_active_window()
97
-            text = _settings.hotkey_start_listening_translate_active_window
98
-        }
99
-    }
100
-
101
-    ShortcutForm {
102
-        indends: 1
103
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
104
-        label: qsTranslate("SettingsPage", "Start listening, text to clipboard")
105
-        text: _settings.hotkey_start_listening_clipboard
106
-        onTextChanged: _settings.hotkey_start_listening_clipboard = text
107
-        onResetClicked: {
108
-            _settings.reset_hotkey_start_listening_clipboard()
109
-            text = _settings.hotkey_start_listening_clipboard
110
-        }
111
-    }
112
-
113
-    ShortcutForm {
114
-        indends: 1
115
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
116
-        label: qsTranslate("SettingsPage", "Start listening, always translate, text to clipboard")
117
-        text: _settings.hotkey_start_listening_translate_clipboard
118
-        onTextChanged: _settings.hotkey_start_listening_translate_clipboard = text
119
-        onResetClicked: {
120
-            _settings.reset_hotkey_start_listening_translate_clipboard()
121
-            text = _settings.hotkey_start_listening_translate_clipboard
122
-        }
123
-    }
124
-
125
-    ShortcutForm {
126
-        indends: 1
127
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
128
-        label: qsTranslate("SettingsPage", "Stop listening")
129
-        text: _settings.hotkey_stop_listening
130
-        onTextChanged: _settings.hotkey_stop_listening = text
131
-        onResetClicked: {
132
-            _settings.reset_hotkey_stop_listening()
133
-            text = _settings.hotkey_stop_listening
134
-        }
135
-    }
136
-
137
-    ShortcutForm {
138
-        indends: 1
139
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
140
-        label: qsTranslate("SettingsPage", "Start reading")
141
-        text: _settings.hotkey_start_reading
142
-        onTextChanged: _settings.hotkey_start_reading = text
143
-        onResetClicked: {
144
-            _settings.reset_hotkey_start_reading()
145
-            text = _settings.hotkey_start_reading
146
-        }
147
-    }
148
-
149
-    ShortcutForm {
150
-        indends: 1
151
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
152
-        label: qsTranslate("SettingsPage", "Start reading text from clipboard")
153
-        text: _settings.hotkey_start_reading_clipboard
154
-        onTextChanged: _settings.hotkey_start_reading_clipboard = text
155
-        onResetClicked: {
156
-            _settings.reset_hotkey_start_reading_clipboard()
157
-            text = _settings.hotkey_start_reading_clipboard
158
-        }
159
-    }
160
-
161
-    ShortcutForm {
162
-        indends: 1
163
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
164
-        label: qsTranslate("SettingsPage", "Pause/Resume reading")
165
-        text: _settings.hotkey_pause_resume_reading
166
-        onTextChanged: _settings.hotkey_pause_resume_reading = text
167
-        onResetClicked: {
168
-            _settings.reset_hotkey_pause_resume_reading()
169
-            text = _settings.hotkey_pause_resume_reading
170
+        visible: _settings.hotkeys_enabled && app.feature_hotkeys && (_settings.hotkeys_type === Settings.HotkeysTypeX11 || _settings.is_kde())
171
+        text: qsTranslate("SettingsPage", "Configure global keyboard shortcuts")
172
+        Layout.leftMargin: appWin.padding
173
+        onClicked: {
174
+            switch(_settings.hotkeys_type) {
175
+            case Settings.HotkeysTypeX11:
176
+                appWin.openPopup(hotkeysEditDialog)
177
+                break
178
+            case Settings.HotkeysTypePortal:
179
+                app.open_hotkeys_editor();
180
+                break
181
+            }
182
         }
183
     }
184
 
185
-    ShortcutForm {
186
+    TipMessage {
187
+        color: palette.text
188
         indends: 1
189
-        visible: _settings.hotkeys_enabled && app.feature_global_shortcuts
190
-        label: qsTranslate("SettingsPage", "Cancel")
191
-        text: _settings.hotkey_cancel
192
-        onTextChanged: _settings.hotkey_cancel = text
193
-        onResetClicked: {
194
-            _settings.reset_hotkey_cancel()
195
-            text = _settings.hotkey_cancel
196
-        }
197
+        visible: _settings.hotkeys_enabled && app.feature_hotkeys && !gsConfButton.visible
198
+        text: qsTranslate("SettingsPage", "Global keyboard shortcuts are managed through the %1.").arg("<i>XDG Desktop Portal</i>") + " " +
199
+              qsTranslate("SettingsPage", "Use your desktop environment configuration tool to change key bindings.")
200
     }
201
dsnote-4.7.1.tar.gz/desktop/qml/SettingsAdvancedPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/SettingsAdvancedPage.qml Changed
201
 
1
@@ -16,13 +16,9 @@
2
     id: root
3
 
4
     property bool verticalMode: parent ? parent.verticalMode : false
5
-    readonly property var features: app.features_availability()
6
 
7
-    Connections {
8
-        target: app
9
-        onFeatures_availability_updated: {
10
-            root.features = app.features_availability()
11
-        }
12
+    Component.onCompleted: {
13
+        app.update_feature_statuses()
14
     }
15
 
16
     SectionLabel {
17
@@ -41,7 +37,7 @@
18
         Repeater {
19
             id: featureRepeter
20
 
21
-            model: root.features
22
+            model: appWin.features
23
 
24
             RowLayout {
25
                 Layout.fillWidth: true
26
@@ -261,70 +257,118 @@
27
         text: qsTranslate("SettingsPage", "Libraries")
28
     }
29
 
30
-    CheckBox {
31
-        checked: _settings.py_feature_scan
32
-        text: qsTranslate("SettingsPage", "Use Python libriaries")
33
-        onCheckedChanged: {
34
-            _settings.py_feature_scan = checked
35
-        }
36
-
37
-        ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
38
-        ToolTip.visible: hovered
39
-        ToolTip.text: qsTranslate("SettingsPage", "Check the presence of the required Python libraries.") + " " +
40
-                      qsTranslate("SettingsPage", "Disable this option if you observe problems when launching the application.")
41
-        hoverEnabled: true
42
+    ComboBoxForm {
43
+        id: pyScanModeCombo
44
 
45
+        label.text: qsTranslate("SettingsPage", "Detection of Python libraries")
46
+        toolTip: qsTranslate("SettingsPage", "Determine how and whether Python libraries are detected when the application is launched.")
47
+        comboBox {
48
+            currentIndex: {
49
+                if (_settings.py_scan_mode === Settings.PyScanOn) return 0
50
+                if (_settings.py_scan_mode === Settings.PyScanOffAllEnabled) return 1
51
+                if (_settings.py_scan_mode === Settings.PyScanOffAllDisabled) return 2
52
+                return _settings.is_xcb() ? 1 : 2
53
+            }
54
+            model: 
55
+                qsTranslate("SettingsPage", "On"),
56
+                qsTranslate("SettingsPage", "Off (Assume all are available)"),
57
+                qsTranslate("SettingsPage", "Off (Assume none are available)"),
58
+            
59
+            onActivated: {
60
+                if (index === 0) {
61
+                    _settings.py_scan_mode = Settings.PyScanOn
62
+                } else if (index === 1) {
63
+                    _settings.py_scan_mode = Settings.PyScanOffAllEnabled
64
+                } else if (index === 2) {
65
+                    _settings.py_scan_mode = Settings.PyScanOffAllDisabled
66
+                } else {
67
+                    _settings.py_scan_mode = Settings.PyScanOn;
68
+                }
69
+            }
70
+        }
71
     }
72
 
73
     TextFieldForm {
74
         id: pyTextField
75
 
76
         indends: 1
77
-        visible: _settings.py_feature_scan && !_settings.is_flatpak()
78
-        label.text: qsTranslate("SettingsPage", "Location of Python libraries")
79
-        toolTip: qsTranslate("SettingsPage", "Python libraries directory (%1).").arg("<i>PYTHONPATH</i>") + " " + qsTranslate("SettingsPage", "Leave blank to use the default value.") + " " +
80
-                 qsTranslate("SettingsPage", "This option may be useful if you use %1 module to manage Python libraries.").arg("<i>venv</i>")
81
+        visible: _settings.py_scan_mode === Settings.PyScanOn || _settings.py_scan_mode === Settings.PyScanOffAllEnabled
82
+        label.text: qsTranslate("SettingsPage", "Location of Python libraries (version: %1)").arg(app.py_version.length === 0 ? "0.0.0" : app.py_version)
83
+        toolTip: qsTranslate("SettingsPage", "Python libraries directory (%1).").arg("<i>PYTHONPATH</i>") + " " +
84
+                 qsTranslate("SettingsPage", "Leave blank to use the default value.") + " " +
85
+                 (_settings.is_flatpak() ?
86
+                      qsTranslate("SettingsPage", "Make sure that the Flatpak application has permissions to access the directory.") :
87
+                      qsTranslate("SettingsPage", "This option may be useful if you use %1 module to manage Python libraries.").arg("<i>venv</i>"))
88
         textField {
89
             text: _settings.py_path
90
+            onTextChanged: _settings.py_path = pyTextField.textField.text
91
             placeholderText: qsTranslate("SettingsPage", "Leave blank to use the default value.")
92
         }
93
-        button {
94
-            text: qsTranslate("SettingsPage", "Save")
95
-            onClicked: _settings.py_path = pyTextField.textField.text
96
-        }
97
+    }
98
+
99
+    function setScanFlags() {
100
+        var flags = Settings.ScanFlagNone
101
+        if (scanFlagTorchCheckbox.checked) flags |= Settings.ScanFlagNoTorchCuda
102
+        if (scanFlagCt2Checkbox.checked) flags |= Settings.ScanFlagNoCt2Cuda
103
+        _settings.scan_flags = flags
104
+    }
105
+
106
+    CheckBox {
107
+        id: scanFlagTorchCheckbox
108
+
109
+        checked: _settings.scan_flags & Settings.ScanFlagNoTorchCuda
110
+        text: qsTranslate("SettingsPage", "Disable detection of PyTorch")
111
+        onCheckedChanged: setScanFlags()
112
+    }
113
+
114
+    CheckBox {
115
+        id: scanFlagCt2Checkbox
116
+
117
+        checked: _settings.scan_flags & Settings.ScanFlagNoCt2Cuda
118
+        text: qsTranslate("SettingsPage", "Disable detection of CTranslate2")
119
+        onCheckedChanged: setScanFlags()
120
     }
121
 
122
     SectionLabel {
123
-        visible: _settings.is_xcb()
124
-        text: "X11"
125
+        visible: app.feature_fake_keyboard || ydoMessage.visible
126
+        text: qsTranslate("SettingsPage", "Insert into active window")
127
     }
128
 
129
     ComboBoxForm {
130
-        visible: _settings.is_xcb()
131
+        id: fakeKeyboardCombo
132
+
133
+        visible: app.feature_fake_keyboard && _settings.is_xcb()
134
         label.text: qsTranslate("SettingsPage", "Keystroke sending method")
135
-        toolTip: qsTranslate("SettingsPage", "Simulated keystroke sending method used in %1.").arg("<i>" + qsTranslate("SettingsPage", "Insert into active window") + "</i>")
136
+        toolTip: qsTranslate("SettingsPage", "Simulated keystroke sending method used in %1.")
137
+                    .arg("<i>" + qsTranslate("SettingsPage", "Insert into active window") + "</i>")
138
         comboBox {
139
             currentIndex: {
140
                 if (_settings.fake_keyboard_type === Settings.FakeKeyboardTypeLegacy) return 0
141
                 if (_settings.fake_keyboard_type === Settings.FakeKeyboardTypeXdo) return 1
142
-                return 1
143
+                if (_settings.fake_keyboard_type === Settings.FakeKeyboardTypeYdo) return 2
144
+                return _settings.is_xcb() ? 1 : 2
145
             }
146
             model: 
147
                 qsTranslate("SettingsPage", "Legacy"),
148
-                "XDO"
149
+                "XDO",
150
+                "YDO"
151
             
152
             onActivated: {
153
                 if (index === 0) {
154
                     _settings.fake_keyboard_type = Settings.FakeKeyboardTypeLegacy
155
-                } else {
156
+                } else if (index === 1) {
157
                     _settings.fake_keyboard_type = Settings.FakeKeyboardTypeXdo
158
+                } else if (index === 2) {
159
+                    _settings.fake_keyboard_type = Settings.FakeKeyboardTypeYdo
160
+                } else {
161
+                    _settings.fake_keyboard_type = _settings.is_xcb() ? Settings.FakeKeyboardTypeXdo : Settings.FakeKeyboardTypeYdo;
162
                 }
163
             }
164
         }
165
     }
166
 
167
     SpinBoxForm {
168
-        visible: _settings.is_xcb() && _settings.fake_keyboard_type === Settings.FakeKeyboardTypeLegacy
169
+        visible: app.feature_fake_keyboard
170
         label.text: qsTranslate("SettingsPage", "Keystroke delay")
171
         toolTip: qsTranslate("SettingsPage", "The delay between simulated keystrokes used in %1.").arg("<i>" + qsTranslate("SettingsPage", "Insert into active window") + "</i>")
172
         spinBox {
173
@@ -339,13 +383,76 @@
174
     }
175
 
176
     TextFieldForm {
177
-        visible: _settings.is_xcb() && _settings.fake_keyboard_type === Settings.FakeKeyboardTypeLegacy
178
+        visible: app.feature_fake_keyboard && _settings.fake_keyboard_type !== Settings.FakeKeyboardTypeXdo
179
         label.text: qsTranslate("SettingsPage", "Compose file")
180
         toolTip: qsTranslate("SettingsPage", "X11 compose file used in %1.").arg("<i>" + qsTranslate("SettingsPage", "Insert into active window") + "</i>") + " " +
181
-                 qsTranslate("SettingsPage", "Leave blank to use the default value.")
182
+                 qsTranslate("SettingsPage", "Leave blank to use the default value.") +
183
+                 (_settings.is_flatpak() ?
184
+                      (" " + qsTranslate("SettingsPage", "Make sure that the Flatpak application has permissions to access the directory.")) :
185
+                      "")
186
         textField {
187
             text: _settings.x11_compose_file
188
             onTextChanged: _settings.x11_compose_file = text
189
+            placeholderText: qsTranslate("SettingsPage", "Leave blank to use the default value.")
190
+        }
191
+    }
192
+
193
+    TextFieldForm {
194
+        visible: app.feature_fake_keyboard && _settings.fake_keyboard_type === Settings.FakeKeyboardTypeYdo
195
+        label.text: qsTranslate("SettingsPage", "Keyboard layout")
196
+        toolTip: qsTranslate("SettingsPage", "Keyboard layout used in %1.").arg("<i>" + qsTranslate("SettingsPage", "Insert into active window") + "</i>") + " " +
197
+                 qsTranslate("SettingsPage", "Leave blank to use the default value.")
198
+        textField {
199
+            text: _settings.fake_keyboard_layout
200
+            onTextChanged: _settings.fake_keyboard_layout = text
201
dsnote-4.7.1.tar.gz/desktop/qml/SettingsGeneralPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/SettingsGeneralPage.qml Changed
13
 
1
@@ -163,7 +163,10 @@
2
 
3
     TextFieldForm {
4
         label.text: qsTranslate("SettingsPage", "Location of language files")
5
-        toolTip: qsTranslate("SettingsPage", "Directory where language files are downloaded to and stored.")
6
+        toolTip: qsTranslate("SettingsPage", "Directory where language files are downloaded to and stored.") +
7
+                 (_settings.is_flatpak() ?
8
+                      (" " + qsTranslate("SettingsPage", "Make sure that the Flatpak application has permissions to access the directory.")) :
9
+                      "")
10
         textField {
11
             text: _settings.models_dir
12
             readOnly: true
13
dsnote-4.7.1.tar.gz/desktop/qml/SettingsPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/SettingsPage.qml Changed
21
 
1
@@ -28,6 +28,10 @@
2
         color: "red"
3
     }
4
 
5
+    LayoutFixer {
6
+        id: fixer
7
+    }
8
+
9
     TabBar {
10
         id: bar
11
 
12
@@ -126,6 +130,8 @@
13
                 replace("SettingsAdvancedPage.qml")
14
                 break
15
             }
16
+
17
+            fixer.fix()
18
         }
19
 
20
         Component.onCompleted: {
21
dsnote-4.7.1.tar.gz/desktop/qml/SettingsSttPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/SettingsSttPage.qml Changed
69
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2024-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -113,6 +113,49 @@
8
     }
9
 
10
     CheckBox {
11
+        checked: _settings.stt_use_note_as_prompt
12
+        text: qsTranslate("SettingsPage", "Use note as context")
13
+        onCheckedChanged: {
14
+            _settings.stt_use_note_as_prompt = checked
15
+        }
16
+
17
+        ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
18
+        ToolTip.visible: hovered
19
+        ToolTip.text: qsTranslate("SettingsPage", "Use an existing note as the initial context in decoding.") + " " +
20
+                      qsTranslate("SettingsPage", "This option only works with %1 and %2 models.").arg("<i>WhisperCpp</i>").arg("<i>FasterWhisper</i>")
21
+        hoverEnabled: true
22
+    }
23
+
24
+    CheckBox {
25
+        checked: _settings.stt_clear_mic_audio_when_decoding
26
+        text: qsTranslate("SettingsPage", "Pause listening while processing")
27
+        onCheckedChanged: {
28
+            _settings.stt_clear_mic_audio_when_decoding = checked
29
+        }
30
+
31
+        ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
32
+        ToolTip.visible: hovered
33
+        ToolTip.text: qsTranslate("SettingsPage", "Temporarily pause listening for the duration of audio processing.") + " " +
34
+                      qsTranslate("SettingsPage", "This option can be useful when %1 is %2.")
35
+                        .arg("<i>" + qsTranslate("SettingsPage", "Listening mode") + "</i>")
36
+                        .arg("<i>" + qsTranslate("SettingsPage", "Always on") + "</i>")
37
+        hoverEnabled: true
38
+    }
39
+
40
+    CheckBox {
41
+        checked: _settings.stt_play_beep
42
+        text: qsTranslate("SettingsPage", "Play tone when starting and stopping listening")
43
+        onCheckedChanged: {
44
+            _settings.stt_play_beep = checked
45
+        }
46
+
47
+        ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
48
+        ToolTip.visible: hovered
49
+        ToolTip.text: qsTranslate("SettingsPage", "Play an audible tone when starting and stopping listening.")
50
+        hoverEnabled: true
51
+    }
52
+
53
+    CheckBox {
54
         checked: _settings.stt_insert_stats
55
         text: qsTranslate("SettingsPage", "Insert statistics")
56
         onCheckedChanged: {
57
@@ -188,6 +231,11 @@
58
         }
59
     }
60
 
61
+    BusyIndicator {
62
+        visible: app.busy && !sttEnginesBar.visible
63
+        running: visible
64
+    }
65
+
66
     SectionLabel {
67
         text: qsTranslate("SettingsPage", "Engine options")
68
         visible: sttEnginesBar.visible
69
dsnote-4.7.1.tar.gz/desktop/qml/SettingsTtsPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/SettingsTtsPage.qml Changed
164
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2024-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -68,6 +68,21 @@
8
     }
9
 
10
     CheckBox {
11
+        checked: _settings.tts_normalize_audio
12
+        text: qsTranslate("SettingsPage", "Normalize audio")
13
+        onCheckedChanged: {
14
+            _settings.tts_normalize_audio = checked
15
+        }
16
+
17
+        ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
18
+        ToolTip.visible: hovered
19
+        ToolTip.text: qsTranslate("SettingsPage", "The volume of the audio will be normalized.") + " " +
20
+                      qsTranslate("SettingsPage", "The volume is normalized independently for each sentence, which can lead to unstable volume levels in different sentences.") + " " +
21
+                      qsTranslate("SettingsPage", "Disable this option if you observe this problem.")
22
+        hoverEnabled: true
23
+    }
24
+
25
+    CheckBox {
26
         checked: _settings.tts_tag_mode === Settings.TtsTagModeSupport
27
         text: qsTranslate("SettingsPage", "Use control tags")
28
         onCheckedChanged: {
29
@@ -144,6 +159,11 @@
30
         text: qsTranslate("SettingsPage", "When SRT Subtitles text format is set, changing the speech speed is disabled because the speed will be adjusted automatically.")
31
     }
32
 
33
+    BusyIndicator {
34
+        visible: app.busy && !ttsEnginesBar.visible
35
+        running: visible
36
+    }
37
+
38
     SectionLabel {
39
         text: qsTranslate("SettingsPage", "Engine options")
40
         visible: ttsEnginesBar.visible
41
@@ -153,12 +173,37 @@
42
         id: ttsEnginesBar
43
 
44
         Layout.fillWidth: true
45
-        currentIndex: !(app.feature_coqui_tts && app.feature_coqui_gpu) ? 1 :
46
-                      !(app.feature_whisperspeech_tts && app.feature_whisperspeech_gpu) ? 0 :
47
-                      _settings.settings_tts_engine_idx
48
+        currentIndex: {
49
+            var idx = _settings.settings_tts_engine_idx
50
+            var coqui_enable = app.feature_coqui_tts && app.feature_coqui_gpu;
51
+            var parler_enable = app.feature_parler_tts && app.feature_parler_gpu
52
+            var f5_enable = app.feature_f5_tts && app.feature_f5_gpu
53
+            var kokoro_enable = app.feature_kokoro_tts && app.feature_kokoro_gpu
54
+            var whisperspeech_enable = app.feature_whisperspeech_tts && app.feature_whisperspeech_gpu
55
+
56
+            // set idx if engine enabled
57
+            if (idx === 0 && coqui_enable) return idx
58
+            if (idx === 1 && parler_enable) return idx
59
+            if (idx === 2 && f5_enable) return idx
60
+            if (idx === 3 && kokoro_enable) return idx
61
+            if (idx === 4 && whisperspeech_enable) return idx
62
+
63
+            // set default
64
+            if (coqui_enable) return 0
65
+            if (parler_enable) return 1
66
+            if (f5_enable) return 2
67
+            if (kokoro_enable) return 3
68
+            if (whisperspeech_enable) return 4
69
+
70
+            return 0
71
+        }
72
+
73
         onCurrentIndexChanged: _settings.settings_tts_engine_idx = currentIndex
74
         visible: (app.feature_coqui_tts && app.feature_coqui_gpu) ||
75
-                 (app.feature_whisperspeech_tts && app.feature_whisperspeech_gpu)
76
+                 (app.feature_whisperspeech_tts && app.feature_whisperspeech_gpu) ||
77
+                 (app.feature_parler_tts && app.feature_parler_gpu) ||
78
+                 (app.feature_f5_tts && app.feature_f5_gpu) ||
79
+                 (app.feature_kokoro_tts && app.feature_kokoro_gpu)
80
 
81
         TabButton {
82
             text: "Coqui"
83
@@ -167,6 +212,24 @@
84
         }
85
 
86
         TabButton {
87
+            text: "Parler-TTS"
88
+            enabled: app.feature_parler_tts && app.feature_parler_gpu
89
+            width: implicitWidth
90
+        }
91
+
92
+        TabButton {
93
+            text: "F5-TTS"
94
+            enabled: app.feature_f5_tts && app.feature_f5_gpu
95
+            width: implicitWidth
96
+        }
97
+
98
+        TabButton {
99
+            text: "Kokoro"
100
+            enabled: app.feature_kokoro_tts && app.feature_kokoro_gpu
101
+            width: implicitWidth
102
+        }
103
+
104
+        TabButton {
105
             text: "WhisperSpeech"
106
             enabled: app.feature_whisperspeech_tts && app.feature_whisperspeech_gpu
107
             width: implicitWidth
108
@@ -192,12 +255,55 @@
109
                 devices: _settings.coqui_gpu_devices
110
                 device_index: _settings.coqui_gpu_device_idx
111
                 use_gpu: _settings.coqui_use_gpu
112
+                show_rocm_warning: true
113
                 onUse_gpuChanged: _settings.coqui_use_gpu = use_gpu
114
                 onDevice_indexChanged: _settings.coqui_gpu_device_idx = device_index
115
             }
116
         }
117
 
118
         ColumnLayout {
119
+            id: parlerTab
120
+
121
+            visible: app.feature_parler_tts && app.feature_parler_gpu
122
+
123
+            GpuComboBox {
124
+                devices: _settings.parler_gpu_devices
125
+                device_index: _settings.parler_gpu_device_idx
126
+                use_gpu: _settings.parler_use_gpu
127
+                onUse_gpuChanged: _settings.parler_use_gpu = use_gpu
128
+                onDevice_indexChanged: _settings.parler_gpu_device_idx = device_index
129
+            }
130
+        }
131
+
132
+        ColumnLayout {
133
+            id: f5Tab
134
+
135
+            visible: app.feature_f5_tts && app.feature_f5_gpu
136
+
137
+            GpuComboBox {
138
+                devices: _settings.f5_gpu_devices
139
+                device_index: _settings.f5_gpu_device_idx
140
+                use_gpu: _settings.f5_use_gpu
141
+                onUse_gpuChanged: _settings.f5_use_gpu = use_gpu
142
+                onDevice_indexChanged: _settings.f5_gpu_device_idx = device_index
143
+            }
144
+        }
145
+
146
+        ColumnLayout {
147
+            id: kokoroTab
148
+
149
+            visible: app.feature_kokoro_tts && app.feature_kokoro_gpu
150
+
151
+            GpuComboBox {
152
+                devices: _settings.kokoro_gpu_devices
153
+                device_index: _settings.kokoro_gpu_device_idx
154
+                use_gpu: _settings.kokoro_use_gpu
155
+                onUse_gpuChanged: _settings.kokoro_use_gpu = use_gpu
156
+                onDevice_indexChanged: _settings.kokoro_gpu_device_idx = device_index
157
+            }
158
+        }
159
+
160
+        ColumnLayout {
161
             id: whisperspeechTab
162
 
163
             visible: app.feature_whisperspeech_tts && app.feature_whisperspeech_gpu
164
dsnote-4.7.1.tar.gz/desktop/qml/ShortcutForm.qml -> dsnote-4.8.1.tar.gz/desktop/qml/ShortcutForm.qml Changed
52
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2024-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -21,27 +21,27 @@
8
     property alias text: _textField.text
9
     property bool compact: true
10
     property bool scanning: false
11
+    property int psize: 500
12
+
13
     signal resetClicked()
14
 
15
-    columns: verticalMode ? 1 : 4
16
+    columns: verticalMode ? 1 : 3
17
     columnSpacing: appWin.padding
18
     rowSpacing: appWin.padding
19
-    Layout.fillWidth: true
20
 
21
     Label {
22
         id: _label
23
 
24
-        Layout.fillWidth: true
25
-        Layout.leftMargin: root.indends * appWin.padding
26
+        Layout.preferredWidth: root.verticalMode ? psize * 2 : psize
27
     }
28
 
29
     TextField {
30
         id: _textField
31
 
32
         enabled: !root.scanning
33
-        Layout.fillWidth: root.verticalMode
34
-        Layout.preferredWidth: root.verticalMode ? 0 : ((parent.width / 2) - (_scanButton.width + _resetButton.width + 2 * root.columnSpacing))
35
-        Layout.leftMargin: root.verticalMode ? (root.indends + 1) * appWin.padding : 0
36
+        Layout.preferredWidth: (root.verticalMode ? psize * 2 : (psize - (_scanButton.width + _resetButton.width + 2 * root.columnSpacing))) - 3 * appWin.padding
37
+        Layout.leftMargin: root.verticalMode ? appWin.padding : 0
38
+        Layout.rightMargin: root.verticalMode ? 3 * appWin.padding : 0
39
         color: palette.text
40
 
41
         TextContextMenu {}
42
@@ -50,7 +50,8 @@
43
     RowLayout {
44
         id: buttonRow
45
 
46
-        Layout.leftMargin: root.verticalMode ? (root.indends + 1) * appWin.padding : 0
47
+        Layout.leftMargin: root.verticalMode ? appWin.padding : 0
48
+        Layout.rightMargin: root.verticalMode ? 0 : 3 * appWin.padding
49
 
50
         Button {
51
             id: _scanButton
52
dsnote-4.7.1.tar.gz/desktop/qml/ToastNotification.qml -> dsnote-4.8.1.tar.gz/desktop/qml/ToastNotification.qml Changed
31
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -14,10 +14,22 @@
8
     delay: 0
9
     anchors.centerIn: parent
10
 
11
+    function invertColor(color) {
12
+        var r = 1 - color.r
13
+        var g = 1 - color.g
14
+        var b = 1 - color.b
15
+        return Qt.rgba(r, g, b, color.a)
16
+    }
17
+
18
+    Component.onCompleted: {
19
+        if (background && background.color)
20
+            contentItem.color = invertColor(background.color)
21
+    }
22
+
23
     contentItem: Label {
24
         text: root.text
25
         font: root.font
26
-        //color: root.palette.text
27
+        color: palette.toolTipText
28
         wrapMode: Text.Wrap
29
         horizontalAlignment: Text.AlignHCenter
30
     }
31
dsnote-4.7.1.tar.gz/desktop/qml/Translator.qml -> dsnote-4.8.1.tar.gz/desktop/qml/Translator.qml Changed
169
 
1
@@ -24,7 +24,7 @@
2
                                                   mntOutCombo.first.combo.implicitWidth)
3
     readonly property string placeholderText: qsTr("Translator model has not been set up yet.") + " " +
4
                                               qsTr("Go to the %1 to download models for the languages you intend to use.")
5
-                                                .arg("<i>" + qsTr("Languages") + "</i>")
6
+                                                .arg("<i>" + qsTr("Languages and Models") + "</i>")
7
     readonly property alias verticalMode: grid.verticalMode
8
 
9
     Connections {
10
@@ -164,6 +164,9 @@
11
             DuoComboButton {
12
                 id: mntInCombo
13
 
14
+                readonly property bool refVoiceNeeded: app.tts_for_in_mnt_ref_voice_needed && app.available_tts_ref_voice_names.length !== 0
15
+                readonly property bool refPromptNeeded: app.tts_for_in_mnt_ref_prompt_needed && _settings.tts_voice_prompts.length !== 0
16
+
17
                 Layout.fillWidth: true
18
                 verticalMode: width < appWin.height
19
                 first {
20
@@ -186,15 +189,16 @@
21
                 second {
22
                     icon.name: "audio-speakers-symbolic"
23
                     enabled: app.mnt_configured && app.tts_configured && app.state === DsnoteApp.StateIdle
24
-                    comboToolTip: app.tts_for_in_mnt_ref_voice_needed && app.available_tts_ref_voices.length === 0 ?
25
-                                      qsTr("This model requires a voice sample.") + " " +
26
-                                      qsTr("Create one in %1.").arg("<i>" + qsTr("Voice samples") + "</i>") :
27
+                    comboToolTip: mntInCombo.second.combo2RedBorder ?
28
+                                      qsTr("This model requires a voice profile.") + " " +
29
+                                      qsTr("Create one in %1.").arg("<i>" + qsTr("Voice profiles") + "</i>") :
30
                                       qsTr("Text to Speech model for language to translate from.")
31
                     comboPlaceholderText: qsTr("No Text to Speech model")
32
-                    combo2PlaceholderText: qsTr("No voice sample")
33
-                    combo2ToolTip: qsTr("Voice sample")
34
+                    combo2PlaceholderText: qsTr("No voice profile")
35
+                    combo2ToolTip: qsTr("Voice profile")
36
                     comboFillWidth: true
37
-                    comboRedBorder: !mntInCombo.second.off && app.tts_for_in_mnt_ref_voice_needed && app.available_tts_ref_voices.length === 0
38
+                    comboRedBorder: !mntInCombo.second.off && ((app.tts_for_in_mnt_ref_voice_needed && app.available_tts_ref_voice_names.length === 0) ||
39
+                                                               (app.tts_for_in_mnt_ref_prompt_needed && _settings.tts_voice_prompts.length === 0))
40
                     showSeparator: !mntInCombo.verticalMode
41
                     combo {
42
                         model: app.available_tts_models_for_in_mnt
43
@@ -205,24 +209,34 @@
44
                         currentIndex: app.active_tts_model_for_in_mnt_idx
45
                     }
46
                     combo2 {
47
-                        visible: app.tts_for_in_mnt_ref_voice_needed && app.available_tts_ref_voices.length !== 0
48
+                        visible: mntInCombo.refVoiceNeeded || mntInCombo.refPromptNeeded
49
                         enabled: mntInCombo.second.enabled &&
50
                                  !mntInCombo.second.off &&
51
                                  app.state === DsnoteApp.StateIdle
52
-                        model: app.available_tts_ref_voices
53
-                        onActivated: app.set_active_tts_for_in_mnt_ref_voice_idx(index)
54
-                        currentIndex: app.active_tts_for_in_mnt_ref_voice_idx
55
+                        model: mntInCombo.refVoiceNeeded ? app.available_tts_ref_voice_names :
56
+                                                           _settings.tts_voice_prompt_names
57
+                        onActivated: {
58
+                            if (mntInCombo.refVoiceNeeded)
59
+                                app.set_active_tts_for_in_mnt_ref_voice_idx(index)
60
+                            else
61
+                                _settings.tts_active_voice_prompt_for_in_mnt_idx = index
62
+                        }
63
+                        currentIndex:
64
+                            mntInCombo.refVoiceNeeded ?
65
+                                app.active_tts_for_in_mnt_ref_voice_idx :
66
+                                _settings.tts_active_voice_prompt_for_in_mnt_idx
67
                     }
68
                     frame {
69
                         leftPadding: appWin.padding
70
                         rightPadding: grid.verticalMode ? appWin.padding : 0
71
                     }
72
                     button {
73
+                        enabled: mntInCombo.second.enabled &&
74
+                                 !mntInCombo.second.off &&
75
+                                 app.note.length !== 0 &&
76
+                                 (!app.tts_for_in_mnt_ref_voice_needed || app.available_tts_ref_voice_names.length !== 0) &&
77
+                                 (!app.tts_for_in_mnt_ref_prompt_needed || _settings.tts_voice_prompts.length !== 0)
78
                         action: Action {
79
-                            enabled: mntInCombo.second.enabled &&
80
-                                     !mntInCombo.second.off &&
81
-                                     app.note.length !== 0 &&
82
-                                     (!app.tts_for_in_mnt_ref_voice_needed || app.available_tts_ref_voices.length !== 0)
83
                             text: qsTr("Read")
84
                             onTriggered: app.play_speech_translator(false)
85
                         }
86
@@ -342,6 +356,9 @@
87
             DuoComboButton {
88
                 id: mntOutCombo
89
 
90
+                readonly property bool refVoiceNeeded: app.tts_for_out_mnt_ref_voice_needed && app.available_tts_ref_voice_names.length !== 0
91
+                readonly property bool refPromptNeeded: app.tts_for_out_mnt_ref_prompt_needed && _settings.tts_voice_prompts.length !== 0
92
+
93
                 Layout.fillWidth: true
94
                 verticalMode: width < appWin.height
95
                 first {
96
@@ -364,32 +381,42 @@
97
                     icon.name: "audio-speakers-symbolic"
98
                     enabled: app.mnt_configured && app.tts_configured &&
99
                              app.state === DsnoteApp.StateIdle
100
-                    comboToolTip: app.tts_for_out_mnt_ref_voice_needed && app.available_tts_ref_voices.length === 0 ?
101
-                                      qsTr("This model requires a voice sample.") + " " +
102
-                                      qsTr("Create one in %1 menu").arg("<i>" + qsTr("Voice samples") + "</i>") :
103
+                    comboToolTip: mntOutCombo.second.combo2RedBorder ?
104
+                                      qsTr("This model requires a voice profile.") + " " +
105
+                                      qsTr("Create one in %1 menu").arg("<i>" + qsTr("Voice profiles") + "</i>") :
106
                                       qsTr("Text to Speech model for language to translate into.")
107
                     comboPlaceholderText: qsTr("No Text to Speech model")
108
-                    combo2PlaceholderText: qsTr("No voice sample")
109
-                    combo2ToolTip: qsTr("Voice sample")
110
+                    combo2PlaceholderText: qsTr("No voice profile")
111
+                    combo2ToolTip: qsTr("Voice profile")
112
                     comboFillWidth: true
113
-                    comboRedBorder: !mntOutCombo.second.off && app.tts_for_out_mnt_ref_voice_needed && app.available_tts_ref_voices.length === 0
114
+                    comboRedBorder: !mntOutCombo.second.off && ((app.tts_for_out_mnt_ref_voice_needed && app.available_tts_ref_voice_names.length === 0) ||
115
+                                                               (app.tts_for_out_mnt_ref_prompt_needed && _settings.tts_voice_prompts.length === 0))
116
                     showSeparator: !mntOutCombo.verticalMode
117
                     combo {
118
+                        model: app.available_tts_models_for_out_mnt
119
                         enabled: mntOutCombo.second.enabled &&
120
                                  !mntOutCombo.second.off &&
121
                                  app.state === DsnoteApp.StateIdle
122
-                        model: app.available_tts_models_for_out_mnt
123
                         onActivated: app.set_active_tts_model_for_out_mnt_idx(index)
124
                         currentIndex: app.active_tts_model_for_out_mnt_idx
125
                     }
126
                     combo2 {
127
-                        visible: app.tts_for_out_mnt_ref_voice_needed && app.available_tts_ref_voices.length !== 0
128
+                        visible: mntOutCombo.refVoiceNeeded || mntOutCombo.refPromptNeeded
129
                         enabled: mntOutCombo.second.enabled &&
130
                                  !mntOutCombo.second.off &&
131
                                  app.state === DsnoteApp.StateIdle
132
-                        model: app.available_tts_ref_voices
133
-                        onActivated: app.set_active_tts_for_out_mnt_ref_voice_idx(index)
134
-                        currentIndex: app.active_tts_for_out_mnt_ref_voice_idx
135
+                        model: mntOutCombo.refVoiceNeeded ? app.available_tts_ref_voice_names :
136
+                                                           _settings.tts_voice_prompt_names
137
+                        onActivated: {
138
+                            if (mntOutCombo.refVoiceNeeded)
139
+                                app.set_active_tts_for_out_mnt_ref_voice_idx(index)
140
+                            else
141
+                                _settings.tts_active_voice_prompt_for_out_mnt_idx = index
142
+                        }
143
+                        currentIndex:
144
+                            mntOutCombo.refVoiceNeeded ?
145
+                                app.active_tts_for_out_mnt_ref_voice_idx :
146
+                                _settings.tts_active_voice_prompt_for_out_mnt_idx
147
                     }
148
                     frame {
149
                         rightPadding: appWin.padding
150
@@ -398,12 +425,13 @@
151
                     }
152
                     buttonToolTip: qsTr("Read") + " (Ctrl+Alt+Shift+R)"
153
                     button {
154
+                        enabled: mntOutCombo.second.enabled &&
155
+                                 !mntOutCombo.second.off &&
156
+                                 app.translated_text.length !== 0 &&
157
+                                 app.state !== DsnoteApp.StateTranslating &&
158
+                                 (!app.tts_for_out_mnt_ref_voice_needed || app.available_tts_ref_voice_names.length !== 0) &&
159
+                                 (!app.tts_for_out_mnt_ref_prompt_needed || _settings.tts_voice_prompts.length !== 0)
160
                         action: Action {
161
-                            enabled: mntOutCombo.second.enabled &&
162
-                                     !mntOutCombo.second.off &&
163
-                                     app.translated_text.length !== 0 &&
164
-                                     app.state !== DsnoteApp.StateTranslating &&
165
-                                     (!app.tts_for_out_mnt_ref_voice_needed || app.available_tts_ref_voices.length !== 0)
166
                             text: qsTr("Read")
167
                             shortcut: "Ctrl+Alt+Shift+R"
168
                             onTriggered: app.play_speech_translator(true)
169
dsnote-4.8.1.tar.gz/desktop/qml/VoiceAudioSampleEditPage.qml Added
194
 
1
@@ -0,0 +1,192 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+import QtQuick 2.0
10
+import QtQuick.Controls 2.15
11
+import QtQuick.Layouts 1.3
12
+
13
+import org.mkiol.dsnote.Settings 1.0
14
+import org.mkiol.dsnote.Dsnote 1.0
15
+
16
+DialogPage {
17
+    id: root
18
+
19
+    readonly property bool verticalMode: width < height
20
+    property var data: null
21
+    property int index: 0
22
+
23
+    readonly property string dataName: data && data.length > 0 ? data0 : ""
24
+    readonly property string dataFile: data && data.length > 1 ? data1 : ""
25
+    readonly property string dataText: data && data.length > 2 ? data2 : ""
26
+
27
+    readonly property bool dataOk: testData()
28
+    readonly property bool canSave: _textForm.text.trim().length > 0 && dataOk
29
+    readonly property bool nameTaken: _nameForm.textField.text.trim().length > 0 && !dataOk
30
+    readonly property int effectiveWidth: root.implicitWidth - root._leftMargin - root._rightMargin - appWin.padding
31
+
32
+    title: qsTr("Edit audio sample")
33
+
34
+    function cancel() {
35
+        appWin.openDialog("VoiceMgmtPage.qml")
36
+    }
37
+
38
+    function saveData() {
39
+        var idx = index
40
+        var name = dataName;
41
+        var text = dataText;
42
+        var new_name = _nameForm.textField.text.trim()
43
+        var new_text = _textForm.text.trim()
44
+
45
+        if (new_name.length === 0 || new_text.length === 0) {
46
+            return
47
+        }
48
+
49
+        app.update_tts_ref_voice(idx, new_name, new_text)
50
+
51
+        appWin.openDialog("VoiceMgmtPage.qml")
52
+    }
53
+
54
+    function testData() {
55
+        var idx = index
56
+        var new_name = _nameForm.textField.text.trim()
57
+
58
+        if (new_name.length === 0) {
59
+            return false
60
+        }
61
+
62
+        return app.test_tts_ref_voice(idx, new_name)
63
+    }
64
+
65
+    function stop_playback() {
66
+        if (app.player_playing)
67
+            app.player_stop_voice_ref()
68
+    }
69
+
70
+    Connections {
71
+        target: app
72
+        onText_decoded_internal: {
73
+            var new_text = text.trim()
74
+            if (new_text.length > 0) {
75
+                _textForm.text = new_text
76
+                appWin.toast.show(qsTr("Text decoding has completed!"))
77
+            }
78
+        }
79
+    }
80
+
81
+    onOpenedChanged: {
82
+        stop_playback()
83
+        app.cancel_if_internal()
84
+    }
85
+
86
+    footer: Item {
87
+        height: closeButton.height + appWin.padding
88
+
89
+        RowLayout {
90
+            anchors {
91
+                left: parent.left
92
+                leftMargin: root.leftPadding + appWin.padding
93
+                right: parent.right
94
+                rightMargin: root.rightPadding + appWin.padding
95
+                bottom: parent.bottom
96
+                bottomMargin: root.bottomPadding
97
+            }
98
+
99
+            Button {
100
+                property bool playing: app.player_playing && app.player_current_voice_ref_idx === root.index
101
+                icon.name: playing ? "media-playback-stop-symbolic" : "media-playback-start-symbolic"
102
+                display: root.verticalMode ? AbstractButton.IconOnly : AbstractButton.TextBesideIcon
103
+                text: playing ? qsTr("Stop") : qsTr("Play")
104
+                onClicked: {
105
+                    if (playing)
106
+                        app.player_stop_voice_ref()
107
+                    else
108
+                        app.player_play_voice_ref_idx(index)
109
+                }
110
+
111
+                ToolTip.visible: display === AbstractButton.IconOnly ? hovered : false
112
+                ToolTip.text: text
113
+            }
114
+
115
+            Item {
116
+                Layout.fillWidth: true
117
+            }
118
+
119
+            Button {
120
+                text: qsTr("Save")
121
+                enabled: root.canSave
122
+                icon.name: "document-save-symbolic"
123
+                Keys.onReturnPressed: root.saveData()
124
+                onClicked: root.saveData()
125
+            }
126
+
127
+            Button {
128
+                id: closeButton
129
+
130
+                text: qsTr("Cancel")
131
+                icon.name: "action-unavailable-symbolic"
132
+                onClicked: root.cancel()
133
+                Keys.onEscapePressed: root.cancel()
134
+            }
135
+        }
136
+    }
137
+
138
+    ColumnLayout {
139
+        property alias verticalMode: root.verticalMode
140
+        Layout.fillWidth: true
141
+
142
+        TextArea {
143
+            id: _textForm
144
+
145
+            readOnly: app.state !== DsnoteApp.StateIdle
146
+            selectByMouse: true
147
+            wrapMode: TextEdit.Wrap
148
+            verticalAlignment: TextEdit.AlignTop
149
+            placeholderText: qsTr("Text spoken in audio sample")
150
+            ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
151
+            ToolTip.visible: hovered
152
+            ToolTip.text: placeholderText
153
+            hoverEnabled: true
154
+            Layout.fillWidth: true
155
+            text: root.dataText
156
+            Layout.minimumHeight: _nameForm.textField.implicitHeight * 3
157
+
158
+            TextContextMenu {}
159
+
160
+            BusyIndicator {
161
+                id: busyIndicator
162
+
163
+                anchors.centerIn: parent
164
+                running: app.state === DsnoteApp.StateTranscribingFile
165
+                visible: running
166
+            }
167
+        }
168
+
169
+        Button {
170
+            enabled: app.stt_configured && app.state === DsnoteApp.StateIdle
171
+            Layout.alignment: Qt.AlignRight
172
+            text: qsTr("Decode text from audio sample")
173
+            ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
174
+            ToolTip.visible: hovered
175
+            ToolTip.text: qsTr("Use the current active Speech to Text model to decode text from an audio sample.")
176
+            onClicked: {
177
+                app.transcribe_ref_file(root.dataFile)
178
+            }
179
+        }
180
+
181
+        TextFieldForm {
182
+            id: _nameForm
183
+
184
+            label.text: qsTr("Name")
185
+            valid: !root.nameTaken
186
+            toolTip: valid ? "" : qsTr("This name is already taken")
187
+            textField {
188
+                text: root.dataName
189
+                placeholderText: _nameForm.label.text
190
+            }
191
+        }
192
+    }
193
+}
194
dsnote-4.7.1.tar.gz/desktop/qml/VoiceImportPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/VoiceImportPage.qml Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -10,13 +10,19 @@
8
 import QtQuick.Dialogs 1.2 as Dialogs
9
 import QtQuick.Layouts 1.3
10
 
11
+import org.mkiol.dsnote.Dsnote 1.0
12
+
13
 DialogPage {
14
     id: root
15
 
16
     readonly property bool verticalMode: (micButton.implicitWidth + fileButton.implicitWidth + cleanupButton.implicitWidth) > (width - 2 * appWin.padding)
17
-    readonly property bool canCreate: app.player_ready && titleTextField.text.length !== 0 &&
18
-                                      rangeSlider.first.value < rangeSlider.second.value && !app.recorder_processing
19
-
20
+    readonly property bool dataOk: testData()
21
+    readonly property bool canSave: app.player_ready &&
22
+                                      rangeSlider.first.value < rangeSlider.second.value &&
23
+                                      !app.recorder_processing &&
24
+                                      _textForm.text.trim().length > 0 &&
25
+                                      dataOk
26
+    readonly property bool nameTaken: _nameForm.textField.text.trim().length > 0 && !dataOk
27
     function format_time_to_s(time_ms) {
28
         return (time_ms / 1000).toFixed(1)
29
     }
30
@@ -25,10 +31,18 @@
31
         appWin.openDialog("VoiceMgmtPage.qml")
32
     }
33
 
34
-    function export_voice() {
35
-        if (!root.canCreate) return
36
+    function saveData() {
37
+        if (!canSave) return
38
+
39
+        var name = _nameForm.textField.text.trim()
40
+        var text = _textForm.text.trim()
41
+
42
+        if (name.length === 0 || text.length === 0) {
43
+            return
44
+        }
45
+
46
+        app.player_export_ref_voice(rangeSlider.first.value, rangeSlider.second.value, name, text)
47
 
48
-        app.player_export_ref_voice(rangeSlider.first.value, rangeSlider.second.value, titleTextField.text)
49
         appWin.openDialog("VoiceMgmtPage.qml")
50
     }
51
 
52
@@ -38,20 +52,73 @@
53
                             rangeSlider.first.handle.width / 2) / probsRow.probs.length
54
     }
55
 
56
+    function testData() {
57
+        var name = _nameForm.textField.text.trim()
58
+
59
+        if (name.length === 0) {
60
+            return false
61
+        }
62
+
63
+        return app.test_tts_ref_voice(-1, name)
64
+    }
65
+
66
     onOpenedChanged: {
67
         if (!opened) {
68
             app.player_reset()
69
             app.recorder_reset()
70
+            app.cancel_if_internal()
71
         }
72
     }
73
 
74
-    title: qsTr("Create a new voice sample")
75
+    title: qsTr("Create a new audio sample")
76
+
77
+    Component {
78
+        id: helpDialog
79
+
80
+        HelpDialog {
81
+            title: qsTr("Audio sample")
82
+
83
+            Label {
84
+                Layout.fillWidth: true
85
+                wrapMode: Text.Wrap
86
+                text: qsTr("Audio sample lets you clone someone's voice.") + " " +
87
+                      qsTr("It can be created by recording a audio sample directly from the microphone or by providing an audio file.") + " " +
88
+                      qsTr("The text spoken in the audio sample should also be provided.")
89
+            }
90
+
91
+            Label {
92
+                Layout.fillWidth: true
93
+                wrapMode: Text.Wrap
94
+                text: qsTr("Tips:") +
95
+                      "<ul>" +
96
+                      "<li>" + qsTr("Audio sample should not be very long.") + " " + qsTr("The duration from 10 to 30 seconds is good enough.") + "</li>" +
97
+                      "<li>" + qsTr("Use the range slider to clip the audio sample to the part containing speech.") + "</li>" +
98
+                      "<li>" + qsTr("If you're not satisfied with voice cloning quality, try creating a few different audio samples and see which one gives you the best result.") + "</li>" +
99
+                      "<li>" + qsTr("More detailed instructions on the requirements for the audio sample can be found in the documentation for the specific TTS engine.") + "</li>" +
100
+                      "</ul>"
101
+            }
102
+
103
+            Label {
104
+                Layout.fillWidth: true
105
+                wrapMode: Text.Wrap
106
+                text: qsTr("Currently, voice cloning can be used in the following models:") +
107
+                      "<ul>" +
108
+                      "<li><i>Coqui XTTS</i></li>" +
109
+                      "<li><i>Coqui YourTTS</i></li>" +
110
+                      "<li><i>WhisperSpeech</i></li>" +
111
+                      "<li><i>F5-TTS</i></li>" +
112
+                      "</ul>"
113
+            }
114
+        }
115
+    }
116
 
117
     footer: Item {
118
         height: closeButton.height + appWin.padding
119
 
120
         RowLayout {
121
             anchors {
122
+                left: parent.left
123
+                leftMargin: root.leftPadding + appWin.padding
124
                 right: parent.right
125
                 rightMargin: root.rightPadding + appWin.padding
126
                 bottom: parent.bottom
127
@@ -59,11 +126,26 @@
128
             }
129
 
130
             Button {
131
+                icon.name: "help-about-symbolic"
132
+                display: AbstractButton.IconOnly
133
+                text: qsTr("Help")
134
+                onClicked: appWin.openPopup(helpDialog)
135
+                ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
136
+                ToolTip.visible: hovered
137
+                ToolTip.text: text
138
+                hoverEnabled: true
139
+            }
140
+
141
+            Item {
142
+                Layout.fillWidth: true
143
+            }
144
+
145
+            Button {
146
                 text: qsTr("Create")
147
-                enabled: root.canCreate
148
+                enabled: root.canSave
149
                 icon.name: "document-save-symbolic"
150
-                Keys.onReturnPressed: root.export_voice()
151
-                onClicked: root.export_voice()
152
+                Keys.onReturnPressed: root.saveData()
153
+                onClicked: root.saveData()
154
             }
155
 
156
             Button {
157
@@ -86,9 +168,16 @@
158
             rangeSlider.second.value = app.player_duration
159
         }
160
         onRecorder_new_stream_name: {
161
-            titleTextField.text = name
162
+            _nameForm.textField.text = name
163
         }
164
         onRecorder_new_probs: root.update_probs(probs)
165
+        onText_decoded_internal: {
166
+            var new_text = text.trim()
167
+            if (new_text.length > 0) {
168
+                _textForm.text = new_text
169
+                appWin.toast.show(qsTr("Text decoding has completed!"))
170
+            }
171
+        }
172
     }
173
 
174
     GridLayout {
175
@@ -245,47 +334,61 @@
176
         }
177
     }
178
 
179
-    GridLayout {
180
-        id: gridVoiceName
181
+    TextArea {
182
+        id: _textForm
183
 
184
-        columns: root.verticalMode ? 1 : 2
185
-        columnSpacing: appWin.padding
186
-        rowSpacing: appWin.padding
187
         enabled: app.player_ready && !app.recorder_processing
188
+        readOnly: app.state !== DsnoteApp.StateIdle
189
+        selectByMouse: true
190
+        wrapMode: TextEdit.Wrap
191
+        verticalAlignment: TextEdit.AlignTop
192
+        placeholderText: qsTr("Text spoken in audio sample")
193
+        ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
194
+        ToolTip.visible: hovered
195
+        ToolTip.text: placeholderText
196
+        hoverEnabled: true
197
+        Layout.fillWidth: true
198
+        Layout.minimumHeight: _nameForm.textField.implicitHeight * 3
199
 
200
-        Label {
201
dsnote-4.7.1.tar.gz/desktop/qml/VoiceMgmtPage.qml -> dsnote-4.8.1.tar.gz/desktop/qml/VoiceMgmtPage.qml Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2024-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -10,57 +10,244 @@
8
 import QtQuick.Dialogs 1.2 as Dialogs
9
 import QtQuick.Layouts 1.3
10
 
11
+import org.mkiol.dsnote.Settings 1.0
12
+
13
 DialogPage {
14
     id: root
15
 
16
     readonly property bool verticalMode: width < appWin.height
17
+    readonly property real _rightMargin: (!root.mirrored && listViewExists && listViewStackItem.currentItem.ScrollBar.vertical.visible) ?
18
+                                             appWin.padding + listViewStackItem.currentItem.ScrollBar.vertical.width :
19
+                                             appWin.padding
20
+    readonly property real _leftMargin: (root.mirrored && listViewExists && listViewStackItem.currentItem.ScrollBar.vertical.visible) ?
21
+                                             appWin.padding + listViewStackItem.currentItem.ScrollBar.vertical.width :
22
+                                             appWin.padding
23
+
24
+    title: qsTr("Voice profiles")    
25
+
26
+    function updateTypeView() {
27
+        stop_playback()
28
+
29
+        switch(_settings.active_voice_profile_type) {
30
+        case Settings.VoiceProfileAudioSample:
31
+            if (listViewStackItem.depth > 1) listViewStackItem.pop()
32
+            break;
33
+        case Settings.VoiceProfilePrompt:
34
+            if (listViewStackItem.depth < 2) listViewStackItem.push(listViewPromptComp)
35
+            break
36
+        }
37
+    }
38
+
39
+    function stop_playback() {
40
+        if (app.player_playing)
41
+            app.player_stop_voice_ref()
42
+    }
43
 
44
-    title: qsTr("Voice samples")
45
+    function create_new() {
46
+        stop_playback()
47
+
48
+        switch(_settings.active_voice_profile_type) {
49
+        case Settings.VoiceProfileAudioSample:
50
+            appWin.openDialog("VoiceImportPage.qml")
51
+            break;
52
+        case Settings.VoiceProfilePrompt:
53
+            appWin.openDialog("VoicePromptEditPage.qml")
54
+            break
55
+        }
56
+    }
57
+
58
+    Connections {
59
+        target: _settings
60
+        onActive_voice_profile_type_changed: root.updateTypeView()
61
+    }
62
 
63
     Component.onCompleted: {
64
         listViewStackItem.push(listViewComp)
65
+        updateTypeView()
66
+    }
67
+
68
+    Component {
69
+        id: helpDialog
70
+
71
+        HelpDialog {
72
+            title: qsTr("Voice profile")
73
+
74
+            Label {
75
+                Layout.fillWidth: true
76
+                wrapMode: Text.Wrap
77
+                text: qsTr("Voice profile can be defined with an audio sample or text description.")
78
+            }
79
+
80
+            Label {
81
+                Layout.fillWidth: true
82
+                wrapMode: Text.Wrap
83
+                text: qsTr("Audio sample") +
84
+                      "<ul>" +
85
+                      "<li>" + qsTr("Allows you to clone someone's voice.") + "</li>" +
86
+                      "<li>" + qsTr("Can be used in models that support %1.").arg("<i>" + qsTr("Voice Cloning") + "</i>") + "</li>" +
87
+                      "</ul>"
88
+            }
89
+
90
+            Label {
91
+                Layout.fillWidth: true
92
+                wrapMode: Text.Wrap
93
+                text: qsTr("Text voice profile") +
94
+                      "<ul>" +
95
+                      "<li>" + qsTr("Allows you to define different speaker characteristics, such as gender, mood or pace.") + "</li>" +
96
+                      "<li>" + qsTr("Can be used in models that support %1.").arg("<i>" + qsTr("Voice Text Description") + "</i>") + "</li>" +
97
+                      "</ul>"
98
+            }
99
+        }
100
     }
101
 
102
-    footer: Item {
103
+    header: ColumnLayout {
104
+        visible: root.title.length !== 0
105
+        spacing: appWin.padding
106
+
107
+        RowLayout {
108
+            Layout.fillWidth: true
109
+            Layout.leftMargin: root.leftPadding
110
+            Layout.rightMargin: root.rightPadding
111
+            Layout.topMargin: root.topPadding
112
+
113
+            Label {
114
+                id: titleLabel
115
+
116
+                text: root.title
117
+                font.pixelSize: Qt.application.font.pixelSize * 1.2
118
+                elide: Label.ElideRight
119
+                horizontalAlignment: Qt.AlignLeft
120
+                verticalAlignment: Qt.AlignVCenter
121
+                Layout.fillWidth: true
122
+                Layout.leftMargin: appWin.padding
123
+                Layout.alignment: Qt.AlignVCenter
124
+            }
125
+        }
126
+
127
+        ColumnLayout {
128
+            visible: root.verticalMode
129
+            Layout.fillWidth: true
130
+            Layout.leftMargin: root.leftPadding + appWin.padding
131
+            Layout.rightMargin: root.rightPadding + appWin.padding
132
+
133
+            ComboBox {
134
+                id: voiceFeatureTypeComboBar
135
+
136
+                Layout.fillWidth: true
137
+                onCurrentIndexChanged: {
138
+                    voiceFeatureTypeComboBar.currentIndex = currentIndex
139
+                    if (currentIndex == 1) {
140
+                        _settings.active_voice_profile_type = Settings.VoiceProfilePrompt
141
+                    } else {
142
+                        _settings.active_voice_profile_type = Settings.VoiceProfileAudioSample
143
+                    }
144
+                }
145
+
146
+                model: 
147
+                    qsTr("Audio sample"),
148
+                    qsTr("Text voice profile")
149
+                
150
+            }
151
+        }
152
+
153
+        TabBar {
154
+            id: voiceFeatureTypeTabBar
155
+
156
+            Layout.fillWidth: true
157
+            currentIndex: {
158
+                switch(_settings.active_voice_profile_type) {
159
+                case Settings.VoiceProfileAudioSample:
160
+                    return 0
161
+                case Settings.VoiceProfilePrompt:
162
+                    return 1
163
+                }
164
+                return 0
165
+            }
166
+
167
+            onCurrentIndexChanged: {
168
+                voiceFeatureTypeComboBar.currentIndex = currentIndex
169
+                if (currentIndex == 1) {
170
+                    _settings.active_voice_profile_type = Settings.VoiceProfilePrompt
171
+                } else {
172
+                    _settings.active_voice_profile_type = Settings.VoiceProfileAudioSample
173
+                }
174
+            }
175
+            visible: !root.verticalMode
176
+            Layout.leftMargin: root.leftPadding + appWin.padding
177
+            Layout.rightMargin: root.rightPadding + appWin.padding
178
+
179
+            TabButton {
180
+                id: audioTabButton
181
+
182
+                width: implicitWidth
183
+                action: Action {
184
+                    text: qsTr("Audio sample")
185
+                    onTriggered: {
186
+                        checked = true
187
+                    }
188
+                }
189
+            }
190
+
191
+            TabButton {
192
+                id: promptTabButton
193
+
194
+                width: implicitWidth
195
+                action: Action {
196
+                    text: qsTr("Text voice profile")
197
+                    onTriggered: {
198
+                        checked = true
199
+                    }
200
+                }
201
dsnote-4.8.1.tar.gz/desktop/qml/VoicePromptEditPage.qml Added
185
 
1
@@ -0,0 +1,183 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+import QtQuick 2.0
10
+import QtQuick.Controls 2.15
11
+import QtQuick.Layouts 1.3
12
+
13
+import org.mkiol.dsnote.Settings 1.0
14
+
15
+DialogPage {
16
+    id: root
17
+
18
+    readonly property bool verticalMode: width < height
19
+    property var data: null // null => new data
20
+
21
+    readonly property string dataName: data ? data0 : ""
22
+    readonly property string dataDesc: data ? data1 : ""
23
+    readonly property bool canSave: testData()
24
+    readonly property bool nameTaken: _nameForm.textField.text.trim().length > 0 &&
25
+                                      _descForm.text.trim().length > 0 && !testData()
26
+    readonly property int effectiveWidth: root.implicitWidth - root._leftMargin - root._rightMargin - appWin.padding
27
+
28
+    title: data ? qsTr("Edit text voice profile") : qsTr("Create a new text voice profile")
29
+
30
+    function cancel() {
31
+        appWin.openDialog("VoiceMgmtPage.qml")
32
+    }
33
+
34
+    function saveData() {
35
+        var name = dataName;
36
+        var new_name = _nameForm.textField.text.trim()
37
+        var desc = _descForm.text.trim()
38
+
39
+        if (new_name.length === 0 || desc.length === 0) {
40
+            return
41
+        }
42
+
43
+        app.update_voice_prompt(name, new_name, desc)
44
+
45
+        appWin.openDialog("VoiceMgmtPage.qml")
46
+    }
47
+
48
+    function testData() {
49
+        var name = dataName;
50
+        var new_name = _nameForm.textField.text.trim()
51
+        var desc = _descForm.text.trim()
52
+
53
+        if (new_name.length === 0 || desc.length === 0) {
54
+            return false
55
+        }
56
+
57
+        return app.test_voice_prompt(name, new_name, desc)
58
+    }
59
+
60
+    Component {
61
+        id: helpDialog
62
+
63
+        HelpDialog {
64
+            title: qsTr("Text voice profile")
65
+
66
+            Label {
67
+                Layout.fillWidth: true
68
+                wrapMode: Text.Wrap
69
+                text: qsTr("Voice profile can be defined by text description.") + " " +
70
+                      qsTr("A simple description could be, for example: %1")
71
+                        .arg("<i>\"Jenna's voice is monotone, but somewhat fast, with no background noise.\"</i>")
72
+            }
73
+
74
+            Label {
75
+                Layout.fillWidth: true
76
+                wrapMode: Text.Wrap
77
+                text: qsTr("Tips:") +
78
+                      "<ul>" +
79
+                      "<li>" + qsTr("Include the term %1 to generate the highest quality audio, and %2 for high levels of background noise.")
80
+                                .arg("<i>\"very clear audio\"</i>").arg("<i>\"very noisy audio\"</i>") + "</li>" +
81
+                      "<li>" + qsTr("Use emotions: %1, %2, %3, %4")
82
+                                .arg("<i>\"happy\"</i>").arg("<i>\"confused\"</i>").arg("<i>\"laughing\"</i>").arg("<i>\"sad\"</i>") + "</li>" +
83
+                      "<li>" + qsTr("To ensure speaker consistency across generations, include speaker name.") + "</li>" +
84
+                      "</ul>"
85
+            }
86
+
87
+            Label {
88
+                Layout.fillWidth: true
89
+                wrapMode: Text.Wrap
90
+                text: qsTr("Currently, text voice profiles can be used only in %1 models.").arg("<i>Parler TTS</i>") + " " +
91
+                      qsTr("To learn more about how to create a good text description, check out the specific model's website.")
92
+            }
93
+
94
+            RichLabel {
95
+                text: "<ul>" +
96
+                      "<li>Parler TTS &rarr; <a href='https://github.com/huggingface/parler-tts'>https://github.com/huggingface/parler-tts</a></li>" +
97
+                      "<li>Parler TTS Expresso &rarr; <a href='https://huggingface.co/parler-tts/parler-tts-mini-expresso'>https://huggingface.co/parler-tts/parler-tts-mini-expresso</a></li>" +
98
+                      "</ul>"
99
+            }
100
+        }
101
+    }
102
+
103
+    footer: Item {
104
+        height: closeButton.height + appWin.padding
105
+
106
+        RowLayout {
107
+            anchors {
108
+                left: parent.left
109
+                leftMargin: root.leftPadding + appWin.padding
110
+                right: parent.right
111
+                rightMargin: root.rightPadding + appWin.padding
112
+                bottom: parent.bottom
113
+                bottomMargin: root.bottomPadding
114
+            }
115
+
116
+            Button {
117
+                icon.name: "help-about-symbolic"
118
+                display: AbstractButton.IconOnly
119
+                text: qsTr("Help")
120
+                onClicked: appWin.openPopup(helpDialog)
121
+                ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
122
+                ToolTip.visible: hovered
123
+                ToolTip.text: text
124
+                hoverEnabled: true
125
+            }
126
+
127
+            Item {
128
+                Layout.fillWidth: true
129
+            }
130
+
131
+            Button {
132
+                text: qsTr("Save")
133
+                enabled: root.canSave
134
+                icon.name: "document-save-symbolic"
135
+                Keys.onReturnPressed: root.saveData()
136
+                onClicked: root.saveData()
137
+            }
138
+
139
+            Button {
140
+                id: closeButton
141
+
142
+                text: qsTr("Cancel")
143
+                icon.name: "action-unavailable-symbolic"
144
+                onClicked: root.cancel()
145
+                Keys.onEscapePressed: root.cancel()
146
+            }
147
+        }
148
+    }
149
+
150
+    ColumnLayout {
151
+        property alias verticalMode: root.verticalMode
152
+        Layout.fillWidth: true
153
+
154
+        TextArea {
155
+            id: _descForm
156
+
157
+            selectByMouse: true
158
+            wrapMode: TextEdit.Wrap
159
+            verticalAlignment: TextEdit.AlignTop
160
+            placeholderText: qsTr("Description")
161
+            ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
162
+            ToolTip.visible: hovered
163
+            ToolTip.text: placeholderText
164
+            hoverEnabled: true
165
+            Layout.fillWidth: true
166
+            text: root.dataDesc
167
+            Layout.minimumHeight: _nameForm.textField.implicitHeight * 3
168
+
169
+            TextContextMenu {}
170
+        }
171
+
172
+        TextFieldForm {
173
+            id: _nameForm
174
+
175
+            label.text: qsTr("Name")
176
+            valid: !root.nameTaken
177
+            toolTip: valid ? "" : qsTr("This name is already taken")
178
+            textField {
179
+                text: root.dataName
180
+                placeholderText: _nameForm.label.text
181
+            }
182
+        }
183
+    }
184
+}
185
dsnote-4.7.1.tar.gz/desktop/qml/main.qml -> dsnote-4.8.1.tar.gz/desktop/qml/main.qml Changed
139
 
1
@@ -31,6 +31,8 @@
2
     readonly property alias buttonWithIconWidth: _dummyButtonWithIcon.width
3
     readonly property alias buttonHeight: _dummyButton.height
4
     readonly property double buttonHeightShort: buttonHeight * 0.8
5
+    readonly property alias toast: _toast
6
+    property var features: app.features_availability()
7
 
8
     property var _dialogPage
9
 
10
@@ -162,17 +164,73 @@
11
         }
12
     }
13
 
14
+    function showRefHelpIfNeeded() {
15
+        var ref_voice_needed = (app.tts_ref_voice_needed && !_settings.translator_mode) ||
16
+                ((app.tts_for_in_mnt_ref_voice_needed || app.tts_for_out_mnt_ref_voice_needed) && _settings.translator_mode)
17
+        var ref_prompt_needed = (app.tts_ref_prompt_needed && !_settings.translator_mode) ||
18
+                ((app.tts_for_in_mnt_ref_prompt_needed || app.tts_for_out_mnt_ref_prompt_needed) && _settings.translator_mode)
19
+
20
+        if (ref_voice_needed && ((_settings.hint_done_flags & Settings.HintDoneRefVoiceHelp) == 0 || app.available_tts_ref_voice_names.length === 0)) {
21
+            appWin.openPopup(refVoiceHelpMessage)
22
+            _settings.set_hint_done(Settings.HintDoneRefVoiceHelp)
23
+        }
24
+        if (ref_prompt_needed && ((_settings.hint_done_flags & Settings.HintDoneRefPromptHelp) == 0 || _settings.tts_voice_prompts.length === 0)) {
25
+            appWin.openPopup(refPromptHelpMessage)
26
+            _settings.set_hint_done(Settings.HintDoneRefPromptHelp)
27
+        }
28
+    }
29
+
30
     Component.onCompleted: {
31
         var hidded =  _start_in_tray || (_settings.start_in_tray && _settings.use_tray)
32
         visible = !hidded;
33
     }
34
 
35
-    width: Screen.width / 2
36
-    height: Screen.height / 2
37
+    width: Screen.width * _settings.window_size_ratio
38
+    height: Screen.height * _settings.window_size_ratio
39
     visible: false
40
     header: MainToolBar {}
41
     onActiveChanged: update_dektop_notification()
42
 
43
+    Component {
44
+        id: refVoiceHelpMessage
45
+
46
+        HelpDialog {
47
+            title: qsTr("Audio sample")
48
+
49
+            Label {
50
+                Layout.fillWidth: true
51
+                wrapMode: Text.Wrap
52
+                text: qsTr("The selected model supports voice cloning. Create an %1 to clone someone's voice.").arg("<i>" + qsTr("Audio sample") + "</i>")
53
+            }
54
+
55
+            Label {
56
+                Layout.fillWidth: true
57
+                wrapMode: Text.Wrap
58
+                text: qsTr("You can make a new %1 in the %2 menu.").arg("<i>" + qsTr("Audio sample") + "</i>").arg("<i>" + qsTr("Voice profiles") + "</i>")
59
+            }
60
+        }
61
+    }
62
+
63
+    Component {
64
+        id: refPromptHelpMessage
65
+
66
+        HelpDialog {
67
+            title: qsTr("Text voice profile")
68
+
69
+            Label {
70
+                Layout.fillWidth: true
71
+                wrapMode: Text.Wrap
72
+                text: qsTr("The selected model supports the voice characteristics defined in the text description.")
73
+            }
74
+
75
+            Label {
76
+                Layout.fillWidth: true
77
+                wrapMode: Text.Wrap
78
+                text: qsTr("You can make a new %1 in the %2 menu.").arg("<i>" + qsTr("Text voice profile") + "</i>").arg("<i>" + qsTr("Voice profiles") + "</i>")
79
+            }
80
+        }
81
+    }
82
+
83
     TextField {
84
         id: _dummyTextField
85
         visible: false
86
@@ -267,18 +325,11 @@
87
             id: warningTip2
88
 
89
             warning: false
90
-            // visible: _settings.hw_accel_supported() && _settings.is_flatpak() &&
91
-            //          _settings.addon_flags == Settings.AddonNone &&
92
-            //          ((_settings.hint_done_flags & Settings.HintDoneAddon) == 0) &&
93
-            //          (((_settings.system_flags & Settings.SystemAmdGpu) > 0) ||
94
-            //           ((_settings.system_flags & Settings.SystemNvidiaGpu) > 0))
95
-
96
-            // right now, ROCm 6.x causes many problems with Coqui TTS therefore
97
-            // "missing add-on" warning for AMD GPU is not shown
98
             visible: _settings.hw_accel_supported() && _settings.is_flatpak() &&
99
                      _settings.addon_flags == Settings.AddonNone &&
100
                      ((_settings.hint_done_flags & Settings.HintDoneAddon) == 0) &&
101
-                     ((_settings.system_flags & Settings.SystemNvidiaGpu) > 0)
102
+                     (((_settings.system_flags & Settings.SystemAmdGpu) > 0) ||
103
+                      ((_settings.system_flags & Settings.SystemNvidiaGpu) > 0))
104
             onCloseClicked: _settings.set_hint_done(Settings.HintDoneAddon)
105
             text: {
106
                 var nvidia_addon = (_settings.system_flags & Settings.SystemNvidiaGpu) > 0
107
@@ -448,7 +499,7 @@
108
     }
109
 
110
     ToastNotification {
111
-        id: toast
112
+        id: _toast
113
     }
114
 
115
     Connections {
116
@@ -533,6 +584,10 @@
117
                 toast.show(stt_auto_lang_name)
118
         }
119
 
120
+        onFeatures_availability_updated: {
121
+            appWin.features = app.features_availability()
122
+        }
123
+
124
         onError: {
125
             switch (type) {
126
             case DsnoteApp.ErrorFileSource:
127
@@ -588,5 +643,11 @@
128
             appWin.show()
129
             appWin.raise()
130
         }
131
+        onTts_ref_voice_neededChanged: appWin.showRefHelpIfNeeded()
132
+        onTts_for_in_mnt_ref_voice_neededChanged: appWin.showRefHelpIfNeeded()
133
+        onTts_for_out_mnt_ref_voice_neededChanged: appWin.showRefHelpIfNeeded()
134
+        onTts_ref_prompt_neededChanged: appWin.showRefHelpIfNeeded()
135
+        onTts_for_in_mnt_ref_prompt_neededChanged: appWin.showRefHelpIfNeeded()
136
+        onTts_for_out_mnt_ref_prompt_neededChanged: appWin.showRefHelpIfNeeded()
137
     }
138
 }
139
dsnote-4.7.1.tar.gz/desktop/resources.qrc -> dsnote-4.8.1.tar.gz/desktop/resources.qrc Changed
18
 
1
@@ -34,6 +34,7 @@
2
         <file>qml/VoiceImportPage.qml</file>
3
         <file>qml/VoiceMgmtPage.qml</file>
4
         <file>qml/VoiceRecordPage.qml</file>
5
+        <file>qml/VoicePromptEditPage.qml</file>
6
         <file>qml/ModelFeatureButton.qml</file>
7
         <file>qml/ModelFilteringWidget.qml</file>
8
         <file>qml/LangFilteringWidget.qml</file>
9
@@ -59,6 +60,8 @@
10
         <file>qml/HelpDialog.qml</file>
11
         <file>qml/RowForm.qml</file>
12
         <file>qml/TextFieldWithHelpForm.qml</file>
13
+        <file>qml/LayoutFixer.qml</file>
14
+        <file>qml/VoiceAudioSampleEditPage.qml</file>
15
         <file alias="config/models.json">../config/models.json</file>
16
         <file alias="nonbreaking_prefixes/ca.txt">../nonbreaking_prefixes/ca.txt</file>
17
         <file alias="nonbreaking_prefixes/cs.txt">../nonbreaking_prefixes/cs.txt</file>
18
dsnote-4.8.1.tar.gz/fedora Added
2
 
1
+(directory)
2
dsnote-4.8.1.tar.gz/fedora/dsnote.spec Added
93
 
1
@@ -0,0 +1,91 @@
2
+
3
+%global debug_package %{nil}
4
+%global source_date_epoch_from_changelog  %{nil}
5
+%global __brp_check_rpaths %{nil}
6
+
7
+# provided NAME through environment or default "dsnote"
8
+Name:           %{?NAME}%{!?NAME:dsnote}
9
+# provided VERSION through environment or default "the current date"
10
+Version:        %{?VERSION}%{!?VERSION:%(date +%%Y%%m%%d)}
11
+Release:        1%{?dist}
12
+Summary:        Speech Note: Take, read and translate notes in multiple languages
13
+
14
+License:        MPL-2.0
15
+URL:            https://github.com/mkiol/dsnote
16
+Source0:        %{name}-%{version}.tar.gz
17
+
18
+BuildRequires:  autoconf
19
+BuildRequires:  automake
20
+BuildRequires:  bison
21
+BuildRequires:  boost-devel
22
+BuildRequires:  cmake
23
+BuildRequires:  git
24
+BuildRequires:  kf5-kdbusaddons-devel
25
+BuildRequires:  libarchive-devel
26
+BuildRequires:  libxdo-devel
27
+BuildRequires:  libXinerama-devel
28
+BuildRequires:  libxkbcommon-x11-devel
29
+BuildRequires:  libXtst-devel
30
+BuildRequires:  libtool
31
+BuildRequires:  wayland-devel
32
+BuildRequires:  meson
33
+BuildRequires:  openblas-devel
34
+BuildRequires:  patchelf
35
+BuildRequires:  pybind11-devel
36
+BuildRequires:  python3-devel
37
+BuildRequires:  python3-pybind11
38
+BuildRequires:  qt5-linguist
39
+BuildRequires:  qt5-qtbase-private-devel
40
+BuildRequires:  qt5-qtmultimedia-devel
41
+BuildRequires:  qt5-qtquickcontrols2-devel
42
+BuildRequires:  qt5-qtx11extras-devel
43
+BuildRequires:  rubberband-devel
44
+BuildRequires:  taglib-devel
45
+BuildRequires:  vulkan-headers
46
+Requires:       kf5-kquickcharts
47
+Requires:       kf5-sonnet
48
+Requires:       python3
49
+Requires:       (qqc2-breeze-style < 6 or kf5-qqc2-breeze-style)
50
+Requires:       (qqc2-desktop-style < 6 or kf5-qqc2-desktop-style)
51
+Requires:       qt5-qtquickcontrols
52
+Requires:       qt5-qtquickcontrols2
53
+Requires:       vulkan-loader
54
+Recommends:     ydotool
55
+
56
+%description
57
+Speech Note let you take, read and translate notes in multiple languages.
58
+It uses Speech to Text, Text to Speech and Machine Translation to do so.
59
+Text and voice processing take place entirely offline, locally on your computer,
60
+without using a network connection. Your privacy is always respected.
61
+No data is sent to the Internet.
62
+
63
+
64
+%prep
65
+%autosetup
66
+
67
+%build
68
+%cmake \
69
+    -DCMAKE_BUILD_TYPE=Release \
70
+    -DWITH_DESKTOP=ON \
71
+    -DBUILD_VOSK=OFF \
72
+    -DDOWNLOAD_VOSK=ON \
73
+    -DBUILD_LIBARCHIVE=OFF \
74
+    -DBUILD_OPENBLAS=OFF \
75
+    -DBUILD_RUBBERBAND=OFF \
76
+    -DBUILD_TAGLIB=OFF \
77
+    -DBUILD_XDO=OFF \
78
+    -DBUILD_WHISPERCPP_VULKAN=ON \
79
+    -DBUILD_XKBCOMMON=ON # not needed on Fedora 42
80
+%cmake_build
81
+
82
+%install
83
+rm -rf $RPM_BUILD_ROOT
84
+%cmake_install
85
+
86
+%files
87
+%{_bindir}/%{name}
88
+%{_datadir}/%{name}
89
+%{_datadir}/applications/%{name}.desktop
90
+%{_datadir}/icons/hicolor/*/apps/%{name}.*
91
+%{_datadir}/metainfo/%{name}.metainfo.xml
92
+%{_datadir}/dbus-1/services/*.service
93
dsnote-4.8.1.tar.gz/fedora/make_rpm.sh Added
79
 
1
@@ -0,0 +1,77 @@
2
+#!/usr/bin/bash
3
+
4
+#
5
+# Make Fedora RPM package
6
+#
7
+# Usage:
8
+# make_rpm.sh spec_file_path output_dir
9
+#
10
+
11
+VERSION="4.7.$(date +%Y%m%d)"
12
+NAME=dsnote
13
+
14
+spec_file="${1:-"$(realpath "$(dirname "$0")")/dsnote.spec"}"
15
+self_dir="$(realpath "$(dirname "$0")")"
16
+out_dir="${2:-"$self_dir"}"
17
+
18
+echo "Name: $NAME"
19
+echo "Version: $VERSION"
20
+echo "Using spec file: $spec_file"
21
+echo "Output dir: $out_dir"
22
+
23
+if  ! -f "$spec_file" ; then
24
+    echo "Error: Spec file doesn't exist: $spec_file"
25
+    exit 1
26
+fi
27
+if  ! -d "$out_dir" ; then
28
+    echo "Error: Output dir doesn't exist: $out_dir"
29
+    exit 1
30
+fi
31
+
32
+src_dir="$(realpath "$self_dir/..")"
33
+
34
+build_requires=$(sed -rn 's_.*BuildRequires:\s*(.*).*_\1_p' "$spec_file" | tr '\n' ' ')
35
+out_dir=$self_dir
36
+rpmbuild_dir="$(realpath "$HOME/rpmbuild")"
37
+src_dir_ver="./$NAME-$VERSION"
38
+tarball_filename="$NAME-$VERSION.tar.gz"
39
+tarball_path="$out_dir/$tarball_filename"
40
+
41
+echo
42
+echo "To install all the packages required for the build:"
43
+echo "# dnf install rpmdevtools $build_requires"
44
+echo
45
+
46
+if ! command -v rpmbuild 2>&1 >/dev/null
47
+then
48
+    echo "Error: rpmbuild could not be found"
49
+    exit 1
50
+fi
51
+
52
+cd "$self_dir" &&
53
+ln -sf --no-target-directory "$src_dir" "$(realpath "$src_dir_ver")" &&
54
+tar \
55
+    --exclude="${src_dir_ver}/appimage" \
56
+    --exclude="${src_dir_ver}/arch" \
57
+    --exclude="${src_dir_ver}/bak" \
58
+    --exclude="${src_dir_ver}/deb" \
59
+    --exclude="${src_dir_ver}/fedora" \
60
+    --exclude="${src_dir_ver}/flatpak" \
61
+    --exclude="${src_dir_ver}/misc" \
62
+    --exclude="${src_dir_ver}/external" \
63
+    --exclude="${src_dir_ver}/dsnote-*" \
64
+    --exclude="${src_dir_ver}/.*" \
65
+    --exclude="${src_dir_ver}/*.user" \
66
+    -hzcvf "$tarball_path" "$src_dir_ver" &&
67
+rm "$src_dir_ver" &&
68
+rm -rf "$rpmbuild_dir" &&
69
+mkdir -p "$rpmbuild_dir"/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} &&
70
+mv "$tarball_path" "$rpmbuild_dir/SOURCES/$tarball_filename" &&
71
+cp "$spec_file" "$rpmbuild_dir/SPECS/$NAME.spec" &&
72
+rpmbuild --clean -ba \
73
+    --define "_topdir $rpmbuild_dir" \
74
+    --define "VERSION $VERSION" \
75
+    --define "NAME $NAME" \
76
+    "$rpmbuild_dir/SPECS/$NAME.spec" &&
77
+find "$rpmbuild_dir" -type f -name "*.rpm" -exec cp -- "{}" "$out_dir/" \;
78
+
79
dsnote-4.7.1.tar.gz/flatpak/net.mkiol.SpeechNote-tiny.yaml -> dsnote-4.8.1.tar.gz/flatpak/net.mkiol.SpeechNote-tiny.yaml Changed
143
 
1
@@ -1,6 +1,6 @@
2
 app-id: net.mkiol.SpeechNote
3
 runtime: org.kde.Platform
4
-runtime-version: "5.15-23.08"
5
+runtime-version: "5.15-24.08"
6
 sdk: org.kde.Sdk
7
 rename-icon: dsnote
8
 command: dsnote
9
@@ -52,7 +52,7 @@
10
   net.mkiol.SpeechNote.Addon:
11
     directory: extensions
12
     no-autodownload: true
13
-    autodelete: true
14
+    autodelete: false
15
     subdirectories: true
16
     version: stable
17
     versions: stable;beta;test;master
18
@@ -66,8 +66,8 @@
19
       - -DFMT_FUZZ=OFF
20
     sources:
21
       - type: archive
22
-        url: https://github.com/fmtlib/fmt/releases/download/10.2.1/fmt-10.2.1.zip
23
-        sha256: 312151a2d13c8327f5c9c586ac6cf7cddc1658e8f53edae0ec56509c8fa516c9
24
+        url: https://github.com/fmtlib/fmt/releases/download/11.1.3/fmt-11.1.3.zip
25
+        sha256: 7df2fd3426b18d552840c071c977dc891efe274051d2e7c47e2c83c3918ba6df
26
 
27
   - name: openblas
28
     buildsystem: cmake-ninja
29
@@ -88,8 +88,8 @@
30
             - -DTARGET=ARMV8
31
     sources:
32
       - type: archive
33
-        url: https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.26/OpenBLAS-0.3.26.tar.gz
34
-        sha256: 4e6e4f5cb14c209262e33e6816d70221a2fe49eb69eaf0a06f065598ac602c68
35
+        url: https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.29/OpenBLAS-0.3.29.tar.gz
36
+        sha256: 38240eee1b29e2bde47ebb5d61160207dc68668a54cac62c076bb5032013b1eb
37
 
38
   - name: mbrola
39
     buildsystem: simple
40
@@ -116,6 +116,8 @@
41
       - type: archive
42
         url: https://github.com/rhasspy/espeak-ng/archive/8593723f10cfd9befd50de447f14bf0a9d2a14a4.zip
43
         sha256: cc8092f23a28ccd79b1c5e62984a4c4ac1959d2d0b8193ac208d728c620bd5ed
44
+      - type: patch
45
+        path: ../patches/espeak-flatpak.patch
46
 
47
   - name: boost
48
     buildsystem: simple
49
@@ -126,7 +128,7 @@
50
       - "./b2 -j ${FLATPAK_BUILDER_N_JOBS} install"
51
     sources:
52
       - type: archive
53
-        url: https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/boost_1_82_0.tar.bz2
54
+        url: https://archives.boost.io/release/1.82.0/source/boost_1_82_0.tar.bz2
55
         sha256: a6e1ab9b0860e6a2881dd7b21fe9f737a095e5f33a3a874afc6a345228597ee6
56
 
57
   - name: webrtcvad
58
@@ -266,8 +268,8 @@
59
       - /share
60
     sources:
61
       - type: archive
62
-        url: https://github.com/pybind/pybind11/archive/refs/tags/v2.11.1.tar.gz
63
-        sha256: d475978da0cdc2d43b73f30910786759d593a9d8ee05b1b6846d1eb16c6d2e0c
64
+        url: https://github.com/pybind/pybind11/archive/refs/tags/v2.13.6.tar.gz
65
+        sha256: e08cb87f4773da97fa7b5f035de8763abc656d87d5773e62f6da0587d1f0ec20
66
 
67
   - name: rnnoise
68
     buildsystem: autotools
69
@@ -316,7 +318,7 @@
70
     sources:
71
       - type: git
72
         url: https://github.com/RHVoice/RHVoice.git
73
-        commit: 71a1a830d2d860688ffcbb0d27d4de260136d161
74
+        commit: 846293f4f966381802131ea3c94ff12461b6058a
75
       - type: patch
76
         path: ../patches/rhvoice.patch
77
 
78
@@ -710,8 +712,8 @@
79
       - -DBUILD_EXE=OFF
80
     sources:
81
       - type: archive
82
-        url: https://github.com/tim-gromeyer/html2md/archive/refs/tags/v1.5.3.tar.gz
83
-        sha256: 9853eeb1d2b1ca34ee7143521d03daacbcfac57a1763180ebd0730595cb46961
84
+        url: https://github.com/tim-gromeyer/html2md/archive/refs/tags/v1.6.4.tar.gz
85
+        sha256: e34c80981d6ee5f4a699985dc4a68b0b280542a5c5e5780fdebc3ba0ca30553d
86
       - type: patch
87
         path: ../patches/html2md.patch
88
 
89
@@ -724,23 +726,6 @@
90
         url: https://github.com/progsource/maddy/archive/refs/tags/1.3.0.tar.gz
91
         sha256: 561681f8c8d2b998c153cda734107a0bc1dea4bb0df69fd813922da63fa9f3e7
92
 
93
-  - name: xkbcommon
94
-    buildsystem: meson
95
-    config-opts:
96
-      - --buildtype=release
97
-      - -Ddefault_library=static
98
-      - -Denable-docs=false
99
-      - -Denable-tools=false
100
-      - -Denable-bash-completion=false
101
-      - -Dx-locale-root=/usr/share/X11/locale
102
-    cleanup:
103
-      - /bin
104
-      - /libexec
105
-    sources:
106
-      - type: archive
107
-        url: https://xkbcommon.org/download/libxkbcommon-1.6.0.tar.xz
108
-        sha256: 0edc14eccdd391514458bc5f5a4b99863ed2d651e4dd761a90abf4f46ef99c2b
109
-
110
   - name: xdo
111
     buildsystem: simple
112
     build-commands:
113
@@ -750,6 +735,20 @@
114
       - type: archive
115
         url: https://github.com/jordansissel/xdotool/archive/33092d8a74d60c9ad3ab39c4f05b90e047ea51d8.zip
116
         sha256: cba1c7d0c23cc60cd0b1f5483f84296ff91360598e2c19c57395aec530af99ad
117
+      - type: patch
118
+        path: ../patches/xdo.patch
119
+
120
+  - name: sam
121
+    buildsystem: cmake-ninja
122
+    config-opts:
123
+      - -DCMAKE_BUILD_TYPE=Release
124
+      - -DCMAKE_POSITION_INDEPENDENT_CODE=ON
125
+    sources:
126
+      - type: archive
127
+        url: https://github.com/s-macke/SAM/archive/a7b36efac730957b59471a42a45fd779f94d77dd.zip
128
+        sha256: 342e245c84b14945b33dd8b272373eee517d239c612763ec01d3fa3bbee6bcb1
129
+      - type: patch
130
+        path: ../patches/sam.patch
131
 
132
   - name: dsnote
133
     buildsystem: cmake-ninja
134
@@ -783,7 +782,7 @@
135
       - -DBUILD_HTML2MD=OFF
136
       - -DBUILD_MADDY=OFF
137
       - -DBUILD_XDO=OFF
138
-      - -DWITH_PY=OFF
139
+      - -DBUILD_SAM=OFF
140
     post-install:
141
       - install -d ${FLATPAK_DEST}/extensions
142
     sources:
143
dsnote-4.7.1.tar.gz/flatpak/net.mkiol.SpeechNote.Addon.amd.metainfo.xml -> dsnote-4.8.1.tar.gz/flatpak/net.mkiol.SpeechNote.Addon.amd.metainfo.xml Changed
15
 
1
@@ -20,6 +20,13 @@
2
   <url type="bugtracker">https://github.com/mkiol/dsnote/issues</url>
3
   <update_contact>dsnote_AT_mkiol.net</update_contact>
4
   <releases>
5
+    <release version="1.4.0" date="2025-06-04">
6
+      <description>
7
+        <ul>
8
+        <li>Flatpak runtime update to version 5.15-24.08</li>
9
+        </ul>
10
+      </description>
11
+    </release>
12
     <release version="1.3.0" date="2024-12-28">
13
       <description>
14
         <ul>
15
dsnote-4.7.1.tar.gz/flatpak/net.mkiol.SpeechNote.Addon.amd.yaml -> dsnote-4.8.1.tar.gz/flatpak/net.mkiol.SpeechNote.Addon.amd.yaml Changed
132
 
1
@@ -1,6 +1,6 @@
2
 id: net.mkiol.SpeechNote.Addon.amd
3
 runtime: net.mkiol.SpeechNote
4
-sdk: org.kde.Sdk//5.15-23.08
5
+sdk: org.kde.Sdk//5.15-24.08
6
 build-extension: true
7
 build-options:
8
   no-debuginfo: true
9
@@ -108,7 +108,7 @@
10
     buildsystem: simple
11
     cleanup:
12
       - /bin
13
-      - /lib/python3.11/site-packages/pybind11*
14
+      - /lib/python3.12/site-packages/pybind11*
15
     build-commands:
16
       - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
17
         --prefix=${FLATPAK_DEST} "pybind11" --no-build-isolation
18
@@ -123,7 +123,7 @@
19
     buildsystem: cmake-ninja
20
     build-options:
21
       env:
22
-        PYTHONPATH: /app/extensions/amd/lib/python3.11/site-packages:/app/lib/python3.11/site-packages
23
+        PYTHONPATH: /app/extensions/amd/lib/python3.12/site-packages:/app/lib/python3.12/site-packages
24
         CTRANSLATE2_ROOT: /app/extensions/amd
25
     cleanup:
26
       - /bin
27
@@ -158,35 +158,35 @@
28
     cleanup:
29
       - /bin/convert*
30
       - /bin/torch*
31
-      - /lib/python3.11/site-packages/torch/lib/rocblas
32
-      - /lib/python3.11/site-packages/torch/lib/libamd*
33
-      - /lib/python3.11/site-packages/torch/lib/libroc*
34
-      - /lib/python3.11/site-packages/torch/lib/libhip*
35
-      - /lib/python3.11/site-packages/torch/lib/libhsa*
36
-      - /lib/python3.11/site-packages/torch/lib/libMIOpen*
37
-      - /lib/python3.11/site-packages/torch/lib/librccl*
38
-      - /lib/python3.11/site-packages/torch/lib/libnuma*
39
-      - /lib/python3.11/site-packages/torch/lib/hipblas*
40
-      - /lib/python3.11/site-packages/torch/lib/msccl-algorithms
41
-      - /lib/python3.11/site-packages/torch/include
42
+      - /lib/python3.12/site-packages/torch/lib/rocblas
43
+      - /lib/python3.12/site-packages/torch/lib/libamd*
44
+      - /lib/python3.12/site-packages/torch/lib/libroc*
45
+      - /lib/python3.12/site-packages/torch/lib/libhip*
46
+      - /lib/python3.12/site-packages/torch/lib/libhsa*
47
+      - /lib/python3.12/site-packages/torch/lib/libMIOpen*
48
+      - /lib/python3.12/site-packages/torch/lib/librccl*
49
+      - /lib/python3.12/site-packages/torch/lib/libnuma*
50
+      - /lib/python3.12/site-packages/torch/lib/hipblas*
51
+      - /lib/python3.12/site-packages/torch/lib/msccl-algorithms
52
+      - /lib/python3.12/site-packages/torch/include
53
     build-options:
54
       env:
55
-        PYTHONPATH: /app/extensions/amd/lib/python3.11/site-packages:/app/lib/python3.11/site-packages
56
+        PYTHONPATH: /app/extensions/amd/lib/python3.12/site-packages:/app/lib/python3.12/site-packages
57
     build-commands:
58
       - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
59
         --prefix=${FLATPAK_DEST} torch torchaudio --no-build-isolation
60
     sources:
61
       - type: file
62
-        url: https://download.pytorch.org/whl/rocm6.2/torch-2.5.1%2Brocm6.2-cp311-cp311-linux_x86_64.whl
63
-        dest-filename: torch-2.5.1+rocm6.2-cp311-cp311-linux_x86_64.whl
64
-        sha256: 9c4c4d985923d0e31aab4108c56a1586ca599ab26abc919833b890f7f40dcc01
65
+        url: https://download.pytorch.org/whl/rocm6.2/torch-2.5.1%2Brocm6.2-cp312-cp312-linux_x86_64.whl
66
+        dest-filename: torch-2.5.1+rocm6.2-cp312-cp312-linux_x86_64.whl
67
+        sha256: 80c7af931acb3941530a717aaa1d142985ae7f29b7660a72e47f1a890fc191fb
68
       - type: file
69
-        url: https://download.pytorch.org/whl/rocm6.2/torchaudio-2.5.1%2Brocm6.2-cp311-cp311-linux_x86_64.whl
70
-        dest-filename: torchaudio-2.5.1+rocm6.2-cp311-cp311-linux_x86_64.whl
71
-        sha256: 334e2c8936533c656095022d89fcb74ac23278ac88e2210b63f49c1810c88e91
72
+        url: https://download.pytorch.org/whl/rocm6.2/torchaudio-2.5.1%2Brocm6.2-cp312-cp312-linux_x86_64.whl
73
+        dest-filename: torchaudio-2.5.1+rocm6.2-cp312-cp312-linux_x86_64.whl
74
+        sha256: 63d1cfe70d8fb6154d85b5b44dbd055587828fc260c2f86cf924433ca897b917
75
       - type: file
76
-        url: https://download.pytorch.org/whl/pytorch_triton_rocm-3.1.0-cp311-cp311-linux_x86_64.whl
77
-        sha256: 4b0a563986aa591ecbbfd69d53f171447f64ba453cecaafd80d853b3f1047eca
78
+        url: https://download.pytorch.org/whl/pytorch_triton_rocm-3.1.0-cp312-cp312-linux_x86_64.whl
79
+        sha256: 3b56b87886d03dcf3aeb8f78f372f5da60b29ffdffcba5cd767b4bfdec47175b
80
 
81
   - name: suitesparse
82
     buildsystem: cmake-ninja
83
@@ -240,6 +240,48 @@
84
       - type: patch
85
         path: ../patches/whispercpp.patch
86
 
87
+  - name: python3-ninja
88
+    only-arches:
89
+      - x86_64
90
+    buildsystem: simple
91
+    build-options:
92
+      strip: true
93
+      env:
94
+        PYTHONPATH: /app/extensions/amd/lib/python3.12/site-packages:/app/lib/python3.12/site-packages
95
+        BUILD_TARGET: rocm
96
+        FLASH_ATTENTION_TRITON_AMD_ENABLE: TRUE
97
+        USE_TRITON_ROCM: TRUE
98
+        SKIP_CUDA_BUILD: TRUE
99
+        ROCM_HOME: /app/extensions/amd/rocm
100
+    build-commands:
101
+      - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
102
+        --prefix=${FLATPAK_DEST} ninja --no-build-isolation
103
+    sources:
104
+      - type: file
105
+        url: https://files.pythonhosted.org/packages/eb/7a/455d2877fe6cf99886849c7f9755d897df32eaf3a0fba47b56e615f880f7/ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
106
+        sha256: 096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0
107
+
108
+  - name: python3-flash-attn-rocm
109
+    only-arches:
110
+      - x86_64
111
+    buildsystem: simple
112
+    build-options:
113
+      strip: true
114
+      env:
115
+        PYTHONPATH: /app/extensions/amd/lib/python3.12/site-packages:/app/lib/python3.12/site-packages
116
+        BUILD_TARGET: rocm
117
+        FLASH_ATTENTION_TRITON_AMD_ENABLE: TRUE
118
+        USE_TRITON_ROCM: TRUE
119
+        SKIP_CUDA_BUILD: TRUE
120
+        ROCM_HOME: /app/extensions/amd/rocm
121
+    build-commands:
122
+      - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
123
+        --prefix=${FLATPAK_DEST} flash-attn --no-build-isolation
124
+    sources:
125
+      - type: file
126
+        url: https://files.pythonhosted.org/packages/11/34/9bf60e736ed7bbe15055ac2dab48ec67d9dbd088d2b4ae318fd77190ab4e/flash_attn-2.7.4.post1.tar.gz
127
+        sha256: f03485c9a49a4d68d0733acdcad80ab0e72afa025a777fdc2966ceccf9d51765
128
+
129
   - name: metadata
130
     buildsystem: simple
131
     build-commands:
132
dsnote-4.7.1.tar.gz/flatpak/net.mkiol.SpeechNote.Addon.nvidia.metainfo.xml -> dsnote-4.8.1.tar.gz/flatpak/net.mkiol.SpeechNote.Addon.nvidia.metainfo.xml Changed
16
 
1
@@ -20,6 +20,14 @@
2
   <url type="bugtracker">https://github.com/mkiol/dsnote/issues</url>
3
   <update_contact>dsnote_AT_mkiol.net</update_contact>
4
   <releases>
5
+    <release version="1.4.0" date="2025-05-21">
6
+      <description>
7
+        <ul>
8
+        <li>Flatpak runtime update to version 5.15-24.08</li>
9
+        <li>CUDA update to version 12.9.0</li>
10
+        </ul>
11
+      </description>
12
+    </release>
13
     <release version="1.3.0" date="2024-11-02">
14
       <description>
15
         <ul>
16
dsnote-4.7.1.tar.gz/flatpak/net.mkiol.SpeechNote.Addon.nvidia.yaml -> dsnote-4.8.1.tar.gz/flatpak/net.mkiol.SpeechNote.Addon.nvidia.yaml Changed
201
 
1
@@ -1,13 +1,12 @@
2
 id: net.mkiol.SpeechNote.Addon.nvidia
3
 runtime: net.mkiol.SpeechNote
4
-sdk: org.kde.Sdk//5.15-23.08
5
-sdk-extensions:
6
-  - org.freedesktop.Sdk.Extension.llvm16
7
+sdk: org.kde.Sdk//5.15-24.08
8
 build-extension: true
9
 build-options:
10
   no-debuginfo: true
11
   prefix: /app/extensions/nvidia
12
 cleanup:
13
+  - /bin
14
   - /include
15
   - "*.a"
16
 modules:
17
@@ -16,13 +15,19 @@
18
       - x86_64
19
     buildsystem: simple
20
     build-commands:
21
-      - sh cuda_12.4.0_550.54.14_linux.run --target ./ --noexec
22
+      - sh cuda_12.9.0_575.51.03_linux.run --target ./ --noexec
23
       - rm -rf builds/*.*
24
       - rm -rf builds/bin builds/cuda_sanitizer_api builds/integration
25
       - rm -rf builds/nsight_compute builds/nsight_systems builds/cuda_gdb builds/cuda_documentation
26
       - mkdir -p ${FLATPAK_DEST}/cuda
27
       - |
28
         set -e
29
+        for f in $(find . -name "*.a" | grep -v "libcudart_static.a" | grep -P "static\.a|static_nocallback"); do
30
+          echo "removing $f"
31
+          rm -f "$f"
32
+        done
33
+      - |
34
+        set -e
35
         cd builds
36
         for f in *; do
37
           echo "copying $f => ${FLATPAK_DEST}/cuda/"
38
@@ -39,12 +44,14 @@
39
           echo "copying $f => ${FLATPAK_DEST}/cuda/lib64/"
40
           cp -P $f ${FLATPAK_DEST}/cuda/lib64/
41
         done
42
+      - rm -rf builds
43
+      - rm -rf cuda_12.9.0_575.51.03_linux.run
44
+      - ${FLATPAK_DEST}/cuda/bin/nvcc nvcc -arch-ls -code-ls
45
     build-options:
46
       strip: true
47
     cleanup:
48
       - /cuda/bin
49
       - /cuda/extras
50
-      - /cuda/extras
51
       - /cuda/gds*
52
       - /cuda/include
53
       - /cuda/libnvvp
54
@@ -68,18 +75,24 @@
55
       - /cuda/targets/x86_64-linux/res
56
     sources:
57
       - type: file
58
-        url: https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_linux.run
59
-        sha256: e6a842f4eca9490575cdb68b6b1bb78d47b95a897de48dee292c431892e57d17
60
+        url: https://developer.download.nvidia.com/compute/cuda/12.9.0/local_installers/cuda_12.9.0_575.51.03_linux.run
61
+        sha256: bbce2b760fe2096ca1c86f729e03bf377c1519add7b2755ecc4e9b0a9e07ee43
62
 
63
   - name: whispercpp-cublas
64
     only-arches:
65
       - x86_64
66
     buildsystem: cmake-ninja
67
+    build-options:
68
+      env:
69
+        NVCC_APPEND_FLAGS: --compress-mode=size --split-compile=0 -Wno-deprecated-gpu-targets
70
+    cleanup:
71
+      - /lib/cmake
72
+      - /lib/pkgconfig
73
     config-opts:
74
       - -DCMAKE_BUILD_TYPE=Release
75
       - -DGGML_NATIVE=OFF
76
       - -DGGML_CUDA=ON
77
-      - -DCMAKE_CUDA_ARCHITECTURES=50;52;53;60;61;62;70;72;75;80;86;87;89;90;90a
78
+      - -DCMAKE_CUDA_ARCHITECTURES=50;52;53;60;61;62;70;72;75;80;86;87;89;90;100
79
       - -DCUDAToolkit_ROOT=/app/extensions/nvidia/cuda
80
       - -DCMAKE_CUDA_COMPILER=/app/extensions/nvidia/cuda/bin/nvcc
81
       - -DGGML_AVX=ON
82
@@ -92,6 +105,8 @@
83
       - -DCMAKE_C_FLAGS=-O3
84
       - -DCMAKE_CXX_FLAGS=-O3
85
       - -DWHISPER_TARGET_NAME=whisper-cublas
86
+    post-install:
87
+      - rm ${FLATPAK_DEST}/lib/libggml.a
88
     sources:
89
       - type: archive
90
         url: https://github.com/ggerganov/whisper.cpp/archive/refs/tags/v1.7.1.tar.gz
91
@@ -113,6 +128,12 @@
92
       - mkdir -p ${FLATPAK_DEST}/cuda/include
93
       - |
94
         set -e
95
+        for f in $(find . -name "*.a"); do
96
+          echo "removing $f"
97
+          rm -f "$f"
98
+        done
99
+      - |
100
+        set -e
101
         cd include
102
         for f in *; do
103
           echo "copying $f => ${FLATPAK_DEST}/cuda/include"
104
@@ -135,6 +156,8 @@
105
     only-arches:
106
       - x86_64
107
     buildsystem: simple
108
+    build-options:
109
+      strip: true
110
     build-commands:
111
       - |
112
         set -e
113
@@ -142,23 +165,46 @@
114
         for f in *.so*; do
115
           echo "copying $f => ${FLATPAK_DEST}/cuda/lib64/"
116
           cp -P $f ${FLATPAK_DEST}/cuda/lib64/
117
+          rm -rf $f
118
         done
119
-    build-options:
120
-      strip: true
121
     sources:
122
       - type: archive
123
         archive-type: "tar-zst"
124
-        url: https://mirror.sunred.org/archlinux/extra/os/x86_64/nccl-2.21.5-1-x86_64.pkg.tar.zst
125
-        sha256: 91c7c06f758416965ba1c5301a1e0cfed1cdddbadb3e936703f3c6dca42d3a95
126
+        url: https://mirror.sunred.org/archlinux/extra/os/x86_64/nccl-2.26.5-1-x86_64.pkg.tar.zst
127
+        sha256: 14136cfcf9fa34b8ddf1300a16b2649143882d9c9bc09326d21d59c95fd84ed4
128
+
129
+  - name: python3-pybind11
130
+    only-arches:
131
+      - x86_64
132
+    buildsystem: simple
133
+    cleanup:
134
+      - /bin
135
+      - /lib/python3.12/site-packages/pybind11*
136
+    build-commands:
137
+      - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
138
+        --prefix=${FLATPAK_DEST} "pybind11" --no-build-isolation
139
+    sources:
140
+      - type: file
141
+        url: https://files.pythonhosted.org/packages/06/55/9f73c32dda93fa4f539fafa268f9504e83c489f460c380371d94296126cd/pybind11-2.11.1-py3-none-any.whl
142
+        sha256: 33cdd02a6453380dd71cc70357ce388ad1ee8d32bd0e38fc22b273d050aa29b3
143
 
144
   - name: oneapi
145
     only-arches:
146
       - x86_64
147
     buildsystem: simple
148
+    build-options:
149
+      strip: true
150
     cleanup:
151
       - /oneapi
152
     build-commands:
153
       - sh l_BaseKit_p_2024.0.0.49564_offline.sh --extract-folder ./oneapi -a --eula accept --silent --install-dir ${FLATPAK_DEST}/oneapi
154
+      - chmod -R +w ${FLATPAK_DEST}/oneapi && echo "done" || echo "done with errors"
155
+      - |
156
+        set -e
157
+        for f in $(find ${FLATPAK_DEST}/oneapi -type f -name "*.so*"); do
158
+          echo "removing $f"
159
+          rm -f "$f"
160
+        done
161
     sources:
162
       - type: file
163
         url: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/20f4e6a1-6b0b-4752-b8c1-e5eacba10e01/l_BaseKit_p_2024.0.0.49564_offline.sh
164
@@ -168,6 +214,8 @@
165
     only-arches:
166
       - x86_64
167
     buildsystem: cmake-ninja
168
+    build-options:
169
+      strip: true
170
     cleanup:
171
       - /bin
172
       - /include
173
@@ -186,29 +234,15 @@
174
         url: https://github.com/oneapi-src/oneDNN/archive/refs/tags/v3.3.1.tar.gz
175
         sha256: e0b7a9452162e854cf08b4e90bcd1b382b9903ace6a61503a872573880d24c3f
176
 
177
-  - name: python3-pybind11
178
-    only-arches:
179
-      - x86_64
180
-    buildsystem: simple
181
-    cleanup:
182
-      - /bin
183
-      - /lib/python3.11/site-packages/pybind11*
184
-    build-commands:
185
-      - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
186
-        --prefix=${FLATPAK_DEST} "pybind11" --no-build-isolation
187
-    sources:
188
-      - type: file
189
-        url: https://files.pythonhosted.org/packages/06/55/9f73c32dda93fa4f539fafa268f9504e83c489f460c380371d94296126cd/pybind11-2.11.1-py3-none-any.whl
190
-        sha256: 33cdd02a6453380dd71cc70357ce388ad1ee8d32bd0e38fc22b273d050aa29b3
191
-
192
   - name: ctranslate2-cuda
193
     only-arches:
194
       - x86_64
195
     buildsystem: cmake-ninja
196
     build-options:
197
       env:
198
-        PYTHONPATH: /app/extensions/nvidia/lib/python3.11/site-packages:/app/lib/python3.11/site-packages
199
+        PYTHONPATH: /app/extensions/nvidia/lib/python3.12/site-packages:/app/lib/python3.12/site-packages
200
         CTRANSLATE2_ROOT: /app/extensions/nvidia
201
dsnote-4.7.1.tar.gz/flatpak/net.mkiol.SpeechNote.yaml -> dsnote-4.8.1.tar.gz/flatpak/net.mkiol.SpeechNote.yaml Changed
201
 
1
@@ -1,6 +1,6 @@
2
 app-id: net.mkiol.SpeechNote
3
 runtime: org.kde.Platform
4
-runtime-version: "5.15-23.08"
5
+runtime-version: "5.15-24.08"
6
 sdk: org.kde.Sdk
7
 rename-icon: dsnote
8
 command: dsnote
9
@@ -19,7 +19,7 @@
10
   - --filesystem=xdg-documents
11
   - --filesystem=xdg-videos
12
   - --env=PYTORCH_TENSOREXPR=0
13
-  - --env=PYTHONPATH=/app/extensions/nvidia/lib/python3.11/site-packages:/app/extensions/amd/lib/python3.11/site-packages:/app/extensions/cpu/lib/python3.11/site-packages:/app/lib/python3.11/site-packages
14
+  - --env=PYTHONPATH=/app/extensions/nvidia/lib/python3.12/site-packages:/app/extensions/amd/lib/python3.12/site-packages:/app/extensions/cpu/lib/python3.12/site-packages:/app/lib/python3.12/site-packages
15
   - --env=LD_LIBRARY_PATH=/app/opt/intel/lib:/app/extensions/nvidia/lib:/app/extensions/amd/lib:/app/extensions/cpu/lib:/app/extensions/nvidia/cuda/lib64:/app/extensions/amd/rocm/lib:/app/extensions/amd/rocm/lib/llvm/lib:/app/extensions/amd/zluda
16
   - --env=OPENCL_VENDOR_PATH=/app/opt/opencl/vendors
17
   - --env=PERL5LIB=/app/lib/perl5/site_perl
18
@@ -34,16 +34,16 @@
19
   - /include
20
   - /lib/cmake
21
   - /lib/pkgconfig
22
-  - /lib/python3.11/site-packages/__pycache__
23
-  - /lib/python3.11/site-packages/nvidia*
24
-  - /lib/python3.11/site-packages/cmake*
25
-  - /lib/python3.11/site-packages/git*
26
-  - /lib/python3.11/site-packages/Git*
27
-  - /lib/python3.11/site-packages/torch/test
28
-  - /lib/python3.11/site-packages/torch/include
29
-  - /lib/python3.11/site-packages/pypinyin/__pycache__
30
-  - /lib/python3.11/site-packages/pandas/tests
31
-  - /lib/python3.11/site-packages/torchvision*
32
+  - /lib/python3.12/site-packages/__pycache__
33
+  - /lib/python3.12/site-packages/nvidia*
34
+  - /lib/python3.12/site-packages/cmake*
35
+  - /lib/python3.12/site-packages/git*
36
+  - /lib/python3.12/site-packages/Git*
37
+  - /lib/python3.12/site-packages/torch/test
38
+  - /lib/python3.12/site-packages/torch/include
39
+  - /lib/python3.12/site-packages/pypinyin/__pycache__
40
+  - /lib/python3.12/site-packages/pandas/tests
41
+  - /lib/python3.12/site-packages/torchvision*
42
   - /lib/libSPIRV*
43
   - /lib/libshaderc*
44
   - /lib/debug/opt
45
@@ -59,13 +59,14 @@
46
   - /bin/spellout
47
   - /bin/vulkan*
48
   - /bin/speak*
49
+  - /bin/xdo*
50
   - "*.a"
51
   - "*.la"
52
 add-extensions:
53
   net.mkiol.SpeechNote.Addon:
54
     directory: extensions
55
     no-autodownload: true
56
-    autodelete: true
57
+    autodelete: false
58
     subdirectories: true
59
     version: stable
60
     versions: stable;beta;test;master
61
@@ -79,8 +80,8 @@
62
       - -DFMT_FUZZ=OFF
63
     sources:
64
       - type: archive
65
-        url: https://github.com/fmtlib/fmt/releases/download/10.2.1/fmt-10.2.1.zip
66
-        sha256: 312151a2d13c8327f5c9c586ac6cf7cddc1658e8f53edae0ec56509c8fa516c9
67
+        url: https://github.com/fmtlib/fmt/releases/download/11.1.3/fmt-11.1.3.zip
68
+        sha256: 7df2fd3426b18d552840c071c977dc891efe274051d2e7c47e2c83c3918ba6df
69
 
70
   - name: openblas
71
     buildsystem: cmake-ninja
72
@@ -101,8 +102,8 @@
73
             - -DTARGET=ARMV8
74
     sources:
75
       - type: archive
76
-        url: https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.26/OpenBLAS-0.3.26.tar.gz
77
-        sha256: 4e6e4f5cb14c209262e33e6816d70221a2fe49eb69eaf0a06f065598ac602c68
78
+        url: https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.29/OpenBLAS-0.3.29.tar.gz
79
+        sha256: 38240eee1b29e2bde47ebb5d61160207dc68668a54cac62c076bb5032013b1eb
80
 
81
   - name: mbrola
82
     buildsystem: simple
83
@@ -129,6 +130,8 @@
84
       - type: archive
85
         url: https://github.com/rhasspy/espeak-ng/archive/8593723f10cfd9befd50de447f14bf0a9d2a14a4.zip
86
         sha256: cc8092f23a28ccd79b1c5e62984a4c4ac1959d2d0b8193ac208d728c620bd5ed
87
+      - type: patch
88
+        path: ../patches/espeak-flatpak.patch
89
 
90
   - name: boost
91
     buildsystem: simple
92
@@ -139,7 +142,7 @@
93
       - "./b2 -j ${FLATPAK_BUILDER_N_JOBS} install"
94
     sources:
95
       - type: archive
96
-        url: https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/boost_1_82_0.tar.bz2
97
+        url: https://archives.boost.io/release/1.82.0/source/boost_1_82_0.tar.bz2
98
         sha256: a6e1ab9b0860e6a2881dd7b21fe9f737a095e5f33a3a874afc6a345228597ee6
99
 
100
   - name: webrtcvad
101
@@ -279,8 +282,8 @@
102
       - /share
103
     sources:
104
       - type: archive
105
-        url: https://github.com/pybind/pybind11/archive/refs/tags/v2.11.1.tar.gz
106
-        sha256: d475978da0cdc2d43b73f30910786759d593a9d8ee05b1b6846d1eb16c6d2e0c
107
+        url: https://github.com/pybind/pybind11/archive/refs/tags/v2.13.6.tar.gz
108
+        sha256: e08cb87f4773da97fa7b5f035de8763abc656d87d5773e62f6da0587d1f0ec20
109
 
110
   - name: rnnoise
111
     buildsystem: autotools
112
@@ -329,7 +332,7 @@
113
     sources:
114
       - type: git
115
         url: https://github.com/RHVoice/RHVoice.git
116
-        commit: 71a1a830d2d860688ffcbb0d27d4de260136d161
117
+        commit: 846293f4f966381802131ea3c94ff12461b6058a
118
       - type: patch
119
         path: ../patches/rhvoice.patch
120
 
121
@@ -692,38 +695,6 @@
122
         url: https://github.com/abb128/april-asr/archive/3308e68442664552de593957cad0fa443ea183dd.zip
123
         sha256: 0640fc16a43018afb1db9f17e93f545d7ac1f07e4bc47ba318d2c7311bef2df5
124
 
125
-  - name: uroman
126
-    only-arches:
127
-      - x86_64
128
-    buildsystem: simple
129
-    build-commands:
130
-      - "mkdir -p ${FLATPAK_DEST}/share/uroman"
131
-      - "cp -r ./bin ${FLATPAK_DEST}/share/uroman"
132
-      - "cp -r ./data ${FLATPAK_DEST}/share/uroman"
133
-      - "cp -r ./lib ${FLATPAK_DEST}/share/uroman"
134
-    sources:
135
-      - type: archive
136
-        url: https://github.com/isi-nlp/uroman/archive/refs/tags/v1.2.8.tar.gz
137
-        sha256: 08e5058341428f3f4ca2401d409df1f4341c386853c4de836e7ab2c2a750cb88
138
-
139
-  - name: perl
140
-    only-arches:
141
-      - x86_64
142
-    buildsystem: simple
143
-    build-options:
144
-      no-debuginfo: true
145
-    build-commands:
146
-      - ./configure.gnu -des
147
-      - make -j${FLATPAK_BUILDER_N_JOBS}
148
-      - mkdir -p ${FLATPAK_DEST}/bin
149
-      - cp perl ${FLATPAK_DEST}/bin/
150
-      - mkdir -p ${FLATPAK_DEST}/lib/perl5/site_perl
151
-      - cp -r lib/* ${FLATPAK_DEST}/lib/perl5/site_perl/
152
-    sources:
153
-      - type: archive
154
-        url: https://www.cpan.org/src/5.0/perl-5.38.0.tar.gz
155
-        sha256: 213ef58089d2f2c972ea353517dc60ec3656f050dcc027666e118b508423e517
156
-
157
   - name: oneapi
158
     only-arches:
159
       - x86_64
160
@@ -762,11 +733,23 @@
161
 
162
   - python3-modules-x86-64.yaml
163
 
164
+  - name: phonemizer-patch
165
+    only-arches:
166
+      - x86_64
167
+    buildsystem: simple
168
+    build-commands:
169
+      - patch --batch --unified -p1 --directory=${FLATPAK_DEST}/lib/python3.12/site-packages/phonemizer -i "$(realpath .)"/phonemizer.patch
170
+    sources:
171
+      - type: file
172
+        path: ../patches/phonemizer.patch
173
+
174
   - name: python3-pybind11
175
+    only-arches:
176
+      - x86_64
177
     buildsystem: simple
178
     cleanup:
179
       - /bin
180
-      - /lib/python3.11/site-packages/pybind11*
181
+      - /lib/python3.12/site-packages/pybind11*
182
     build-commands:
183
       - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
184
         --prefix=${FLATPAK_DEST} "pybind11" --no-build-isolation
185
@@ -800,7 +783,7 @@
186
       - -DCMAKE_INSTALL_PREFIX=/app/extensions/cpu
187
       - -DCMAKE_SYSTEM_PREFIX_PATH=/app
188
     post-install:
189
-      - rm -rf ${FLATPAK_DEST}/lib/python3.11/site-packages/ctranslate2*
190
+      - rm -rf ${FLATPAK_DEST}/lib/python3.12/site-packages/ctranslate2*
191
       - mkdir -p ${FLATPAK_DEST}/extensions/cpu
192
       - cd python && python setup.py bdist_wheel
193
       - pip3 install --verbose --exists-action=i --no-index --prefix=${FLATPAK_DEST}/extensions/cpu --no-build-isolation python/dist/*.whl
194
@@ -820,8 +803,8 @@
195
       - -DBUILD_EXE=OFF
196
     sources:
197
       - type: archive
198
-        url: https://github.com/tim-gromeyer/html2md/archive/refs/tags/v1.5.3.tar.gz
199
-        sha256: 9853eeb1d2b1ca34ee7143521d03daacbcfac57a1763180ebd0730595cb46961
200
+        url: https://github.com/tim-gromeyer/html2md/archive/refs/tags/v1.6.4.tar.gz
201
dsnote-4.7.1.tar.gz/flatpak/python3-modules-x86-64.yaml -> dsnote-4.8.1.tar.gz/flatpak/python3-modules-x86-64.yaml Changed
201
 
1
@@ -12,40 +12,40 @@
2
       strip: true
3
     build-commands:
4
       - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
5
-        --prefix=${FLATPAK_DEST} Jinja2 MarkupSafe filelock fsspec mpmath networkx sympy typing_extensions --no-build-isolation
6
+        --prefix=${FLATPAK_DEST} Jinja2 filelock fsspec mpmath networkx sympy typing_extensions MarkupSafe --no-build-isolation
7
     sources:
8
-      - &id002
9
-        type: file
10
-        url: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl
11
-        sha256: 7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa
12
-      - &id003
13
-        type: file
14
-        url: https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
15
-        sha256: b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5
16
       - &id004
17
         type: file
18
-        url: https://files.pythonhosted.org/packages/81/54/84d42a0bee35edba99dee7b59a8d4970eccdd44b99fe728ed912106fc781/filelock-3.13.1-py3-none-any.whl
19
-        sha256: 57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c
20
-      - &id005
21
+        url: https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
22
+        sha256: e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8
23
+      - &id001
24
         type: file
25
-        url: https://files.pythonhosted.org/packages/ad/30/2281c062222dc39328843bd1ddd30ff3005ef8e30b2fd09c4d2792766061/fsspec-2024.2.0-py3-none-any.whl
26
-        sha256: 817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8
27
-      - &id006
28
+        url: https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl
29
+        sha256: c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de
30
+      - &id002
31
+        type: file
32
+        url: https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl
33
+        sha256: 2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711
34
+      - &id011
35
+        type: file
36
+        url: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
37
+        sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67
38
+      - &id012
39
         type: file
40
         url: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl
41
         sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c
42
-      - &id007
43
+      - &id013
44
         type: file
45
-        url: https://files.pythonhosted.org/packages/42/31/d2f89f1ae42718f8c8a9e440ebe38d7d5fe1e0d9eb9178ce779e365b3ab0/networkx-2.8.8-py3-none-any.whl
46
-        sha256: e435dfa75b1d7195c7b8378c3859f0445cd88c6b0375c181ed66823a9ceb7524
47
-      - &id021
48
+        url: https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl
49
+        sha256: df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f
50
+      - &id030
51
         type: file
52
         url: https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl
53
         sha256: db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8
54
-      - &id001
55
+      - &id003
56
         type: file
57
-        url: https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl
58
-        sha256: af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
59
+        url: https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl
60
+        sha256: a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c
61
 
62
   - name: python3-torch
63
     buildsystem: simple
64
@@ -55,41 +55,94 @@
65
     build-options:
66
       strip: true
67
     build-commands:
68
-      - python --version
69
       - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
70
         --prefix=${FLATPAK_DEST}/extensions/cpu torch torchaudio --no-build-isolation
71
     sources:
72
-      - &id022
73
-        type: file
74
-        url: https://download.pytorch.org/whl/cpu/torch-2.5.1%2Bcpu-cp311-cp311-linux_x86_64.whl
75
-        dest-filename: torch-2.5.1+cpu-cp311-cp311-linux_x86_64.whl
76
-        sha256: 07d7c9e069123d5af08b0cf0013d74f680b2d8be7d9e2cf561a52c90c55d9409
77
-      - &id039
78
+      - &id031
79
         type: file
80
-        url: https://download.pytorch.org/whl/cpu/torchaudio-2.5.1%2Bcpu-cp311-cp311-linux_x86_64.whl
81
-        dest-filename: torchaudio-2.5.1+cpu-cp311-cp311-linux_x86_64.whl
82
-        sha256: 209f8e7efff818d2066f49c27c8097f2246f8bf6fd743c69bcf8dce80c63ee80
83
+        url: https://download.pytorch.org/whl/cpu/torch-2.5.1%2Bcpu-cp312-cp312-linux_x86_64.whl
84
+        dest-filename: torch-2.5.1+cpu-cp312-cp312-linux_x86_64.whl
85
+        sha256: 4856f9d6925121d13c2df07aa7580b767f449dfe71ae5acde9c27535d5da4840
86
+      - &id099
87
+        type: file
88
+        url: https://download.pytorch.org/whl/cpu/torchaudio-2.5.1%2Bcpu-cp312-cp312-linux_x86_64.whl
89
+        dest-filename: torchaudio-2.5.1+cpu-cp312-cp312-linux_x86_64.whl
90
+        sha256: b7fbd9c264dcbe28efb061364c76d3770eb13ae692d2982949b583edfb9ed7f5
91
 
92
-  - name: python3-setuptools_scm
93
+  - name: python3-transformers
94
     buildsystem: simple
95
     cleanup:
96
       - /bin
97
-      - /lib/*.so*
98
     build-options:
99
       env:
100
-        PYTHONPATH: /app/extensions/cpu/lib/python3.11/site-packages:/app/lib/python3.11/site-packages
101
+        PYTHONPATH: /app/extensions/cpu/lib/python3.12/site-packages:/app/lib/python3.12/site-packages
102
     build-commands:
103
       - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
104
-        --prefix=${FLATPAK_DEST} "setuptools_scmtoml==8.0.4" --no-build-isolation
105
+        --prefix=${FLATPAK_DEST} "transformers==4.46.1" --no-build-isolation
106
     sources:
107
-      - &id020
108
+      - &id005
109
         type: file
110
-        url: https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl
111
-        sha256: 8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7
112
-      - type: file
113
-        url: https://files.pythonhosted.org/packages/0e/a3/b9a8b0adfe672bf0df5901707aa929d30a97ee390ba651910186776746d2/setuptools_scm-8.0.4-py3-none-any.whl
114
-        sha256: b47844cd2a84b83b3187a5782c71128c28b4c94cad8bfb871da2784a5cb54c4f
115
+        url: https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
116
+        sha256: 80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476
117
+      - &id006
118
+        type: file
119
+        url: https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl
120
+        sha256: 30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3
121
+      - &id007
122
+        type: file
123
+        url: https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
124
+        sha256: 4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a
125
       - *id001
126
+      - *id002
127
+      - &id008
128
+        type: file
129
+        url: https://files.pythonhosted.org/packages/83/9a/d40d2a57b132d609d8a4ccc29e59ed69749021610616749cabcda2532158/hf_xet-1.1.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
130
+        sha256: 995eeffb119636ea617b96c7d7bf3c3f5ea8727fa57974574e25d700b8532d48
131
+      - &id009
132
+        type: file
133
+        url: https://files.pythonhosted.org/packages/3a/bf/6002da17ec1c7a47bedeb216812929665927c70b6e7500b3c7bf36f01bdd/huggingface_hub-0.31.1-py3-none-any.whl
134
+        sha256: 43f73124819b48b42d140cbc0d7a2e6bd15b2853b1b9d728d4d55ad1750cac5b
135
+      - &id010
136
+        type: file
137
+        url: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl
138
+        sha256: 946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3
139
+      - &id014
140
+        type: file
141
+        url: https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
142
+        sha256: 675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed
143
+      - &id027
144
+        type: file
145
+        url: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl
146
+        sha256: 29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484
147
+      - &id054
148
+        type: file
149
+        url: https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
150
+        sha256: 70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e
151
+      - &id028
152
+        type: file
153
+        url: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl
154
+        sha256: 70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
155
+      - &id029
156
+        type: file
157
+        url: https://files.pythonhosted.org/packages/a6/f8/dae3421624fcc87a89d42e1898a798bc7ff72c61f38973a65d60df8f124c/safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
158
+        sha256: cead1fa41fc54b1e61089fa57452e8834f798cb1dc7a09ba3524f1eb08e0317a
159
+      - &id063
160
+        type: file
161
+        url: https://files.pythonhosted.org/packages/9e/65/c83cb3545a65a9eaa2e13b22c93d5e00bd7624b354a44adbdc93d5d9bd91/tokenizers-0.20.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
162
+        sha256: f2b7cb962564785a83dafbba0144ecb7f579f1d57d8c406cdaa7f32fe32f18ad
163
+      - &id032
164
+        type: file
165
+        url: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl
166
+        sha256: 26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2
167
+      - &id064
168
+        type: file
169
+        url: https://files.pythonhosted.org/packages/75/d5/294a09a62bdd88da9a1007a341d4f8fbfc43be520c101e6afb526000e9f4/transformers-4.46.1-py3-none-any.whl
170
+        sha256: f77b251a648fd32e3d14b5e7e27c913b7c29154940f519e4c8c3aa6061df0f05
171
+      - *id003
172
+      - &id034
173
+        type: file
174
+        url: https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl
175
+        sha256: 4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813
176
 
177
   - name: python3-accelerate
178
     buildsystem: simple
179
@@ -98,485 +151,578 @@
180
       - /lib/*.so*
181
     build-options:
182
       env:
183
-        PYTHONPATH: /app/extensions/cpu/lib/python3.11/site-packages:/app/lib/python3.11/site-packages
184
+        PYTHONPATH: /app/extensions/cpu/lib/python3.12/site-packages:/app/lib/python3.12/site-packages
185
     build-commands:
186
       - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
187
-        --prefix=${FLATPAK_DEST} "accelerate" --no-build-isolation
188
+        --prefix=${FLATPAK_DEST} "accelerate==1.5.2" --no-build-isolation
189
     sources:
190
-      - *id002
191
-      - *id003
192
-      - &id023
193
-        type: file
194
-        url: https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
195
-        sha256: d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673
196
-      - type: file
197
-        url: https://files.pythonhosted.org/packages/73/e7/e61feefda1b483f0d53a320909051252175ccbfea29ab99bd62df6083c81/accelerate-1.1.0-py3-none-any.whl
198
-        sha256: babee98bd3692cfb0537db3f96f36b5d4e29809776b406d32aaf593d4eeb574c
199
-      - &id024
200
-        type: file
201
dsnote-4.7.1.tar.gz/patches/bergamot.patch -> dsnote-4.8.1.tar.gz/patches/bergamot.patch Changed
19
 
1
@@ -435,6 +435,17 @@
2
  
3
    Expr apply(Expr query, Expr values, Expr bias);
4
  
5
+diff -ruN bergamot-org/3rd_party/marian-dev/src/microsoft/quicksand.h bergamot-patched/3rd_party/marian-dev/src/microsoft/quicksand.h
6
+--- bergamot-org/3rd_party/marian-dev/src/microsoft/quicksand.h    2023-07-08 17:36:56.240113019 +0200
7
++++ bergamot-patched/3rd_party/marian-dev/src/microsoft/quicksand.h    2025-05-10 20:20:20.011642719 +0200
8
+@@ -5,6 +5,7 @@
9
+ #include <unordered_set>
10
+ #include <vector>
11
+ #include <set>
12
++#include <cstdint>
13
+ 
14
+ namespace marian {
15
+ 
16
 diff -ruN bergamot-org/3rd_party/marian-dev/src/tensors/cpu/integer_common.h bergamot-patched/3rd_party/marian-dev/src/tensors/cpu/integer_common.h
17
 --- bergamot-org/3rd_party/marian-dev/src/tensors/cpu/integer_common.h 2023-07-08 17:36:56.243446352 +0200
18
 +++ bergamot-patched/3rd_party/marian-dev/src/tensors/cpu/integer_common.h 2023-07-31 11:43:04.106649054 +0200
19
dsnote-4.8.1.tar.gz/patches/espeak-flatpak.patch Added
14
 
1
@@ -0,0 +1,12 @@
2
+diff -ruN espeak-org/Makefile.am espeak-patched/Makefile.am
3
+--- espeak-org/Makefile.am 2023-11-27 22:00:32.000000000 +0100
4
++++ espeak-patched/Makefile.am 2025-04-06 13:09:29.186077138 +0200
5
+@@ -5,7 +5,7 @@
6
+ BINDIR=@bindir@
7
+ INCDIR=@includedir@/espeak
8
+ LIBDIR=@libdir@
9
+-DATADIR=$(PREFIX)/share/espeak-ng-data
10
++DATADIR=/app/share/espeak-ng-data
11
+ VIMDIR=$(PREFIX)/share/vim
12
+ 
13
+ pkgconfigdir = $(libdir)/pkgconfig
14
dsnote-4.7.1.tar.gz/patches/html2md.patch -> dsnote-4.8.1.tar.gz/patches/html2md.patch Changed
32
 
1
@@ -1,7 +1,18 @@
2
+diff -ruN html2md-org/include/html2md.h html2md-patched/include/html2md.h
3
+--- html2md-org/include/html2md.h  2025-02-13 09:38:03.000000000 +0100
4
++++ html2md-patched/include/html2md.h  2025-05-10 20:17:11.600032700 +0200
5
+@@ -7,6 +7,7 @@
6
+ #include <memory>
7
+ #include <string>
8
+ #include <unordered_map>
9
++#include <cstdint>
10
+ 
11
+ /*!
12
+  * \brief html2md namespace
13
 diff -ruN html2md-org/src/html2md.cpp html2md-patched/src/html2md.cpp
14
---- html2md-org/src/html2md.cpp    2023-08-21 19:46:09.000000000 +0200
15
-+++ html2md-patched/src/html2md.cpp    2023-12-14 15:00:07.233043352 +0100
16
-@@ -188,8 +188,7 @@
17
+--- html2md-org/src/html2md.cpp    2025-02-13 09:38:03.000000000 +0100
18
++++ html2md-patched/src/html2md.cpp    2025-05-10 20:15:44.589932259 +0200
19
+@@ -186,8 +186,7 @@
20
    return this;
21
  }
22
  
23
@@ -11,7 +22,7 @@
24
    if (IsInIgnoredTag())
25
      return this;
26
  
27
-@@ -610,11 +609,11 @@
28
+@@ -607,11 +606,11 @@
29
  }
30
  
31
  void Converter::TagStrikethrought::OnHasLeftOpeningTag(Converter *c) {
32
dsnote-4.7.1.tar.gz/patches/openfst.patch -> dsnote-4.8.1.tar.gz/patches/openfst.patch Changed
16
 
1
@@ -1,3 +1,14 @@
2
+diff -ruN openfst-org/src/include/fst/bi-table.h openfst-patched/src/include/fst/bi-table.h
3
+--- openfst-org/src/include/fst/bi-table.h 2021-02-07 09:38:45.000000000 +0100
4
++++ openfst-patched/src/include/fst/bi-table.h 2025-05-10 20:35:24.699637425 +0200
5
+@@ -34,6 +34,7 @@
6
+ #include <fst/windows_defs.inc>
7
+ #include <unordered_map>
8
+ #include <unordered_set>
9
++#include <cstdint>
10
+ 
11
+ namespace fst {
12
+ 
13
 diff -ruN openfst-org/src/include/fst/fst.h openfst-patched/src/include/fst/fst.h
14
 --- openfst-org/src/include/fst/fst.h  2021-02-07 09:38:45.000000000 +0100
15
 +++ openfst-patched/src/include/fst/fst.h  2024-10-06 17:38:03.698500302 +0200
16
dsnote-4.8.1.tar.gz/patches/phonemizer.patch Added
64
 
1
@@ -0,0 +1,62 @@
2
+diff -ruN phonemizer-org/backend/espeak/api.py phonemizer-pathed/backend/espeak/api.py
3
+--- phonemizer-org/backend/espeak/api.py   2025-04-05 19:50:59.950166878 +0200
4
++++ phonemizer-pathed/backend/espeak/api.py    2025-04-05 19:59:15.371166561 +0200
5
+@@ -44,47 +44,11 @@
6
+         # set to None to avoid an AttributeError in _delete if the __init__
7
+         # method raises, will be properly initialized below
8
+         self._library = None
9
+-        
10
++
11
+         if data_path is not None:
12
+             data_path = str(data_path).encode('utf-8')
13
+ 
14
+-        # Because the library is not designed to be wrapped nor to be used in
15
+-        # multithreaded/multiprocess contexts (massive use of global variables)
16
+-        # we need a copy of the original library for each instance of the
17
+-        # wrapper... (see "man dlopen" on Linux/MacOS: we cannot load two times
18
+-        # the same library because a reference is then returned by dlopen). The
19
+-        # tweak is therefore to make a copy of the original library in a
20
+-        # different (temporary) directory.
21
+-        try:
22
+-            # load the original library in order to retrieve its full path?
23
+-            # Forced as str as it is required on Windows.
24
+-            espeak: CDLL = ctypes.cdll.LoadLibrary(str(library))
25
+-            library_path = self._shared_library_path(espeak)
26
+-            del espeak
27
+-        except OSError as error:
28
+-            raise RuntimeError(
29
+-                f'failed to load espeak library: {str(error)}') from None
30
+-
31
+-        # will be automatically destroyed after use
32
+-        self._tempdir = tempfile.mkdtemp()
33
+-
34
+-        # properly exit when the wrapper object is destroyed (see
35
+-        # https://docs.python.org/3/library/weakref.html#comparing-finalizers-with-del-methods).
36
+-        # But... weakref implementation does not work on windows so we register
37
+-        # the cleanup with atexit. This means that, on Windows, all the
38
+-        # temporary directories created by EspeakAPI instances will remain on
39
+-        # disk until the Python process exit.
40
+-        if sys.platform == 'win32':  # pragma: nocover
41
+-            atexit.register(self._delete_win32)
42
+-        else:
43
+-            weakref.finalize(self, self._delete, self._library, self._tempdir)
44
+-
45
+-        espeak_copy = pathlib.Path(self._tempdir) / library_path.name
46
+-        shutil.copy(library_path, espeak_copy, follow_symlinks=False)
47
+-
48
+-        # finally load the library copy and initialize it. 0x02 is
49
+-        # AUDIO_OUTPUT_SYNCHRONOUS in the espeak API
50
+-        self._library = ctypes.cdll.LoadLibrary(str(espeak_copy))
51
++        self._library = ctypes.cdll.LoadLibrary('/app/lib/libespeak-ng.so')
52
+         try:
53
+             if self._library.espeak_Initialize(0x02, 0, data_path, 0) <= 0:
54
+                 raise RuntimeError(  # pragma: nocover
55
+@@ -95,7 +59,7 @@
56
+ 
57
+         # the path to the original one (the copy is considered an
58
+         # implementation detail and is not exposed)
59
+-        self._library_path = library_path
60
++        self._library_path = '/app/lib/libespeak-ng.so'
61
+ 
62
+     def _delete_win32(self):  # pragma: nocover
63
+         # Windows does not support static methods with ctypes libraries
64
dsnote-4.8.1.tar.gz/patches/sam.patch Added
201
 
1
@@ -0,0 +1,378 @@
2
+diff -ruN sam-org/CMakeLists.txt sam-patched/CMakeLists.txt
3
+--- sam-org/CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100
4
++++ sam-patched/CMakeLists.txt 2025-01-07 20:47:53.295359003 +0100
5
+@@ -0,0 +1,23 @@
6
++cmake_minimum_required(VERSION 3.5)
7
++
8
++project(sam_api LANGUAGES C VERSION 1.0.0)
9
++
10
++set(BUILD_SHARED_LIBS OFF)
11
++set(CMAKE_POSITION_INDEPENDENT_CODE ON)
12
++
13
++file(GLOB_RECURSE sam_src src/*.c)
14
++
15
++add_library(${CMAKE_PROJECT_NAME} STATIC sam_api.c ${sam_src})
16
++
17
++# add prefix 'sam' to avoid symbol name colision with espeak
18
++target_compile_definitions(${CMAKE_PROJECT_NAME} PUBLIC
19
++    SetSpeed=sam_SetSpeed
20
++    speed=sam_speed)
21
++
22
++target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR} "src")
23
++set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES PUBLIC_HEADER "sam_api.h")
24
++
25
++install(TARGETS ${CMAKE_PROJECT_NAME}
26
++    LIBRARY DESTINATION lib
27
++    ARCHIVE DESTINATION lib
28
++    PUBLIC_HEADER DESTINATION include)
29
+diff -ruN sam-org/sam_api.c sam-patched/sam_api.c
30
+--- sam-org/sam_api.c  1970-01-01 01:00:00.000000000 +0100
31
++++ sam-patched/sam_api.c  2025-01-07 20:49:30.898331241 +0100
32
+@@ -0,0 +1,46 @@
33
++#include "sam_api.h"
34
++
35
++#include <stdio.h>
36
++#include <stdlib.h>
37
++#include <ctype.h>
38
++#include <string.h>
39
++
40
++#include "reciter.h"
41
++#include "sam.h"
42
++
43
++int debug = 0;
44
++
45
++int sam_text_to_u8_buff(const char* text, int speed, const char** buff, int* buff_length) {
46
++    if (text == NULL) return -1;
47
++
48
++    if (speed <= 0) speed = 72; // default speed
49
++
50
++    SetSpeed(speed);
51
++
52
++    size_t input_size = strlen(text) + 1;
53
++
54
++    char input256;
55
++    memset(input, 0, sizeof(input));
56
++
57
++    strncat(input, text, 255);
58
++    strncat(input, " ", 255);
59
++
60
++    for(int i=0; inputi != 0; ++i)
61
++        inputi = toupper((int)inputi);
62
++
63
++    strncat(input, "", 256);
64
++    if (!TextToPhonemes(input)) {
65
++        return SAM_ERROR;
66
++    }
67
++
68
++    SetInput(input);
69
++
70
++    if (!SAMMain()) {
71
++        return SAM_ERROR;
72
++    }
73
++
74
++    *buff = GetBuffer();
75
++    *buff_length = GetBufferLength() / 50;
76
++
77
++    return SAM_SUCCESS;;
78
++}
79
+diff -ruN sam-org/sam_api.h sam-patched/sam_api.h
80
+--- sam-org/sam_api.h  1970-01-01 01:00:00.000000000 +0100
81
++++ sam-patched/sam_api.h  2025-01-07 20:45:43.592573704 +0100
82
+@@ -0,0 +1,18 @@
83
++#ifndef SAM_API_H
84
++#define SAM_API_H
85
++
86
++#define SAM_API_EXPORT __attribute__((visibility("default")))
87
++#define SAM_SUCCESS 0
88
++#define SAM_ERROR 1
89
++
90
++#ifdef __cplusplus
91
++extern "C" {
92
++#endif
93
++
94
++int sam_text_to_u8_buff(const char* text, int speed, const char** buff, int* buff_length);
95
++
96
++#ifdef __cplusplus
97
++}
98
++#endif
99
++
100
++#endif  // SAM_API_H
101
+diff -ruN sam-org/src/main.c sam-patched/src/main.c
102
+--- sam-org/src/main.c 2020-02-09 18:46:33.000000000 +0100
103
++++ sam-patched/src/main.c 1970-01-01 01:00:00.000000000 +0100
104
+@@ -1,263 +0,0 @@
105
+-#include <stdio.h>
106
+-#include <stdlib.h>
107
+-#include <ctype.h>
108
+-#include <string.h>
109
+-
110
+-#include "reciter.h"
111
+-#include "sam.h"
112
+-#include "debug.h"
113
+-
114
+-#ifdef USESDL
115
+-#include <SDL.h>
116
+-#include <SDL_audio.h>
117
+-#endif
118
+-
119
+-void WriteWav(char* filename, char* buffer, int bufferlength)
120
+-{
121
+-    FILE *file = fopen(filename, "wb");
122
+-    if (file == NULL) return;
123
+-    //RIFF header
124
+-    fwrite("RIFF", 4, 1,file);
125
+-    unsigned int filesize=bufferlength + 12 + 16 + 8 - 8;
126
+-    fwrite(&filesize, 4, 1, file);
127
+-    fwrite("WAVE", 4, 1, file);
128
+-
129
+-    //format chunk
130
+-    fwrite("fmt ", 4, 1, file);
131
+-    unsigned int fmtlength = 16;
132
+-    fwrite(&fmtlength, 4, 1, file);
133
+-    unsigned short int format=1; //PCM
134
+-    fwrite(&format, 2, 1, file);
135
+-    unsigned short int channels=1;
136
+-    fwrite(&channels, 2, 1, file);
137
+-    unsigned int samplerate = 22050;
138
+-    fwrite(&samplerate, 4, 1, file);
139
+-    fwrite(&samplerate, 4, 1, file); // bytes/second
140
+-    unsigned short int blockalign = 1;
141
+-    fwrite(&blockalign, 2, 1, file);
142
+-    unsigned short int bitspersample=8;
143
+-    fwrite(&bitspersample, 2, 1, file);
144
+-
145
+-    //data chunk
146
+-    fwrite("data", 4, 1, file);
147
+-    fwrite(&bufferlength, 4, 1, file);
148
+-    fwrite(buffer, bufferlength, 1, file);
149
+-
150
+-    fclose(file);
151
+-}
152
+-
153
+-void PrintUsage()
154
+-{
155
+-    printf("usage: sam options Word1 Word2 ....\n");
156
+-    printf("options\n");
157
+-    printf("    -phonetic         enters phonetic mode. (see below)\n");
158
+-    printf("    -pitch number        set pitch value (default=64)\n");
159
+-    printf("    -speed number        set speed value (default=72)\n");
160
+-    printf("    -throat number        set throat value (default=128)\n");
161
+-    printf("    -mouth number        set mouth value (default=128)\n");
162
+-    printf("    -wav filename        output to wav instead of libsdl\n");
163
+-    printf("    -sing            special treatment of pitch\n");
164
+-    printf("    -debug            print additional debug messages\n");
165
+-    printf("\n");
166
+-
167
+-
168
+-    printf("     VOWELS                            VOICED CONSONANTS    \n");
169
+-    printf("IY           f(ee)t                    R        red        \n");
170
+-    printf("IH           p(i)n                     L        allow        \n");
171
+-    printf("EH           beg                       W        away        \n");
172
+-    printf("AE           Sam                       W        whale        \n");
173
+-    printf("AA           pot                       Y        you        \n");
174
+-    printf("AH           b(u)dget                  M        Sam        \n");
175
+-    printf("AO           t(al)k                    N        man        \n");
176
+-    printf("OH           cone                      NX       so(ng)        \n");
177
+-    printf("UH           book                      B        bad        \n");
178
+-    printf("UX           l(oo)t                    D        dog        \n");
179
+-    printf("ER           bird                      G        again        \n");
180
+-    printf("AX           gall(o)n                  J        judge        \n");
181
+-    printf("IX           dig(i)t                   Z        zoo        \n");
182
+-    printf("                       ZH       plea(s)ure    \n");
183
+-    printf("   DIPHTHONGS                          V        seven        \n");
184
+-    printf("EY           m(a)de                    DH       (th)en        \n");
185
+-    printf("AY           h(igh)                        \n");
186
+-    printf("OY           boy                        \n");
187
+-    printf("AW           h(ow)                     UNVOICED CONSONANTS    \n");
188
+-    printf("OW           slow                      S         Sam        \n");
189
+-    printf("UW           crew                      Sh        fish        \n");
190
+-    printf("                                       F         fish        \n");
191
+-    printf("                                       TH        thin        \n");
192
+-    printf(" SPECIAL PHONEMES                      P         poke        \n");
193
+-    printf("UL           sett(le) (=AXL)           T         talk        \n");
194
+-    printf("UM           astron(omy) (=AXM)        K         cake        \n");
195
+-    printf("UN           functi(on) (=AXN)         CH        speech        \n");
196
+-    printf("Q            kitt-en (glottal stop)    /H        a(h)ead    \n");
197
+-}
198
+-
199
+-#ifdef USESDL
200
+-
201
dsnote-4.8.1.tar.gz/patches/xdo.patch Added
22
 
1
@@ -0,0 +1,20 @@
2
+diff -ruN xdo-org/xdo.c xdo-patched/xdo.c
3
+--- xdo-org/xdo.c  2024-10-16 08:09:02.000000000 +0200
4
++++ xdo-patched/xdo.c  2025-06-22 11:07:29.550099221 +0200
5
+@@ -978,7 +978,6 @@
6
+ /* XXX: Return proper code if errors found */
7
+ int xdo_enter_text_window(const xdo_t *xdo, Window window, const char *string, useconds_t delay) {
8
+   /* Keep the original delay for key up events, but use 50000 microseconds (50ms) for key down */
9
+-  useconds_t down_delay = 50000; 
10
+ 
11
+   charcodemap_t key;
12
+   setlocale(LC_CTYPE,"");
13
+@@ -997,7 +996,7 @@
14
+     }
15
+ 
16
+     /* Send the key press event with the fixed 50ms delay */
17
+-    xdo_send_keysequence_window_list_do(xdo, window, &key, 1, True, NULL, down_delay);
18
++    xdo_send_keysequence_window_list_do(xdo, window, &key, 1, True, NULL, delay);
19
+     key.needs_binding = 0;
20
+     /* Send the key release event with the user-specified delay */
21
+     xdo_send_keysequence_window_list_do(xdo, window, &key, 1, False, NULL, delay);
22
dsnote-4.8.1.tar.gz/resources Added
2
 
1
+(directory)
2
dsnote-4.8.1.tar.gz/resources/beep-end-listen.wav Added
dsnote-4.8.1.tar.gz/resources/beep-start-listen.wav Added
dsnote-4.8.1.tar.gz/resources/voice-1.opus Added
dsnote-4.8.1.tar.gz/resources/voice-2.opus Added
dsnote-4.7.1.tar.gz/sfos/harbour-dsnote.spec -> dsnote-4.8.1.tar.gz/sfos/harbour-dsnote.spec Changed
23
 
1
@@ -6,9 +6,11 @@
2
 %define _unpackaged_files_terminate_build 0
3
 # << macros
4
 
5
+%global debug_package %{nil}
6
+
7
 Summary:        Speech Note
8
-Version:        4.7.0
9
-Release:        1
10
+Version:        4.8.1
11
+Release:        2
12
 Group:          Qt/Qt
13
 License:        LICENSE
14
 URL:            https://github.com/mkiol/dsnote
15
@@ -34,6 +36,7 @@
16
 BuildRequires:  git
17
 BuildRequires:  boost-devel
18
 BuildRequires:  meson
19
+BuildRequires:  patchelf
20
 
21
 %description
22
 Speech Note let you take, read and translate notes in multiple languages.
23
dsnote-4.7.1.tar.gz/sfos/qml/AddTextDialog.qml -> dsnote-4.8.1.tar.gz/sfos/qml/AddTextDialog.qml Changed
15
 
1
@@ -18,10 +18,12 @@
2
     modal: true
3
 
4
     width: parent.width
5
-    height: Theme.itemSizeExtraLarge + Theme.paddingLarge
6
+    height: column.height + 2 * Theme.paddingLarge
7
     dock: Dock.Bottom
8
 
9
     Column {
10
+        id: column
11
+
12
         spacing: Theme.paddingLarge
13
         y: Theme.paddingMedium
14
         width: parent.width - 2 * Theme.paddingMedium
15
dsnote-4.7.1.tar.gz/sfos/qml/ChangelogPage.qml -> dsnote-4.8.1.tar.gz/sfos/qml/ChangelogPage.qml Changed
188
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2021-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2021-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -33,16 +33,82 @@
8
             }
9
 
10
             LogItem {
11
-                text: "<p>" + qsTr("General") + ":</p>
12
+                text: "<p>" + qsTr("Translator") + "</p>
13
+                <ul>
14
+                <li>Fix: Model download error for Portuguese, Dutch, Persian, Norwegian and Icelandic languages.</li>
15
+                <li>Updated models with improved accuracy: German to English, Dutch to English, English to Ukrainian,
16
+                    English to Hungarian, English to Catalan, Catalan to English, English to Lithuanian, English to Latvian,
17
+                    English to Slovenian, Slovenian to English, English to Slovak, English to Russian.</li>
18
+                <li>New models: Azerbaijani to English, Belarusian to English, Bengali to English, Gujarati to English,
19
+                    Hebrew to English, Hindi to English, Kannada to English, Malayalam to English, Malay to English,
20
+                    Albanian to English, Tamil to English.</li>
21
+                </ul>
22
+                <p>" + qsTr("User Interface") + "</p>
23
+                <ul>
24
+                <li><i>Speech Note</i> has been translated into German language.</li>
25
+                </ul>"
26
+            }
27
+
28
+            SectionHeader {
29
+                text: qsTr("Version %1").arg("4.8.0")
30
+            }
31
+
32
+            LogItem {
33
+                text: "<p>" + qsTr("User Interface") + "</p>
34
+                <ul>
35
+                <li><i>Speech Note</i> has been translated into Arabic, Chinese, Catalan, Spanish, Turkish and French-Canadian languages.</li>
36
+                </ul>
37
+                <p>" + qsTr("Speech to Text") + "</p>
38
+                <ul>
39
+                <li><i><a href='https://huggingface.co/KBLab'>KBLab Whisper</a></i> models for Swedish.
40
+                    The National Library of Sweden has released fine-tuned STT models trained on its library collections.
41
+                    The models have significantly improved accuracy compared to regular Whisper models.
42
+                    Even \"Tiny\" model provides decent quality.</li>
43
+                <li><i><a href='https://keyboard.futo.org/voice-input-models'>FUTO<a/></i> Whisper models.
44
+                    New models used in the FUTO mobile keyboard app.</li>
45
+                <li>Using an existing note as the initial context in decoding.
46
+                    This has the potential to improve transcription quality and reduce \"hallucination\" problem.
47
+                    If you observe a degradation in quality, turn off the <i>Use note as context</i> option.</li>
48
+                <li>Option to pause listening while processing.
49
+                    This option can be useful when <i>Listening mode</i> is <i>Always on</i>.
50
+                    By default, listening continues even when a piece of audio data is being processed.
51
+                    Using this option, you can temporarily pause listening for the duration of processing.</li>
52
+                <li>Option to play an audible tone when starting and stopping listening</li>
53
+                </ul>
54
+                <p>" + qsTr("Text to Speech") + "</p>
55
+                <ul>
56
+                <li>S.A.M. TTS engine. S.A.M. is a small speech synthesizer designed for the Commodore 64.
57
+                    It features a robotic voice that evokes a strong sense of nostalgia.
58
+                    The S.A.M. voice is available in English only.</li>
59
+                <li><i>Normalize audio</i> setting option.
60
+                    Use this option to enable/disable audio volume normalization.
61
+                    The volume is normalized independently for each sentence, which can lead to unstable volume levels in different sentences.
62
+                    Disable this option if you observe this problem.</li>
63
+                <li>New <i>Piper</i> voices for Dutch, Finnish, German and Luxembourgish</li>
64
+                <li>New <i>RHVoice</i> voice for Spanish</li>
65
+                <li>Updated <i>RHVoice</i> voice for Czech</li>
66
+                </ul>
67
+                <p>" + qsTr("Translator") + "</p>
68
+                <ul>
69
+                <li>New models: English to Chinese, English to Arabic, Arabic to English, English to Korean, English to Japanese</li>
70
+                </ul>"
71
+            }
72
+
73
+            SectionHeader {
74
+                text: qsTr("Version %1").arg("4.7.0")
75
+            }
76
+
77
+            LogItem {
78
+                text: "<p>" + qsTr("General") + "</p>
79
                 <ul>
80
                 <li>New mode for replacing the current note instead of appending new text to it.
81
                     When the <i>Replace an existing note</i> option is set, whenever new text is added, it will replace the existing note.</li>
82
                 </ul>
83
-                <p>" + qsTr("User Interface") + ":</p>
84
+                <p>" + qsTr("User Interface") + "</p>
85
                 <ul>
86
                 <li><i>Speech Note</i> has been translated into Slovenian language.</li>
87
                 </ul>
88
-                <p>" + qsTr("Speech to Text") + ":</p>
89
+                <p>" + qsTr("Speech to Text") + "</p>
90
                 <ul>
91
                 <li>Settings option <i>Profile</i> which allows you to change <i>WhisperCpp</i> processing parameters.
92
                     There are two profiles to choose from: <i>Best Performance</i>, <i>Best Quality</i>.</li>
93
@@ -50,11 +116,11 @@
94
                     To enable, use the option in the settings (<i>Speech to Text</i> &rarr; <i>Echo mode</i>).</li>
95
                 <li>Update the <i>whisper.cpp</i> library to version 1.7.1. This provides a 10% increase in STT speed with <i>WhisperCpp</i> models.</li>
96
                 </ul>
97
-                <p>" + qsTr("Text to Speech") + ":</p>
98
+                <p>" + qsTr("Text to Speech") + "</p>
99
                 <ul>
100
                 <li>New <i>Piper</i> voice for Latvian</li>
101
                 </ul>
102
-                <p>" + qsTr("Translator") + ":</p>
103
+                <p>" + qsTr("Translator") + "</p>
104
                 <ul>
105
                 <li>New models: English to Finnish, English to Turkish, English to Swedish, Swedish to English,
106
                     English to Slovak, English to Indonesian, English to Romanian, English to Greek, Chinese to English</li>
107
@@ -67,11 +133,11 @@
108
             }
109
 
110
             LogItem {
111
-                text: "<p>" + qsTr("User Interface") + ":</p>
112
+                text: "<p>" + qsTr("User Interface") + "</p>
113
                 <ul>
114
                 <li>Swedish translation has been updated.</li>
115
                 </ul>
116
-                <p>" + qsTr("Translator") + ":</p>
117
+                <p>" + qsTr("Translator") + "</p>
118
                 <ul>
119
                 <li>New models: English to Latvian, English to Danish, English to Croatian, English to Slovenian,
120
                     Indonesian to English, Romanian to English</li>
121
@@ -84,7 +150,7 @@
122
             }
123
 
124
             LogItem {
125
-                text: "<p>" + qsTr("User Interface") + ":</p>
126
+                text: "<p>" + qsTr("User Interface") + "</p>
127
                 <ul>
128
                 <li><i>Speech Note</i> has been translated into Norwegian language.</li>
129
                 <li>Grouped models.
130
@@ -94,7 +160,7 @@
131
                     To simplify the user interface, the subtitle options is not visible by default.
132
                     To enable them, use the <i>Subtitles support</i> option in the settings.</li>
133
                 </ul>
134
-                <p>" + qsTr("Speech to Text") + ":</p>
135
+                <p>" + qsTr("Speech to Text") + "</p>
136
                 <ul>
137
                 <li>The name of the all Whisper models has been changed to <i>WhisperCpp</i> to better reflect the engine behind them.
138
                     Whisper is currently supported by the <i>WhisperCpp</i> engine, which is optimized for best performance.</li>
139
@@ -111,13 +177,13 @@
140
                     such as processing time and audio length. This can be useful for comparing the performance of different models,
141
                     engines and their parameters. Option works only with <i>WhisperCpp</i> engine.
142
                 </ul>
143
-                <p>" + qsTr("Text to Speech") + ":</p>
144
+                <p>" + qsTr("Text to Speech") + "</p>
145
                 <ul>
146
                 <li>Welsh language. New language is enabled with <i>Piper</i> voice.</li>
147
                 <li>New <i>Piper</i> voices for Spanish, Italian and English</li>
148
                 <li>New <i>RHVoice</i> voices for Slovak and Croatian</li>
149
                 </ul>
150
-                <p>" + qsTr("Translator") + ":</p>
151
+                <p>" + qsTr("Translator") + "</p>
152
                 <ul>
153
                 <li>New button for switching languages. <i>Switch languages</i> button have been placed is translated text area.</li>
154
                 <li>New models: English to Lithuanian, Croatian to English, Latvian to English, Danish to English, Serbian to English,
155
@@ -131,7 +197,7 @@
156
             }
157
 
158
             LogItem {
159
-                text: "<p>" + qsTr("User Interface") + ":</p>
160
+                text: "<p>" + qsTr("User Interface") + "</p>
161
                 <ul>
162
                 <li>Import subtitles in many formats and subtitles embedded into video file.
163
                     You can import and export subtitles in SRT, WebVTT and ASS formats.
164
@@ -148,12 +214,12 @@
165
                 <li><i>Speech Note</i> has been translated into Ukrainian and Russian languages.</li>
166
                 <li>Fix: Cancellation was blocking the user interface.</li>
167
                 </ul>
168
-                <p>" + qsTr("Speech to Text") + ":</p>
169
+                <p>" + qsTr("Speech to Text") + "</p>
170
                 <ul>
171
                 <li>Subtitles support in STT. To generate timestamped text in SRT format, change the text format to <i>SRT Subtitles</i> using
172
                     the button at the bottom of the text area. Check the settings to find more subtitle options.</li>
173
                 </ul>
174
-                <p>" + qsTr("Text to Speech") + ":</p>
175
+                <p>" + qsTr("Text to Speech") + "</p>
176
                 <ul>
177
                 <li>Speech synchronized with subtitle timestamps in TTS. When the text format is set to <i>SRT Subtitles</i>,
178
                     the generated speech will be synchronized with the subtitle timestamps.
179
@@ -165,7 +231,7 @@
180
                     This may be useful for creating voice overs.</li>
181
                 <li>Speech audio is always normalized after TTS processing.</li>
182
                 </ul>
183
-                <p>" + qsTr("Translator") + ":</p>
184
+                <p>" + qsTr("Translator") + "</p>
185
                 <ul>
186
                 <li>New models: Greek to English, Maltese to English,
187
                     Slovenian to English, Turkish to English, English to Catalan</li>
188
dsnote-4.7.1.tar.gz/sfos/qml/MainToolBar.qml -> dsnote-4.8.1.tar.gz/sfos/qml/MainToolBar.qml Changed
25
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -15,7 +15,7 @@
8
 PullDownMenu {
9
     id: root
10
 
11
-    busy: app.busy || service.busy || app.state !== DsnoteApp.StateIdle
12
+    busy: app.busy || service.busy || (app.state !== DsnoteApp.StateIdle && app.state !== DsnoteApp.StateNotConfigured)
13
 
14
     MenuItem {
15
         text: qsTr("About %1").arg(APP_NAME)
16
@@ -28,7 +28,7 @@
17
     }
18
 
19
     MenuItem {
20
-        text: qsTr("Languages")
21
+        text: qsTr("Languages and Models")
22
         onClicked: pageStack.push(Qt.resolvedUrl("LangsPage.qml"))
23
     }
24
 
25
dsnote-4.7.1.tar.gz/sfos/qml/Notepad.qml -> dsnote-4.8.1.tar.gz/sfos/qml/Notepad.qml Changed
10
 
1
@@ -106,7 +106,7 @@
2
                      !_noteTextArea.textArea.highlighted
3
             text: qsTr("Neither Speech to Text nor Text to Speech model has been set up yet.") + " " +
4
                   qsTr("Go to the %1 to download models for the languages you intend to use.")
5
-                    .arg("<i>" + qsTr("Languages") + "</i>")
6
+                    .arg("<i>" + qsTr("Languages and Models") + "</i>")
7
         }
8
     }
9
 
10
dsnote-4.7.1.tar.gz/sfos/qml/SettingsPage.qml -> dsnote-4.8.1.tar.gz/sfos/qml/SettingsPage.qml Changed
67
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2021-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2021-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -198,6 +198,40 @@
8
                         }
9
 
10
                         TextSwitch {
11
+                            checked: _settings.stt_use_note_as_prompt
12
+                            automaticCheck: false
13
+                            text: qsTr("Use note as context")
14
+                            onClicked: {
15
+                                _settings.stt_use_note_as_prompt = !_settings.stt_use_note_as_prompt
16
+                            }
17
+                            description: qsTr("Use an existing note as the initial context in decoding.") + " " +
18
+                                         qsTr("The option works only with %1 models.").arg("<i>WhisperCpp</i>")
19
+                        }
20
+
21
+                        TextSwitch {
22
+                            checked: _settings.stt_clear_mic_audio_when_decoding
23
+                            automaticCheck: false
24
+                            text: qsTr("Pause listening while processing")
25
+                            onClicked: {
26
+                                _settings.stt_clear_mic_audio_when_decoding = !_settings.stt_clear_mic_audio_when_decoding
27
+                            }
28
+                            description: qsTr("Temporarily pause listening for the duration of audio processing.") + " " +
29
+                                         qsTr("This option can be useful when %1 is %2.")
30
+                                            .arg("<i>" + qsTr("Listening mode") + "</i>")
31
+                                            .arg("<i>" + qsTr("Always on") + "</i>")
32
+                        }
33
+
34
+                        TextSwitch {
35
+                            checked: _settings.stt_play_beep
36
+                            automaticCheck: false
37
+                            text: qsTr("Play tone when starting and stopping listening")
38
+                            onClicked: {
39
+                                _settings.stt_play_beep = !_settings.stt_play_beep
40
+                            }
41
+                            description: qsTr("Play an audible tone when starting and stopping listening.")
42
+                        }
43
+
44
+                        TextSwitch {
45
                             checked: _settings.stt_insert_stats
46
                             automaticCheck: false
47
                             text: qsTr("Insert statistics")
48
@@ -418,6 +452,18 @@
49
                             }
50
                         }
51
 
52
+                        TextSwitch {
53
+                            checked: _settings.tts_normalize_audio
54
+                            automaticCheck: false
55
+                            text: qsTr("Normalize audio")
56
+                            description: qsTr("The volume of the audio will be normalized.") + " " +
57
+                                         qsTr("The volume is normalized independently for each sentence, which can lead to unstable volume levels in different sentences.") + " " +
58
+                                         qsTr("Disable this option if you observe this problem.")
59
+                            onClicked: {
60
+                                _settings.tts_normalize_audio = !_settings.tts_normalize_audio
61
+                            }
62
+                        }
63
+
64
                         SectionHeader {
65
                             visible: _settings.subtitles_support
66
                             text: qsTr("Subtitles")
67
dsnote-4.7.1.tar.gz/sfos/qml/Translator.qml -> dsnote-4.8.1.tar.gz/sfos/qml/Translator.qml Changed
10
 
1
@@ -74,7 +74,7 @@
2
         enabled: !app.mnt_configured
3
         text: qsTr("Translator model has not been set up yet.") + " " +
4
               qsTr("Go to the %1 to download models for the languages you intend to use.")
5
-                .arg("<i>" + qsTr("Languages") + "</i>")
6
+                .arg("<i>" + qsTr("Languages and Models") + "</i>")
7
     }
8
 
9
     Column {
10
dsnote-4.7.1.tar.gz/src/app_server.cpp -> dsnote-4.8.1.tar.gz/src/app_server.cpp Changed
86
 
1
@@ -80,8 +80,20 @@
2
     if (!options.action.isEmpty()) {
3
         qDebug() << "dbus client calling InvokeAction on another instance:"
4
                  << options.action;
5
-        auto result =
6
-            iface.InvokeAction(options.action, QDBusVariant{options.extra});
7
+
8
+        QVariantMap arguments;
9
+        if (!options.model_id.isEmpty()) {
10
+            arguments.insert("model-id", options.model_id);
11
+        }
12
+        if (!options.text.isEmpty()) {
13
+            arguments.insert("text", options.text);
14
+        }
15
+        if (!options.output_file.isEmpty()) {
16
+            arguments.insert("output-file",
17
+                             QFileInfo{options.output_file}.absoluteFilePath());
18
+        }
19
+
20
+        auto result = iface.InvokeAction(options.action, arguments);
21
         result.waitForFinished();
22
 
23
         if (result.isValid()) {
24
@@ -119,7 +131,7 @@
25
         auto max_id_size = (const QVariantList &models) {
26
             return std::accumulate(
27
                 models.cbegin(), models.cend(), 0, (int size, const auto &m) {
28
-                    QVariantMap model = qdbus_cast<QVariantMap>(
29
+                    auto model = qdbus_cast<QVariantMap>(
30
                         m.template value<QDBusArgument>());
31
                     return std::max(model.contains("id")
32
                                         ? model.value("id").toString().size()
33
@@ -133,8 +145,7 @@
34
             fmt::print("Available {} models: {}\n", name, models.size());
35
 
36
             for (const auto &m : models) {
37
-                QVariantMap model =
38
-                    qdbus_cast<QVariantMap>(m.value<QDBusArgument>());
39
+                auto model = qdbus_cast<QVariantMap>(m.value<QDBusArgument>());
40
                 if (!model.contains("id")) continue;
41
                 fmt::print(fmt::format("\t{{:{}}} \"{{}}\"\n",
42
                                        max_id_size > 0 ? max_id_size : 10),
43
@@ -258,19 +269,20 @@
44
 }
45
 
46
 QVariantMap app_server::InvokeAction(const QString &action_name,
47
-                                     const QDBusVariant &argument) {
48
+                                     const QVariantMap &arguments) {
49
     qDebug() << "dbus app InvokeAction called:" << action_name;
50
 
51
-    return invoke_action(action_name, argument.variant());
52
+    return invoke_action(action_name, arguments);
53
 }
54
 
55
-QVariantMap app_server::invoke_action(const QString &action_name,
56
-                                      const QVariant &argument) {
57
+QVariantMap app_server::invoke_action(const QString &action_id,
58
+                                      const QVariantMap &arguments) {
59
     QVariantMap map;
60
 
61
     QMetaObject::invokeMethod(
62
-        m_dsnote_app, "execute_action_name", Q_RETURN_ARG(QVariantMap, map),
63
-        Q_ARG(QString, action_name), Q_ARG(QString, argument.toString()));
64
+        m_dsnote_app, "execute_action_id", Q_RETURN_ARG(QVariantMap, map),
65
+        Q_ARG(QString, action_id), Q_ARG(QVariantMap, arguments),
66
+        Q_ARG(bool, false));
67
 
68
     return map;
69
 }
70
@@ -312,9 +324,12 @@
71
     maybe_unused const QVariantMap &platform_data) {
72
     qDebug() << "dbus app ActivateAction called:" << action_name;
73
 
74
-    invoke_action(action_name, parameter.isEmpty()
75
-                                   ? QString{}
76
-                                   : parameter.front().toString());
77
+    QVariantMap argumets;
78
+    if (parameter.size() > 2) argumets.insert("output-file", parameter.at(2));
79
+    if (parameter.size() > 1) argumets.insert("text", parameter.at(1));
80
+    if (parameter.size() > 0) argumets.insert("model-id", parameter.at(0));
81
+
82
+    invoke_action(action_name, argumets);
83
 }
84
 
85
 void app_server::Open(const QStringList &uris,
86
dsnote-4.7.1.tar.gz/src/app_server.hpp -> dsnote-4.8.1.tar.gz/src/app_server.hpp Changed
21
 
1
@@ -44,7 +44,7 @@
2
                           const QVariantMap &platform_data);
3
     // dbus dsnote api
4
     Q_INVOKABLE QVariantMap InvokeAction(const QString &action_name,
5
-                                         const QDBusVariant &argument);
6
+                                         const QVariantMap &arguments);
7
     Q_INVOKABLE QVariantList GetSttModels();
8
     Q_INVOKABLE QVariantList GetTtsModels();
9
 
10
@@ -81,8 +81,8 @@
11
     QVariantMap active_tts_model() const;
12
     int state() const;
13
     int task_state() const;
14
-    QVariantMap invoke_action(const QString &action_name,
15
-                              const QVariant &argument);
16
+    QVariantMap invoke_action(const QString &action_id,
17
+                              const QVariantMap &arguments);
18
    private Q_SLOTS:
19
     void handle_active_stt_model_change();
20
     void handle_active_tts_model_change();
21
dsnote-4.7.1.tar.gz/src/astrunc/astrunc.h -> dsnote-4.8.1.tar.gz/src/astrunc/astrunc.h Changed
17
 
1
@@ -62,6 +62,7 @@
2
         LA,       /** Latin         - 拉丁         */
3
         LV,       /** Latvia        - 拉脱维亚     */
4
         MK,       /** Macedonia     - 马其顿       */
5
+        ML,       /** Malayalam                   */
6
         MS,       /** Malay         - 马来         */
7
         MR,       /** Mara          - 马拉地       */
8
         MN,       /** Mongolia      - 蒙古         */
9
@@ -335,6 +336,7 @@
10
                     (astrunc::access::LA  == __lang) ||
11
                     (astrunc::access::LV  == __lang) ||
12
                     (astrunc::access::MK  == __lang) ||
13
+                    (astrunc::access::ML  == __lang) ||
14
                     (astrunc::access::MS  == __lang) ||
15
                     (astrunc::access::MR  == __lang) ||
16
                     (astrunc::access::NL  == __lang) ||
17
dsnote-4.7.1.tar.gz/src/audio_source.h -> dsnote-4.8.1.tar.gz/src/audio_source.h Changed
14
 
1
@@ -31,8 +31,12 @@
2
     virtual void stop() = 0;
3
     virtual void slowdown() = 0;
4
     virtual void speedup() = 0;
5
+    bool stopped() const { return m_stopped; }
6
     ~audio_source() override = default;
7
 
8
+   protected:
9
+    bool m_stopped = false;
10
+
11
    signals:
12
     void audio_available();
13
     void error();
14
dsnote-4.7.1.tar.gz/src/cmd_options.hpp -> dsnote-4.8.1.tar.gz/src/cmd_options.hpp Changed
14
 
1
@@ -40,9 +40,11 @@
2
     std::underlying_type_t<role_flag> models_to_print_roles = role_none;
3
     std::underlying_type_t<role_flag> active_model_to_print_role = role_none;
4
     QString action;
5
-    QString extra;
6
+    QString text;
7
+    QString model_id;
8
     QStringList files;
9
     QString log_file;
10
+    QString output_file;
11
 };
12
 }  // namespace cmd
13
 
14
dsnote-4.7.1.tar.gz/src/coqui_engine.cpp -> dsnote-4.8.1.tar.gz/src/coqui_engine.cpp Changed
146
 
1
@@ -46,6 +46,11 @@
2
     auto task = py_executor::instance()->execute(&() {
3
         try {
4
             m_model.reset();
5
+            m_uroman.reset();
6
+
7
+            // release mem
8
+            py::module_::import("gc").attr("collect")();
9
+            py::module_::import("torch").attr("cuda").attr("empty_cache")();
10
         } catch (const std::exception& err) {
11
             LOGE("py error: " << err.what());
12
         }
13
@@ -147,6 +152,35 @@
14
     return vocoder ? vocoder_config_temp_file : config_temp_file;
15
 }
16
 
17
+bool coqui_engine::register_cancel_hook(const char* field, py::object obj) {
18
+    // run only under py thread
19
+    auto hook =
20
+        py::cpp_function{this(maybe_unused const py::args& args,
21
+                                maybe_unused const py::kwargs& kwargs) {
22
+            if (is_shutdown()) {
23
+                throw std::runtime_error{"engine shutdown"};
24
+            }
25
+        }};
26
+
27
+    if (field == nullptr) {
28
+        if (py::hasattr(obj, "register_forward_hook"))
29
+            obj.attr("register_forward_hook")(hook);
30
+        if (py::hasattr(obj, "register_forward_pre_hook"))
31
+            obj.attr(field).attr("register_forward_pre_hook")(hook);
32
+        return true;
33
+    }
34
+
35
+    if (py::hasattr(obj, field)) {
36
+        if (py::hasattr(obj.attr(field), "register_forward_hook"))
37
+            obj.attr(field).attr("register_forward_hook")(hook);
38
+        if (py::hasattr(obj.attr(field), "register_forward_pre_hook"))
39
+            obj.attr(field).attr("register_forward_pre_hook")(hook);
40
+        return true;
41
+    }
42
+
43
+    return false;
44
+}
45
+
46
 void coqui_engine::create_model() {
47
     auto task = py_executor::instance()->execute(&() {
48
         auto model_file = find_file_with_name_prefix(
49
@@ -193,6 +227,11 @@
50
                               << m_config.gpu_device.id);
51
 
52
         try {
53
+            if (m_config.has_option('r')) {
54
+                // uroman is required
55
+                m_uroman = py::module_::import("uroman").attr("Uroman")();
56
+            }
57
+
58
             auto api = py::module_::import("TTS.utils.synthesizer");
59
 
60
             m_model = api.attr("Synthesizer")(
61
@@ -222,28 +261,35 @@
62
                                     : static_cast<py::object>(py::none()),
63
                 "use_cuda"_a = use_cuda);
64
 
65
-            if (m_model) {
66
-                auto model = m_model->attr("tts_model");
67
-
68
-                auto model_class_name =
69
-                    model.get_type().attr("__name__").cast<std::string>();
70
-                LOGD("model class name: " << model_class_name);
71
+            auto model = m_model->attr("tts_model");
72
+
73
+            auto model_class_name =
74
+                model.get_type().attr("__name__").cast<std::string>();
75
+            LOGD("model class name: " << model_class_name);
76
+
77
+            if (py::hasattr(model, "length_scale")) {
78
+                m_initial_length_scale =
79
+                    model.attr("length_scale").cast<float>();
80
+                LOGD("initial length scale: " << *m_initial_length_scale);
81
+            } else if (py::hasattr(model, "duration_threshold")) {
82
+                m_initial_duration_threshold =
83
+                    model.attr("duration_threshold").cast<float>();
84
+                LOGD("initial duration threshold: "
85
+                     << *m_initial_duration_threshold);
86
+            } else if (model_class_name == "Xtts") {
87
+                m_speed_supported = true;
88
+            } else {
89
+                LOGD("model does not have initial speed");
90
+            }
91
 
92
-                if (py::hasattr(model, "length_scale")) {
93
-                    m_initial_length_scale =
94
-                        model.attr("length_scale").cast<float>();
95
-                    LOGD("initial length scale: " << *m_initial_length_scale);
96
-                } else if (py::hasattr(model, "duration_threshold")) {
97
-                    m_initial_duration_threshold =
98
-                        model.attr("duration_threshold").cast<float>();
99
-                    LOGD("initial duration threshold: "
100
-                         << *m_initial_duration_threshold);
101
-                } else if (model_class_name == "Xtts") {
102
-                    m_speed_supported = true;
103
-                } else {
104
-                    LOGD("model does not have initial speed");
105
-                }
106
+            if (register_cancel_hook("gpt", model)) {
107
+                register_cancel_hook("gpt_inference", model.attr("gpt"));
108
             }
109
+            register_cancel_hook("hifigan_decoder", model);
110
+            register_cancel_hook("text_encoder", model);
111
+            register_cancel_hook("posterior_encoder", model);
112
+            register_cancel_hook("flow", model);
113
+            register_cancel_hook("waveform_decoder", model);
114
         } catch (const std::exception& err) {
115
             LOGE("py error: " << err.what());
116
             return false;
117
@@ -291,8 +337,18 @@
118
                 }
119
             }
120
 
121
+            auto text_u = & {
122
+                if (m_uroman) {
123
+                    return m_uroman
124
+                        ->attr("romanize_string")(
125
+                            "s"_a = text, "lcode"_a = m_config.lang_code)
126
+                        .cast<std::string>();
127
+                }
128
+                return text;
129
+            }();
130
+
131
             auto wav = m_model->attr("tts")(
132
-                "text"_a = text,
133
+                "text"_a = text_u,
134
                 "speaker_name"_a =
135
                     m_config.speaker_id.empty()
136
                         ? static_cast<py::object>(py::none())
137
@@ -308,6 +364,8 @@
138
                 "style_text"_a = py::none(),
139
                 "reference_speaker_name"_a = py::none(), "speed"_a = speed_f);
140
 
141
+            if (is_shutdown()) throw std::runtime_error{"engine shutdown"};
142
+
143
             m_model->attr("save_wav")("wav"_a = wav, "path"_a = out_file);
144
         } catch (const std::exception& err) {
145
             LOGE("py error: " << err.what());
146
dsnote-4.7.1.tar.gz/src/coqui_engine.hpp -> dsnote-4.8.1.tar.gz/src/coqui_engine.hpp Changed
17
 
1
@@ -32,6 +32,7 @@
2
         "/tmp/tmp_coqui_vocoder_config.json";
3
 
4
     std::optional<py::object> m_model;
5
+    std::optional<py::object> m_uroman;
6
     std::optional<float> m_initial_length_scale;
7
     std::optional<float> m_initial_duration_threshold;
8
     bool m_speed_supported = false;
9
@@ -44,6 +45,7 @@
10
     void stop();
11
     static std::string fix_config_file(const std::string& config_file,
12
                                        const std::string& dir, bool vocoder);
13
+    bool register_cancel_hook(const char* field, py::object obj);
14
 };
15
 
16
 #endif  // COQUI_ENGINE_HPP
17
dsnote-4.8.1.tar.gz/src/dbus_portal_globalshortcuts_inf.cpp Added
28
 
1
@@ -0,0 +1,26 @@
2
+/*
3
+ * This file was generated by qdbusxml2cpp version 0.8
4
+ * Command line was: qdbusxml2cpp ../dbus/org.freedesktop.portal.GlobalShortcuts.xml -p dbus_portal_globalshortcuts_inf
5
+ *
6
+ * qdbusxml2cpp is Copyright (C) 2023 The Qt Company Ltd.
7
+ *
8
+ * This is an auto-generated file.
9
+ * This file may have been hand-edited. Look for HAND-EDIT comments
10
+ * before re-generating it.
11
+ */
12
+
13
+#include "dbus_portal_globalshortcuts_inf.h"
14
+
15
+/*
16
+ * Implementation of interface class OrgFreedesktopPortalGlobalShortcutsInterface
17
+ */
18
+
19
+OrgFreedesktopPortalGlobalShortcutsInterface::OrgFreedesktopPortalGlobalShortcutsInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)
20
+    : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent)
21
+{
22
+}
23
+
24
+OrgFreedesktopPortalGlobalShortcutsInterface::~OrgFreedesktopPortalGlobalShortcutsInterface()
25
+{
26
+}
27
+
28
dsnote-4.8.1.tar.gz/src/dbus_portal_globalshortcuts_inf.h Added
79
 
1
@@ -0,0 +1,77 @@
2
+/*
3
+ * This file was generated by qdbusxml2cpp version 0.8
4
+ * Command line was: qdbusxml2cpp ../dbus/org.freedesktop.portal.GlobalShortcuts.xml -p dbus_portal_globalshortcuts_inf
5
+ *
6
+ * qdbusxml2cpp is Copyright (C) 2023 The Qt Company Ltd.
7
+ *
8
+ * This is an auto-generated file.
9
+ * Do not edit! All changes made to it will be lost.
10
+ */
11
+
12
+#ifndef DBUS_PORTAL_GLOBALSHORTCUTS_INF_H
13
+#define DBUS_PORTAL_GLOBALSHORTCUTS_INF_H
14
+
15
+#include <QtCore/QObject>
16
+#include <QtCore/QByteArray>
17
+#include <QtCore/QList>
18
+#include <QtCore/QMap>
19
+#include <QtCore/QString>
20
+#include <QtCore/QStringList>
21
+#include <QtCore/QVariant>
22
+#include <QtDBus/QtDBus>
23
+
24
+/*
25
+ * Proxy class for interface org.freedesktop.portal.GlobalShortcuts
26
+ */
27
+class OrgFreedesktopPortalGlobalShortcutsInterface: public QDBusAbstractInterface
28
+{
29
+    Q_OBJECT
30
+public:
31
+    static inline const char *staticInterfaceName()
32
+    { return "org.freedesktop.portal.GlobalShortcuts"; }
33
+
34
+public:
35
+    OrgFreedesktopPortalGlobalShortcutsInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr);
36
+
37
+    ~OrgFreedesktopPortalGlobalShortcutsInterface();
38
+
39
+    Q_PROPERTY(uint version READ version)
40
+    inline uint version() const
41
+    { return qvariant_cast< uint >(property("version")); }
42
+
43
+public Q_SLOTS: // METHODS
44
+    inline QDBusPendingReply<QDBusObjectPath> BindShortcuts(const QDBusObjectPath &session_handle, const QList<QPair<QString,QVariantMap>> &shortcuts, const QString &parent_window, const QVariantMap &options)
45
+    {
46
+        QList<QVariant> argumentList;
47
+        argumentList << QVariant::fromValue(session_handle) << QVariant::fromValue(shortcuts) << QVariant::fromValue(parent_window) << QVariant::fromValue(options);
48
+        return asyncCallWithArgumentList(QStringLiteral("BindShortcuts"), argumentList);
49
+    }
50
+
51
+    inline QDBusPendingReply<QDBusObjectPath> CreateSession(const QVariantMap &options)
52
+    {
53
+        QList<QVariant> argumentList;
54
+        argumentList << QVariant::fromValue(options);
55
+        return asyncCallWithArgumentList(QStringLiteral("CreateSession"), argumentList);
56
+    }
57
+
58
+    inline QDBusPendingReply<QDBusObjectPath> ListShortcuts(const QDBusObjectPath &session_handle, const QVariantMap &options)
59
+    {
60
+        QList<QVariant> argumentList;
61
+        argumentList << QVariant::fromValue(session_handle) << QVariant::fromValue(options);
62
+        return asyncCallWithArgumentList(QStringLiteral("ListShortcuts"), argumentList);
63
+    }
64
+
65
+Q_SIGNALS: // SIGNALS
66
+    void Activated(const QDBusObjectPath &session_handle, const QString &shortcut_id, qulonglong timestamp, const QVariantMap &options);
67
+    void Deactivated(const QDBusObjectPath &session_handle, const QString &shortcut_id, qulonglong timestamp, const QVariantMap &options);
68
+    void ShortcutsChanged(const QDBusObjectPath &session_handle, const QList<QPair<QString,QVariantMap>> &shortcuts);
69
+};
70
+
71
+namespace org {
72
+  namespace freedesktop {
73
+    namespace portal {
74
+      typedef ::OrgFreedesktopPortalGlobalShortcutsInterface GlobalShortcuts;
75
+    }
76
+  }
77
+}
78
+#endif
79
dsnote-4.8.1.tar.gz/src/dbus_portal_request_inf.cpp Added
28
 
1
@@ -0,0 +1,26 @@
2
+/*
3
+ * This file was generated by qdbusxml2cpp version 0.8
4
+ * Command line was: qdbusxml2cpp ../dbus/org.freedesktop.portal.Request.xml -p dbus_portal_request_inf
5
+ *
6
+ * qdbusxml2cpp is Copyright (C) 2023 The Qt Company Ltd.
7
+ *
8
+ * This is an auto-generated file.
9
+ * This file may have been hand-edited. Look for HAND-EDIT comments
10
+ * before re-generating it.
11
+ */
12
+
13
+#include "dbus_portal_request_inf.h"
14
+
15
+/*
16
+ * Implementation of interface class OrgFreedesktopPortalRequestInterface
17
+ */
18
+
19
+OrgFreedesktopPortalRequestInterface::OrgFreedesktopPortalRequestInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)
20
+    : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent)
21
+{
22
+}
23
+
24
+OrgFreedesktopPortalRequestInterface::~OrgFreedesktopPortalRequestInterface()
25
+{
26
+}
27
+
28
dsnote-4.8.1.tar.gz/src/dbus_portal_request_inf.h Added
58
 
1
@@ -0,0 +1,56 @@
2
+/*
3
+ * This file was generated by qdbusxml2cpp version 0.8
4
+ * Command line was: qdbusxml2cpp ../dbus/org.freedesktop.portal.Request.xml -p dbus_portal_request_inf
5
+ *
6
+ * qdbusxml2cpp is Copyright (C) 2023 The Qt Company Ltd.
7
+ *
8
+ * This is an auto-generated file.
9
+ * Do not edit! All changes made to it will be lost.
10
+ */
11
+
12
+#ifndef DBUS_PORTAL_REQUEST_INF_H
13
+#define DBUS_PORTAL_REQUEST_INF_H
14
+
15
+#include <QtCore/QObject>
16
+#include <QtCore/QByteArray>
17
+#include <QtCore/QList>
18
+#include <QtCore/QMap>
19
+#include <QtCore/QString>
20
+#include <QtCore/QStringList>
21
+#include <QtCore/QVariant>
22
+#include <QtDBus/QtDBus>
23
+
24
+/*
25
+ * Proxy class for interface org.freedesktop.portal.Request
26
+ */
27
+class OrgFreedesktopPortalRequestInterface: public QDBusAbstractInterface
28
+{
29
+    Q_OBJECT
30
+public:
31
+    static inline const char *staticInterfaceName()
32
+    { return "org.freedesktop.portal.Request"; }
33
+
34
+public:
35
+    OrgFreedesktopPortalRequestInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr);
36
+
37
+    ~OrgFreedesktopPortalRequestInterface();
38
+
39
+public Q_SLOTS: // METHODS
40
+    inline QDBusPendingReply<> Close()
41
+    {
42
+        QList<QVariant> argumentList;
43
+        return asyncCallWithArgumentList(QStringLiteral("Close"), argumentList);
44
+    }
45
+
46
+Q_SIGNALS: // SIGNALS
47
+    void Response(uint response, const QVariantMap &results);
48
+};
49
+
50
+namespace org {
51
+  namespace freedesktop {
52
+    namespace portal {
53
+      typedef ::OrgFreedesktopPortalRequestInterface Request;
54
+    }
55
+  }
56
+}
57
+#endif
58
dsnote-4.7.1.tar.gz/src/dsnote_app.cpp -> dsnote-4.8.1.tar.gz/src/dsnote_app.cpp Changed
201
 
1
@@ -22,7 +22,9 @@
2
 
3
 #include "downloader.hpp"
4
 #include "media_compressor.hpp"
5
+#include "module_tools.hpp"
6
 #include "mtag_tools.hpp"
7
+#include "qtlogger.hpp"
8
 #include "speech_service.h"
9
 
10
 QDebug operator<<(QDebug d, dsnote_app::service_state_t state) {
11
@@ -288,6 +290,7 @@
12
                            "/org/freedesktop/Notifications",
13
                            QDBusConnection::sessionBus()},
14
       m_audio_dm{& { emit audio_devices_changed(); }} {
15
+    initQtLogger();
16
     qDebug() << "starting app:" << settings::launch_mode;
17
 
18
     QDir{cache_dir()}.canonicalPath();
19
@@ -310,10 +313,6 @@
20
     connect(settings::instance(), &settings::mnt_text_format_changed, this,
21
             &dsnote_app::handle_translator_settings_changed,
22
             Qt::QueuedConnection);
23
-    connect(settings::instance(), &settings::hotkeys_enabled_changed, this,
24
-            &dsnote_app::register_hotkeys);
25
-    connect(settings::instance(), &settings::hotkeys_changed, this,
26
-            &dsnote_app::register_hotkeys);
27
     connect(settings::instance(), &settings::audio_input_device_changed, this,
28
             this { emit audio_source_changed(); });
29
     connect(settings::instance(), &settings::insert_mode_changed, this,
30
@@ -360,8 +359,10 @@
31
 #ifdef USE_DESKTOP
32
     connect(this, &dsnote_app::available_stt_models_changed, this,
33
             this() { m_tray.set_stt_models(available_stt_models()); });
34
-    connect(this, &dsnote_app::active_stt_model_changed, this,
35
-            this() { m_tray.set_active_stt_model(active_stt_model_name()); });
36
+    connect(this, &dsnote_app::active_stt_model_changed, this, this() {
37
+        m_tray.set_active_stt_model(active_stt_model_name(),
38
+                                    stt_translate_needed());
39
+    });
40
     connect(this, &dsnote_app::available_tts_models_changed, this,
41
             this() { m_tray.set_tts_models(available_tts_models()); });
42
     connect(this, &dsnote_app::active_tts_model_changed, this,
43
@@ -457,7 +458,6 @@
44
     }
45
 
46
     update_available_tts_ref_voices();
47
-    register_hotkeys();
48
     handle_note_changed();
49
     update_audio_sources();
50
 
51
@@ -468,6 +468,10 @@
52
             });
53
     connect(&m_tray, &tray_icon::action_triggered, this,
54
             &dsnote_app::execute_tray_action);
55
+    connect(&m_gs_manager, &global_hotkeys_manager::hotkey_activated, this,
56
+            this(const QString &action_id, const QVariantMap &arguments) {
57
+                execute_action_id(action_id, arguments, true);
58
+            });
59
 #endif
60
 }
61
 
62
@@ -720,31 +724,32 @@
63
 
64
     // qDebug() << "trans rule:" << rule;
65
 
66
+    bool case_sens = (rule.flags & trans_rule_flags_t::TransRuleCaseSensitive);
67
     bool rule_matches = false;
68
 
69
     switch (rule.type) {
70
         case trans_rule_type_t::TransRuleTypeNone:
71
             break;
72
         case trans_rule_type_t::TransRuleTypeMatchSimple:
73
-            rule_matches = text.contains(rule.pattern, Qt::CaseInsensitive)
74
+            rule_matches = text.contains(rule.pattern, case_sens ? Qt::CaseSensitive : Qt::CaseInsensitive)
75
                                ? rule.flags
76
                                : trans_rule_flags_t::TransRuleNone;
77
             break;
78
         case trans_rule_type_t::TransRuleTypeMatchRe:
79
             rule_matches =
80
-                text.contains(QRegExp{rule.pattern, Qt::CaseInsensitive});
81
+                text.contains(QRegExp{rule.pattern, case_sens ? Qt::CaseSensitive : Qt::CaseInsensitive});
82
             break;
83
         case trans_rule_type_t::TransRuleTypeReplaceSimple: {
84
-            rule_matches = text.contains(rule.pattern, Qt::CaseInsensitive);
85
+            rule_matches = text.contains(rule.pattern, case_sens ? Qt::CaseSensitive : Qt::CaseInsensitive);
86
             if (rule_matches)
87
-                text.replace(rule.pattern, rule.replace, Qt::CaseInsensitive);
88
+                text.replace(rule.pattern, rule.replace, case_sens ? Qt::CaseSensitive : Qt::CaseInsensitive);
89
             break;
90
         }
91
         case trans_rule_type_t::TransRuleTypeReplaceRe: {
92
             auto replace = rule.replace;
93
             replace.replace("\\n", "\n");
94
 
95
-            QRegExp rx{rule.pattern, Qt::CaseInsensitive};
96
+            QRegExp rx{rule.pattern, case_sens ? Qt::CaseSensitive : Qt::CaseInsensitive};
97
 
98
             rule_matches = text.contains(rx);
99
             if (rule_matches) {
100
@@ -752,7 +757,7 @@
101
                     text.replace(rx, replace);
102
                 } else {
103
                     int pos = 0;
104
-                    while ((pos = rx.indexIn(text, pos)) != -1) {
105
+                    while (pos < text.size() && (pos = rx.indexIn(text, pos)) != -1 && rx.matchedLength() > 0) {
106
                         QString after = replace;
107
                         for (int i = 1; i < rx.captureCount() + 1; ++i) {
108
                             after.replace(QStringLiteral("\\U\\%1").arg(i),
109
@@ -828,25 +833,25 @@
110
     return result;
111
 }
112
 
113
-QVariantList dsnote_app::test_trans_rule(const QString &text,
114
+QVariantList dsnote_app::test_trans_rule(unsigned int flags, const QString &text,
115
                                          const QString &pattern,
116
                                          const QString &replace,
117
                                          unsigned int type) {
118
     QString out_text{text};
119
 
120
     if (pattern.isEmpty()) {
121
-        qWarning() << "invalid trans rule";
122
+        //qWarning() << "invalid trans rule";
123
         return {false, out_text};
124
     }
125
 
126
-    auto flags = apply_trans_rule(
127
-        out_text, {/*flags=*/settings::trans_rule_flags_t::TransRuleNone,
128
+    auto rflags = apply_trans_rule(
129
+        out_text, {/*flags=*/static_cast<settings::trans_rule_flags_t>(flags),
130
                    /*type=*/static_cast<settings::trans_rule_type_t>(type),
131
                    /*name=*/{},
132
                    /*pattern=*/pattern,
133
                    /*replace=*/replace});
134
 
135
-    return {(flags & settings::trans_rule_flags_t::TransRuleMatched) > 0,
136
+    return {(rflags & settings::trans_rule_flags_t::TransRuleMatched) > 0,
137
             out_text};
138
 }
139
 
140
@@ -857,9 +862,9 @@
141
 void dsnote_app::update_trans_rule(int index, unsigned int flags,
142
                                    const QString &name, const QString &pattern,
143
                                    const QString &replace, const QString &langs,
144
-                                   unsigned int type) {
145
+                                   unsigned int type, const QString &test_text) {
146
     if (pattern.isEmpty()) {
147
-        qWarning() << "invalid trans rule";
148
+        //qWarning() << "invalid trans rule";
149
         return;
150
     }
151
 
152
@@ -877,6 +882,7 @@
153
         /*3 pattern=*/pattern,
154
         /*4 replace=*/replace,
155
         /*5 langs=*/langs,
156
+        /*6 test_text=*/test_text,
157
     };
158
 
159
     if (index < 0) {
160
@@ -890,15 +896,58 @@
161
     settings::instance()->set_trans_rules(rules);
162
 }
163
 
164
-QString dsnote_app::trans_rules_test_text() const { return m_translated_text; }
165
+QString dsnote_app::trans_rules_test_text() const { return m_trans_rules_test_text; }
166
 
167
 void dsnote_app::set_trans_rules_test_text(const QString &value) {
168
-    if (m_translated_text != value) {
169
-        m_translated_text = value;
170
+    if (m_trans_rules_test_text != value) {
171
+        m_trans_rules_test_text = value;
172
         emit trans_rules_test_text_changed();
173
     }
174
 }
175
 
176
+void dsnote_app::update_voice_prompt(const QString &name,
177
+                                     const QString &new_name,
178
+                                     const QString &desc) const {
179
+    if (new_name.isEmpty() || desc.isEmpty()) {
180
+        qWarning() << "empty voice prompt";
181
+        return;
182
+    }
183
+
184
+    settings::instance()->tts_update_voice_prompt(name, {new_name, desc});
185
+}
186
+
187
+void dsnote_app::delete_voice_prompt(const QString &name) const {
188
+    if (name.isEmpty()) {
189
+        qWarning() << "empty voice prompt name";
190
+        return;
191
+    }
192
+
193
+    settings::instance()->tts_delete_voice_prompt(name);
194
+}
195
+
196
+void dsnote_app::clone_voice_prompt(const QString &name) const {
197
+    if (name.isEmpty()) {
198
+        qWarning() << "empty voice prompt name";
199
+        return;
200
+    }
201
dsnote-4.7.1.tar.gz/src/dsnote_app.h -> dsnote-4.8.1.tar.gz/src/dsnote_app.h Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2021-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2021-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -18,12 +18,9 @@
8
 #include <optional>
9
 #include <queue>
10
 
11
-#ifdef USE_X11_FEATURES
12
-#include <qhotkey.h>
13
-#include "fake_keyboard.hpp"
14
-#endif
15
-
16
 #ifdef USE_DESKTOP
17
+#include "fake_keyboard.hpp"
18
+#include "global_hotkeys_manager.hpp"
19
 #include "tray_icon.hpp"
20
 #endif
21
 
22
@@ -58,6 +55,29 @@
23
     X(set_stt_model, "set-stt-model")                                 \
24
     X(set_tts_model, "set-tts-model")
25
 
26
+#define FEATURE_TABLE    \
27
+    X(whispercpp_stt)    \
28
+    X(whispercpp_gpu)    \
29
+    X(fasterwhisper_stt) \
30
+    X(fasterwhisper_gpu) \
31
+    X(whisperspeech_tts) \
32
+    X(whisperspeech_gpu) \
33
+    X(coqui_tts)         \
34
+    X(coqui_gpu)         \
35
+    X(parler_tts)        \
36
+    X(parler_gpu)        \
37
+    X(f5_tts)            \
38
+    X(f5_gpu)            \
39
+    X(kokoro_tts)        \
40
+    X(kokoro_gpu)        \
41
+    X(punctuator)        \
42
+    X(diacritizer_he)    \
43
+    X(translator)        \
44
+    X(fake_keyboard)     \
45
+    X(fake_keyboard_ydo) \
46
+    X(hotkeys)           \
47
+    X(hotkeys_portal)
48
+
49
 class dsnote_app : public QObject {
50
     Q_OBJECT
51
     Q_PROPERTY(QString intermediate_text READ intermediate_text NOTIFY
52
@@ -117,7 +137,6 @@
53
                    NOTIFY active_tts_ref_voice_changed)
54
     Q_PROPERTY(bool tts_ref_voice_needed READ tts_ref_voice_needed NOTIFY
55
                    active_tts_model_changed)
56
-
57
     Q_PROPERTY(int active_tts_for_in_mnt_ref_voice_idx READ
58
                    active_tts_for_in_mnt_ref_voice_idx NOTIFY
59
                        active_tts_for_in_mnt_ref_voice_changed)
60
@@ -130,7 +149,6 @@
61
     Q_PROPERTY(bool tts_for_in_mnt_ref_voice_needed READ
62
                    tts_for_in_mnt_ref_voice_needed NOTIFY
63
                        active_tts_model_for_in_mnt_changed)
64
-
65
     Q_PROPERTY(int active_tts_for_out_mnt_ref_voice_idx READ
66
                    active_tts_for_out_mnt_ref_voice_idx NOTIFY
67
                        active_tts_for_out_mnt_ref_voice_changed)
68
@@ -143,10 +161,22 @@
69
     Q_PROPERTY(bool tts_for_out_mnt_ref_voice_needed READ
70
                    tts_for_out_mnt_ref_voice_needed NOTIFY
71
                        active_tts_model_for_out_mnt_changed)
72
-
73
     Q_PROPERTY(
74
         QVariantList available_tts_ref_voices READ available_tts_ref_voices
75
             NOTIFY available_tts_ref_voices_changed)
76
+    Q_PROPERTY(QVariantList available_tts_ref_voice_names READ
77
+                   available_tts_ref_voice_names NOTIFY
78
+                       available_tts_ref_voices_changed)
79
+
80
+    // tts ref prompts
81
+    Q_PROPERTY(bool tts_ref_prompt_needed READ tts_ref_prompt_needed NOTIFY
82
+                   active_tts_model_changed)
83
+    Q_PROPERTY(bool tts_for_in_mnt_ref_prompt_needed READ
84
+                   tts_for_in_mnt_ref_prompt_needed NOTIFY
85
+                       active_tts_model_for_in_mnt_changed)
86
+    Q_PROPERTY(bool tts_for_out_mnt_ref_prompt_needed READ
87
+                   tts_for_out_mnt_ref_prompt_needed NOTIFY
88
+                       active_tts_model_for_out_mnt_changed)
89
 
90
     // tts
91
     Q_PROPERTY(int active_tts_model_idx READ active_tts_model_idx NOTIFY
92
@@ -246,25 +276,14 @@
93
             set_trans_rules_test_text NOTIFY trans_rules_test_text_changed)
94
 
95
     // features
96
-#define FEATURE_OPT(name) \
97
+#define X(name) \
98
     Q_PROPERTY(bool feature_##name READ feature_##name NOTIFY features_changed)
99
-    FEATURE_OPT(whispercpp_stt)
100
-    FEATURE_OPT(whispercpp_gpu)
101
-    FEATURE_OPT(fasterwhisper_stt)
102
-    FEATURE_OPT(fasterwhisper_gpu)
103
-    FEATURE_OPT(whisperspeech_tts)
104
-    FEATURE_OPT(whisperspeech_gpu)
105
-    FEATURE_OPT(coqui_tts)
106
-    FEATURE_OPT(coqui_gpu)
107
-    FEATURE_OPT(punctuator)
108
-    FEATURE_OPT(diacritizer_he)
109
-    FEATURE_OPT(global_shortcuts)
110
-    FEATURE_OPT(text_active_window)
111
-    FEATURE_OPT(translator)
112
-#undef FEATURE_OPT
113
+    FEATURE_TABLE
114
+#undef X
115
 
116
     Q_PROPERTY(auto_text_format_t auto_text_format READ auto_text_format NOTIFY
117
                    auto_text_format_changed)
118
+    Q_PROPERTY(QString py_version READ py_version NOTIFY py_version_changed)
119
 
120
    public:
121
     enum service_state_t {
122
@@ -351,7 +370,9 @@
123
     Q_INVOKABLE void set_active_tts_for_in_mnt_ref_voice_idx(int idx);
124
     Q_INVOKABLE void set_active_tts_for_out_mnt_ref_voice_idx(int idx);
125
     Q_INVOKABLE void delete_tts_ref_voice(int idx);
126
-    Q_INVOKABLE void rename_tts_ref_voice(int idx, const QString &new_name);
127
+    Q_INVOKABLE void update_tts_ref_voice(int idx, const QString &new_name,
128
+                                          const QString &new_text);
129
+    Q_INVOKABLE bool test_tts_ref_voice(int idx, const QString &new_name) const;
130
     Q_INVOKABLE void set_active_mnt_lang_idx(int idx);
131
     Q_INVOKABLE void set_active_mnt_out_lang_idx(int idx);
132
     Q_INVOKABLE void set_active_tts_model_for_in_mnt_idx(int idx);
133
@@ -359,6 +380,7 @@
134
     Q_INVOKABLE void import_file(const QString &file_path, int stream_index,
135
                                  bool replace);
136
     Q_INVOKABLE void cancel();
137
+    Q_INVOKABLE void cancel_if_internal();
138
     Q_INVOKABLE void listen();
139
     Q_INVOKABLE void listen_translate();
140
     Q_INVOKABLE void listen_to_active_window();
141
@@ -417,8 +439,9 @@
142
     Q_INVOKABLE void show_desktop_notification(const QString &summary,
143
                                                const QString &body,
144
                                                bool permanent = false);
145
-    Q_INVOKABLE QVariantMap execute_action_name(const QString &action_name,
146
-                                                const QString &extra);
147
+    Q_INVOKABLE QVariantMap execute_action_id(const QString &action_id,
148
+                                              const QVariantMap &arguments,
149
+                                              bool trusted_source);
150
     Q_INVOKABLE QVariantList features_availability();
151
     Q_INVOKABLE QString download_content(const QUrl &url);
152
     Q_INVOKABLE void player_import_from_url(const QUrl &url);
153
@@ -427,7 +450,8 @@
154
     Q_INVOKABLE void player_stop();
155
     Q_INVOKABLE void player_set_position(long long position);
156
     Q_INVOKABLE void player_export_ref_voice(long long start, long long stop,
157
-                                             const QString &name);
158
+                                             const QString &name,
159
+                                             const QString &text);
160
     Q_INVOKABLE void player_stop_voice_ref();
161
     Q_INVOKABLE void player_reset();
162
     Q_INVOKABLE void recorder_start();
163
@@ -438,7 +462,8 @@
164
     Q_INVOKABLE void set_app_window(QObject *app_window);
165
     Q_INVOKABLE QString special_key_name(int key) const;
166
     /* used in QML, returns list: 0 bool:matched, 0 string:out-text */
167
-    Q_INVOKABLE QVariantList test_trans_rule(const QString &text,
168
+    Q_INVOKABLE QVariantList test_trans_rule(unsigned int flags,
169
+                                             const QString &text,
170
                                              const QString &pattern,
171
                                              const QString &replace,
172
                                              unsigned int type);
173
@@ -446,10 +471,24 @@
174
                                        const QString &name,
175
                                        const QString &pattern,
176
                                        const QString &replace,
177
-                                       const QString &langs, unsigned int type);
178
+                                       const QString &langs, unsigned int type,
179
+                                       const QString &test_text);
180
     Q_INVOKABLE bool trans_rule_re_pattern_valid(const QString &pattern);
181
     nodiscard Q_INVOKABLE QVariantList available_stt_models_info() const;
182
     nodiscard Q_INVOKABLE QVariantList available_tts_models_info() const;
183
+    Q_INVOKABLE void update_feature_statuses();
184
+    Q_INVOKABLE void open_hotkeys_editor();
185
+    Q_INVOKABLE void update_voice_prompt(const QString &name,
186
+                                         const QString &new_name,
187
+                                         const QString &desc) const;
188
+    Q_INVOKABLE bool test_voice_prompt(const QString &name,
189
+                                       const QString &new_name,
190
+                                       const QString &desc) const;
191
+    Q_INVOKABLE void delete_voice_prompt(const QString &name) const;
192
+    Q_INVOKABLE void clone_voice_prompt(const QString &name) const;
193
+    Q_INVOKABLE void transcribe_ref_file(const QString &file_path);
194
+    Q_INVOKABLE void transcribe_ref_file_import(long long start,
195
+                                                long long stop);
196
 
197
    signals:
198
     void active_stt_model_changed();
199
@@ -468,6 +507,7 @@
200
     void intermediate_text_changed();
201
dsnote-4.8.1.tar.gz/src/f5_engine.cpp Added
160
 
1
@@ -0,0 +1,158 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#include "f5_engine.hpp"
10
+
11
+#include <fmt/format.h>
12
+#include <unistd.h>
13
+
14
+#include <cstdio>
15
+#include <cstdlib>
16
+#include <cstring>
17
+#include <utility>
18
+
19
+#include "cpu_tools.hpp"
20
+#include "logger.hpp"
21
+#include "py_executor.hpp"
22
+
23
+using namespace pybind11::literals;
24
+
25
+f5_engine::f5_engine(config_t config, callbacks_t call_backs)
26
+    : tts_engine{std::move(config), std::move(call_backs)} {
27
+    if ((cpu_tools::cpuinfo().feature_flags &
28
+         cpu_tools::feature_flags_t::avx) == 0) {
29
+        LOGE("avx not supported but f5 engine needs it");
30
+        throw std::runtime_error("failed to init f5 engine: avx not supported");
31
+    }
32
+
33
+    if (m_config.model_files.hub_path.empty()) {
34
+        LOGE("hub path missing but f5 engine needs it");
35
+        throw std::runtime_error("failed to init f5 engine: no hub path");
36
+    }
37
+}
38
+
39
+f5_engine::~f5_engine() {
40
+    LOGD("f5 dtor");
41
+
42
+    stop();
43
+}
44
+
45
+void f5_engine::stop() {
46
+    tts_engine::stop();
47
+
48
+    auto task = py_executor::instance()->execute(&() {
49
+        try {
50
+            m_model.reset();
51
+
52
+            // release mem
53
+            py::module_::import("gc").attr("collect")();
54
+            py::module_::import("torch").attr("cuda").attr("empty_cache")();
55
+        } catch (const std::exception& err) {
56
+            LOGE("py error: " << err.what());
57
+        }
58
+        return std::any{};
59
+    });
60
+
61
+    if (task) task->get();
62
+
63
+    LOGD("f5 stopped");
64
+}
65
+
66
+void f5_engine::create_model() {
67
+    auto task = py_executor::instance()->execute(&() {
68
+        auto model_file =
69
+            first_file_with_ext(m_config.model_files.model_path, "safetensors");
70
+        if (model_file.empty()) {
71
+            LOGD("can't find model file in dir: "
72
+                 << m_config.model_files.model_path);
73
+            return false;
74
+        }
75
+        auto vocab_file =
76
+            first_file_with_ext(m_config.model_files.model_path, "txt");
77
+        if (vocab_file.empty()) {
78
+            LOGD("can't find vocab file in dir: "
79
+                 << m_config.model_files.model_path);
80
+            return false;
81
+        }
82
+
83
+        auto use_cuda =
84
+            m_config.use_gpu &&
85
+            (py_executor::instance()->libs_availability->torch_cuda ||
86
+             py_executor::instance()->libs_availability->torch_hip);
87
+
88
+        LOGD("using device: " << (use_cuda ? "cuda" : "cpu") << " "
89
+                              << m_config.gpu_device.id);
90
+
91
+        m_device_str =
92
+            use_cuda ? fmt::format("cuda:{}", m_config.gpu_device.id) : "cpu";
93
+
94
+        make_hf_link("charactr--vocos-mel-24khz", m_config.model_files.hub_path,
95
+                     m_config.cache_dir);
96
+
97
+        try {
98
+            auto f5_api = py::module_::import("f5_tts.api");
99
+            m_model = f5_api.attr("F5TTS")("ckpt_file"_a = model_file,
100
+                                           "vocab_file"_a = vocab_file,
101
+                                           "device"_a = m_device_str);
102
+
103
+            auto hook = py::cpp_function{
104
+                this(maybe_unused const py::args& args,
105
+                       maybe_unused const py::kwargs& kwargs) {
106
+                    if (is_shutdown()) {
107
+                        throw std::runtime_error{"engine shutdown"};
108
+                    }
109
+                }};
110
+            m_model->attr("ema_model")
111
+                .attr("transformer")
112
+                .attr("register_forward_hook")(hook);
113
+            m_model->attr("ema_model")
114
+                .attr("transformer")
115
+                .attr("register_forward_pre_hook")(hook);
116
+        } catch (const std::exception& err) {
117
+            LOGE("py error: " << err.what());
118
+            return false;
119
+        }
120
+        return true;
121
+    });
122
+
123
+    if (!task || !std::any_cast<bool>(task->get()))
124
+        LOGE("failed to create f5 model");
125
+    else
126
+        LOGD("f5 model created");
127
+}
128
+
129
+bool f5_engine::model_created() const { return m_model.has_value(); }
130
+
131
+bool f5_engine::encode_speech_impl(const std::string& text,
132
+                                       maybe_unused unsigned int speed,
133
+                                       const std::string& out_file) {
134
+    auto speech_speed = std::clamp(speed, 1U, 20U) / 10.0;
135
+
136
+    auto task = py_executor::instance()->execute(&() {
137
+        try {
138
+            // to speed up decrease "nfe_step", e.g. "nfe_step"_a = 16
139
+            m_model->attr("infer")(
140
+                "ref_file"_a = m_ref_voice_wav_file,
141
+                "ref_text"_a = m_ref_voice_text, "gen_text"_a = text,
142
+                "file_wave"_a = out_file, "speed"_a = speech_speed,
143
+                "remove_silence"_a = false, "seed"_a = py::none(),
144
+                "file_spec"_a = py::none());
145
+
146
+            if (is_shutdown()) throw std::runtime_error{"engine shutdown"};
147
+        } catch (const std::exception& err) {
148
+            LOGE("py error: " << err.what());
149
+            return false;
150
+        }
151
+
152
+        LOGD("voice synthesized successfully");
153
+        return true;
154
+    });
155
+
156
+    return task && std::any_cast<bool>(task->get());
157
+}
158
+
159
+bool f5_engine::model_supports_speed() const { return true; }
160
dsnote-4.8.1.tar.gz/src/f5_engine.hpp Added
42
 
1
@@ -0,0 +1,40 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#ifndef F5_ENGINE_HPP
10
+#define F5_ENGINE_HPP
11
+
12
+#undef slots
13
+#include <pybind11/embed.h>
14
+#include <pybind11/pytypes.h>
15
+#define slots Q_SLOTS
16
+
17
+#include <optional>
18
+#include <string>
19
+
20
+#include "tts_engine.hpp"
21
+
22
+namespace py = pybind11;
23
+
24
+class f5_engine : public tts_engine {
25
+   public:
26
+    f5_engine(config_t config, callbacks_t call_backs);
27
+    ~f5_engine() override;
28
+
29
+   private:
30
+    std::optional<py::object> m_model;
31
+    std::string m_device_str;
32
+
33
+    bool model_created() const final;
34
+    bool model_supports_speed() const final;
35
+    void create_model() final;
36
+    bool encode_speech_impl(const std::string& text, unsigned int speed,
37
+                            const std::string& out_file) final;
38
+    void stop();
39
+};
40
+
41
+#endif  // F5_ENGINE_HPP
42
dsnote-4.7.1.tar.gz/src/fake_keyboard.cpp -> dsnote-4.8.1.tar.gz/src/fake_keyboard.cpp Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -11,19 +11,41 @@
8
 #include "settings.h"
9
 // clang-format on
10
 
11
-#include <X11/XKBlib.h>
12
-#include <X11/Xlib.h>
13
-#include <X11/keysym.h>
14
-#include <stdio.h>
15
-#include <xdo.h>
16
+#include <fmt/format.h>
17
+#include <linux/uinput.h>
18
+#include <qpa/qplatformnativeinterface.h>
19
+#include <sys/epoll.h>
20
+#include <sys/ioctl.h>
21
+#include <sys/mman.h>
22
+#include <sys/socket.h>
23
+#include <sys/stat.h>
24
+#include <sys/types.h>
25
+#include <sys/un.h>
26
+#include <unistd.h>
27
 #include <xkbcommon/xkbcommon-compose.h>
28
-#include <xkbcommon/xkbcommon-x11.h>
29
 #include <xkbcommon/xkbcommon.h>
30
 
31
 #include <QFile>
32
-#include <QX11Info>
33
+#include <QGuiApplication>
34
+#include <QLocale>
35
+#include <cstdint>
36
+#include <cstdio>
37
 #include <cstdlib>
38
 #include <optional>
39
+#include <string>
40
+#include <tuple>
41
+
42
+#include "logger.hpp"
43
+#include "qtlogger.hpp"
44
+
45
+using namespace std::chrono_literals;
46
+
47
+#ifdef USE_X11_FEATURES
48
+#include <X11/XKBlib.h>
49
+#include <X11/Xlib.h>
50
+#include <X11/keysym.h>
51
+#include <xdo.h>
52
+#include <xkbcommon/xkbcommon-x11.h>
53
 
54
 static XKeyEvent create_key_event(Display *display, Window &win,
55
                                   Window &win_root,
56
@@ -49,97 +71,603 @@
57
 
58
     return event;
59
 }
60
+#endif  // USE_X11_FEATURES
61
 
62
 fake_keyboard::fake_keyboard(QObject *parent) : QObject{parent} {
63
-    if (settings::instance()->fake_keyboard_type() ==
64
-        settings::fake_keyboard_type_t::FakeKeyboardTypeXdo) {
65
-        qDebug() << "using xdo fake-keyboard";
66
+#ifdef USE_X11_FEATURES
67
+    switch (settings::instance()->fake_keyboard_type()) {
68
+        case settings::fake_keyboard_type_t::FakeKeyboardTypeLegacy:
69
+            init_legacy();
70
+            break;
71
+        case settings::fake_keyboard_type_t::FakeKeyboardTypeXdo:
72
+            init_xdo();
73
+            break;
74
+        case settings::fake_keyboard_type_t::FakeKeyboardTypeYdo:
75
+            init_ydo();
76
+            break;
77
+    }
78
+#else
79
+    init_ydo();
80
+#endif
81
+}
82
+
83
+fake_keyboard::~fake_keyboard() {
84
+    {
85
+        std::lock_guard lock{m_wl_mtx};
86
+        disconnect_wayland();
87
+    }
88
+#ifdef USE_X11_FEATURES
89
+    if (m_xdo_thread.joinable()) m_xdo_thread.join();
90
+    if (m_xdo) xdo_free(m_xdo);
91
+#endif
92
+    if (m_xkb_compose_table) {
93
+        xkb_compose_table_unref(m_xkb_compose_table);
94
+        m_xkb_compose_table = nullptr;
95
+    }
96
+    if (m_xkb_ctx) {
97
+        xkb_context_unref(m_xkb_ctx);
98
+        m_xkb_ctx = nullptr;
99
+    }
100
+    if (m_ydo_daemon_socket >= 0) ::close(m_ydo_daemon_socket);
101
+}
102
+
103
+bool fake_keyboard::is_supported() {
104
+    return is_legacy_supported() || is_xdo_supported() || is_ydo_supported();
105
+}
106
+
107
+bool fake_keyboard::is_xdo_supported() {
108
+#ifdef USE_X11_FEATURES
109
+    return settings::instance()->is_xcb();
110
+#else
111
+    return false;
112
+#endif
113
+}
114
+
115
+bool fake_keyboard::is_ydo_supported() {
116
+    auto ydo_daemon_socket = make_ydo_socket();
117
+
118
+    if (ydo_daemon_socket < 0) {
119
+        return false;
120
+    }
121
+
122
+    ::close(ydo_daemon_socket);
123
+    return true;
124
+}
125
+
126
+bool fake_keyboard::is_legacy_supported() {
127
+#ifdef USE_X11_FEATURES
128
+    return settings::instance()->is_xcb();
129
+#else
130
+    return false;
131
+#endif
132
+}
133
+
134
+// Copied from https://github.com/ReimuNotMoe/ydotool
135
+void fake_keyboard::ydo_uinput_emit(uint16_t type, uint16_t code, int32_t val,
136
+                                    bool syn_report) const {
137
+    input_event ie{};
138
+    ie.type = type;
139
+    ie.code = code;
140
+    ie.value = val;
141
+
142
+    write(m_ydo_daemon_socket, &ie, sizeof(ie));
143
+
144
+    if (syn_report) {
145
+        ie.type = EV_SYN;
146
+        ie.code = SYN_REPORT;
147
+        ie.value = 0;
148
+        write(m_ydo_daemon_socket, &ie, sizeof(ie));
149
+    }
150
+}
151
+
152
+xkb_keycode_t fake_keyboard::get_l3_shift_keycode() {
153
+    xkb_keycode_t keycode = 0;
154
+
155
+    if (!m_xkb_keymap) {
156
+        LOGE("xkb_keymap not initialized");
157
+        return keycode;
158
+    }
159
+
160
+    auto *state = xkb_state_new(m_xkb_keymap);
161
+    if (!state) {
162
+        LOGE("failed to create xkb state");
163
+        return keycode;
164
+    }
165
+
166
+    auto min_keycode = xkb_keymap_min_keycode(m_xkb_keymap);
167
+    auto max_keycode = xkb_keymap_max_keycode(m_xkb_keymap);
168
+    const xkb_keysym_t *syms_out = nullptr;
169
+    for (xkb_keycode_t kc = min_keycode; kc <= max_keycode; ++kc) {
170
+        auto num_keysym = xkb_state_key_get_syms(state, kc, &syms_out);
171
+        for (int i = 0; i < num_keysym; ++i) {
172
+            if (syms_outi == XKB_KEY_ISO_Level3_Shift) {
173
+                LOGD("l3_shift is mapped to keycode: " << kc << " " << i);
174
+                keycode = kc;
175
+            }
176
+        }
177
+    }
178
+
179
+    xkb_state_unref(state);
180
+    return keycode;
181
+}
182
+
183
+std::vector<fake_keyboard::key_code_t> fake_keyboard::key_from_character(
184
+    /*UTF-32*/ uint32_t character) {
185
+    if (!m_xkb_keymap) {
186
+        LOGE("xkb_keymap not initialized");
187
+        return {};
188
+    }
189
+
190
+    auto in_sym = xkb_utf32_to_keysym(character);
191
+
192
+    const size_t XKB_KEYSYM_NAME_MAX_SIZE = 28;
193
+    char nameXKB_KEYSYM_NAME_MAX_SIZE;
194
+    auto ret = xkb_keysym_get_name(in_sym, name, sizeof(name));
195
+    if (ret < 0 || static_cast<size_t>(ret) >= sizeof(name)) {
196
+        LOGE("failed to get name of keysym");
197
+        return {};
198
+    }
199
+
200
+    auto find_key_layout =
201
dsnote-4.7.1.tar.gz/src/fake_keyboard.hpp -> dsnote-4.8.1.tar.gz/src/fake_keyboard.hpp Changed
155
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -8,20 +8,27 @@
8
 #ifndef FAKE_KEYBOARD_HPP
9
 #define FAKE_KEYBOARD_HPP
10
 
11
-#include <QDebug>
12
+#include <wayland-client.h>
13
+
14
 #include <QObject>
15
 #include <QString>
16
 #include <QStringList>
17
 #include <QTimer>
18
-#include <QX11Info>
19
+#include <cstdint>
20
+#include <mutex>
21
 #include <queue>
22
+#include <string>
23
 #include <thread>
24
 
25
+#ifdef USE_X11_FEATURES
26
+#include <QX11Info>
27
+
28
 struct xcb_connection_t;
29
 struct xkb_context;
30
 struct xkb_keymap;
31
 struct xkb_compose_table;
32
 struct xdo;
33
+#endif
34
 
35
 class fake_keyboard : public QObject {
36
     Q_OBJECT
37
@@ -33,8 +40,13 @@
38
         unsigned int layout = 0;
39
     };
40
 
41
-    fake_keyboard(QObject* parent = nullptr);
42
-    ~fake_keyboard();
43
+    static bool is_supported();
44
+    static bool is_xdo_supported();
45
+    static bool is_ydo_supported();
46
+    static bool is_legacy_supported();
47
+
48
+    explicit fake_keyboard(QObject* parent = nullptr);
49
+    ~fake_keyboard() override;
50
     void send_text(const QString& text);
51
 
52
    signals:
53
@@ -42,24 +54,93 @@
54
     void send_keyevent_request();
55
 
56
    private:
57
-    Display* m_x11_display = nullptr;
58
-    xdo* m_xdo = nullptr;
59
-    xcb_connection_t* m_xcb_conn = nullptr;
60
+    enum class method_t { legacy, xdo, ydo };
61
+    inline static std::string m_keymap{};
62
+    method_t m_method = method_t::legacy;
63
+    std::queue<key_code_t> m_keys_to_send_queue;
64
+    std::u32string m_text;
65
+    size_t m_text_cursor = 0;
66
+    QTimer m_delay_timer;
67
+    int m_ydo_daemon_socket = -1;
68
     xkb_context* m_xkb_ctx = nullptr;
69
     xkb_keymap* m_xkb_keymap = nullptr;
70
     xkb_compose_table* m_xkb_compose_table = nullptr;
71
+    uint32_t m_l3_shift_keycode = 0;
72
+    wl_display* m_wl_display = nullptr;
73
+    wl_registry* m_wl_registry = nullptr;
74
+    wl_seat* m_wl_seat = nullptr;
75
+    wl_keyboard* m_wl_keyboard = nullptr;
76
+    std::mutex m_wl_mtx;
77
+    int m_keyboard_layout_idx = -1;
78
+#ifdef USE_X11_FEATURES
79
+    Display* m_x11_display = nullptr;
80
+    xdo* m_xdo = nullptr;
81
+    xcb_connection_t* m_xcb_conn = nullptr;
82
+    std::thread m_xdo_thread;
83
     unsigned long m_root_window = 0;
84
     unsigned long m_focus_window = 0;
85
-    QString m_text;
86
-    int m_text_cursor = 0;
87
-    QTimer m_delay_timer;
88
     unsigned int m_num_layouts = 0;
89
-    std::queue<key_code_t> m_keys_to_send_queue;
90
-    std::thread m_xdo_thread;
91
+#endif
92
+
93
+    static int make_ydo_socket();
94
 
95
+    void init_ydo();
96
+    void send_text_ydo(const QString& text);
97
     void send_keyevent();
98
+    void send_keyevent_ydo();
99
+    void ydo_uinput_emit(uint16_t type, uint16_t code, int32_t val,
100
+                         bool syn_report) const;
101
+    void ydo_type_char(uint32_t c);
102
     std::vector<fake_keyboard::key_code_t> key_from_character(
103
+        uint32_t character);
104
+    uint32_t get_l3_shift_keycode();
105
+    void connect_wayland();
106
+    void disconnect_wayland();
107
+    void make_compose_table(const char* compose_file);
108
+#ifdef USE_X11_FEATURES
109
+    void init_xdo();
110
+    void init_legacy();
111
+    void send_text_xdo(const QString& text);
112
+    void send_text_legacy(const QString& text);
113
+    void send_keyevent_legacy();
114
+    std::vector<fake_keyboard::key_code_t> key_from_character_x11(
115
         /*UTF-32*/ uint32_t character);
116
+#endif
117
+    static void wly_global_callback(void* data, wl_registry* registry,
118
+                                    uint32_t id, const char* interface,
119
+                                    uint32_t version);
120
+    static void wly_global_remove_callback(void* data, wl_registry* registry,
121
+                                           uint32_t id);
122
+    static void wly_callback_callback(void* data, wl_callback* cb,
123
+                                      uint32_t time);
124
+    static void wly_seat_capabilities(void* data, wl_seat* wl_seat,
125
+                                      uint32_t capabilities);
126
+    static void wly_seat_name(void* data, wl_seat* wl_seat, const char* name);
127
+    static void wly_keyboard_keymap(void* data, wl_keyboard* wl_keyboard,
128
+                                    uint32_t format, int32_t fd, uint32_t size);
129
+    static void wly_keyboard_enter(void* data, wl_keyboard* wl_keyboard,
130
+                                   uint32_t serial, wl_surface* surface,
131
+                                   wl_array* keys);
132
+    static void wly_keyboard_leave(void* data, wl_keyboard* wl_keyboard,
133
+                                   uint32_t serial, wl_surface* surface);
134
+    static void wly_keyboard_key(void* data, wl_keyboard* wl_keyboard,
135
+                                 uint32_t serial, uint32_t time, uint32_t key,
136
+                                 uint32_t state);
137
+    static void wly_keyboard_modifiers(void* data, wl_keyboard* wl_keyboard,
138
+                                       uint32_t serial, uint32_t mods_depressed,
139
+                                       uint32_t mods_latched,
140
+                                       uint32_t mods_locked, uint32_t group);
141
+    static void wly_keyboard_repeat_info(void* data, wl_keyboard* wl_keyboard,
142
+                                         int32_t rate, int32_t delay);
143
+    inline static const wl_callback_listener wly_callback{
144
+        wly_callback_callback};
145
+    inline static const wl_registry_listener wly_global_listener{
146
+        wly_global_callback, wly_global_remove_callback};
147
+    inline static const wl_seat_listener wly_seat_listener{
148
+        wly_seat_capabilities, wly_seat_name};
149
+    inline static const wl_keyboard_listener wly_keyboard_listener{
150
+        wly_keyboard_keymap, wly_keyboard_enter,     wly_keyboard_leave,
151
+        wly_keyboard_key,    wly_keyboard_modifiers, wly_keyboard_repeat_info};
152
 };
153
 
154
 #endif  // FAKE_KEYBOARD_HPP
155
dsnote-4.7.1.tar.gz/src/fasterwhisper_engine.cpp -> dsnote-4.8.1.tar.gz/src/fasterwhisper_engine.cpp Changed
26
 
1
@@ -41,7 +41,11 @@
2
 
3
     auto task = py_executor::instance()->execute(&() {
4
         try {
5
+            m_model->attr("model").attr("unload_model")();
6
             m_model.reset();
7
+
8
+            // release mem
9
+            py::module_::import("gc").attr("collect")();
10
         } catch (const std::exception& err) {
11
             LOGE("py error: " << err.what());
12
         }
13
@@ -339,7 +343,11 @@
14
                                                  py::str(m_config.lang)),
15
                 "task"_a = m_config.translate && m_config.has_option('t')
16
                                ? "translate"
17
-                               : "transcribe");
18
+                               : "transcribe",
19
+                "initial_prompt"_a = m_config.initial_prompt.empty()
20
+                                         ? static_cast<py::object>(py::none())
21
+                                         : static_cast<py::object>(py::str(
22
+                                               m_config.initial_prompt)));
23
 
24
             auto segments = *seg_tuple.cast<py::list>().begin();
25
 
26
dsnote-4.7.1.tar.gz/src/file_source.cpp -> dsnote-4.8.1.tar.gz/src/file_source.cpp Changed
17
 
1
@@ -19,6 +19,7 @@
2
 void file_source::stop() {
3
     qDebug() << "file source stop";
4
     m_mc.cancel();
5
+    m_stopped = true;
6
 }
7
 
8
 void file_source::slowdown() {
9
@@ -38,6 +39,7 @@
10
 }
11
 
12
 void file_source::start() {
13
+    m_stopped = false;
14
     connect(&m_timer, &QTimer::timeout, this,
15
             &file_source::handle_read_timeout);
16
     m_timer.setInterval(m_timer_quick);
17
dsnote-4.8.1.tar.gz/src/global_hotkeys_manager.cpp Added
201
 
1
@@ -0,0 +1,353 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#include "global_hotkeys_manager.hpp"
10
+
11
+#include <QDebug>
12
+#include <QRandomGenerator>
13
+
14
+#include "config.h"
15
+#include "dbus_portal_request_inf.h"
16
+#include "logger.hpp"
17
+#include "qtlogger.hpp"
18
+#include "settings.h"
19
+
20
+using PortalShortcut = QPair<QString, QVariantMap>;
21
+using PortalShortcuts = QList<PortalShortcut>;
22
+
23
+global_hotkeys_manager::global_hotkeys_manager(QObject *parent)
24
+    : QObject{parent},
25
+      m_portal_inf{DBUS_SERVICE_NAME, DBUS_SERVICE_PATH,
26
+                   QDBusConnection::sessionBus()} {
27
+    qDBusRegisterMetaType<PortalShortcuts>();
28
+    qDBusRegisterMetaType<QPair<QString, QVariantMap>>();
29
+    m_portal_inf.setTimeout(DBUS_TIMEOUT_MS);
30
+
31
+    connect(settings::instance(), &settings::hotkeys_enabled_changed, this,
32
+            &global_hotkeys_manager::enable_or_disable);
33
+    connect(settings::instance(), &settings::hotkeys_type_changed, this,
34
+            &global_hotkeys_manager::enable_or_disable);
35
+    connect(settings::instance(), &settings::hotkeys_changed, this,
36
+            &global_hotkeys_manager::enable_or_disable);
37
+
38
+    // try to create portal global shortcuts session
39
+    create_portal_session();
40
+}
41
+
42
+bool global_hotkeys_manager::is_supported() const {
43
+    return is_x11_supported() || is_portal_supported();
44
+}
45
+
46
+bool global_hotkeys_manager::is_x11_supported() const {
47
+#ifdef USE_X11_FEATURES
48
+    return settings::instance()->is_xcb();
49
+#else
50
+    return false;
51
+#endif
52
+}
53
+
54
+bool global_hotkeys_manager::is_portal_supported() const {
55
+    return !m_portal_session.path().isEmpty();
56
+}
57
+
58
+void global_hotkeys_manager::enable_or_disable() {
59
+    disable_portal();
60
+#ifdef USE_X11_FEATURES
61
+    disable_x11();
62
+    if (settings::instance()->hotkeys_enabled()) {
63
+        switch (settings::instance()->hotkeys_type()) {
64
+            case settings::hotkeys_type_t::HotkeysTypeX11:
65
+                enable_x11();
66
+                break;
67
+            case settings::hotkeys_type_t::HotkeysTypePortal:
68
+                enable_portal();
69
+                break;
70
+        }
71
+    }
72
+#else
73
+    if (settings::instance()->hotkeys_enabled()) {
74
+        switch (settings::instance()->hotkeys_type()) {
75
+            case settings::hotkeys_type_t::HotkeysTypePortal:
76
+                enable_portal();
77
+                break;
78
+        }
79
+    }
80
+#endif
81
+}
82
+
83
+void global_hotkeys_manager::enable_portal() {
84
+    if (!is_portal_supported()) {
85
+        LOGW("can't enable global hotkeys becuase portal is not supported");
86
+        return;
87
+    }
88
+
89
+    m_portal_activated_conn = connect(
90
+        &m_portal_inf, &OrgFreedesktopPortalGlobalShortcutsInterface::Activated,
91
+        this, &global_hotkeys_manager::handle_portal_activated);
92
+
93
+    fetch_portal_shortcuts();
94
+}
95
+
96
+void global_hotkeys_manager::disable_portal() {
97
+    disconnect(m_portal_activated_conn);
98
+}
99
+
100
+void global_hotkeys_manager::handle_portal_activated(
101
+    maybe_unused const QDBusObjectPath &session_handle,
102
+    const QString &action_id, maybe_unused qulonglong timestamp,
103
+    maybe_unused const QVariantMap &options) {
104
+    LOGD("portal hotkey activated: " << action_id);
105
+    emit hotkey_activated(action_id, {});
106
+}
107
+
108
+void global_hotkeys_manager::create_portal_session(bool force_bind) {
109
+    LOGD("dbus call CreateSession");
110
+
111
+    auto handle_token = QStringLiteral(APP_ID "_%1")
112
+                            .arg(QRandomGenerator::global()->generate());
113
+    m_force_bind = force_bind;
114
+
115
+    auto reply = m_portal_inf.CreateSession({
116
+        {QLatin1String("session_handle_token"), handle_token},
117
+        {QLatin1String("handle_token"), handle_token},
118
+    });
119
+
120
+    reply.waitForFinished();
121
+
122
+    if (reply.isError()) {
123
+        LOGW("can't connect to portal global shortcuts service: "
124
+             << reply.error().message());
125
+
126
+        // enable x11 key bindings if configured
127
+        enable_or_disable();
128
+
129
+        return;
130
+    }
131
+
132
+    LOGD("connecting to portal service: " << reply.value().path());
133
+
134
+    QDBusConnection::sessionBus().connect(
135
+        DBUS_SERVICE_NAME, reply.value().path(),
136
+        OrgFreedesktopPortalRequestInterface::staticInterfaceName(),
137
+        QLatin1String("Response"), this,
138
+        SLOT(handle_create_session_response(uint, QVariantMap)));
139
+}
140
+
141
+void global_hotkeys_manager::handle_create_session_response(
142
+    uint res, const QVariantMap &results) {
143
+    if (res != 0) {
144
+        LOGW("failed to create portal session: " << res);
145
+    } else {
146
+        m_portal_session =
147
+            QDBusObjectPath{results"session_handle".toString()};
148
+        LOGD("portal session created successfully");
149
+    }
150
+
151
+    enable_or_disable();
152
+}
153
+
154
+void global_hotkeys_manager::fetch_portal_shortcuts() {
155
+    LOGD("dbus call ListShortcuts");
156
+
157
+    auto reply = m_portal_inf.ListShortcuts(m_portal_session, {});
158
+    reply.waitForFinished();
159
+    if (reply.isError()) {
160
+        LOGW("failed to call ListShortcuts: " << reply.error().message());
161
+        return;
162
+    }
163
+
164
+    auto *req = new OrgFreedesktopPortalRequestInterface(
165
+        DBUS_SERVICE_NAME, reply.value().path(), QDBusConnection::sessionBus(),
166
+        this);
167
+
168
+    connect(req, &OrgFreedesktopPortalRequestInterface::Response, this,
169
+            &global_hotkeys_manager::handle_list_shortcuts_response);
170
+    connect(req, &OrgFreedesktopPortalRequestInterface::Response, req,
171
+            &QObject::deleteLater);
172
+}
173
+
174
+void global_hotkeys_manager::handle_list_shortcuts_response(
175
+    uint code, const QVariantMap &results) {
176
+    if (code != 0) {
177
+        LOGW("failed to get the list of portal hotkeys: " << code);
178
+        return;
179
+    }
180
+
181
+    if (!results.contains("shortcuts")) {
182
+        LOGW("no shortcuts in portal reply");
183
+        return;
184
+    }
185
+
186
+    PortalShortcuts s;
187
+    const auto arg = results"shortcuts".value<QDBusArgument>();
188
+    arg >> s;
189
+
190
+    for (auto it = s.cbegin(), it_end = s.cend(); it != it_end; ++it) {
191
+        LOGD("portal hotkey: " << it->first << " "
192
+                               << it->second"description".toString() << " "
193
+                               << it->second"trigger_description".toString());
194
+    }
195
+
196
+    if (s.isEmpty()) {
197
+        set_portal_bindings();
198
+        m_force_bind = false;
199
+        return;
200
+    }
201
dsnote-4.8.1.tar.gz/src/global_hotkeys_manager.hpp Added
84
 
1
@@ -0,0 +1,82 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#ifndef GLOBAL_HOTKEYS_MANAGER_H
10
+#define GLOBAL_HOTKEYS_MANAGER_H
11
+
12
+#include <QDBusObjectPath>
13
+#include <QMetaObject>
14
+#include <QObject>
15
+#include <QString>
16
+#include <QVariantMap>
17
+
18
+#include "settings.h"
19
+
20
+#ifdef USE_X11_FEATURES
21
+#include <qhotkey.h>
22
+#endif
23
+
24
+#include "dbus_portal_globalshortcuts_inf.h"
25
+
26
+class global_hotkeys_manager : public QObject {
27
+    Q_OBJECT
28
+
29
+   public:
30
+    explicit global_hotkeys_manager(QObject* parent = nullptr);
31
+    bool is_supported() const;
32
+    bool is_x11_supported() const;
33
+    bool is_portal_supported() const;
34
+    void set_portal_bindings();
35
+    void reset_portal_connection();
36
+
37
+   Q_SIGNALS:
38
+    void hotkey_activated(const QString& action_id,
39
+                          const QVariantMap& arguments);
40
+
41
+   private:
42
+    inline static const QString DBUS_SERVICE_NAME{
43
+        QStringLiteral("org.freedesktop.portal.Desktop")};
44
+    inline static const QString DBUS_SERVICE_PATH{
45
+        QStringLiteral("/org/freedesktop/portal/desktop")};
46
+    static const int DBUS_TIMEOUT_MS = 10000;  // 10s
47
+
48
+    uint m_portal_request_token_counter = 0;
49
+
50
+    OrgFreedesktopPortalGlobalShortcutsInterface m_portal_inf;
51
+    QDBusObjectPath m_portal_session;
52
+    QMetaObject::Connection m_portal_activated_conn;
53
+#ifdef USE_X11_FEATURES
54
+    struct x11_hotkeys_t {
55
+#define X(name, id, desc, key) QHotkey name;
56
+        HOTKEY_TABLE
57
+#undef X
58
+    };
59
+    x11_hotkeys_t m_x11_hotkeys;
60
+    bool m_force_bind = false;
61
+
62
+    void enable_x11();
63
+    void disable_x11();
64
+    void handle_x11_activated();
65
+#endif
66
+
67
+    void create_portal_session(bool force_bind = false);
68
+    void fetch_portal_shortcuts();
69
+    QString get_portal_request_token();
70
+    void enable_or_disable();
71
+    void enable_portal();
72
+    void disable_portal();
73
+    void handle_portal_activated(const QDBusObjectPath& session_handle,
74
+                                 const QString& action_id, qulonglong timestamp,
75
+                                 const QVariantMap& options);
76
+
77
+   public Q_SLOTS:
78
+    void handle_create_session_response(uint res, const QVariantMap& results);
79
+    void handle_list_shortcuts_response(uint code, const QVariantMap& results);
80
+    void handle_bind_shortcuts_response(uint code, const QVariantMap& results);
81
+};
82
+
83
+#endif  // GLOBAL_HOTKEYS_MANAGER_H
84
dsnote-4.8.1.tar.gz/src/kokoro_engine.cpp Added
201
 
1
@@ -0,0 +1,200 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#include "kokoro_engine.hpp"
10
+
11
+#include <fmt/format.h>
12
+#include <pybind11/embed.h>
13
+#include <pybind11/numpy.h>
14
+#include <unistd.h>
15
+
16
+#include <cstdio>
17
+#include <cstdlib>
18
+#include <cstring>
19
+#include <utility>
20
+
21
+#include "cpu_tools.hpp"
22
+#include "logger.hpp"
23
+#include "py_executor.hpp"
24
+
25
+using namespace pybind11::literals;
26
+
27
+kokoro_engine::kokoro_engine(config_t config, callbacks_t call_backs)
28
+    : tts_engine{std::move(config), std::move(call_backs)} {
29
+    if ((cpu_tools::cpuinfo().feature_flags &
30
+         cpu_tools::feature_flags_t::avx) == 0) {
31
+        LOGE("avx not supported but kokoro engine needs it");
32
+        throw std::runtime_error(
33
+            "failed to init kokoro engine: avx not supported");
34
+    }
35
+
36
+    if (m_config.model_files.hub_path.empty()) {
37
+        LOGE("hub path missing but kokoro engine needs it");
38
+        throw std::runtime_error("failed to init kokoro engine: no hub path");
39
+    }
40
+}
41
+
42
+kokoro_engine::~kokoro_engine() {
43
+    LOGD("kokoro dtor");
44
+
45
+    stop();
46
+}
47
+
48
+void kokoro_engine::stop() {
49
+    tts_engine::stop();
50
+
51
+    auto task = py_executor::instance()->execute(&() {
52
+        try {
53
+            m_pipeline.reset();
54
+            m_model.reset();
55
+
56
+            // release mem
57
+            py::module_::import("gc").attr("collect")();
58
+            py::module_::import("torch").attr("cuda").attr("empty_cache")();
59
+        } catch (const std::exception& err) {
60
+            LOGE("py error: " << err.what());
61
+        }
62
+        return std::any{};
63
+    });
64
+
65
+    if (task) task->get();
66
+
67
+    LOGD("kokoro stopped");
68
+}
69
+
70
+void kokoro_engine::create_model() {
71
+    auto task = py_executor::instance()->execute(&() {
72
+        auto model_file =
73
+            first_file_with_ext(m_config.model_files.model_path, "pth");
74
+        if (model_file.empty()) {
75
+            LOGD("can't find model file in dir: "
76
+                 << m_config.model_files.model_path);
77
+            return false;
78
+        }
79
+        auto config_file =
80
+            first_file_with_ext(m_config.model_files.model_path, "json");
81
+        if (config_file.empty()) {
82
+            LOGD("can't find config file in dir: "
83
+                 << m_config.model_files.model_path);
84
+            return false;
85
+        }
86
+        m_voice_file = fmt::format("{}/{}.pt", m_config.model_files.model_path,
87
+                                   m_config.speaker_id);
88
+        if (!file_exists(m_voice_file)) {
89
+            LOGD("can't find voice file: " << m_voice_file);
90
+            return false;
91
+        }
92
+
93
+        auto use_cuda =
94
+            m_config.use_gpu &&
95
+            (py_executor::instance()->libs_availability->torch_cuda ||
96
+             py_executor::instance()->libs_availability->torch_hip);
97
+
98
+        LOGD("using device: " << (use_cuda ? "cuda" : "cpu") << " "
99
+                              << m_config.gpu_device.id);
100
+
101
+        m_device_str = use_cuda ? "cuda" : "cpu";
102
+
103
+        try {
104
+            auto kokoro_api = py::module_::import("kokoro");
105
+            m_model = kokoro_api.attr("KModel")("model"_a = model_file,
106
+                                                "config"_a = config_file);
107
+
108
+            auto hook = py::cpp_function{
109
+                this(maybe_unused const py::args& args,
110
+                       maybe_unused const py::kwargs& kwargs) {
111
+                    if (is_shutdown()) {
112
+                        throw std::runtime_error{"engine shutdown"};
113
+                    }
114
+                }};
115
+            m_model->attr("register_forward_hook")(hook);
116
+            m_model->attr("register_forward_pre_hook")(hook);
117
+
118
+            m_pipeline = kokoro_api.attr("KPipeline")(
119
+                "model"_a = m_model.value(),
120
+                "lang_code"_a = m_config.speaker_id.empty()
121
+                                    ? "a"
122
+                                    : m_config.speaker_id.substr(0, 1),
123
+                "device"_a = m_device_str);
124
+        } catch (const std::exception& err) {
125
+            LOGE("py error: " << err.what());
126
+            return false;
127
+        }
128
+        return true;
129
+    });
130
+
131
+    if (!task || !std::any_cast<bool>(task->get()))
132
+        LOGE("failed to create kokoro model");
133
+    else
134
+        LOGD("kokoro model created");
135
+}
136
+
137
+bool kokoro_engine::model_created() const {
138
+    return m_model.has_value() && m_pipeline.has_value();
139
+}
140
+
141
+bool kokoro_engine::encode_speech_impl(const std::string& text,
142
+                                       unsigned int speed,
143
+                                       const std::string& out_file) {
144
+    auto speech_speed = std::clamp(speed, 1U, 20U) / 10.0;
145
+
146
+    auto task = py_executor::instance()->execute(&() {
147
+        try {
148
+            auto generator = m_pipeline.value()(text, "voice"_a = m_voice_file,
149
+                                                "speed"_a = speech_speed,
150
+                                                "model"_a = m_model.value());
151
+            auto next = generator.attr("__iter__")().attr("__next__");
152
+
153
+            std::ofstream os{out_file, std::ios::binary};
154
+            os.seekp(sizeof(wav_header));
155
+            auto data_start = os.tellp();
156
+
157
+            while (true) {
158
+                if (is_shutdown()) throw std::runtime_error{"engine shutdown"};
159
+
160
+                try {
161
+                    auto item = next();
162
+                    py::array_t<float,
163
+                                py::array::c_style | py::array::forcecast>
164
+                        audio_arr =
165
+                            item.attr("output").attr("audio").attr("squeeze")();
166
+                    auto buffer = audio_arr.request();
167
+                    for (ssize_t i = 0; i < buffer.size; ++i) {
168
+                        // convert f32 to s16 sample format
169
+                        auto sample = static_cast<int16_t>(
170
+                            static_cast<float*>(buffer.ptr)i * 32768.0F);
171
+                        os.write(reinterpret_cast<char*>(&sample), 2);
172
+                    }
173
+                } catch (const py::error_already_set& e) {
174
+                    if (e.matches(PyExc_StopIteration)) {
175
+                        break;
176
+                    } else {
177
+                        throw;
178
+                    }
179
+                }
180
+            }
181
+
182
+            auto data_size = os.tellp() - data_start;
183
+
184
+            os.seekp(0);
185
+            write_wav_header(s_sample_rate, sizeof(int16_t), 1,
186
+                             data_size / sizeof(int16_t), os);
187
+
188
+        } catch (const std::exception& err) {
189
+            LOGE("py error: " << err.what());
190
+            unlink(out_file.c_str());
191
+            return false;
192
+        }
193
+
194
+        LOGD("voice synthesized successfully");
195
+        return true;
196
+    });
197
+
198
+    return task && std::any_cast<bool>(task->get());
199
+}
200
+
201
dsnote-4.8.1.tar.gz/src/kokoro_engine.hpp Added
45
 
1
@@ -0,0 +1,43 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#ifndef KOKORO_ENGINE_HPP
10
+#define KOKORO_ENGINE_HPP
11
+
12
+#undef slots
13
+#include <pybind11/embed.h>
14
+#include <pybind11/pytypes.h>
15
+#define slots Q_SLOTS
16
+
17
+#include <optional>
18
+#include <string>
19
+
20
+#include "tts_engine.hpp"
21
+
22
+namespace py = pybind11;
23
+
24
+class kokoro_engine : public tts_engine {
25
+   public:
26
+    kokoro_engine(config_t config, callbacks_t call_backs);
27
+    ~kokoro_engine() override;
28
+
29
+   private:
30
+    static const int s_sample_rate = 24000;
31
+    std::optional<py::object> m_model;
32
+    std::optional<py::object> m_pipeline;
33
+    std::string m_voice_file;
34
+    std::string m_device_str;
35
+
36
+    bool model_created() const final;
37
+    bool model_supports_speed() const final;
38
+    void create_model() final;
39
+    bool encode_speech_impl(const std::string& text, unsigned int speed,
40
+                            const std::string& out_file) final;
41
+    void stop();
42
+};
43
+
44
+#endif  // KOKORO_ENGINE_HPP
45
dsnote-4.7.1.tar.gz/src/logger.hpp -> dsnote-4.8.1.tar.gz/src/logger.hpp Changed
14
 
1
@@ -27,6 +27,12 @@
2
         << msg
3
 #define LOGE(msg) \
4
     Logger::Message(Logger::LogType::Error, __FILE__, __func__, __LINE__) << msg
5
+#define LOGF(msg)                                                         \
6
+    Logger::Message(Logger::LogType::Error, __FILE__, __func__, __LINE__) \
7
+        << msg;                                                           \
8
+    std::ostringstream ss;                                                \
9
+    ss << __func__ << ':' << __LINE__ << " - " << msg;                    \
10
+    throw std::runtime_error { ss.str() }
11
 
12
 class Logger {
13
    public:
14
dsnote-4.7.1.tar.gz/src/main.cpp -> dsnote-4.8.1.tar.gz/src/main.cpp Changed
195
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2021-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2021-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -56,7 +56,7 @@
8
 #include "text_tools.hpp"
9
 
10
 static void exit_program() {
11
-    qDebug() << "exiting";
12
+    LOGD("exiting");
13
 
14
     speech_service::remove_cached_files();
15
 
16
@@ -65,7 +65,7 @@
17
 }
18
 
19
 static void signal_handler(int sig) {
20
-    qDebug() << "received signal:" << sig;
21
+    LOGD("received signal: " << sig);
22
 
23
     exit_program();
24
 }
25
@@ -152,6 +152,15 @@
26
         QStringLiteral("text")};
27
     parser.addOption(text_opt);
28
 
29
+    QCommandLineOption output_file_opt{
30
+        QStringLiteral("output-file"),
31
+        QStringLiteral("Save the synthesized speech in an audio file instead "
32
+                       "of playing it aloud. Used together with "
33
+                       "start-reading-clipboard or "
34
+                       "start-reading-text action."),
35
+        QStringLiteral("output-file")};
36
+    parser.addOption(output_file_opt);
37
+
38
     QCommandLineOption gen_checksum_opt{
39
         QStringLiteral("gen-checksums"),
40
         QStringLiteral(
41
@@ -265,7 +274,7 @@
42
                                id_opt.valueName().toStdString());
43
                     options.valid = false;
44
                 } else {
45
-                    options.extra = QStringLiteral("{%1}").arg(id);
46
+                    options.model_id = QStringLiteral("%1").arg(id);
47
                 }
48
             } else if (action.compare("start-reading-text",
49
                                       Qt::CaseInsensitive) == 0) {
50
@@ -275,14 +284,15 @@
51
                                text_opt.valueName().toStdString());
52
                     options.valid = false;
53
                 } else if (!id_ok) {
54
-                    options.extra = std::move(text);
55
+                    options.text = std::move(text);
56
                 } else {
57
-                    options.extra = QStringLiteral("{%1}%2").arg(id, text);
58
+                    options.text = std::move(text);
59
+                    options.model_id = id;
60
                 }
61
             } else if (action.compare("start-reading-clipboard",
62
                                       Qt::CaseInsensitive) == 0) {
63
                 if (id_ok) {
64
-                    options.extra = QStringLiteral("{%1}").arg(id);
65
+                    options.model_id = QStringLiteral("%1").arg(id);
66
                 }
67
             }
68
 
69
@@ -290,6 +300,18 @@
70
         }
71
     }
72
 
73
+    options.output_file = parser.value(output_file_opt);
74
+    if (!options.output_file.isEmpty()) {
75
+        if (!options.action.startsWith("start-reading-", Qt::CaseInsensitive)) {
76
+            fmt::print(
77
+                stderr,
78
+                "Option --{} can be used only with start-reading-clipboard and "
79
+                "start-reading-text actions.\n",
80
+                output_file_opt.valueName().toStdString());
81
+            options.valid = false;
82
+        }
83
+    }
84
+
85
     auto models_role_to_print = parser.value(print_models_opt);
86
     if (!models_role_to_print.isEmpty()) {
87
         if (models_role_to_print.contains("stt", Qt::CaseInsensitive)) {
88
@@ -299,8 +321,9 @@
89
             options.models_to_print_roles |= cmd::role_tts;
90
         }
91
         if (options.models_to_print_roles == cmd::role_none) {
92
+            auto names = print_models_opt.names();
93
             fmt::print(stderr, "Invalid model role in --{} option.\n",
94
-                       print_models_opt.names().front().toStdString());
95
+                       names.front().toStdString());
96
             options.valid = false;
97
         }
98
     }
99
@@ -314,8 +337,9 @@
100
             options.active_model_to_print_role |= cmd::role_tts;
101
         }
102
         if (options.active_model_to_print_role == cmd::role_none) {
103
+            auto names = print_active_model_opt.names();
104
             fmt::print(stderr, "Invalid model role in --{} option.\n",
105
-                       print_active_model_opt.names().front().toStdString());
106
+                       names.front().toStdString());
107
             options.valid = false;
108
         }
109
     }
110
@@ -329,8 +353,9 @@
111
             options.state_scope_to_print_flag |= cmd::scope_task;
112
         }
113
         if (options.state_scope_to_print_flag == cmd::scope_none) {
114
+            auto names = print_state_opt.names();
115
             fmt::print(stderr, "Invalid state scope in --{} option.\n",
116
-                       print_state_opt.names().front().toStdString());
117
+                       names.front().toStdString());
118
             options.valid = false;
119
         }
120
     }
121
@@ -383,19 +408,19 @@
122
     if (!translator->load(QLocale{}, QStringLiteral("dsnote"),
123
                           QStringLiteral("-"), trans_dir,
124
                           QStringLiteral(".qm"))) {
125
-        qDebug() << "failed to load translation:" << QLocale::system().name()
126
-                 << trans_dir;
127
+        LOGD("failed to load translation: " << QLocale::system().name() << " "
128
+                                            << trans_dir);
129
         if (!translator->load(QStringLiteral("dsnote-en"), trans_dir)) {
130
-            qDebug() << "failed to load default translation";
131
+            LOGE("failed to load default translation");
132
             delete translator;
133
             return;
134
         }
135
     } else {
136
-        qDebug() << "translation:" << QLocale::system().name();
137
+        LOGD("translation: " << QLocale::system().name());
138
     }
139
 
140
     if (!QGuiApplication::installTranslator(translator)) {
141
-        qWarning() << "failed to install translation";
142
+        LOGW("failed to install translation");
143
     }
144
 }
145
 
146
@@ -434,7 +459,7 @@
147
 
148
 #if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
149
     QGuiApplication::setDesktopFileName(APP_ICON_ID);
150
-    qDebug() << "desktop file:" << QGuiApplication::desktopFileName();
151
+    LOGD("desktop file: " << QGuiApplication::desktopFileName());
152
 #endif
153
 #endif
154
     register_types();
155
@@ -479,7 +504,7 @@
156
         QCoreApplication::instance(),
157
         url(const QObject* obj, const QUrl& objUrl) {
158
             if (!obj && url == objUrl) {
159
-                qCritical() << "failed to create qml object";
160
+                LOGE("failed to create qml object");
161
                 QCoreApplication::exit(-1);
162
             }
163
         },
164
@@ -515,9 +540,9 @@
165
     initQtLogger();
166
     initAvLogger();
167
 
168
-    qDebug() << "app version:" << APP_VERSION;
169
+    LOGD("app version: " << APP_VERSION);
170
 #ifdef USE_FLATPAK
171
-    qDebug() << "required addon version:" << APP_ADDON_VERSION;
172
+    LOGD("required addon version: " << APP_ADDON_VERSION);
173
 #endif
174
 
175
     cpu_tools::cpuinfo();
176
@@ -532,15 +557,15 @@
177
 
178
     switch (cmd_opts.launch_mode) {
179
         case settings::launch_mode_t::service:
180
-            qDebug() << "starting service";
181
+            LOGD("starting service");
182
             start_service(cmd_opts);
183
             exit_program();
184
             break;
185
         case settings::launch_mode_t::app_stanalone:
186
-            qDebug() << "starting standalone app";
187
+            LOGD("starting standalone app");
188
             break;
189
         case settings::launch_mode_t::app:
190
-            qDebug() << "starting app";
191
+            LOGD("starting app");
192
             break;
193
     }
194
 
195
dsnote-4.7.1.tar.gz/src/mic_source.h -> dsnote-4.8.1.tar.gz/src/mic_source.h Changed
9
 
1
@@ -39,7 +39,6 @@
2
     bool m_eof = false;
3
     bool m_sof = true;
4
     bool m_ended = false;
5
-    bool m_stopped = false;
6
 
7
     void init_audio(const QString& preferred_audio_input);
8
     void start();
9
dsnote-4.7.1.tar.gz/src/mimic3_engine.cpp -> dsnote-4.8.1.tar.gz/src/mimic3_engine.cpp Changed
11
 
1
@@ -42,6 +42,9 @@
2
                     .attr("_SHARED_MODELS")
3
                     .attr("clear")();
4
                 m_tts.reset();
5
+
6
+                // release mem
7
+                py::module_::import("gc").attr("collect")();
8
             } catch (const std::exception& err) {
9
                 LOGE("py error: " << err.what());
10
             }
11
dsnote-4.7.1.tar.gz/src/models_list_model.cpp -> dsnote-4.8.1.tar.gz/src/models_list_model.cpp Changed
97
 
1
@@ -81,6 +81,23 @@
2
                 FeatureEngineTtsWhisperSpeech:
3
                 d << "engine-tts-whisper-speech";
4
                 break;
5
+            case ModelsListModel::ModelFeatureFilterFlags::
6
+                FeatureEngineTtsParler:
7
+                d << "engine-tts-parler";
8
+                break;
9
+            case ModelsListModel::ModelFeatureFilterFlags::
10
+                FeatureEngineTtsKokoro:
11
+                d << "engine-tts-kokoro";
12
+                break;
13
+            case ModelsListModel::ModelFeatureFilterFlags::FeatureEngineTtsF5:
14
+                d << "engine-tts-f5";
15
+                break;
16
+            case ModelsListModel::ModelFeatureFilterFlags::FeatureEngineTtsSam:
17
+                d << "engine-tts-sam";
18
+                break;
19
+            case ModelsListModel::ModelFeatureFilterFlags::FeatureEngineMnt:
20
+                d << "engine-mnt";
21
+                break;
22
             case ModelsListModel::ModelFeatureFilterFlags::FeatureEngineOther:
23
                 d << "engine-other";
24
                 break;
25
@@ -99,6 +116,9 @@
26
                 FeatureTtsVoiceCloning:
27
                 d << "tts-voice-cloning";
28
                 break;
29
+            case ModelsListModel::ModelFeatureFilterFlags::FeatureTtsPrompt:
30
+                d << "tts-prompt";
31
+                break;
32
             default:
33
                 break;
34
         }
35
@@ -239,6 +259,7 @@
36
         /*license=*/
37
         {model.license.id, model.license.name, model.license.url,
38
          model.license.accept_required},
39
+        /*info=*/std::move(model.info),
40
         /*download_info=*/std::move(download_info),
41
         /*available=*/model.available,
42
         /*dl_multi=*/model.dl_multi,
43
@@ -346,7 +367,8 @@
44
 
45
     m_disabledFeatureFilterFlags = 0;
46
     for (unsigned int flag = ModelFeatureFilterFlags::FeatureSttStart;
47
-         flag <= ModelFeatureFilterFlags::FeatureTtsEnd; flag <<= 1U) {
48
+         flag != 0 && flag <= ModelFeatureFilterFlags::FeatureTtsEnd;
49
+         flag <<= 1U) {
50
         if ((flag & existing_not_generic_feature_flags) == 0)
51
             m_disabledFeatureFilterFlags |= flag;
52
     }
53
@@ -459,14 +481,15 @@
54
 ModelsListItem::ModelsListItem(
55
     const QString &id, QString name, QString lang_id, QString pack_id,
56
     int pack_count, int pack_available_count, ModelsListModel::ModelRole role,
57
-    License license, DownloadInfo download_info, bool available, bool dl_multi,
58
-    bool dl_off, unsigned int features, int score, bool default_for_lang,
59
-    bool downloading, double progress, QObject *parent)
60
+    License license, QString info, DownloadInfo download_info, bool available,
61
+    bool dl_multi, bool dl_off, unsigned int features, int score,
62
+    bool default_for_lang, bool downloading, double progress, QObject *parent)
63
     : SelectableItem{parent},
64
       m_id{id},
65
       m_name{std::move(name)},
66
       m_lang_id{std::move(lang_id)},
67
       m_pack_id{std::move(pack_id)},
68
+      m_info{std::move(info)},
69
       m_pack_count{pack_count},
70
       m_pack_available_count{pack_available_count},
71
       m_role{role},
72
@@ -507,6 +530,7 @@
73
         QByteArrayLiteral("license_accept_required");
74
     namesDownloadUrlsRole = QByteArrayLiteral("download_urls");
75
     namesDownloadSizeRole = QByteArrayLiteral("download_size");
76
+    namesInfoRole = QByteArrayLiteral("info");
77
     return names;
78
 }
79
 
80
@@ -554,6 +578,8 @@
81
             return download_urls();
82
         case DownloadSizeRole:
83
             return download_size();
84
+        case InfoRole:
85
+            return info();
86
         default:
87
             break;
88
     }
89
@@ -576,6 +602,7 @@
90
         m_dl_multi = item->dl_multi();
91
         m_dl_off = item->dl_off();
92
         m_pack_available_count = item->pack_available_count();
93
+
94
         emit itemDataChanged();
95
     }
96
 }
97
dsnote-4.7.1.tar.gz/src/models_list_model.h -> dsnote-4.8.1.tar.gz/src/models_list_model.h Changed
174
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2021-2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2021-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -52,6 +52,7 @@
8
     };
9
     Q_ENUM(ModelRoleFilterFlags)
10
 
11
+    // must be the same as models_manager::feature_flags
12
     enum ModelFeatureFilterFlags : unsigned int {
13
         FeatureNone = 0U,
14
         FeatureGenericStart = 1U << 0U,
15
@@ -76,17 +77,23 @@
16
         FeatureEngineTtsCoqui = 1U << 14U,
17
         FeatureEngineTtsMimic3 = 1U << 15U,
18
         FeatureEngineTtsWhisperSpeech = 1U << 16U,
19
-        FeatureEngineTtsEnd = FeatureEngineTtsWhisperSpeech,
20
-        FeatureEngineOther = 1U << 17U,
21
-        FeatureHwOpenVino = 1U << 18U,
22
+        FeatureEngineTtsSam = 1U << 17U,
23
+        FeatureEngineTtsParler = 1U << 18U,
24
+        FeatureEngineTtsF5 = 1U << 19U,
25
+        FeatureEngineTtsKokoro = 1U << 20U,
26
+        FeatureEngineTtsEnd = FeatureEngineTtsKokoro,
27
+        FeatureEngineMnt = 1U << 23U,
28
+        FeatureEngineOther = 1U << 24U,
29
         FeatureGenericEnd = FeatureEngineOther,
30
-        FeatureSttStart = 1U << 20U,
31
+        FeatureHwOpenVino = 1U << 25U,
32
+        FeatureSttStart = 1U << 26U,
33
         FeatureSttIntermediateResults = FeatureSttStart,
34
-        FeatureSttPunctuation = 1U << 21U,
35
+        FeatureSttPunctuation = 1U << 27U,
36
         FeatureSttEnd = FeatureSttPunctuation,
37
-        FeatureTtsStart = 1U << 30U,
38
+        FeatureTtsStart = 1U << 28U,
39
         FeatureTtsVoiceCloning = FeatureTtsStart,
40
-        FeatureTtsEnd = FeatureTtsVoiceCloning,
41
+        FeatureTtsPrompt = 1U << 29U,
42
+        FeatureTtsEnd = FeatureTtsPrompt,
43
         FeatureLast = FeatureTtsEnd,
44
         FeatureAllSttEngines = FeatureEngineSttDs | FeatureEngineSttVosk |
45
                                FeatureEngineSttWhisper |
46
@@ -95,19 +102,22 @@
47
         FeatureAllTtsEngines = FeatureEngineTtsEspeak | FeatureEngineTtsPiper |
48
                                FeatureEngineTtsRhvoice | FeatureEngineTtsCoqui |
49
                                FeatureEngineTtsMimic3 |
50
-                               FeatureEngineTtsWhisperSpeech,
51
+                               FeatureEngineTtsWhisperSpeech |
52
+                               FeatureEngineTtsSam | FeatureEngineTtsParler |
53
+                               FeatureEngineTtsF5 | FeatureEngineTtsKokoro,
54
         FeatureAll = FeatureFastProcessing | FeatureMediumProcessing |
55
                      FeatureSlowProcessing | FeatureQualityHigh |
56
                      FeatureQualityMedium | FeatureQualityLow |
57
                      FeatureAllSttEngines | FeatureAllTtsEngines |
58
                      FeatureSttIntermediateResults | FeatureSttPunctuation |
59
-                     FeatureTtsVoiceCloning,
60
+                     FeatureTtsVoiceCloning | FeatureTtsPrompt,
61
         FeatureDefault = FeatureFastProcessing | FeatureMediumProcessing |
62
                          FeatureSlowProcessing | FeatureQualityHigh |
63
                          FeatureQualityMedium | FeatureQualityLow |
64
                          FeatureAllSttEngines | FeatureAllTtsEngines,
65
         FeatureAdditional = FeatureSttIntermediateResults |
66
-                            FeatureSttPunctuation | FeatureTtsVoiceCloning
67
+                            FeatureSttPunctuation | FeatureTtsVoiceCloning |
68
+                            FeatureTtsPrompt
69
 
70
     };
71
     Q_ENUM(ModelFeatureFilterFlags)
72
@@ -148,12 +158,12 @@
73
     size_t firstChangedItemIdx(const QList<ListItem *> &oldItems,
74
                                const QList<ListItem *> &newItems) override;
75
     void updateItem(ListItem *oldItem, const ListItem *newItem) override;
76
-    inline bool downloading() const { return m_downloading; }
77
-    inline QString lang() const { return m_lang; }
78
-    inline QString pack() const { return m_pack; }
79
-    inline auto roleFilterFlags() const { return m_roleFilterFlags; }
80
-    inline auto featureFilterFlags() const { return m_featureFilterFlags; }
81
-    inline auto disabledFeatureFilterFlags() const {
82
+    bool downloading() const { return m_downloading; }
83
+    QString lang() const { return m_lang; }
84
+    QString pack() const { return m_pack; }
85
+    auto roleFilterFlags() const { return m_roleFilterFlags; }
86
+    auto featureFilterFlags() const { return m_featureFilterFlags; }
87
+    auto disabledFeatureFilterFlags() const {
88
         return m_disabledFeatureFilterFlags;
89
     }
90
     void setLang(const QString &lang);
91
@@ -190,7 +200,8 @@
92
         LicenseUrlRole,
93
         LicenseAccceptRequiredRole,
94
         DownloadUrlsRole,
95
-        DownloadSizeRole
96
+        DownloadSizeRole,
97
+        InfoRole
98
     };
99
 
100
     struct License {
101
@@ -210,43 +221,44 @@
102
     ModelsListItem(const QString &id, QString name, QString lang_id,
103
                    QString pack_id, int pack_count, int pack_available_count,
104
                    ModelsListModel::ModelRole role, License license,
105
-                   DownloadInfo download_info, bool available = true,
106
-                   bool dl_multi = false, bool dl_off = false,
107
-                   unsigned int features = 0, int score = 2,
108
-                   bool default_for_lang = false, bool downloading = false,
109
-                   double progress = 0.0, QObject *parent = nullptr);
110
+                   QString info, DownloadInfo download_info,
111
+                   bool available = true, bool dl_multi = false,
112
+                   bool dl_off = false, unsigned int features = 0,
113
+                   int score = 2, bool default_for_lang = false,
114
+                   bool downloading = false, double progress = 0.0,
115
+                   QObject *parent = nullptr);
116
     QVariant data(int role) const override;
117
     QHash<int, QByteArray> roleNames() const override;
118
-    inline QString id() const override { return m_id; }
119
-    inline QString name() const { return m_name; }
120
-    inline QString lang_id() const { return m_lang_id; }
121
-    inline QString pack_id() const { return m_pack_id; }
122
-    inline int pack_count() const { return m_pack_count; }
123
-    inline int pack_available_count() const { return m_pack_available_count; }
124
-    inline ModelsListModel::ModelRole modelRole() const { return m_role; }
125
-    inline bool available() const { return m_available; }
126
-    inline bool dl_multi() const { return m_dl_multi; }
127
-    inline bool dl_off() const { return m_dl_off; }
128
-    inline auto features() const { return m_features; }
129
-    inline int score() const { return m_score; }
130
-    inline bool default_for_lang() const { return m_default_for_lang; }
131
-    inline bool downloading() const { return m_downloading; }
132
-    inline double progress() const { return m_progress; }
133
-    inline QString license_id() const { return m_license.id; }
134
-    inline QString license_name() const { return m_license.name; }
135
-    inline QUrl license_url() const { return m_license.url; }
136
-    inline bool license_accept_required() const {
137
-        return m_license.accept_required;
138
-    }
139
-    inline QStringList download_urls() const { return m_download_info.urls; }
140
-    inline QString download_size() const { return m_download_info.size; }
141
+    QString id() const override { return m_id; }
142
+    QString name() const { return m_name; }
143
+    QString lang_id() const { return m_lang_id; }
144
+    QString pack_id() const { return m_pack_id; }
145
+    int pack_count() const { return m_pack_count; }
146
+    int pack_available_count() const { return m_pack_available_count; }
147
+    ModelsListModel::ModelRole modelRole() const { return m_role; }
148
+    bool available() const { return m_available; }
149
+    bool dl_multi() const { return m_dl_multi; }
150
+    bool dl_off() const { return m_dl_off; }
151
+    auto features() const { return m_features; }
152
+    int score() const { return m_score; }
153
+    bool default_for_lang() const { return m_default_for_lang; }
154
+    bool downloading() const { return m_downloading; }
155
+    double progress() const { return m_progress; }
156
+    QString license_id() const { return m_license.id; }
157
+    QString license_name() const { return m_license.name; }
158
+    QUrl license_url() const { return m_license.url; }
159
+    bool license_accept_required() const { return m_license.accept_required; }
160
+    QStringList download_urls() const { return m_download_info.urls; }
161
+    QString download_size() const { return m_download_info.size; }
162
     void update(const ModelsListItem *item);
163
+    QString info() const { return m_info; };
164
 
165
    private:
166
     QString m_id;
167
     QString m_name;
168
     QString m_lang_id;
169
     QString m_pack_id;
170
+    QString m_info;
171
     int m_pack_count = 0;
172
     int m_pack_available_count = 0;
173
     ModelsListModel::ModelRole m_role = ModelsListModel::ModelRole::Stt;
174
dsnote-4.7.1.tar.gz/src/models_manager.cpp -> dsnote-4.8.1.tar.gz/src/models_manager.cpp Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2021-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2021-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -31,7 +31,6 @@
8
 #include <functional>
9
 #include <iostream>
10
 #include <set>
11
-#include <sstream>
12
 #include <string>
13
 #include <thread>
14
 #include <utility>
15
@@ -144,12 +143,16 @@
16
     if (flags & models_manager::engine_tts_mimic3) d << "engine-tts-mimic3, ";
17
     if (flags & models_manager::engine_tts_whisperspeech)
18
         d << "engine-tts-whisperspeech, ";
19
+    if (flags & models_manager::engine_tts_parler) d << "engine-tts-parler, ";
20
+    if (flags & models_manager::engine_tts_f5) d << "engine-tts-f5, ";
21
+    if (flags & models_manager::engine_tts_kokoro) d << "engine-tts-kokoro, ";
22
     if (flags & models_manager::engine_other) d << "engine-other, ";
23
     if (flags & models_manager::hw_openvino) d << "hw-openvino, ";
24
     if (flags & models_manager::stt_intermediate_results)
25
         d << "stt-intermediate-results, ";
26
     if (flags & models_manager::stt_punctuation) d << "stt-punctuation, ";
27
     if (flags & models_manager::tts_voice_cloning) d << "tts-voice-cloning, ";
28
+    if (flags & models_manager::tts_prompt) d << "tts-prompt, ";
29
     return d;
30
 }
31
 
32
@@ -197,6 +200,18 @@
33
         case models_manager::model_engine_t::tts_whisperspeech:
34
             d << "tts-whisperspeech";
35
             break;
36
+        case models_manager::model_engine_t::tts_sam:
37
+            d << "tts-sam";
38
+            break;
39
+        case models_manager::model_engine_t::tts_parler:
40
+            d << "tts-parler";
41
+            break;
42
+        case models_manager::model_engine_t::tts_f5:
43
+            d << "tts-f5";
44
+            break;
45
+        case models_manager::model_engine_t::tts_kokoro:
46
+            d << "tts-kokoro";
47
+            break;
48
         case models_manager::model_engine_t::mnt_bergamot:
49
             d << "mnt-bergamot";
50
             break;
51
@@ -241,6 +256,11 @@
52
     if (models_availability.tts_mimic3_nl) d << "tts_mimic3_nl,";
53
     if (models_availability.tts_rhvoice) d << "tts_rhvoice,";
54
     if (models_availability.tts_whisperspeech) d << "tts_whisperspeech,";
55
+    if (models_availability.tts_parler) d << "tts_parler,";
56
+    if (models_availability.tts_f5) d << "tts_f5,";
57
+    if (models_availability.tts_kokoro) d << "tts_kokoro,";
58
+    if (models_availability.tts_kokoro_ja) d << "tts_kokoro_ja,";
59
+    if (models_availability.tts_kokoro_zh) d << "tts_kokoro_zh,";
60
     if (models_availability.stt_fasterwhisper) d << "stt_fasterwhisper,";
61
     if (models_availability.stt_ds) d << "stt_ds,";
62
     if (models_availability.stt_vosk) d << "stt_vosk,";
63
@@ -431,40 +451,10 @@
64
                       const auto& model = pair.second;
65
 
66
                       if (model.disabled) return;
67
-
68
-                      if (!lang_id.isEmpty() && lang_id != model.lang_id)
69
-                          return;
70
-
71
                       if (!pack_id.isEmpty() && pack_id != model.pack_id)
72
                           return;
73
-
74
-                      for (const auto& pack : model.packs) {
75
-                          list.push_back(model_t{/*id=*/pack.id,
76
-                                                 /*engine=*/model.engine,
77
-                                                 /*lang_id=*/model.lang_id,
78
-                                                 /*lang_code=*/{},
79
-                                                 /*name=*/pack.name,
80
-                                                 /*model_file=*/{},
81
-                                                 /*sup_files=*/{},
82
-                                                 /*pack_id=*/pack.id,
83
-                                                 /*pack_count=*/0,
84
-                                                 /*pack_available_count=*/0,
85
-                                                 /*packs=*/{},
86
-                                                 /*speaker=*/{},
87
-                                                 /*trg_lang_id=*/{},
88
-                                                 /*score=*/model.score,
89
-                                                 /*options=*/{},
90
-                                                 /*license=*/{},
91
-                                                 /*download_info=*/{},
92
-                                                 /*default_for_lang=*/{},
93
-                                                 /*available=*/{},
94
-                                                 /*dl_multi=*/{},
95
-                                                 /*dl_off=*/{},
96
-                                                 /*features=*/model.features,
97
-                                                 /*downloading=*/{},
98
-                                                 /*download_progress=*/{}});
99
-                      }
100
-
101
+                      if (!lang_id.isEmpty() && lang_id != model.lang_id)
102
+                          return;
103
                       if (model.hidden) return;
104
 
105
                       if (pack_id.isEmpty() && !model.pack_id.isEmpty()) {
106
@@ -489,7 +479,7 @@
107
                           /*pack_id=*/{},
108
                           /*pack_count=*/{},
109
                           /*pack_available_count=*/{},
110
-                          /*packs=*/model.packs,
111
+                          /*info=*/model.info,
112
                           /*speaker=*/model.speaker,
113
                           /*trg_lang_id=*/model.trg_lang_id,
114
                           /*score=*/model.score,
115
@@ -505,6 +495,44 @@
116
                           /*download_progress=*/model.download_progress});
117
                   });
118
 
119
+    if (pack_id.isEmpty()) {
120
+        std::for_each(m_packs.cbegin(), m_packs.cend(),
121
+                      &(const std::pair<QString, pack_t>& pair) {
122
+                          const auto& pack = pair.second;
123
+                          if (!lang_id.isEmpty() && lang_id != pack.lang_id) {
124
+                              return;
125
+                          }
126
+                          if (pack.disabled || pack.hidden ||
127
+                              pack_status_map.count(pair.first) == 0) {
128
+                              return;
129
+                          }
130
+                          list.push_back(model_t{/*id=*/pair.first,
131
+                                                 /*engine=*/pack.engine,
132
+                                                 /*lang_id=*/pack.lang_id,
133
+                                                 /*lang_code=*/{},
134
+                                                 /*name=*/pack.name,
135
+                                                 /*model_file=*/{},
136
+                                                 /*sup_files=*/{},
137
+                                                 /*pack_id=*/pair.first,
138
+                                                 /*pack_count=*/0,
139
+                                                 /*pack_available_count=*/0,
140
+                                                 /*info=*/{},
141
+                                                 /*speaker=*/{},
142
+                                                 /*trg_lang_id=*/{},
143
+                                                 /*score=*/pack.score,
144
+                                                 /*options=*/{},
145
+                                                 /*license=*/{},
146
+                                                 /*download_info=*/{},
147
+                                                 /*default_for_lang=*/{},
148
+                                                 /*available=*/{},
149
+                                                 /*dl_multi=*/{},
150
+                                                 /*dl_off=*/{},
151
+                                                 /*features=*/pack.features,
152
+                                                 /*downloading=*/{},
153
+                                                 /*download_progress=*/{}});
154
+                      });
155
+    }
156
+
157
     std::for_each(list.begin(), list.end(), &pack_status_map(auto& model) {
158
         if (!model.pack_id.isEmpty() && pack_status_map.count(model.id) > 0) {
159
             const auto& status = pack_status_map.at(model.id);
160
@@ -607,7 +635,7 @@
161
                             /*pack_id=*/model.pack_id,
162
                             /*pack_count=*/0,
163
                             /*pack_available_count=*/0,
164
-                            /*packs=*/model.packs,
165
+                            model.info,
166
                             model.speaker,
167
                             model.trg_lang_id,
168
                             model.score,
169
@@ -1453,6 +1481,65 @@
170
     return langs;
171
 }
172
 
173
+auto models_manager::extract_packs(const QJsonArray& packs_jarray) {
174
+    packs_t packs;
175
+
176
+    for (const auto& ele : packs_jarray) {
177
+        auto obj = ele.toObject();
178
+
179
+        auto id = obj.value(QLatin1String{"id"}).toString();
180
+        if (id.isEmpty()) {
181
+            qWarning() << "empty pack id";
182
+            continue;
183
+        }
184
+
185
+        pack_t pack;
186
+
187
+        try {
188
+            pack.engine =
189
+                engine_from_name(obj.value(QLatin1String{"engine"}).toString());
190
+        } catch (const std::runtime_error& e) {
191
+            qWarning() << e.what();
192
+            continue;
193
+        }
194
+
195
+        pack.lang_id = obj.value(QLatin1String{"lang_id"}).toString();
196
+        if (pack.lang_id.isEmpty()) {
197
+            qWarning() << "empty pack lang id";
198
+            continue;
199
+        }
200
+
201
dsnote-4.7.1.tar.gz/src/models_manager.h -> dsnote-4.8.1.tar.gz/src/models_manager.h Changed
192
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2021-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2021-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -58,10 +58,15 @@
8
         tts_rhvoice,
9
         tts_mimic3,
10
         tts_whisperspeech,
11
+        tts_sam,
12
+        tts_parler,
13
+        tts_f5,
14
+        tts_kokoro,
15
         mnt_bergamot
16
     };
17
     friend QDebug operator<<(QDebug d, model_engine_t engine);
18
 
19
+    // must be the same as ModelFeatureFilterFlags
20
     enum feature_flags : unsigned int {
21
         no_flags = 0U,
22
         generic_start = 1U << 0U,
23
@@ -82,18 +87,24 @@
24
         engine_tts_coqui = 1U << 14U,
25
         engine_tts_mimic3 = 1U << 15U,
26
         engine_tts_whisperspeech = 1U << 16U,
27
-        engine_other = 1U << 17U,
28
-        hw_openvino = 1U << 18U,
29
+        engine_tts_sam = 1U << 17U,
30
+        engine_tts_parler = 1U << 18U,
31
+        engine_tts_f5 = 1U << 19U,
32
+        engine_tts_kokoro = 1U << 20U,
33
+        engine_mnt = 1U << 23U,
34
+        engine_other = 1U << 24U,
35
         generic_end = engine_other,
36
-        stt_start = 1U << 20U,
37
+        hw_openvino = 1U << 25U,
38
+        stt_start = 1U << 26U,
39
         stt_intermediate_results = stt_start,
40
-        stt_punctuation = 1U << 21U,
41
+        stt_punctuation = 1U << 27U,
42
         stt_end = stt_punctuation,
43
-        tts_start = 1U << 30U,
44
+        tts_start = 1U << 28U,
45
         tts_voice_cloning = tts_start,
46
-        tts_end = tts_voice_cloning
47
+        tts_prompt = 1U << 29U,
48
+        tts_end = tts_prompt
49
     };
50
-    friend inline feature_flags operator|(feature_flags a, feature_flags b) {
51
+    friend feature_flags operator|(feature_flags a, feature_flags b) {
52
         return static_cast<feature_flags>(static_cast<unsigned int>(a) |
53
                                           static_cast<unsigned int>(b));
54
     }
55
@@ -133,11 +144,6 @@
56
         size_t total_size = 0;
57
     };
58
 
59
-    struct pack_t {
60
-        QString id;
61
-        QString name;
62
-    };
63
-
64
     struct model_t {
65
         QString id;
66
         model_engine_t engine = model_engine_t::stt_ds;
67
@@ -149,7 +155,7 @@
68
         QString pack_id;
69
         unsigned int pack_count = 0;
70
         unsigned int pack_available_count = 0;
71
-        std::vector<pack_t> packs;
72
+        QString info;
73
         QString speaker;
74
         QString trg_lang_id;
75
         int score = 2;
76
@@ -178,6 +184,11 @@
77
         bool tts_mimic3_nl = false;
78
         bool tts_rhvoice = false;
79
         bool tts_whisperspeech = false;
80
+        bool tts_parler = false;
81
+        bool tts_f5 = false;
82
+        bool tts_kokoro = false;
83
+        bool tts_kokoro_ja = false;
84
+        bool tts_kokoro_zh = false;
85
         bool stt_fasterwhisper = false;
86
         bool stt_ds = false;
87
         bool stt_vosk = false;
88
@@ -268,6 +279,16 @@
89
         size_t urls_hash = 0;
90
     };
91
 
92
+    struct pack_t {
93
+        model_engine_t engine = model_engine_t::stt_ds;
94
+        QString lang_id;
95
+        QString name;
96
+        int score = 2;
97
+        feature_flags features = feature_flags::no_flags;
98
+        bool disabled = false;
99
+        bool hidden = false;
100
+    };
101
+
102
     struct priv_model_t {
103
         model_engine_t engine = model_engine_t::stt_ds;
104
         QString lang_id;
105
@@ -281,7 +302,7 @@
106
         long long size = 0;
107
         std::vector<sup_model_t> sup_models;
108
         QString pack_id;
109
-        std::vector<pack_t> packs;
110
+        QString info;
111
         QString speaker;
112
         QString trg_lang_id;
113
         QString alias_of;
114
@@ -293,11 +314,13 @@
115
          * r - tts, use romanizer
116
          * l - tts, convert to lower case
117
          * p - tts, add extra pause at the end
118
-         * x - tts, voice cloning supported
119
+         * x - tts, voice cloning required
120
          * c - tts, convert quote to standard one
121
          * s - tts, avoid "punto" issue
122
          * 0 - tts, add extra silence
123
          * q - tts, do not split into sentences
124
+         * v - tts, propmt required
125
+         * w - tts, split by words
126
          * i - stt, punctuation supported
127
          * t - stt, translate to english supported
128
          */
129
@@ -321,12 +344,15 @@
130
     inline static const QString models_file{QStringLiteral("models.json")};
131
     inline static const int default_score = 2;
132
     inline static const int default_score_tts_espeak = 1;
133
+    inline static const int default_score_tts_sam = 1;
134
     using langs_t = std::unordered_map<QString, std::pair<QString, QString>>;
135
     using models_t = std::unordered_map<QString, priv_model_t>;
136
+    using packs_t = std::unordered_map<QString, pack_t>;
137
     using langs_of_role_t = std::unordered_map<model_role_t, std::set<QString>>;
138
 
139
     models_t m_models;
140
     langs_t m_langs;
141
+    packs_t m_packs;
142
     langs_of_role_t m_langs_of_role;
143
     QNetworkAccessManager m_nam;
144
     std::atomic_bool m_busy_value = false;
145
@@ -344,7 +370,7 @@
146
     static QLatin1String comp_type_str(comp_type type);
147
     bool parse_models_file_might_reset();
148
     static void parse_models_file(
149
-        bool reset, langs_t* langs, models_t* models,
150
+        bool reset, langs_t* langs, packs_t* packs, models_t* models,
151
         std::optional<models_availability_t> models_availability);
152
     static QString file_name_from_id(const QString& id, model_engine_t engine);
153
     static QString sup_file_name_from_id(const QString& id,
154
@@ -365,9 +391,10 @@
155
                          const QString& path_in_archive_2, comp_type comp,
156
                          int parts);
157
     static auto extract_models(
158
-        const QJsonArray& models_jarray,
159
+        const QJsonArray& models_jarray, const packs_t& packs,
160
         std::optional<models_availability_t> models_availability);
161
     static auto extract_langs(const QJsonArray& langs_jarray);
162
+    static auto extract_packs(const QJsonArray& packs_jarray);
163
     static comp_type str2comp(const QString& str);
164
     static QString download_filename(QString filename, comp_type comp,
165
                                      int part = -1, const QUrl& url = {});
166
@@ -411,21 +438,22 @@
167
     static void extract_sup_models(const QString& model_id,
168
                                    const QJsonObject& model_obj,
169
                                    std::vector<sup_model_t>& sup_models);
170
-    static void extract_packs(const QJsonObject& model_obj,
171
-                              std::vector<pack_t>& packs);
172
     void update_models_using_availability_internal();
173
     static void update_dl_multi(models_t& models);
174
     static void update_dl_off(models_t& models);
175
     static void update_url_hash(priv_model_t& model);
176
     static download_info_t make_download_info(const priv_model_t& model);
177
     static feature_flags add_implicit_feature_flags(
178
-        const QString& model_id, model_engine_t engine,
179
+        const QString& model_id, model_engine_t engine, int score,
180
         feature_flags existing_features);
181
     static feature_flags add_new_feature(feature_flags existing_features,
182
                                          feature_flags new_feature);
183
     void handle_download_model_finished(const QString& id,
184
                                         bool download_not_needed);
185
     void update_counts();
186
+    static bool is_modelless_engine(model_engine_t engine);
187
+    static bool is_ignore_on_sfos(model_engine_t engine,
188
+                                  const QString& model_id);
189
 };
190
 
191
 #endif  // MODELS_MANAGER_H
192
dsnote-4.7.1.tar.gz/src/mtag_tools.cpp -> dsnote-4.8.1.tar.gz/src/mtag_tools.cpp Changed
36
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -10,6 +10,8 @@
8
 #include <taglib/fileref.h>
9
 #include <taglib/tag.h>
10
 
11
+#include <limits>
12
+
13
 #include "logger.hpp"
14
 
15
 namespace mtag_tools {
16
@@ -30,6 +32,8 @@
17
     if (!mtag.artist.empty())
18
         tag->setArtist({mtag.artist, TagLib::String::UTF8});
19
     if (!mtag.album.empty()) tag->setAlbum({mtag.album, TagLib::String::UTF8});
20
+    if (!mtag.comment.empty())
21
+        tag->setComment({mtag.comment, TagLib::String::UTF8});
22
     if (mtag.track > 0) tag->setTrack(mtag.track);
23
 
24
     file.save();
25
@@ -55,7 +59,9 @@
26
     mtag.title = tag->title().toCString(true);
27
     mtag.artist = tag->artist().toCString(true);
28
     mtag.album = tag->album().toCString(true);
29
-    mtag.track = tag->track();
30
+    mtag.comment = tag->comment().toCString(true);
31
+    mtag.track = static_cast<int>(std::clamp<decltype(tag->track())>(
32
+        tag->track(), 0, std::numeric_limits<decltype(mtag.track)>::max()));
33
 
34
     return mtag;
35
 }
36
dsnote-4.7.1.tar.gz/src/mtag_tools.hpp -> dsnote-4.8.1.tar.gz/src/mtag_tools.hpp Changed
15
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -13,6 +13,7 @@
8
     std::string title;
9
     std::string artist;
10
     std::string album;
11
+    std::string comment;
12
     int track = 0;
13
 };
14
 
15
dsnote-4.8.1.tar.gz/src/parler_engine.cpp Added
192
 
1
@@ -0,0 +1,190 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#include "parler_engine.hpp"
10
+
11
+#include <fmt/format.h>
12
+#include <pybind11/functional.h>
13
+#include <pybind11/numpy.h>
14
+
15
+#include <utility>
16
+
17
+#include "cpu_tools.hpp"
18
+#include "logger.hpp"
19
+#include "py_executor.hpp"
20
+
21
+using namespace pybind11::literals;
22
+
23
+parler_engine::parler_engine(config_t config, callbacks_t call_backs)
24
+    : tts_engine{std::move(config), std::move(call_backs)} {
25
+    if ((cpu_tools::cpuinfo().feature_flags &
26
+         cpu_tools::feature_flags_t::avx) == 0) {
27
+        LOGE("avx not supported but parler engine needs it");
28
+        throw std::runtime_error(
29
+            "failed to init parler engine: avx not supported");
30
+    }
31
+}
32
+
33
+parler_engine::~parler_engine() {
34
+    LOGD("parler dtor");
35
+
36
+    stop();
37
+}
38
+
39
+void parler_engine::stop() {
40
+    tts_engine::stop();
41
+
42
+    auto task = py_executor::instance()->execute(&() {
43
+        try {
44
+            m_desc_input_ids.reset();
45
+            m_desc_attention_mask.reset();
46
+            m_model.reset();
47
+            m_tokenizer.reset();
48
+
49
+            // release mem
50
+            py::module_::import("gc").attr("collect")();
51
+            py::module_::import("torch").attr("cuda").attr("empty_cache")();
52
+        } catch (const std::exception& err) {
53
+            LOGE("py error: " << err.what());
54
+        }
55
+        return std::any{};
56
+    });
57
+
58
+    if (task) task->get();
59
+
60
+    LOGD("parler stopped");
61
+}
62
+
63
+// must be run in py thread after create_model
64
+void parler_engine::create_desc() {
65
+    if (m_desc_input_ids && m_desc_attention_mask) return;
66
+
67
+    auto desc_encoding = m_tokenizer.value()(
68
+        m_config.ref_prompt, "return_tensors"_a = "pt", "padding"_a = true);
69
+    m_desc_input_ids = desc_encoding.attr("input_ids").attr("to")(m_device_str);
70
+    m_desc_attention_mask =
71
+        desc_encoding.attr("attention_mask").attr("to")(m_device_str);
72
+}
73
+
74
+void parler_engine::reset_ref_voice() {
75
+    auto task = py_executor::instance()->execute(&() {
76
+        LOGD("reset ref prompt");
77
+        try {
78
+            m_desc_input_ids.reset();
79
+            m_desc_attention_mask.reset();
80
+        } catch (const std::exception& err) {
81
+            LOGE("py error: " << err.what());
82
+        }
83
+        return std::any{};
84
+    });
85
+
86
+    if (task) task->get();
87
+}
88
+
89
+void parler_engine::create_model() {
90
+    auto task = py_executor::instance()->execute(&() {
91
+        auto use_cuda =
92
+            m_config.use_gpu &&
93
+            (py_executor::instance()->libs_availability->torch_cuda ||
94
+             py_executor::instance()->libs_availability->torch_hip);
95
+
96
+        LOGD("using device: " << (use_cuda ? "cuda" : "cpu") << " "
97
+                              << m_config.gpu_device.id);
98
+
99
+        m_device_str =
100
+            use_cuda ? fmt::format("cuda:{}", m_config.gpu_device.id) : "cpu";
101
+
102
+        try {
103
+            auto parler_api = py::module_::import("parler_tts");
104
+            auto transformers_api = py::module_::import("transformers");
105
+
106
+            m_model =
107
+                parler_api.attr("ParlerTTSForConditionalGeneration")
108
+                    .attr("from_pretrained")(m_config.model_files.model_path,
109
+                                             "low_cpu_mem_usage"_a = true)
110
+                    .attr("to")(m_device_str);
111
+            m_tokenizer =
112
+                transformers_api.attr("AutoTokenizer")
113
+                    .attr("from_pretrained")(m_config.model_files.model_path,
114
+                                             "use_fast"_a = true);
115
+
116
+            create_desc();
117
+        } catch (const std::exception& err) {
118
+            LOGE("py error: " << err.what());
119
+            return false;
120
+        }
121
+        return true;
122
+    });
123
+
124
+    if (!task || !std::any_cast<bool>(task->get()))
125
+        LOGE("failed to create parler model");
126
+    else
127
+        LOGD("parler model created");
128
+}
129
+
130
+bool parler_engine::model_created() const {
131
+    return m_model && m_tokenizer && m_desc_input_ids && m_desc_attention_mask;
132
+}
133
+
134
+bool parler_engine::encode_speech_impl(const std::string& text,
135
+                                       maybe_unused unsigned int speed,
136
+                                       const std::string& out_file) {
137
+    auto task = py_executor::instance()->execute(&() {
138
+        try {
139
+            create_desc();
140
+
141
+            auto prompt_input_ids =
142
+                m_tokenizer
143
+                    .value()(text, "return_tensors"_a = "pt",
144
+                             "padding"_a = true)
145
+                    .attr("input_ids")
146
+                    .attr("to")(m_device_str);
147
+
148
+            py::list scl;
149
+            scl.append(py::cpp_function{
150
+                this(maybe_unused const py::args& args,
151
+                       maybe_unused const py::kwargs& kwargs) {
152
+                    return is_shutdown();
153
+                }});
154
+
155
+            auto generation = m_model->attr("generate")(
156
+                "input_ids"_a = m_desc_input_ids.value(),
157
+                "prompt_input_ids"_a = prompt_input_ids,
158
+                "attention_mask"_a = m_desc_attention_mask.value(),
159
+                "stopping_criteria"_a = scl);
160
+
161
+            py::array_t<float, py::array::c_style | py::array::forcecast>
162
+                audio_arr =
163
+                    generation.attr("cpu")().attr("numpy")().attr("squeeze")();
164
+
165
+            if (is_shutdown()) throw std::runtime_error{"engine shutdown"};
166
+
167
+            // save to wav file
168
+            auto buffer = audio_arr.request();
169
+            std::ofstream os{out_file, std::ios::binary};
170
+            write_wav_header(
171
+                m_model->attr("config").attr("sampling_rate").cast<int>(),
172
+                sizeof(int16_t), 1, buffer.size, os);
173
+            for (ssize_t i = 0; i < buffer.size; ++i) {
174
+                // convert f32 to s16 sample format
175
+                auto sample = static_cast<int16_t>(
176
+                    static_cast<float*>(buffer.ptr)i * 32768.0F);
177
+                os.write(reinterpret_cast<char*>(&sample), 2);
178
+            }
179
+        } catch (const std::exception& err) {
180
+            LOGE("py error: " << err.what());
181
+            return false;
182
+        }
183
+
184
+        LOGD("voice synthesized successfully");
185
+        return true;
186
+    });
187
+
188
+    return task && std::any_cast<bool>(task->get());
189
+}
190
+
191
+bool parler_engine::model_supports_speed() const { return false; }
192
dsnote-4.8.1.tar.gz/src/parler_engine.hpp Added
48
 
1
@@ -0,0 +1,46 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#ifndef PARLER_ENGINE_HPP
10
+#define PARLER_ENGINE_HPP
11
+
12
+#undef slots
13
+#include <pybind11/embed.h>
14
+#include <pybind11/pytypes.h>
15
+#define slots Q_SLOTS
16
+
17
+#include <optional>
18
+#include <string>
19
+
20
+#include "tts_engine.hpp"
21
+
22
+namespace py = pybind11;
23
+
24
+class parler_engine : public tts_engine {
25
+   public:
26
+    parler_engine(config_t config, callbacks_t call_backs);
27
+    ~parler_engine() override;
28
+
29
+   private:
30
+    std::optional<py::object> m_model;
31
+    std::optional<py::object> m_tokenizer;
32
+    std::optional<py::object> m_desc_input_ids;
33
+    std::optional<py::object> m_desc_attention_mask;
34
+
35
+    std::string m_device_str;
36
+
37
+    bool model_created() const final;
38
+    bool model_supports_speed() const final;
39
+    void create_model() final;
40
+    void reset_ref_voice() final;
41
+    bool encode_speech_impl(const std::string& text, unsigned int speed,
42
+                            const std::string& out_file) final;
43
+    void stop();
44
+    void create_desc();
45
+};
46
+
47
+#endif  // PARLER_ENGINE_HPP
48
dsnote-4.7.1.tar.gz/src/punctuator.cpp -> dsnote-4.8.1.tar.gz/src/punctuator.cpp Changed
12
 
1
@@ -60,6 +60,10 @@
2
     auto task = py_executor::instance()->execute(&() {
3
         try {
4
             m_pipeline.reset();
5
+
6
+            // release mem
7
+            py::module_::import("gc").attr("collect")();
8
+            py::module_::import("torch").attr("cuda").attr("empty_cache")();
9
         } catch (const std::exception& err) {
10
             LOGE("py error: " << err.what());
11
         }
12
dsnote-4.7.1.tar.gz/src/py_executor.cpp -> dsnote-4.8.1.tar.gz/src/py_executor.cpp Changed
34
 
1
@@ -106,12 +106,26 @@
2
     try {
3
         m_py_interpreter.emplace();
4
 
5
-        if (settings::instance()->py_feature_scan()) {
6
-            libs_availability = py_tools::libs_availability();
7
-        } else {
8
-            LOGW("py scan is off");
9
-            libs_availability = py_tools::libs_availability_t{};
10
-        }
11
+#ifdef USE_PY
12
+        libs_availability = py_tools::libs_availability(
13
+            scan_type = settings::instance()->py_scan_mode() {
14
+                switch (scan_type) {
15
+                    case settings::py_scan_mode_t::PyScanOn:
16
+                        LOGD("py scan mode: on");
17
+                        return py_tools::libs_scan_type_t::on;
18
+                    case settings::py_scan_mode_t::PyScanOffAllEnabled:
19
+                        LOGD("py scan mode: off-all-enabled");
20
+                        return py_tools::libs_scan_type_t::off_all_enabled;
21
+                    case settings::py_scan_mode_t::PyScanOffAllDisabled:
22
+                        LOGD("py scan mode: off-all-disabled");
23
+                        return py_tools::libs_scan_type_t::off_all_disabled;
24
+                }
25
+                LOGF("invalid py scan mode");
26
+            }(),
27
+            settings::instance()->scan_flags());
28
+#else
29
+        libs_availability = py_tools::libs_availability_t{};
30
+#endif
31
 
32
         while (!m_shutting_down) {
33
             std::unique_lock<std::mutex> lock{m_mutex};
34
dsnote-4.7.1.tar.gz/src/py_tools.cpp -> dsnote-4.8.1.tar.gz/src/py_tools.cpp Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -20,18 +20,28 @@
8
 
9
 #include "cpu_tools.hpp"
10
 #include "logger.hpp"
11
+#include "settings.h"
12
 
13
 #ifdef USE_PYTHON_MODULE
14
 #include "module_tools.hpp"
15
 #endif
16
 
17
+std::ostream& operator<<(std::ostream& os, py_tools::py_version_t version) {
18
+    os << version.major << '.' << version.minor << '.' << version.micro;
19
+    return os;
20
+}
21
+
22
 std::ostream& operator<<(std::ostream& os,
23
                          const py_tools::libs_availability_t& availability) {
24
-    os << "coqui-tts=" << availability.coqui_tts
25
+    os << "py-version=" << availability.py_version
26
+       << ", coqui-tts=" << availability.coqui_tts
27
        << ", faster-whisper=" << availability.faster_whisper
28
        << ", ctranslate2-cuda=" << availability.ctranslate2_cuda
29
        << ", mimic3-tts=" << availability.mimic3_tts
30
        << ", whisperspeech-tts=" << availability.whisperspeech_tts
31
+       << ", parler-tts=" << availability.parler_tts
32
+       << ", f5-tts=" << availability.f5_tts
33
+       << ", kokoro-tts=" << availability.f5_tts
34
        << ", transformers=" << availability.transformers
35
        << ", unikud=" << availability.unikud
36
        << ", gruut_de=" << availability.gruut_de
37
@@ -42,7 +52,9 @@
38
        << ", gruut_it=" << availability.gruut_it
39
        << ", gruut_ru=" << availability.gruut_ru
40
        << ", gruut_sw=" << availability.gruut_sw
41
-       << ", mecab=" << availability.mecab
42
+       << ", kokoro_ja=" << availability.kokoro_ja
43
+       << ", kokoro_zh=" << availability.kokoro_zh
44
+       << ", mecab=" << availability.mecab << ", uroman=" << availability.uroman
45
        << ", torch-cuda=" << availability.torch_cuda
46
        << ", torch-hip=" << availability.torch_hip;
47
 
48
@@ -50,38 +62,112 @@
49
 }
50
 
51
 namespace py_tools {
52
-libs_availability_t libs_availability() {
53
+libs_availability_t libs_availability(libs_scan_type_t scan_type,
54
+                                      unsigned int scan_flags) {
55
     // run only in py thread
56
 
57
     libs_availability_t availability{};
58
 
59
+    switch (scan_type) {
60
+        case libs_scan_type_t::on:
61
+            break;
62
+        case libs_scan_type_t::off_all_enabled:
63
+            if (cpu_tools::cpuinfo().feature_flags &
64
+                cpu_tools::feature_flags_t::avx) {
65
+                availability.coqui_tts = true;
66
+                availability.whisperspeech_tts = true;
67
+                availability.parler_tts = true;
68
+                availability.f5_tts = true;
69
+                availability.kokoro_tts = true;
70
+                availability.kokoro_ja = true;
71
+                availability.kokoro_zh = true;
72
+            }
73
+            availability.faster_whisper = true;
74
+            availability.mimic3_tts = true;
75
+            availability.transformers = true;
76
+            availability.unikud = true;
77
+            availability.gruut_de = true;
78
+            availability.gruut_es = true;
79
+            availability.gruut_fa = true;
80
+            availability.gruut_fr = true;
81
+            availability.gruut_it = true;
82
+            availability.gruut_nl = true;
83
+            availability.gruut_ru = true;
84
+            availability.gruut_sw = true;
85
+            availability.mecab = true;
86
+            availability.uroman = true;
87
+            break;
88
+        case libs_scan_type_t::off_all_disabled:
89
+            return availability;
90
+    }
91
+
92
 #ifdef USE_PY
93
     namespace py = pybind11;
94
     using namespace pybind11::literals;
95
 
96
-    if (cpu_tools::cpuinfo().feature_flags & cpu_tools::feature_flags_t::avx) {
97
-        try {
98
-            LOGD("checking: torch cuda");
99
-            auto torch_cuda = py::module_::import("torch.cuda");
100
-            auto torch_ver = py::module_::import("torch.version");
101
-            if (torch_cuda.attr("is_available")().cast<bool>()) {
102
-                try {
103
-                    auto cuda_ver = torch_ver.attr("cuda").cast<std::string>();
104
-                    LOGD("torch cuda version: " << cuda_ver);
105
-                    availability.torch_cuda = !cuda_ver.empty();
106
-                } catch (maybe_unused const py::cast_error& err) {
107
-                }
108
-                try {
109
-                    auto hip_ver = torch_ver.attr("hip").cast<std::string>();
110
-                    LOGD("torch hip version: " << hip_ver);
111
-                    availability.torch_hip = !hip_ver.empty();
112
-                } catch (maybe_unused const py::cast_error& err) {
113
+    try {
114
+        LOGD("checking: python version");
115
+        auto version_info = py::module_::import("sys").attr("version_info");
116
+        availability.py_version.major = version_info.attr("major").cast<int>();
117
+        availability.py_version.minor = version_info.attr("minor").cast<int>();
118
+        availability.py_version.micro = version_info.attr("micro").cast<int>();
119
+        LOGD("python version: " << availability.py_version);
120
+    } catch (const std::exception& err) {
121
+        LOGD("python version check py error: " << err.what());
122
+    }
123
+
124
+    if ((scan_flags & settings::ScanFlagNoTorchCuda) > 0) {
125
+        LOGD("checking: torch cuda (skipped)");
126
+    } else {
127
+        if (cpu_tools::cpuinfo().feature_flags &
128
+            cpu_tools::feature_flags_t::avx) {
129
+            try {
130
+                LOGD("checking: torch cuda");
131
+                auto torch_cuda = py::module_::import("torch.cuda");
132
+                auto torch_ver = py::module_::import("torch.version");
133
+                if (torch_cuda.attr("is_available")().cast<bool>()) {
134
+                    try {
135
+                        auto cuda_ver =
136
+                            torch_ver.attr("cuda").cast<std::string>();
137
+                        LOGD("torch cuda version: " << cuda_ver);
138
+                        availability.torch_cuda = !cuda_ver.empty();
139
+                    } catch (maybe_unused const py::cast_error& err) {
140
+                    }
141
+                    try {
142
+                        auto hip_ver =
143
+                            torch_ver.attr("hip").cast<std::string>();
144
+                        LOGD("torch hip version: " << hip_ver);
145
+                        availability.torch_hip = !hip_ver.empty();
146
+                    } catch (maybe_unused const py::cast_error& err) {
147
+                    }
148
                 }
149
+            } catch (const std::exception& err) {
150
+                LOGD("torch cuda check py error: " << err.what());
151
             }
152
+        }
153
+    }
154
+
155
+    if ((scan_flags & settings::ScanFlagNoCt2Cuda) > 0) {
156
+        LOGD("checking: ctranslate2-cuda (skipped)");
157
+    } else {
158
+        try {
159
+            LOGD("checking: ctranslate2-cuda");
160
+            auto ct2 = py::module_::import("ctranslate2");
161
+            LOGD("ctranslate2 version: "
162
+                 << ct2.attr("__version__").cast<std::string>());
163
+            availability.ctranslate2_cuda =
164
+                py::len(ct2.attr("get_supported_compute_types")("cuda")) > 0;
165
         } catch (const std::exception& err) {
166
-            LOGD("torch cuda check py error: " << err.what());
167
+            LOGD("ctranslate2-cuda check py error: " << err.what());
168
         }
169
+    }
170
 
171
+    if (scan_type == libs_scan_type_t::off_all_enabled ||
172
+        scan_type == libs_scan_type_t::off_all_disabled) {
173
+        return availability;
174
+    }
175
+
176
+    if (cpu_tools::cpuinfo().feature_flags & cpu_tools::feature_flags_t::avx) {
177
         try {
178
             LOGD("checking: coqui tts");
179
             py::module_::import("TTS");
180
@@ -99,22 +185,53 @@
181
         }
182
 
183
         try {
184
-            LOGD("checking: faster-whisper");
185
-            py::module_::import("faster_whisper");
186
-            availability.faster_whisper = true;
187
+            LOGD("checking: parler tts");
188
+            py::module_::import("parler_tts");
189
+            LOGD("checking: transformers");
190
+            py::module_::import("transformers");
191
+            availability.parler_tts = true;
192
         } catch (const std::exception& err) {
193
-            LOGD("faster-whisper check py error: " << err.what());
194
+            LOGD("parler tts check py error: " << err.what());
195
         }
196
 
197
         try {
198
-            LOGD("checking: ctranslate2-cuda");
199
-            auto ct2 = py::module_::import("ctranslate2");
200
-            LOGD("ctranslate2 version: "
201
dsnote-4.7.1.tar.gz/src/py_tools.hpp -> dsnote-4.8.1.tar.gz/src/py_tools.hpp Changed
56
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -11,9 +11,17 @@
8
 #include <iostream>
9
 
10
 namespace py_tools {
11
+enum class libs_scan_type_t { on, off_all_disabled, off_all_enabled };
12
 inline static const auto python_site_path = "python/site-packages";
13
 
14
+struct py_version_t {
15
+    int major = 0;
16
+    int minor = 0;
17
+    int micro = 0;
18
+};
19
+
20
 struct libs_availability_t {
21
+    py_version_t py_version;
22
     bool coqui_tts = false;
23
     bool torch_cuda = false;
24
     bool torch_hip = false;
25
@@ -21,6 +29,9 @@
26
     bool ctranslate2_cuda = false;
27
     bool mimic3_tts = false;
28
     bool whisperspeech_tts = false;
29
+    bool parler_tts = false;
30
+    bool f5_tts = false;
31
+    bool kokoro_tts = false;
32
     bool transformers = false;
33
     bool unikud = false;
34
     bool gruut_de = false;
35
@@ -31,14 +42,19 @@
36
     bool gruut_nl = false;
37
     bool gruut_ru = false;
38
     bool gruut_sw = false;
39
+    bool kokoro_ja = false;
40
+    bool kokoro_zh = false;
41
     bool mecab = false;
42
+    bool uroman = false;
43
 };
44
 
45
-libs_availability_t libs_availability();
46
+libs_availability_t libs_availability(libs_scan_type_t scan_type,
47
+                                      unsigned int scan_flags);
48
 bool init_module();
49
 }  // namespace py_tools
50
 
51
 std::ostream& operator<<(std::ostream& os,
52
                          const py_tools::libs_availability_t& availability);
53
+std::ostream& operator<<(std::ostream& os, py_tools::py_version_t version);
54
 
55
 #endif  // PY_TOOLS_HPP
56
dsnote-4.7.1.tar.gz/src/qtlogger.cpp -> dsnote-4.8.1.tar.gz/src/qtlogger.cpp Changed
24
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -15,6 +15,16 @@
8
 
9
 #include "logger.hpp"
10
 
11
+std::ostream &operator<<(std::ostream &os, const QString &msg) {
12
+    os << msg.toStdString();
13
+    return os;
14
+}
15
+
16
+std::ostream &operator<<(std::ostream &os, const QStringList &msg) {
17
+    for (const auto &s : msg) os << s.toStdString() << ", ";
18
+    return os;
19
+}
20
+
21
 static void qtLog(QtMsgType qtType, const QMessageLogContext &qtContext,
22
                   const QString &qtMsg) {
23
     Logger::Message msg{qtType {
24
dsnote-4.7.1.tar.gz/src/qtlogger.hpp -> dsnote-4.8.1.tar.gz/src/qtlogger.hpp Changed
23
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -8,6 +8,15 @@
8
 #ifndef QTLOGGER_HPP
9
 #define QTLOGGER_HPP
10
 
11
+#include <QDBusError>
12
+#include <QString>
13
+#include <QStringList>
14
+#include <QVariant>
15
+#include <QVariantMap>
16
+#include <iostream>
17
+
18
+std::ostream &operator<<(std::ostream &os, const QString &msg);
19
+std::ostream &operator<<(std::ostream &os, const QStringList &msg);
20
 void initQtLogger();
21
 
22
 #endif  // QTLOGGER_HPP
23
dsnote-4.8.1.tar.gz/src/sam_engine.cpp Added
86
 
1
@@ -0,0 +1,84 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#include "sam_engine.hpp"
10
+
11
+#include <fmt/format.h>
12
+#include <sys/stat.h>
13
+#include <unistd.h>
14
+
15
+#include <algorithm>
16
+#include <cstdlib>
17
+
18
+#include "logger.hpp"
19
+
20
+sam_engine::sam_engine(config_t config, callbacks_t call_backs)
21
+    : tts_engine{std::move(config), std::move(call_backs)} {}
22
+
23
+sam_engine::~sam_engine() {
24
+    LOGD("sam dtor");
25
+
26
+    stop();
27
+}
28
+
29
+bool sam_engine::model_created() const { return true; }
30
+
31
+void sam_engine::create_model() {}
32
+
33
+bool sam_engine::model_supports_speed() const { return true; }
34
+
35
+bool sam_engine::encode_speech_impl(const std::string& text, unsigned int speed,
36
+                                    const std::string& out_file) {
37
+    auto rate = speed() {
38
+        const int default_speed = 72;
39
+
40
+        if (speed < 1 || speed > 20 || speed == 10) {
41
+            return default_speed;
42
+        }
43
+
44
+        return std::clamp<int>(static_cast<float>(default_speed) *
45
+                                   (10.0f / static_cast<float>(speed)),
46
+                               10, 100);
47
+    }();
48
+
49
+    LOGD("requested speed: " << speed << " " << rate);
50
+
51
+    if (is_shutdown()) {
52
+        unlink(out_file.c_str());
53
+        return false;
54
+    }
55
+
56
+    const char* u8_buff = nullptr;
57
+    int u8_buff_size = 0;
58
+
59
+    if (sam_text_to_u8_buff(text.c_str(), rate, &u8_buff, &u8_buff_size) !=
60
+        SAM_SUCCESS) {
61
+        unlink(out_file.c_str());
62
+        return false;
63
+    }
64
+
65
+    std::ofstream of{out_file, std::ios::binary};
66
+    if (of.bad()) {
67
+        LOGE("failed to open file for writting: " << out_file);
68
+        return false;
69
+    }
70
+
71
+    write_wav_header(22050, sizeof(short), 1, u8_buff_size, of);
72
+
73
+    // covert u8 samples to s16
74
+    std::vector<short> s16_buff;
75
+    s16_buff.reserve(u8_buff_size);
76
+    for (int i = 0; i < u8_buff_size; ++i) {
77
+        s16_buff.push_back(static_cast<short>(u8_buffi - 128) << 8);
78
+    }
79
+    of.write(reinterpret_cast<char*>(s16_buff.data()),
80
+             s16_buff.size() * sizeof(short));
81
+
82
+    LOGD("voice synthesized successfully");
83
+
84
+    return true;
85
+}
86
dsnote-4.8.1.tar.gz/src/sam_engine.hpp Added
32
 
1
@@ -0,0 +1,30 @@
2
+/* Copyright (C) 2025 Michal Kosciesza <michal@mkiol.net>
3
+ *
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+#ifndef SAM_ENGINE_HPP
10
+#define SAM_ENGINE_HPP
11
+
12
+#include <sam_api.h>
13
+
14
+#include <string>
15
+
16
+#include "tts_engine.hpp"
17
+
18
+class sam_engine : public tts_engine {
19
+   public:
20
+    sam_engine(config_t config, callbacks_t call_backs);
21
+    ~sam_engine() override;
22
+
23
+   private:
24
+    bool model_created() const final;
25
+    bool model_supports_speed() const final;
26
+    void create_model() final;
27
+    bool encode_speech_impl(const std::string& text, unsigned int speed,
28
+                            const std::string& out_file) final;
29
+};
30
+
31
+#endif  // SAM_ENGINE_HPP
32
dsnote-4.7.1.tar.gz/src/settings.cpp -> dsnote-4.8.1.tar.gz/src/settings.cpp Changed
201
 
1
@@ -27,8 +27,11 @@
2
 #include <thread>
3
 
4
 #include "config.h"
5
+#include "cpu_tools.hpp"
6
 #include "gpu_tools.hpp"
7
+#include "logger.hpp"
8
 #include "module_tools.hpp"
9
+#include "qtlogger.hpp"
10
 
11
 QDebug operator<<(QDebug d, settings::mode_t mode) {
12
     switch (mode) {
13
@@ -184,6 +187,14 @@
14
     if (hw_features &
15
         settings::hw_feature_flags_t::hw_feature_tts_whisperspeech_hip)
16
         d << "tts-whisperspeech-hip";
17
+    if (hw_features & settings::hw_feature_flags_t::hw_feature_tts_parler_cuda)
18
+        d << "tts-parler-cuda,";
19
+    if (hw_features & settings::hw_feature_flags_t::hw_feature_tts_parler_hip)
20
+        d << "tts-parler-hip";
21
+    if (hw_features & settings::hw_feature_flags_t::hw_feature_tts_f5_cuda)
22
+        d << "tts-f5-cuda,";
23
+    if (hw_features & settings::hw_feature_flags_t::hw_feature_tts_f5_hip)
24
+        d << "tts-f5-hip";
25
 
26
     return d;
27
 }
28
@@ -238,17 +249,15 @@
29
 settings::launch_mode_t settings::launch_mode = launch_mode_t::app_stanalone;
30
 
31
 settings::settings() : QSettings{settings_filepath(), QSettings::NativeFormat} {
32
-    qDebug() << "app:" << APP_ORG << APP_ID;
33
-    qDebug() << "config location:"
34
-             << QStandardPaths::writableLocation(
35
-                    QStandardPaths::ConfigLocation);
36
-    qDebug() << "data location:"
37
-             << QStandardPaths::writableLocation(
38
-                    QStandardPaths::AppDataLocation);
39
-    qDebug() << "cache location:"
40
-             << QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
41
-    qDebug() << "settings file:" << fileName();
42
-    qDebug() << "platform:" << QGuiApplication::platformName();
43
+    LOGD("app: " << APP_ORG << " " << APP_ID);
44
+    LOGD("config location: "
45
+         << QStandardPaths::writableLocation(QStandardPaths::ConfigLocation));
46
+    LOGD("data location: " << QStandardPaths::writableLocation(
47
+             QStandardPaths::AppDataLocation));
48
+    LOGD("cache location: "
49
+         << QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
50
+    LOGD("settings file: " << fileName());
51
+    LOGD("platform: " << QGuiApplication::platformName());
52
 
53
     if (launch_mode != launch_mode_t::app) {
54
         // in app mode, flags are updated in fa
55
@@ -264,6 +273,19 @@
56
         .removeRecursively();
57
 }
58
 
59
+#define X(name, type, dvalue)                                             \
60
+    type settings::name() const {                                         \
61
+        return qvariant_cast<type>(value(QStringLiteral(#name), dvalue)); \
62
+    }                                                                     \
63
+    void settings::set_##name(type value) {                               \
64
+        if (name() != value) {                                            \
65
+            setValue(QStringLiteral(#name), value);                       \
66
+            emit name##_changed();                                        \
67
+        }                                                                 \
68
+    }
69
+SETTINGS_PROPERTY_TABLE
70
+#undef X
71
+
72
 QString settings::settings_filepath() {
73
     QDir conf_dir{
74
         QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)};
75
@@ -455,17 +477,6 @@
76
     }
77
 }
78
 
79
-bool settings::use_toggle_for_hotkey() const {
80
-    return value(QStringLiteral("use_toggle_for_hotkey"), true).toBool();
81
-}
82
-
83
-void settings::set_use_toggle_for_hotkey(bool value) {
84
-    if (use_toggle_for_hotkey() != value) {
85
-        setValue(QStringLiteral("use_toggle_for_hotkey"), value);
86
-        emit use_toggle_for_hotkey_changed();
87
-    }
88
-}
89
-
90
 QString settings::default_tts_model_for_mnt_lang(const QString& lang) {
91
     return value(QStringLiteral("default_tts_model_for_mnt_%1").arg(lang), {})
92
         .toString();
93
@@ -890,39 +901,6 @@
94
     return value(QStringLiteral("mtag_artist_name"), "Speech Note").toString();
95
 }
96
 
97
-bool settings::mtag() const {
98
-    return value(QStringLiteral("mtag"), false).toBool();
99
-}
100
-
101
-void settings::set_mtag(bool value) {
102
-    if (mtag() != value) {
103
-        setValue(QStringLiteral("mtag"), value);
104
-        emit mtag_changed();
105
-    }
106
-}
107
-
108
-bool settings::translator_mode() const {
109
-    return value(QStringLiteral("translator_mode"), false).toBool();
110
-}
111
-
112
-void settings::set_translator_mode(bool value) {
113
-    if (translator_mode() != value) {
114
-        setValue(QStringLiteral("translator_mode"), value);
115
-        emit translator_mode_changed();
116
-    }
117
-}
118
-
119
-bool settings::translate_when_typing() const {
120
-    return value(QStringLiteral("translate_when_typing"), false).toBool();
121
-}
122
-
123
-void settings::set_translate_when_typing(bool value) {
124
-    if (translate_when_typing() != value) {
125
-        setValue(QStringLiteral("translate_when_typing"), value);
126
-        emit translate_when_typing_changed();
127
-    }
128
-}
129
-
130
 settings::text_format_t settings::mnt_text_format() const {
131
     if (subtitles_support()) {
132
         return static_cast<text_format_t>(
133
@@ -1004,6 +982,17 @@
134
     }
135
 }
136
 
137
+QString settings::fake_keyboard_layout() const {
138
+    return value(QStringLiteral("fake_keyboard_layout"), {}).toString();
139
+}
140
+
141
+void settings::set_fake_keyboard_layout(const QString& value) {
142
+    if (fake_keyboard_layout() != value) {
143
+        setValue(QStringLiteral("fake_keyboard_layout"), value);
144
+        emit fake_keyboard_layout_changed();
145
+    }
146
+}
147
+
148
 bool settings::qt_style_auto() const {
149
     return value(QStringLiteral("qt_style_auto"), true).toBool();
150
 }
151
@@ -1126,37 +1115,50 @@
152
 
153
 settings::audio_format_t settings::audio_format_from_filename(
154
     const QString& filename) {
155
-    if (settings::instance()->audio_format() ==
156
-        settings::audio_format_t::AudioFormatAuto) {
157
+    if (instance()->audio_format() == audio_format_t::AudioFormatAuto) {
158
         return filename_to_audio_format_static(filename);
159
-    } else {
160
-        return settings::instance()->audio_format();
161
     }
162
+
163
+    return instance()->audio_format();
164
+}
165
+
166
+settings::audio_format_t settings::audio_format_from_filename(
167
+    audio_format_t audio_format, const QString& filename) {
168
+    if (audio_format == audio_format_t::AudioFormatAuto)
169
+        audio_format = instance()->audio_format();
170
+
171
+    if (audio_format == audio_format_t::AudioFormatAuto) {
172
+        auto real_format = filename_to_audio_format_static(filename);
173
+        return real_format == audio_format_t::AudioFormatAuto
174
+                   ? audio_format_t::AudioFormatMp3
175
+                   : real_format;
176
+    }
177
+
178
+    return audio_format;
179
 }
180
 
181
 QString settings::audio_format_str_from_filename(audio_format_t audio_format,
182
                                                  const QString& filename) {
183
-    if (audio_format == settings::audio_format_t::AudioFormatAuto)
184
-        audio_format = settings::instance()->audio_format();
185
+    if (audio_format == audio_format_t::AudioFormatAuto)
186
+        audio_format = instance()->audio_format();
187
 
188
-    if (audio_format == settings::audio_format_t::AudioFormatAuto) {
189
+    if (audio_format == audio_format_t::AudioFormatAuto) {
190
         return audio_format_to_str(filename_to_audio_format_static(filename));
191
-    } else {
192
-        return audio_format_to_str(audio_format);
193
     }
194
+
195
+    return audio_format_to_str(audio_format);
196
 }
197
 
198
 QString settings::audio_ext_from_filename(audio_format_t audio_format,
199
                                           const QString& filename) {
200
-    if (audio_format == settings::audio_format_t::AudioFormatAuto)
201
dsnote-4.7.1.tar.gz/src/settings.h -> dsnote-4.8.1.tar.gz/src/settings.h Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2021-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2021-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -14,13 +14,40 @@
8
 #include <QString>
9
 #include <QStringList>
10
 #include <QUrl>
11
+#include <QVariantList>
12
 #ifdef USE_DESKTOP
13
 #include <QQmlApplicationEngine>
14
 #endif
15
 
16
+#include <optional>
17
+
18
 #include "qdebug.h"
19
 #include "singleton.h"
20
 
21
+// name, setting str, type, default value
22
+#define SETTINGS_PROPERTY_TABLE                       \
23
+    X(stt_use_note_as_prompt, bool, true)             \
24
+    X(stt_echo, bool, false)                          \
25
+    X(tts_split_into_sentences, bool, true)           \
26
+    X(show_repair_text, bool, false)                  \
27
+    X(tts_use_engine_speed_control, bool, true)       \
28
+    X(tts_normalize_audio, bool, true)                \
29
+    X(stt_insert_stats, bool, false)                  \
30
+    X(trans_rules_enabled, bool, false)               \
31
+    X(mnt_clean_text, bool, false)                    \
32
+    X(whisper_translate, bool, false)                 \
33
+    X(use_tray, bool, false)                          \
34
+    X(start_in_tray, bool, false)                     \
35
+    X(clean_ref_voice, bool, true)                    \
36
+    X(stt_clear_mic_audio_when_decoding, bool, false) \
37
+    X(stt_play_beep, bool, false)                     \
38
+    X(translate_when_typing, bool, false)             \
39
+    X(translator_mode, bool, false)                   \
40
+    X(hotkeys_enabled, bool, false)                   \
41
+    X(mtag, bool, false)                              \
42
+    X(use_toggle_for_hotkey, bool, true)              \
43
+    X(window_size_ratio, double, 0.6)
44
+
45
 // name, default value
46
 #define GPU_SCAN_TABLE                                                 \
47
     X(cuda, true)                                                      \
48
@@ -34,28 +61,83 @@
49
     X(vulkan_igpu, true)                                               \
50
     X(vulkan_cpu, false) /* will work but extremely slow */
51
 
52
+// name, enable by default
53
+#define GPU_ENGINE_TABLE    \
54
+    X(whispercpp, false)    \
55
+    X(fasterwhisper, false) \
56
+    X(coqui, true)          \
57
+    X(whisperspeech, true)  \
58
+    X(parler, true)         \
59
+    X(f5, true)             \
60
+    X(kokoro, true)
61
+
62
 // name, default key
63
-#define HOTKEY_TABLE                                               \
64
-    X(start_listening, "Ctrl+Alt+Shift+L")                         \
65
-    X(start_listening_translate, "Ctrl+Alt+Shift+/")               \
66
-    X(start_listening_active_window, "Ctrl+Alt+Shift+K")           \
67
-    X(start_listening_translate_active_window, "Ctrl+Alt+Shift+.") \
68
-    X(start_listening_clipboard, "Ctrl+Alt+Shift+J")               \
69
-    X(start_listening_translate_clipboard, "Ctrl+Alt+Shift+,")     \
70
-    X(stop_listening, "Ctrl+Alt+Shift+S")                          \
71
-    X(start_reading, "Ctrl+Alt+Shift+R")                           \
72
-    X(start_reading_clipboard, "Ctrl+Alt+Shift+E")                 \
73
-    X(pause_resume_reading, "Ctrl+Alt+Shift+P")                    \
74
-    X(cancel, "Ctrl+Alt+Shift+C")                                  \
75
-    X(switch_to_next_stt_model, "Ctrl+Alt+Shift+B")                \
76
-    X(switch_to_next_tts_model, "Ctrl+Alt+Shift+M")                \
77
-    X(switch_to_prev_stt_model, "Ctrl+Alt+Shift+V")                \
78
-    X(switch_to_prev_tts_model, "Ctrl+Alt+Shift+N")
79
+#define HOTKEY_TABLE                                                           \
80
+    X(start_listening, "start-listening",                                      \
81
+      QCoreApplication::translate("SettingsPage", "Start listening"),          \
82
+      "Ctrl+Alt+Shift+L")                                                      \
83
+    X(start_listening_translate, "start-listening-translate",                  \
84
+      QCoreApplication::translate("SettingsPage",                              \
85
+                                  "Start listening, always translate"),        \
86
+      "Ctrl+Alt+Shift+/")                                                      \
87
+    X(start_listening_active_window, "start-listening-active-window",          \
88
+      QCoreApplication::translate("SettingsPage",                              \
89
+                                  "Start listening, text to active window"),   \
90
+      "Ctrl+Alt+Shift+K")                                                      \
91
+    X(start_listening_translate_active_window,                                 \
92
+      "start-listening-translate-active-window",                               \
93
+      QCoreApplication::translate(                                             \
94
+          "SettingsPage",                                                      \
95
+          "Start listening, always translate, text to active window"),         \
96
+      "Ctrl+Alt+Shift+.")                                                      \
97
+    X(start_listening_clipboard, "start-listening-clipboard",                  \
98
+      QCoreApplication::translate("SettingsPage",                              \
99
+                                  "Start listening, text to clipboard"),       \
100
+      "Ctrl+Alt+Shift+J")                                                      \
101
+    X(start_listening_translate_clipboard,                                     \
102
+      "start-listening-translate-clipboard",                                   \
103
+      QCoreApplication::translate(                                             \
104
+          "SettingsPage",                                                      \
105
+          "Start listening, always translate, text to clipboard"),             \
106
+      "Ctrl+Alt+Shift+,")                                                      \
107
+    X(stop_listening, "stop-listening",                                        \
108
+      QCoreApplication::translate("SettingsPage", "Stop listening"),           \
109
+      "Ctrl+Alt+Shift+S")                                                      \
110
+    X(start_reading, "start-reading",                                          \
111
+      QCoreApplication::translate("SettingsPage", "Start reading"),            \
112
+      "Ctrl+Alt+Shift+R")                                                      \
113
+    X(start_reading_clipboard, "start-reading-clipboard",                      \
114
+      QCoreApplication::translate("SettingsPage",                              \
115
+                                  "Start reading text from clipboard"),        \
116
+      "Ctrl+Alt+Shift+E")                                                      \
117
+    X(pause_resume_reading, "pause-resume-reading",                            \
118
+      QCoreApplication::translate("SettingsPage", "Pause/Resume reading"),     \
119
+      "Ctrl+Alt+Shift+P")                                                      \
120
+    X(cancel, "cancel", QCoreApplication::translate("SettingsPage", "Cancel"), \
121
+      "Ctrl+Alt+Shift+C")                                                      \
122
+    X(switch_to_next_stt_model, "switch-to-next-stt-model",                    \
123
+      QCoreApplication::translate("SettingsPage", "Switch to next STT model"), \
124
+      "Ctrl+Alt+Shift+B")                                                      \
125
+    X(switch_to_next_tts_model, "switch-to-next-tts-model",                    \
126
+      QCoreApplication::translate("SettingsPage", "Switch to next TTS model"), \
127
+      "Ctrl+Alt+Shift+M")                                                      \
128
+    X(switch_to_prev_stt_model, "switch-to-prev-stt-model",                    \
129
+      QCoreApplication::translate("SettingsPage",                              \
130
+                                  "Switch to previous STT model"),             \
131
+      "Ctrl+Alt+Shift+V")                                                      \
132
+    X(switch_to_prev_tts_model, "switch-to-prev-tts-model",                    \
133
+      QCoreApplication::translate("SettingsPage",                              \
134
+                                  "Switch to previous TTS model"),             \
135
+      "Ctrl+Alt+Shift+N")
136
 
137
 class settings : public QSettings, public singleton<settings> {
138
     Q_OBJECT
139
 
140
     // app
141
+#define X(name, type, dvalue) \
142
+    Q_PROPERTY(type name READ name WRITE set_##name NOTIFY name##_changed)
143
+    SETTINGS_PROPERTY_TABLE
144
+#undef X
145
     Q_PROPERTY(QString note READ note WRITE set_note NOTIFY note_changed)
146
     Q_PROPERTY(speech_mode_t speech_mode READ speech_mode WRITE set_speech_mode
147
                    NOTIFY speech_mode_changed)
148
@@ -82,7 +164,6 @@
149
                    NOTIFY video_file_save_dir_changed)
150
     Q_PROPERTY(QString video_file_save_filename READ video_file_save_filename
151
                    NOTIFY video_file_save_dir_changed)
152
-
153
     Q_PROPERTY(QString text_file_save_dir READ text_file_save_dir WRITE
154
                    set_text_file_save_dir NOTIFY text_file_save_dir_changed)
155
     Q_PROPERTY(QUrl text_file_save_dir_url READ text_file_save_dir_url WRITE
156
@@ -91,7 +172,6 @@
157
                    NOTIFY text_file_save_dir_changed)
158
     Q_PROPERTY(QString text_file_save_filename READ text_file_save_filename
159
                    NOTIFY text_file_save_dir_changed)
160
-
161
     Q_PROPERTY(QString file_open_dir READ file_open_dir WRITE set_file_open_dir
162
                    NOTIFY file_open_dir_changed)
163
     Q_PROPERTY(QUrl file_open_dir_url READ file_open_dir_url WRITE
164
@@ -100,11 +180,6 @@
165
                    file_open_dir_changed)
166
     Q_PROPERTY(QString prev_app_ver READ prev_app_ver WRITE set_prev_app_ver
167
                    NOTIFY prev_app_ver_changed)
168
-    Q_PROPERTY(bool translator_mode READ translator_mode WRITE
169
-                   set_translator_mode NOTIFY translator_mode_changed)
170
-    Q_PROPERTY(
171
-        bool translate_when_typing READ translate_when_typing WRITE
172
-            set_translate_when_typing NOTIFY translate_when_typing_changed)
173
     Q_PROPERTY(text_format_t mnt_text_format READ mnt_text_format WRITE
174
                    set_mnt_text_format NOTIFY mnt_text_format_changed)
175
     Q_PROPERTY(text_format_t stt_tts_text_format READ stt_tts_text_format WRITE
176
@@ -135,20 +210,17 @@
177
                    set_mtag_album_name NOTIFY mtag_album_name_changed)
178
     Q_PROPERTY(QString mtag_artist_name READ mtag_artist_name WRITE
179
                    set_mtag_artist_name NOTIFY mtag_artist_name_changed)
180
-    Q_PROPERTY(bool mtag READ mtag WRITE set_mtag NOTIFY mtag_changed)
181
-    Q_PROPERTY(bool hotkeys_enabled READ hotkeys_enabled WRITE
182
-                   set_hotkeys_enabled NOTIFY hotkeys_enabled_changed)
183
-
184
-#define X(name, keys)                                         \
185
+    Q_PROPERTY(hotkeys_type_t hotkeys_type READ hotkeys_type WRITE
186
+                   set_hotkeys_type NOTIFY hotkeys_type_changed)
187
+    Q_PROPERTY(QVariantList hotkeys_table READ hotkeys_table NOTIFY
188
+                   hotkeys_table_changed)
189
+#define X(name, id, desc, keys)                               \
190
     Q_PROPERTY(QString hotkey_##name READ hotkey_##name WRITE \
191
                    set_hotkey_##name NOTIFY hotkeys_changed)
192
     HOTKEY_TABLE
193
 #undef X
194
 
195
     Q_PROPERTY(
196
-        bool use_toggle_for_hotkey READ use_toggle_for_hotkey WRITE
197
-            set_use_toggle_for_hotkey NOTIFY use_toggle_for_hotkey_changed)
198
-    Q_PROPERTY(
199
         desktop_notification_policy_t desktop_notification_policy READ
200
             desktop_notification_policy WRITE set_desktop_notification_policy
201
dsnote-4.7.1.tar.gz/src/speech_service.cpp -> dsnote-4.8.1.tar.gz/src/speech_service.cpp Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2021-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2021-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -24,17 +24,21 @@
8
 #include "coqui_engine.hpp"
9
 #include "ds_engine.hpp"
10
 #include "espeak_engine.hpp"
11
+#include "f5_engine.hpp"
12
 #include "fasterwhisper_engine.hpp"
13
 #include "file_source.h"
14
 #include "gpu_tools.hpp"
15
+#include "kokoro_engine.hpp"
16
 #include "media_compressor.hpp"
17
 #include "mic_source.h"
18
 #include "mimic3_engine.hpp"
19
 #include "module_tools.hpp"
20
+#include "parler_engine.hpp"
21
 #include "piper_engine.hpp"
22
 #include "py_executor.hpp"
23
 #include "py_tools.hpp"
24
 #include "rhvoice_engine.hpp"
25
+#include "sam_engine.hpp"
26
 #include "settings.h"
27
 #include "text_tools.hpp"
28
 #include "vosk_engine.hpp"
29
@@ -120,6 +124,19 @@
30
     return d;
31
 }
32
 
33
+QDebug operator<<(QDebug d, speech_service::beep_role_t beep_role) {
34
+    switch (beep_role) {
35
+        case speech_service::beep_role_t::stt_start_listen:
36
+            d << "stt-start-listen";
37
+            break;
38
+        case speech_service::beep_role_t::stt_end_listen:
39
+            d << "stt-end-listen";
40
+            break;
41
+    }
42
+
43
+    return d;
44
+}
45
+
46
 static bool tts_not_merge_files_options(const QVariantMap &options) {
47
     if (options.contains(QStringLiteral("not_merge_files"))) {
48
         return options.value(QStringLiteral("not_merge_files")).toBool();
49
@@ -1114,6 +1131,33 @@
50
     return l.first();
51
 }
52
 
53
+bool speech_service::get_bool_value_from_options(const QString &name,
54
+                                                 bool default_value,
55
+                                                 const QVariantMap &options) {
56
+    if (options.contains(name))
57
+        return options.value(name, default_value).toBool();
58
+    return default_value;
59
+}
60
+
61
+int speech_service::get_int_value_from_options(const QString &name,
62
+                                               int default_value,
63
+                                               const QVariantMap &options) {
64
+    if (options.contains(name)) {
65
+        bool ok = false;
66
+        auto value = options.value(name).toInt(&ok);
67
+        if (ok) return value;
68
+    }
69
+    return default_value;
70
+}
71
+
72
+QString speech_service::get_string_value_from_options(
73
+    const QString &name, const QString &default_value,
74
+    const QVariantMap &options) {
75
+    if (options.contains(name))
76
+        return options.value(name, default_value).toString();
77
+    return default_value;
78
+}
79
+
80
 template <typename Engine>
81
 static std::optional<typename Engine::gpu_device_t> make_gpu_device(
82
     const QString &gpu_str, const QString &auto_device_str) {
83
@@ -1166,16 +1210,6 @@
84
     return std::nullopt;
85
 }
86
 
87
-static settings::text_format_t text_format_from_options(
88
-    const QVariantMap &options) {
89
-    if (options.contains(QStringLiteral("text_format"))) {
90
-        bool ok = false;
91
-        auto value = options.value(QStringLiteral("text_format")).toInt(&ok);
92
-        if (ok) return static_cast<settings::text_format_t>(value);
93
-    }
94
-    return settings::text_format_t::TextFormatRaw;
95
-}
96
-
97
 static stt_engine::text_format_t stt_text_fromat_from_settings_format(
98
     settings::text_format_t format) {
99
     switch (format) {
100
@@ -1205,16 +1239,6 @@
101
     return sub_config;
102
 }
103
 
104
-static bool stt_insert_stats_from_options(const QVariantMap &options) {
105
-    if (options.contains(QStringLiteral("insert_stats"))) {
106
-        bool ok = false;
107
-        auto value = options.value(QStringLiteral("insert_stats")).toInt(&ok);
108
-        if (ok) return value;
109
-    }
110
-
111
-    return false;
112
-}
113
-
114
 static std::vector<int> whispercpp_vulkan_devices() {
115
     std::vector<int> devs;
116
 
117
@@ -1256,16 +1280,23 @@
118
                            config.lang != "en";
119
         config.options = model_config->options.toStdString();
120
         config.text_format = stt_text_fromat_from_settings_format(
121
-            text_format_from_options(options));
122
+            static_cast<settings::text_format_t>(get_int_value_from_options(
123
+                "text_format",
124
+                static_cast<int>(settings::text_format_t::TextFormatRaw),
125
+                options)));
126
         config.sub_config = stt_sub_config_from_options(options);
127
         config.cache_dir = settings::instance()->cache_dir().toStdString();
128
-        config.insert_stats = stt_insert_stats_from_options(options);
129
+        config.insert_stats =
130
+            get_bool_value_from_options("insert_stats", false, options);
131
+        config.initial_prompt =
132
+            get_string_value_from_options("initial_prompt", {}, options)
133
+                .toStdString();
134
 
135
         // clang-format off
136
 #define ENGINE_OPTS(name_) \
137
         switch(settings::instance()->name_##_profile()) {  \
138
         case settings::engine_profile_t::EngineProfilePerformance: \
139
-            config.beam_search = 1; \
140
+            config.beam_search = 2; \
141
             config.cpu_threads = 4; \
142
             config.audio_ctx_conf = stt_engine::audio_ctx_conf_t::dynamic; \
143
             config.audio_ctx_size = 1500; \
144
@@ -1445,6 +1476,10 @@
145
                     case models_manager::model_engine_t::tts_rhvoice:
146
                     case models_manager::model_engine_t::tts_mimic3:
147
                     case models_manager::model_engine_t::tts_whisperspeech:
148
+                    case models_manager::model_engine_t::tts_sam:
149
+                    case models_manager::model_engine_t::tts_parler:
150
+                    case models_manager::model_engine_t::tts_f5:
151
+                    case models_manager::model_engine_t::tts_kokoro:
152
                     case models_manager::model_engine_t::mnt_bergamot:
153
                         throw std::runtime_error{
154
                             "invalid model engine, expected stt"};
155
@@ -1465,6 +1500,7 @@
156
             m_stt_engine->set_text_format(config.text_format);
157
             m_stt_engine->set_sub_config(config.sub_config);
158
             m_stt_engine->set_insert_stats(config.insert_stats);
159
+            m_stt_engine->set_initial_prompt(std::move(config.initial_prompt));
160
         }
161
 
162
         return model_config->stt->model_id;
163
@@ -1492,27 +1528,6 @@
164
     throw std::runtime_error{"invalid format"};
165
 }
166
 
167
-static QString tts_ref_voice_file_from_options(const QVariantMap &options) {
168
-    if (options.contains(QStringLiteral("ref_voice_file")))
169
-        return options.value(QStringLiteral("ref_voice_file")).toString();
170
-    return {};
171
-}
172
-
173
-static bool tts_split_into_sentences_from_options(const QVariantMap &options) {
174
-    if (options.contains(QStringLiteral("split_into_sentences")))
175
-        return options.value(QStringLiteral("split_into_sentences"), true)
176
-            .toBool();
177
-    return true;
178
-}
179
-
180
-static bool tts_use_engine_speed_control_from_options(
181
-    const QVariantMap &options) {
182
-    if (options.contains(QStringLiteral("use_engine_speed_control")))
183
-        return options.value(QStringLiteral("use_engine_speed_control"), true)
184
-            .toBool();
185
-    return true;
186
-}
187
-
188
 static tts_engine::subtitles_sync_mode_t tts_subtitles_sync_mode_from_settings(
189
     settings::tts_subtitles_sync_mode_t mode) {
190
     switch (mode) {
191
@@ -1530,16 +1545,6 @@
192
     throw std::runtime_error("invalid subtitles sync mode");
193
 }
194
 
195
-static settings::tts_subtitles_sync_mode_t sync_subs_from_options(
196
-    const QVariantMap &options) {
197
-    if (options.contains(QStringLiteral("sync_subs"))) {
198
-        bool ok = false;
199
-        auto value = options.value(QStringLiteral("sync_subs")).toInt(&ok);
200
-        if (ok) return static_cast<settings::tts_subtitles_sync_mode_t>(value);
201
dsnote-4.7.1.tar.gz/src/speech_service.h -> dsnote-4.8.1.tar.gz/src/speech_service.h Changed
56
 
1
@@ -272,6 +272,8 @@
2
 
3
    private:
4
     enum class engine_t { stt, tts, mnt, text_repair };
5
+    enum class beep_role_t { stt_start_listen, stt_end_listen };
6
+    friend QDebug operator<<(QDebug d, beep_role_t beep_role);
7
 
8
     struct lang_to_model_map_t {
9
         std::unordered_map<QString, QString> stt;
10
@@ -344,6 +346,12 @@
11
         QString options;
12
     };
13
 
14
+    enum task_flags_t {
15
+        task_flags_none = 0,
16
+        task_flags_stt_clear_mic_audio_when_decoding = 1 << 1,
17
+        task_flags_stt_play_beep = 1 << 2
18
+    };
19
+
20
     struct task_t {
21
         int id = INVALID_TASK;
22
         engine_t engine = engine_t::stt;
23
@@ -354,6 +362,7 @@
24
         std::vector<QString> files;
25
         QVariantMap options;
26
         bool paused = false;
27
+        std::underlying_type_t<task_flags_t> flags = task_flags_none;
28
     };
29
 
30
     inline static const QString DBUS_SERVICE_NAME{
31
@@ -393,6 +402,7 @@
32
     std::optional<task_t> m_previous_task;
33
     std::optional<task_t> m_current_task;
34
     QMediaPlayer m_player;
35
+    QMediaPlayer m_beep_player;
36
     int m_task_state = 0;
37
     std::queue<tts_partial_result_t> m_tts_queue;
38
     QVariantMap m_features_availability;
39
@@ -527,6 +537,16 @@
40
     static void setup_modules();
41
     static void setup_env();
42
     void clean_tts_queue();
43
+    static bool get_bool_value_from_options(const QString &name,
44
+                                            bool default_value,
45
+                                            const QVariantMap &options);
46
+    static int get_int_value_from_options(const QString &name,
47
+                                          int default_value,
48
+                                          const QVariantMap &options);
49
+    static QString get_string_value_from_options(const QString &name,
50
+                                                 const QString &default_value,
51
+                                                 const QVariantMap &options);
52
+    void play_beep(beep_role_t beep_role);
53
 
54
     // DBus
55
     Q_INVOKABLE int Cancel(int task);
56
dsnote-4.7.1.tar.gz/src/stt_engine.cpp -> dsnote-4.8.1.tar.gz/src/stt_engine.cpp Changed
11
 
1
@@ -235,7 +235,8 @@
2
        << ", use-gpu=" << config.use_gpu << ", gpu-device="
3
        << config.gpu_device << ""
4
        << ", sub-config=" << config.sub_config << ""
5
-       << ", translate=" << config.translate;
6
+       << ", translate=" << config.translate
7
+       << ", initial_prompt=" << config.initial_prompt.empty();
8
     return os;
9
 }
10
 
11
dsnote-4.7.1.tar.gz/src/stt_engine.hpp -> dsnote-4.8.1.tar.gz/src/stt_engine.hpp Changed
110
 
1
@@ -66,13 +66,13 @@
2
         std::string ttt_model_file;
3
         std::string openvino_model_file; /* used only in whisper.cpp */
4
 
5
-        inline bool operator==(const model_files_t& rhs) const {
6
+        bool operator==(const model_files_t& rhs) const {
7
             return model_file == rhs.model_file &&
8
                    scorer_file == rhs.scorer_file &&
9
                    ttt_model_file == rhs.ttt_model_file &&
10
                    openvino_model_file == rhs.openvino_model_file;
11
         };
12
-        inline bool operator!=(const model_files_t& rhs) const {
13
+        bool operator!=(const model_files_t& rhs) const {
14
             return !(*this == rhs);
15
         };
16
     };
17
@@ -108,11 +108,11 @@
18
         std::string platform_name;
19
         bool flash_attn = false;
20
 
21
-        inline bool operator==(const gpu_device_t& rhs) const {
22
+        bool operator==(const gpu_device_t& rhs) const {
23
             return platform_name == rhs.platform_name && name == rhs.name &&
24
                    id == rhs.id && flash_attn == rhs.flash_attn;
25
         }
26
-        inline bool operator!=(const gpu_device_t& rhs) const {
27
+        bool operator!=(const gpu_device_t& rhs) const {
28
             return !(*this == rhs);
29
         }
30
     };
31
@@ -136,12 +136,13 @@
32
         audio_ctx_conf_t audio_ctx_conf =
33
             audio_ctx_conf_t::dynamic; /*extra whisper feature*/
34
         int audio_ctx_size = 1500;     /*extra whisper feature*/
35
+        std::string initial_prompt;    /*extra whisper feature*/
36
         text_format_t text_format = text_format_t::raw;
37
         std::string options;
38
         gpu_device_t gpu_device;
39
         std::vector<int> available_devices;
40
         sub_config_t sub_config;
41
-        inline bool has_option(char c) const {
42
+        bool has_option(char c) const {
43
             return options.find(c) != std::string::npos;
44
         }
45
     };
46
@@ -156,32 +157,30 @@
47
     void request_stop();
48
     bool started() const;
49
     bool stopping() const;
50
-    inline void restart() { m_restart_requested = true; }
51
+    void restart() { m_restart_requested = true; }
52
     speech_detection_status_t speech_detection_status() const;
53
     void set_speech_mode(speech_mode_t mode);
54
-    inline auto speech_mode() const { return m_config.speech_mode; }
55
+    auto speech_mode() const { return m_config.speech_mode; }
56
     void set_speech_started(bool value);
57
-    inline auto speech_status() const { return m_config.speech_started; }
58
-    inline const model_files_t& model_files() const {
59
-        return m_config.model_files;
60
+    auto speech_status() const { return m_config.speech_started; }
61
+    const model_files_t& model_files() const { return m_config.model_files; }
62
+    const std::string& lang() const { return m_config.lang; }
63
+    auto translate() const { return m_config.translate; }
64
+    auto use_gpu() const { return m_config.use_gpu; }
65
+    auto gpu_device() const { return m_config.gpu_device; }
66
+    auto text_format() const { return m_config.text_format; }
67
+    void set_text_format(text_format_t value) { m_config.text_format = value; }
68
+    void set_sub_config(sub_config_t value) { m_config.sub_config = value; }
69
+    bool stop_requested() const { return m_thread_exit_requested; }
70
+    void set_insert_stats(bool value) { m_config.insert_stats = value; }
71
+    auto audio_ctx_conf() const { return m_config.audio_ctx_conf; }
72
+    auto audio_ctx_size() const { return m_config.audio_ctx_size; }
73
+    auto cpu_threads() const { return m_config.cpu_threads; }
74
+    auto beam_search() const { return m_config.beam_search; }
75
+    auto initial_prompt() const { return m_config.initial_prompt; }
76
+    void set_initial_prompt(std::string prompt) {
77
+        m_config.initial_prompt.assign(std::move(prompt));
78
     }
79
-    inline const std::string& lang() const { return m_config.lang; }
80
-    inline auto translate() const { return m_config.translate; }
81
-    inline auto use_gpu() const { return m_config.use_gpu; }
82
-    inline auto gpu_device() const { return m_config.gpu_device; }
83
-    inline auto text_format() const { return m_config.text_format; }
84
-    inline void set_text_format(text_format_t value) {
85
-        m_config.text_format = value;
86
-    }
87
-    inline void set_sub_config(sub_config_t value) {
88
-        m_config.sub_config = value;
89
-    }
90
-    inline bool stop_requested() const { return m_thread_exit_requested; }
91
-    inline void set_insert_stats(bool value) { m_config.insert_stats = value; }
92
-    inline auto audio_ctx_conf() const { return m_config.audio_ctx_conf; }
93
-    inline auto audio_ctx_size() const { return m_config.audio_ctx_size; }
94
-    inline auto cpu_threads() const { return m_config.cpu_threads; }
95
-    inline auto beam_search() const { return m_config.beam_search; }
96
 
97
    protected:
98
     enum class lock_type_t { free, processed, borrowed };
99
@@ -210,8 +209,8 @@
100
         bool sof = true;
101
         bool eof = false;
102
         std::atomic<lock_type_t> lock = lock_type_t::free;
103
-        nodiscard inline bool full() const { return size == buf.size(); }
104
-        inline void clear() {
105
+        nodiscard bool full() const { return size == buf.size(); }
106
+        void clear() {
107
             size = 0;
108
             sof = false;
109
             eof = false;
110
dsnote-4.7.1.tar.gz/src/text_tools.cpp -> dsnote-4.8.1.tar.gz/src/text_tools.cpp Changed
87
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023-2024 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -7,7 +7,6 @@
8
 
9
 #include "text_tools.hpp"
10
 
11
-#include <ctype.h>
12
 #include <fmt/format.h>
13
 #include <html2md/html2md.h>
14
 #include <maddy/parser.h>
15
@@ -15,6 +14,7 @@
16
 #include <unistd.h>
17
 
18
 #include <algorithm>
19
+#include <cctype>
20
 #include <cstdlib>
21
 #include <cwctype>
22
 #include <libnumbertext/Numbertext.hxx>
23
@@ -114,6 +114,7 @@
24
             if (lang1 == 's') return astrunc::access::lang_t::MS;
25
             if (lang1 == 'r') return astrunc::access::lang_t::MR;
26
             if (lang1 == 'n') return astrunc::access::lang_t::MN;
27
+            if (lang1 == 'l') return astrunc::access::lang_t::ML;
28
             break;
29
         case 'n':
30
             if (lang1 == 'e') return astrunc::access::lang_t::NE;
31
@@ -446,34 +447,6 @@
32
     }
33
 }
34
 
35
-bool has_uroman() { return std::system("perl --version > /dev/null") == 0; }
36
-
37
-void uroman(std::string& text, const std::string& lang_code,
38
-            const std::string& prefix_path) {
39
-    auto p_stdin, p_stdout =
40
-        popen2(fmt::format("perl {}/uroman/bin/uroman.pl -l {}", prefix_path,
41
-                           lang_code)
42
-                   .c_str());
43
-
44
-    std::string result;
45
-
46
-    if (p_stdin == nullptr || p_stdout == nullptr) {
47
-        LOGE("uroman popen error");
48
-    }
49
-
50
-    fwrite(text.c_str(), 1, text.size(), p_stdin);
51
-    fclose(p_stdin);
52
-
53
-    char buf1024;
54
-    while (fgets(buf, 1024, p_stdout)) result.append(buf);
55
-
56
-    if (result.empty()) {
57
-        LOGW("uroman result is empty");
58
-    } else {
59
-        text.assign(result);
60
-    }
61
-}
62
-
63
 void numbers_to_words(std::string& text, const std::string& lang,
64
                       const std::string& prefix_path) {
65
     Numbertext nt{};
66
@@ -1184,7 +1157,7 @@
67
 std::string processor::preprocess(const std::string& text,
68
                                   const std::string& options,
69
                                   const std::string& lang,
70
-                                  const std::string& lang_code,
71
+                                  maybe_unused const std::string& lang_code,
72
                                   const std::string& prefix_path,
73
                                   const std::string& diacritizer_path) {
74
     std::string new_text{text};
75
@@ -1196,11 +1169,6 @@
76
         numbers_to_words(new_text, lang, prefix_path);
77
     }
78
 
79
-    if (has_option('r', options)) {
80
-        LOGD("uroman pre-processing needed");
81
-        uroman(new_text, lang_code, prefix_path);
82
-    }
83
-
84
     if (has_option('d', options) && !diacritizer_path.empty()) {
85
         LOGD("diacritize pre-processing needed");
86
         if (lang == "ar")
87
dsnote-4.7.1.tar.gz/src/text_tools.hpp -> dsnote-4.8.1.tar.gz/src/text_tools.hpp Changed
12
 
1
@@ -87,10 +87,6 @@
2
 void trim_line(std::string& text);
3
 void remove_hyphen_word_break(std::string& text);
4
 void clean_white_characters(std::string& text);
5
-bool has_uroman();
6
-void uroman(std::string& text, const std::string& lang_code,
7
-            const std::string& prefix_path);
8
-
9
 void numbers_to_words(std::string& text, const std::string& lang,
10
                       const std::string& prefix_path);
11
 void convert_text_format_to_html(std::string& text, text_format_t input_format);
12
dsnote-4.7.1.tar.gz/src/tray_icon.cpp -> dsnote-4.8.1.tar.gz/src/tray_icon.cpp Changed
201
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -155,8 +155,24 @@
8
         auto tts_configured = !m_active_tts_model.isEmpty();
9
 
10
         switch (p.first) {
11
-            case action_t::start_listening:
12
+            case action_t::start_listening_translate_active_window:
13
+                p.second->setProperty(
14
+                    "enabled", stt_configured && m_state == state_t::idle &&
15
+                                   m_stt_translate_supported &&
16
+                                   m_fake_keyboard_supported);
17
+                break;
18
+            case action_t::start_listening_translate:
19
+            case action_t::start_listening_translate_clipboard:
20
+                p.second->setProperty("enabled", stt_configured &&
21
+                                                     m_state == state_t::idle &&
22
+                                                     m_stt_translate_supported);
23
+                break;
24
             case action_t::start_listening_active_window:
25
+                p.second->setProperty("enabled", stt_configured &&
26
+                                                     m_state == state_t::idle &&
27
+                                                     m_fake_keyboard_supported);
28
+                break;
29
+            case action_t::start_listening:
30
             case action_t::start_listening_clipboard:
31
                 p.second->setProperty(
32
                     "enabled", stt_configured && m_state == state_t::idle);
33
@@ -234,78 +250,105 @@
34
                 break;
35
         }
36
     });
37
+
38
+    QMenu* new_menu = m_stt_translate_supported ? &m_menu_translate : &m_menu;
39
+    if (contextMenu() != new_menu) {
40
+        setContextMenu(new_menu);
41
+    }
42
 }
43
 
44
 void tray_icon::make_menu() {
45
     m_actions.clear();
46
 
47
-    m_actions.emplace(
48
-        action_t::start_listening,
49
-        m_menu.addAction(
50
-            QIcon::fromTheme(QStringLiteral("audio-input-microphone-symbolic")),
51
-            tr("Start listening")));
52
-#ifdef USE_X11_FEATURES
53
-    if (settings::instance()->is_xcb()) {
54
-        m_actions.emplace(
55
-            action_t::start_listening_active_window,
56
-            m_menu.addAction(QIcon::fromTheme(QStringLiteral(
57
-                                 "audio-input-microphone-symbolic")),
58
-                             tr("Start listening, text to active window")));
59
-    }
60
-#endif
61
-    m_actions.emplace(
62
-        action_t::start_listening_clipboard,
63
-        m_menu.addAction(
64
-            QIcon::fromTheme(QStringLiteral("audio-input-microphone-symbolic")),
65
-            tr("Start listening, text to clipboard")));
66
-    m_actions.emplace(
67
-        action_t::stop_listening,
68
-        m_menu.addAction(
69
-            QIcon::fromTheme(QStringLiteral("media-playback-stop-symbolic")),
70
-            tr("Stop listening")));
71
-    m_actions.emplace(
72
-        action_t::change_stt_model,
73
-        m_menu.addMenu(
74
-            QIcon::fromTheme(QStringLiteral("audio-input-microphone-symbolic")),
75
-            QString{}));
76
+    auto add_action_to_menu = this(action_t action_type, const char* icon,
77
+                                     const QString& text, QMenu& menu) {
78
+        auto* action = menu.addAction(QIcon::fromTheme(icon), text);
79
+        m_actions.emplace_back(action_type, action);
80
+    };
81
+    auto add_menu_to_menu = this(action_t action_type, const char* icon,
82
+                                   QMenu& menu) {
83
+        auto* action = menu.addMenu(QIcon::fromTheme(icon), QString{});
84
+        m_actions.emplace_back(action_type, action);
85
+    };
86
+
87
+    add_action_to_menu(action_t::start_listening,
88
+                       "audio-input-microphone-symbolic", tr("Start listening"),
89
+                       m_menu);
90
+    add_action_to_menu(action_t::start_listening,
91
+                       "audio-input-microphone-symbolic", tr("Start listening"),
92
+                       m_menu_translate);
93
+    add_action_to_menu(
94
+        action_t::start_listening_translate, "audio-input-microphone-symbolic",
95
+        tr("Start listening, always translate"), m_menu_translate);
96
+    add_action_to_menu(action_t::start_listening_active_window,
97
+                       "audio-input-microphone-symbolic",
98
+                       tr("Start listening, text to active window"), m_menu);
99
+    add_action_to_menu(action_t::start_listening_active_window,
100
+                       "audio-input-microphone-symbolic",
101
+                       tr("Start listening, text to active window"),
102
+                       m_menu_translate);
103
+    add_action_to_menu(
104
+        action_t::start_listening_translate_active_window,
105
+        "audio-input-microphone-symbolic",
106
+        tr("Start listening, always translate, text to active window"),
107
+        m_menu_translate);
108
+    add_action_to_menu(action_t::start_listening_clipboard,
109
+                       "audio-input-microphone-symbolic",
110
+                       tr("Start listening, text to clipboard"), m_menu);
111
+    add_action_to_menu(
112
+        action_t::start_listening_clipboard, "audio-input-microphone-symbolic",
113
+        tr("Start listening, text to clipboard"), m_menu_translate);
114
+    add_action_to_menu(
115
+        action_t::start_listening_translate_clipboard,
116
+        "audio-input-microphone-symbolic",
117
+        tr("Start listening, always translate, text to clipboard"),
118
+        m_menu_translate);
119
+    add_action_to_menu(action_t::stop_listening, "media-playback-stop-symbolic",
120
+                       tr("Stop listening"), m_menu);
121
+    add_action_to_menu(action_t::stop_listening, "media-playback-stop-symbolic",
122
+                       tr("Stop listening"), m_menu_translate);
123
+    add_menu_to_menu(action_t::change_stt_model,
124
+                     "audio-input-microphone-symbolic", m_menu);
125
+    add_menu_to_menu(action_t::change_stt_model,
126
+                     "audio-input-microphone-symbolic", m_menu_translate);
127
     m_menu.addSeparator();
128
-    m_actions.emplace(
129
-        action_t::start_reading,
130
-        m_menu.addAction(
131
-            QIcon::fromTheme(QStringLiteral("audio-speakers-symbolic")),
132
-            tr("Start reading")));
133
-    m_actions.emplace(
134
-        action_t::start_reading_clipboard,
135
-        m_menu.addAction(
136
-            QIcon::fromTheme(QStringLiteral("audio-speakers-symbolic")),
137
-            tr("Start reading text from clipboard")));
138
-    m_actions.emplace(
139
-        action_t::pause_resume_reading,
140
-        m_menu.addAction(
141
-            QIcon::fromTheme(QStringLiteral("media-playback-pause-symbolic")),
142
-            tr("Pause/Resume reading")));
143
-    m_actions.emplace(
144
-        action_t::change_tts_model,
145
-        m_menu.addMenu(
146
-            QIcon::fromTheme(QStringLiteral("audio-speakers-symbolic")),
147
-            QString{}));
148
+    m_menu_translate.addSeparator();
149
+    add_action_to_menu(action_t::start_reading, "audio-speakers-symbolic",
150
+                       tr("Start reading"), m_menu);
151
+    add_action_to_menu(action_t::start_reading, "audio-speakers-symbolic",
152
+                       tr("Start reading"), m_menu_translate);
153
+    add_action_to_menu(action_t::start_reading_clipboard,
154
+                       "audio-speakers-symbolic",
155
+                       tr("Start reading text from clipboard"), m_menu);
156
+    add_action_to_menu(
157
+        action_t::start_reading_clipboard, "audio-speakers-symbolic",
158
+        tr("Start reading text from clipboard"), m_menu_translate);
159
+    add_action_to_menu(action_t::pause_resume_reading,
160
+                       "media-playback-pause-symbolic",
161
+                       tr("Pause/Resume reading"), m_menu);
162
+    add_action_to_menu(action_t::pause_resume_reading,
163
+                       "media-playback-pause-symbolic",
164
+                       tr("Pause/Resume reading"), m_menu_translate);
165
+    add_menu_to_menu(action_t::change_tts_model, "audio-speakers-symbolic",
166
+                     m_menu);
167
+    add_menu_to_menu(action_t::change_tts_model, "audio-speakers-symbolic",
168
+                     m_menu_translate);
169
     m_menu.addSeparator();
170
-    m_actions.emplace(
171
-        action_t::cancel,
172
-        m_menu.addAction(
173
-            QIcon::fromTheme(QStringLiteral("action-unavailable-symbolic")),
174
-            tr("Cancel")));
175
+    m_menu_translate.addSeparator();
176
+    add_action_to_menu(action_t::cancel, "action-unavailable-symbolic",
177
+                       tr("Cancel"), m_menu);
178
+    add_action_to_menu(action_t::cancel, "action-unavailable-symbolic",
179
+                       tr("Cancel"), m_menu_translate);
180
     m_menu.addSeparator();
181
-    m_actions.emplace(
182
-        action_t::toggle_app_window,
183
-        m_menu.addAction(
184
-            QIcon::fromTheme(QStringLiteral("view-restore-symbolic")),
185
-            tr("Show/Hide")));
186
-    m_actions.emplace(
187
-        action_t::quit,
188
-        m_menu.addAction(
189
-            QIcon::fromTheme(QStringLiteral("application-exit-symbolic")),
190
-            tr("Quit")));
191
+    m_menu_translate.addSeparator();
192
+    add_action_to_menu(action_t::toggle_app_window, "view-restore-symbolic",
193
+                       tr("Show/Hide"), m_menu);
194
+    add_action_to_menu(action_t::toggle_app_window, "view-restore-symbolic",
195
+                       tr("Show/Hide"), m_menu_translate);
196
+    add_action_to_menu(action_t::quit, "application-exit-symbolic", tr("Quit"),
197
+                       m_menu);
198
+    add_action_to_menu(action_t::quit, "application-exit-symbolic", tr("Quit"),
199
+                       m_menu_translate);
200
 
201
dsnote-4.7.1.tar.gz/src/tray_icon.hpp -> dsnote-4.8.1.tar.gz/src/tray_icon.hpp Changed
60
 
1
@@ -1,4 +1,4 @@
2
-/* Copyright (C) 2023 Michal Kosciesza <michal@mkiol.net>
3
+/* Copyright (C) 2023-2025 Michal Kosciesza <michal@mkiol.net>
4
  *
5
  * This Source Code Form is subject to the terms of the Mozilla Public
6
  * License, v. 2.0. If a copy of the MPL was not distributed with this
7
@@ -14,15 +14,19 @@
8
 #include <QSystemTrayIcon>
9
 #include <QTimer>
10
 #include <QVariantMap>
11
-#include <unordered_map>
12
+#include <utility>
13
+#include <vector>
14
 
15
 class tray_icon : public QSystemTrayIcon {
16
     Q_OBJECT
17
    public:
18
     enum class action_t {
19
         start_listening,
20
+        start_listening_translate,
21
         start_listening_active_window,
22
+        start_listening_translate_active_window,
23
         start_listening_clipboard,
24
+        start_listening_translate_clipboard,
25
         stop_listening,
26
         start_reading,
27
         start_reading_clipboard,
28
@@ -47,9 +51,10 @@
29
     void set_state(state_t state);
30
     void set_task_state(task_state_t task_state);
31
     void set_stt_models(QVariantList&& stt_models);
32
-    void set_active_stt_model(QString&& stt_model);
33
+    void set_active_stt_model(QString&& stt_model, bool translate_supported);
34
     void set_tts_models(QVariantList&& tts_models);
35
     void set_active_tts_model(QString&& tts_model);
36
+    void set_fake_keyboard_supported(bool supported);
37
 
38
    signals:
39
     void action_triggered(action_t action, int value);
40
@@ -57,15 +62,18 @@
41
    private:
42
     inline static const auto app_icon = QStringLiteral(":/app_icon.png");
43
     QMenu m_menu;
44
+    QMenu m_menu_translate;
45
     state_t m_state = state_t::busy;
46
     task_state_t m_task_state = task_state_t::idle;
47
-    std::unordered_map<action_t, QObject*> m_actions;
48
+    std::vector<std::pair<action_t, QObject*>> m_actions;
49
     QVariantList m_stt_models;
50
     QString m_active_stt_model;
51
     QVariantList m_tts_models;
52
     QString m_active_tts_model;
53
     QTimer m_animated_icon_timer;
54
     uint8_t m_icon_idx = 0;
55
+    bool m_stt_translate_supported = false;
56
+    bool m_fake_keyboard_supported = false;
57
 
58
     void make_menu();
59
     void update_menu();
60
dsnote-4.7.1.tar.gz/src/tts_engine.cpp -> dsnote-4.8.1.tar.gz/src/tts_engine.cpp Changed
201
 
1
@@ -19,11 +19,14 @@
2
 #include <clocale>
3
 #include <cmath>
4
 #include <cstdio>
5
+#include <cstdlib>
6
+#include <cstring>
7
 #include <fstream>
8
 
9
 #include "denoiser.hpp"
10
 #include "logger.hpp"
11
 #include "media_compressor.hpp"
12
+#include "mtag_tools.hpp"
13
 
14
 static std::string file_ext_for_format(tts_engine::audio_format_t format) {
15
     switch (format) {
16
@@ -178,6 +181,7 @@
17
        << ", model-files=" << config.model_files << ""
18
        << ", speaker=" << config.speaker_id
19
        << ", ref_voice_file=" << config.ref_voice_file
20
+       << ", ref_prompt=" << config.ref_prompt
21
        << ", text-format=" << config.text_format
22
        << ", sync_subs=" << config.sync_subs << ", tag_mode=" << config.tag_mode
23
        << ", options=" << config.options << ", lang_code=" << config.lang_code
24
@@ -186,6 +190,7 @@
25
        << ", speech-speed=" << config.speech_speed
26
        << ", split-into-sentences=" << config.split_into_sentences
27
        << ", use-engine-speed-control=" << config.use_engine_speed_control
28
+       << ", normalize-audio=" << config.normalize_audio
29
        << ", use-gpu=" << config.use_gpu << ", gpu-device="
30
        << config.gpu_device << ""
31
        << ", audio-format=" << config.audio_format;
32
@@ -304,7 +309,13 @@
33
 void tts_engine::push_tasks(std::string&& text, task_type_t type) {
34
     auto tasks = make_tasks(
35
         std::move(text),
36
-        m_config.split_into_sentences && !m_config.has_option('q'), type);
37
+        this() {
38
+            if (m_config.has_option('w')) return split_type_t::by_words;
39
+            if (m_config.has_option('q') || !m_config.split_into_sentences)
40
+                return split_type_t::none;
41
+            return split_type_t::by_sentence;
42
+        }(),
43
+        type);
44
 
45
     if (tasks.empty()) {
46
         LOGW("no task to process");
47
@@ -346,6 +357,12 @@
48
 void tts_engine::set_ref_voice_file(std::string ref_voice_file) {
49
     m_config.ref_voice_file.assign(std::move(ref_voice_file));
50
     m_ref_voice_wav_file.clear();
51
+    m_ref_voice_text.clear();
52
+    reset_ref_voice();
53
+}
54
+
55
+void tts_engine::set_ref_prompt(std::string ref_prompt) {
56
+    m_config.ref_prompt.assign(std::move(ref_prompt));
57
     reset_ref_voice();
58
 }
59
 
60
@@ -379,7 +396,7 @@
61
 }
62
 
63
 static decltype(timespec::tv_sec) create_date_sec(const std::string& file) {
64
-    struct stat result;
65
+    struct stat result{};
66
     if (stat(file.c_str(), &result) == 0) return result.st_ctim.tv_sec;
67
     return 0;
68
 }
69
@@ -391,8 +408,10 @@
70
         text + m_config.model_files.model_path +
71
         m_config.model_files.vocoder_path + m_config.ref_voice_file +
72
         std::to_string(create_date_sec(m_config.ref_voice_file)) +
73
-        m_config.model_files.diacritizer_path + m_config.speaker_id +
74
-        m_config.lang + (do_speech_change ? "1" : "0") +
75
+        m_config.ref_prompt + m_config.model_files.diacritizer_path +
76
+        m_config.speaker_id + m_config.lang +
77
+        (m_config.normalize_audio ? "1" : "0") +
78
+        (do_speech_change ? "1" : "0") +
79
         (speech_speed == 10 ? "" : std::to_string(speech_speed)));
80
     return m_config.cache_dir + "/" + std::to_string(hash) + '.' +
81
            file_ext_for_format(m_config.audio_format);
82
@@ -405,7 +424,7 @@
83
                        sample_rate, file_ext_for_format(format));
84
 }
85
 
86
-static bool file_exists(const std::string& file_path) {
87
+bool tts_engine::file_exists(const std::string& file_path) {
88
     struct stat buffer {};
89
     return stat(file_path.c_str(), &buffer) == 0;
90
 }
91
@@ -462,52 +481,110 @@
92
     }
93
 }
94
 
95
+// source: https://rosettacode.org/wiki/Word_wrap#C++
96
+static std::vector<std::string> wrap(const std::string& text,
97
+                                     size_t line_length) {
98
+    std::vector<std::string> wrapped;
99
+    std::istringstream words(text);
100
+    std::string word;
101
+    std::ostringstream line;
102
+
103
+    if (words >> word) {
104
+        line << word;
105
+        size_t space_left = line_length - word.length();
106
+        while (words >> word) {
107
+            if (space_left < word.length() + 1) {
108
+                wrapped.push_back(line.str());
109
+                line = {};
110
+                line << word;
111
+                space_left = line_length - word.length();
112
+            } else {
113
+                line << ' ' << word;
114
+                space_left -= word.length() + 1;
115
+            }
116
+        }
117
+    }
118
+
119
+    if (line.tellp() > 0) wrapped.push_back(line.str());
120
+
121
+    return wrapped;
122
+}
123
+
124
 void tts_engine::make_plain_tasks(
125
-    const std::string& text, bool split, unsigned int speed,
126
+    const std::string& text, split_type_t split_type, unsigned int speed,
127
     unsigned int silence_duration, task_type_t type,
128
     std::vector<tts_engine::task_t>& tasks) const {
129
-    if (split) {
130
-        auto engine = m_config.has_option('a')
131
-                          ? text_tools::split_engine_t::astrunc
132
-                          : text_tools::split_engine_t::ssplit;
133
-        auto parts, _ =
134
-            text_tools::split(text, engine, m_config.lang, m_config.nb_data);
135
-        if (parts.empty()) {
136
+    switch (split_type) {
137
+        case split_type_t::by_sentence: {
138
+            auto parts, _ = text_tools::split(
139
+                text,
140
+                m_config.has_option('a') ? text_tools::split_engine_t::astrunc
141
+                                         : text_tools::split_engine_t::ssplit,
142
+                m_config.lang, m_config.nb_data);
143
+            if (parts.empty()) {
144
+                task_t task;
145
+                task.speed = speed;
146
+                task.silence_duration = silence_duration;
147
+                task.type = type;
148
+                tasks.push_back(std::move(task));
149
+            } else {
150
+                tasks.reserve(parts.size());
151
+                for (auto& part : parts) {
152
+                    trim(part);
153
+                    if (!part.empty()) {
154
+                        task_t task;
155
+                        task.text = std::move(part);
156
+                        task.speed = speed;
157
+                        task.silence_duration = silence_duration;
158
+                        task.type = type;
159
+                        tasks.push_back(std::move(task));
160
+                    }
161
+                }
162
+            }
163
+            break;
164
+        }
165
+        case split_type_t::by_words: {
166
+            auto parts = wrap(text, 100);
167
+            if (parts.empty()) {
168
+                task_t task;
169
+                task.speed = speed;
170
+                task.silence_duration = silence_duration;
171
+                task.type = type;
172
+                tasks.push_back(std::move(task));
173
+            } else {
174
+                tasks.reserve(parts.size());
175
+                for (auto& part : parts) {
176
+                    trim(part);
177
+                    if (!part.empty()) {
178
+                        task_t task;
179
+                        task.text = std::move(part);
180
+                        task.speed = speed;
181
+                        task.silence_duration = silence_duration;
182
+                        task.type = type;
183
+                        tasks.push_back(std::move(task));
184
+                    }
185
+                }
186
+            }
187
+            break;
188
+        }
189
+        case split_type_t::none: {
190
+            auto t_text{text};
191
+            text_tools::trim_line(t_text);
192
+
193
             task_t task;
194
+            task.text = std::move(t_text);
195
             task.speed = speed;
196
             task.silence_duration = silence_duration;
197
             task.type = type;
198
+
199
             tasks.push_back(std::move(task));
200
-        } else {
201
dsnote-4.7.1.tar.gz/src/tts_engine.hpp -> dsnote-4.8.1.tar.gz/src/tts_engine.hpp Changed
182
 
1
@@ -82,13 +82,13 @@
2
         std::string diacritizer_path;
3
         std::string hub_path;
4
 
5
-        inline bool operator==(const model_files_t& rhs) const {
6
+        bool operator==(const model_files_t& rhs) const {
7
             return model_path == rhs.model_path &&
8
                    vocoder_path == rhs.vocoder_path &&
9
                    diacritizer_path == rhs.diacritizer_path &&
10
                    hub_path == rhs.hub_path;
11
         };
12
-        inline bool operator!=(const model_files_t& rhs) const {
13
+        bool operator!=(const model_files_t& rhs) const {
14
             return !(*this == rhs);
15
         };
16
     };
17
@@ -111,11 +111,11 @@
18
         std::string name;
19
         std::string platform_name;
20
 
21
-        inline bool operator==(const gpu_device_t& rhs) const {
22
+        bool operator==(const gpu_device_t& rhs) const {
23
             return platform_name == rhs.platform_name && name == rhs.name &&
24
                    id == rhs.id;
25
         }
26
-        inline bool operator!=(const gpu_device_t& rhs) const {
27
+        bool operator!=(const gpu_device_t& rhs) const {
28
             return !(*this == rhs);
29
         }
30
     };
31
@@ -127,6 +127,7 @@
32
         model_files_t model_files;
33
         std::string speaker_id;
34
         std::string ref_voice_file;
35
+        std::string ref_prompt;
36
         std::string cache_dir;
37
         std::string data_dir;
38
         std::string config_dir;
39
@@ -140,10 +141,12 @@
40
         unsigned int speech_speed = 10;
41
         bool split_into_sentences = true;
42
         bool use_engine_speed_control = true;
43
+        bool normalize_audio = true;
44
         bool use_gpu = false;
45
         gpu_device_t gpu_device;
46
         audio_format_t audio_format = audio_format_t::wav;
47
-        inline bool has_option(char c) const {
48
+
49
+        bool has_option(char c) const {
50
             return options.find(c) != std::string::npos;
51
         }
52
     };
53
@@ -154,47 +157,42 @@
54
     void start();
55
     void stop();
56
     void request_stop();
57
-    inline auto lang() const { return m_config.lang; }
58
-    inline void set_lang(const std::string& value) { m_config.lang = value; }
59
-    inline auto lang_code() const { return m_config.lang_code; }
60
-    inline void set_lang_code(const std::string& value) {
61
-        m_config.lang_code = value;
62
-    }
63
-    inline auto model_files() const { return m_config.model_files; }
64
-    inline auto state() const { return m_state; }
65
-    inline auto speaker() const { return m_config.speaker_id; }
66
-    inline void set_speaker(const std::string& value) {
67
-        m_config.speaker_id = value;
68
-    }
69
-    inline auto use_gpu() const { return m_config.use_gpu; }
70
-    inline auto gpu_device() const { return m_config.gpu_device; }
71
-    inline auto ref_voice_file() const { return m_config.ref_voice_file; }
72
-    inline void restart() { m_restart_requested = true; }
73
-    inline auto text_format() const { return m_config.text_format; }
74
-    inline void set_text_format(text_format_t value) {
75
-        m_config.text_format = value;
76
-    }
77
-    inline auto split_into_sentences() const {
78
-        return m_config.split_into_sentences;
79
-    }
80
-    inline void set_split_into_sentences(bool value) {
81
+    auto lang() const { return m_config.lang; }
82
+    void set_lang(const std::string& value) { m_config.lang = value; }
83
+    auto lang_code() const { return m_config.lang_code; }
84
+    void set_lang_code(const std::string& value) { m_config.lang_code = value; }
85
+    auto model_files() const { return m_config.model_files; }
86
+    auto state() const { return m_state; }
87
+    auto speaker() const { return m_config.speaker_id; }
88
+    void set_speaker(const std::string& value) { m_config.speaker_id = value; }
89
+    auto use_gpu() const { return m_config.use_gpu; }
90
+    auto gpu_device() const { return m_config.gpu_device; }
91
+    auto ref_voice_file() const { return m_config.ref_voice_file; }
92
+    void restart() { m_restart_requested = true; }
93
+    auto text_format() const { return m_config.text_format; }
94
+    void set_text_format(text_format_t value) { m_config.text_format = value; }
95
+    auto split_into_sentences() const { return m_config.split_into_sentences; }
96
+    auto ref_prompt() const { return m_config.ref_prompt; }
97
+    void set_split_into_sentences(bool value) {
98
         m_config.split_into_sentences = value;
99
     }
100
-    inline auto use_engine_speed_control() const {
101
+    auto use_engine_speed_control() const {
102
         return m_config.use_engine_speed_control;
103
     }
104
-    inline void set_use_engine_speed_control(bool value) {
105
+    void set_use_engine_speed_control(bool value) {
106
         m_config.use_engine_speed_control = value;
107
     }
108
-    inline void set_sync_subs(subtitles_sync_mode_t value) {
109
+    void set_normalize_audio(bool value) { m_config.normalize_audio = value; }
110
+    void set_sync_subs(subtitles_sync_mode_t value) {
111
         m_config.sync_subs = value;
112
     }
113
-    inline void set_tag_mode(tag_mode_t value) { m_config.tag_mode = value; }
114
+    void set_tag_mode(tag_mode_t value) { m_config.tag_mode = value; }
115
     void encode_speech(std::string text);
116
     void restore_text(std::string text);
117
     static std::string merge_wav_files(std::vector<std::string>&& files);
118
     void set_speech_speed(unsigned int speech_speed);
119
     void set_ref_voice_file(std::string ref_voice_file);
120
+    void set_ref_prompt(std::string ref_prompt);
121
 
122
    protected:
123
     enum class task_type_t { speech_encoding, text_restoration };
124
@@ -203,6 +201,7 @@
125
         task_flag_first = 1U << 0U,
126
         task_flag_last = 1U << 1U
127
     };
128
+    enum class split_type_t { none, by_sentence, by_words };
129
 
130
     struct task_t {
131
         std::string text;
132
@@ -213,7 +212,7 @@
133
         task_type_t type = task_type_t::speech_encoding;
134
         unsigned int flags = task_flags::task_flag_none;
135
 
136
-        inline bool empty() const {
137
+        bool empty() const {
138
             return text.empty() && t0 == 0LL && t1 == 0LL &&
139
                    silence_duration == 0UL;
140
         }
141
@@ -228,6 +227,7 @@
142
     state_t m_state = state_t::idle;
143
     text_tools::processor m_text_processor;
144
     std::string m_ref_voice_wav_file;
145
+    std::string m_ref_voice_text;
146
     bool m_restart_requested = false;
147
     unsigned int m_last_speech_sample_rate = 48000;
148
 
149
@@ -260,9 +260,9 @@
150
     void process_encode_speech(const task_t& task, size_t& speech_time,
151
                                double progress);
152
     void process_restore_text(const task_t& task, std::string& restored_text);
153
-    std::vector<task_t> make_tasks(std::string text, bool split,
154
+    std::vector<task_t> make_tasks(std::string text, split_type_t split_type,
155
                                    task_type_t type) const;
156
-    void make_plain_tasks(const std::string& text, bool split,
157
+    void make_plain_tasks(const std::string& text, split_type_t split_type,
158
                           unsigned int speed, unsigned int silence_duration,
159
                           task_type_t type, std::vector<task_t>& tasks) const;
160
     void make_subrip_tasks(const std::string& text, unsigned int speed,
161
@@ -274,12 +274,17 @@
162
     void make_silence_wav_file(size_t duration_msec, unsigned int sample_rate,
163
                                const std::string& output_file) const;
164
     void push_tasks(std::string&& text, task_type_t type);
165
-    inline bool is_shutdown() const {
166
+    bool is_shutdown() const {
167
         return m_state == state_t::stopping || m_state == state_t::stopped ||
168
                m_state == state_t::error;
169
     }
170
-    static bool post_process_wav(const std::string& wav_file,
171
-                                 size_t silence_duration_msec);
172
+    void post_process_wav(const std::string& wav_file,
173
+                          size_t silence_duration_msec) const;
174
+    static bool file_exists(const std::string& file_path);
175
+    static bool convert_wav_to_16bits(const std::string& wav_file);
176
+    static void make_hf_link(const char* model_name,
177
+                             const std::string& hub_path,
178
+                             const std::string& cache_dir);
179
 };
180
 
181
 #endif // TTS_ENGINE_HPP
182
dsnote-4.7.1.tar.gz/src/whisper_engine.cpp -> dsnote-4.8.1.tar.gz/src/whisper_engine.cpp Changed
103
 
1
@@ -131,62 +131,74 @@
2
 }
3
 
4
 bool whisper_engine::has_cuda() {
5
+#ifdef ARCH_X86_64
6
     auto cpuinfo = cpu_tools::cpuinfo();
7
     if ((cpuinfo.feature_flags & cpu_tools::feature_flags_t::avx) == 0 ||
8
         (cpuinfo.feature_flags & cpu_tools::feature_flags_t::f16c) == 0) {
9
         LOGD("whisper-cublas is not supported due to lack of avx");
10
         return false;
11
     }
12
+#endif
13
     return try_open_lib("libwhisper-cublas.so");
14
 }
15
 
16
 bool whisper_engine::has_openvino() {
17
+#ifdef ARCH_X86_64
18
     auto cpuinfo = cpu_tools::cpuinfo();
19
     if ((cpuinfo.feature_flags & cpu_tools::feature_flags_t::avx) == 0 ||
20
         (cpuinfo.feature_flags & cpu_tools::feature_flags_t::f16c) == 0) {
21
         LOGD("whisper-openvino is not supported due to lack of avx");
22
         return false;
23
     }
24
+#endif
25
     return try_open_lib("libwhisper-openvino.so");
26
 }
27
 
28
 bool whisper_engine::has_opencl() {
29
+#ifdef ARCH_X86_64
30
     auto cpuinfo = cpu_tools::cpuinfo();
31
     if ((cpuinfo.feature_flags & cpu_tools::feature_flags_t::avx) == 0 ||
32
         (cpuinfo.feature_flags & cpu_tools::feature_flags_t::f16c) == 0) {
33
         LOGD("whisper-clblast is not supported due to lack of avx");
34
         return false;
35
     }
36
+#endif
37
     return try_open_lib("libwhisper-clblast.so");
38
 }
39
 
40
 bool whisper_engine::has_hip() {
41
+#ifdef ARCH_X86_64
42
     auto cpuinfo = cpu_tools::cpuinfo();
43
     if ((cpuinfo.feature_flags & cpu_tools::feature_flags_t::avx) == 0 ||
44
         (cpuinfo.feature_flags & cpu_tools::feature_flags_t::f16c) == 0) {
45
         LOGD("whisper-hip is not supported due to lack of avx");
46
         return false;
47
     }
48
+#endif
49
     return try_open_lib("libwhisper-hipblas.so");
50
 }
51
 
52
 bool whisper_engine::has_vulkan() {
53
+#ifdef ARCH_X86_64
54
     auto cpuinfo = cpu_tools::cpuinfo();
55
     if ((cpuinfo.feature_flags & cpu_tools::feature_flags_t::avx) == 0 ||
56
         (cpuinfo.feature_flags & cpu_tools::feature_flags_t::f16c) == 0) {
57
         LOGD("whisper-vulkan is not supported due to lack of avx");
58
         return false;
59
     }
60
+#endif
61
     return try_open_lib("libwhisper-vulkan.so");
62
 }
63
 
64
 bool whisper_engine::use_openvino() const {
65
+#ifdef ARCH_X86_64
66
     auto cpuinfo = cpu_tools::cpuinfo();
67
     if ((cpuinfo.feature_flags & cpu_tools::feature_flags_t::avx) == 0 ||
68
         (cpuinfo.feature_flags & cpu_tools::feature_flags_t::f16c) == 0) {
69
         LOGD("whisper-openvino is not supported due to lack of avx");
70
         return false;
71
     }
72
+#endif
73
     return m_config.gpu_device.api == gpu_api_t::openvino &&
74
            !m_config.model_files.openvino_model_file.empty();
75
 }
76
@@ -643,6 +655,7 @@
77
     wparams.print_progress = false;
78
     wparams.print_timestamps = false;
79
     wparams.audio_ctx = 1500;
80
+    wparams.no_context = false;
81
 
82
     if (!m_config.model_files.openvino_model_file.empty()) {
83
         // read audio_ctx from config file for openvino
84
@@ -691,6 +704,7 @@
85
     if (m_whisper_sup_ctx && auto_lang) {
86
         // use sup model to detect language
87
         m_wparams.detect_language = true;
88
+        m_wparams.initial_prompt = nullptr;
89
 
90
         if (auto ret = m_whisper_api.whisper_full(m_whisper_sup_ctx, m_wparams,
91
                                                   buf.data(), buf.size());
92
@@ -714,6 +728,10 @@
93
 
94
     std::ostringstream os;
95
 
96
+    if (!m_config.initial_prompt.empty()) {
97
+        m_wparams.initial_prompt = m_config.initial_prompt.c_str();
98
+    }
99
+
100
     if (auto ret = m_whisper_api.whisper_full(m_whisper_ctx, m_wparams,
101
                                               buf.data(), buf.size());
102
         ret == 0) {
103
dsnote-4.7.1.tar.gz/src/whisperspeech_engine.cpp -> dsnote-4.8.1.tar.gz/src/whisperspeech_engine.cpp Changed
53
 
1
@@ -14,8 +14,6 @@
2
 #include <cstdlib>
3
 #include <cstring>
4
 #include <fstream>
5
-#include <functional>
6
-#include <string_view>
7
 #include <utility>
8
 
9
 #include "cpu_tools.hpp"
10
@@ -53,6 +51,10 @@
11
         try {
12
             m_model.reset();
13
             m_speaker.reset();
14
+
15
+            // release mem
16
+            py::module_::import("gc").attr("collect")();
17
+            py::module_::import("torch").attr("cuda").attr("empty_cache")();
18
         } catch (const std::exception& err) {
19
             LOGE("py error: " << err.what());
20
         }
21
@@ -64,31 +66,6 @@
22
     LOGD("whisperspeech stopped");
23
 }
24
 
25
-static void make_hf_link(const char* model_name, const std::string& hub_path,
26
-                         const std::string& cache_dir) {
27
-    auto model_path = fmt::format("{}/hf_{}_hub", hub_path, model_name);
28
-
29
-    auto dir = fmt::format("{}/models--{}", cache_dir, model_name);
30
-    mkdir(dir.c_str(), 0755);
31
-    mkdir(fmt::format("{}/snapshots", dir).c_str(), 0755);
32
-    mkdir(fmt::format("{}/refs", dir).c_str(), 0755);
33
-
34
-    if (std::ofstream os{fmt::format("{}/refs/main", dir).c_str()}) {
35
-        os << "4e61d082c08045a4c11e5b148ad93b1d0c591a14";
36
-    } else {
37
-        LOGE("can't write hf ref file");
38
-        return;
39
-    }
40
-
41
-    auto ln_target = fmt::format(
42
-        "{}/snapshots/4e61d082c08045a4c11e5b148ad93b1d0c591a14", dir);
43
-    mkdir(dir.c_str(), 0755);
44
-
45
-    remove(ln_target.c_str());
46
-    LOGD("ln: " << model_path << " => " << ln_target);
47
-    (void)symlink(model_path.c_str(), ln_target.c_str());
48
-}
49
-
50
 static void make_torch_link(const char* model_name, const std::string& hub_path,
51
                             const std::string& cache_dir) {
52
     auto model_path = fmt::format("{}/torch_{}_hub", hub_path, model_name);
53
dsnote-4.8.1.tar.gz/translations/dsnote-ar.ts Added
201
 
1
@@ -0,0 +1,5651 @@
2
+<?xml version="1.0" encoding="utf-8"?>
3
+<!DOCTYPE TS>
4
+<TS version="2.1" language="ar" sourcelanguage="en_US">
5
+<context>
6
+    <name>AboutPage</name>
7
+    <message>
8
+        <location filename="../sfos/qml/AboutPage.qml" line="28"/>
9
+        <source>About %1</source>
10
+        <translation>نبذة عن %1</translation>
11
+    </message>
12
+    <message>
13
+        <location filename="../sfos/qml/AboutPage.qml" line="46"/>
14
+        <source>Version %1</source>
15
+        <translation>الاصدار %1</translation>
16
+    </message>
17
+    <message>
18
+        <location filename="../sfos/qml/AboutPage.qml" line="53"/>
19
+        <source>Project website</source>
20
+        <translation>الموقع الإلكتروني للمشروع</translation>
21
+    </message>
22
+    <message>
23
+        <location filename="../sfos/qml/AboutPage.qml" line="57"/>
24
+        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
25
+        <source>Changes</source>
26
+        <translation>التغييرات</translation>
27
+    </message>
28
+    <message>
29
+        <location filename="../sfos/qml/AboutPage.qml" line="63"/>
30
+        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
31
+        <source>Authors</source>
32
+        <translation>المؤلفون</translation>
33
+    </message>
34
+    <message>
35
+        <location filename="../sfos/qml/AboutPage.qml" line="77"/>
36
+        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
37
+        <source>%1 is developed as an open source project under %2.</source>
38
+        <translation>%1 طور كمشروع مفتوح المصدر تحت %2.</translation>
39
+    </message>
40
+    <message>
41
+        <location filename="../sfos/qml/AboutPage.qml" line="83"/>
42
+        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
43
+        <source>Translators</source>
44
+        <translation>المترجمون</translation>
45
+    </message>
46
+    <message>
47
+        <location filename="../sfos/qml/AboutPage.qml" line="92"/>
48
+        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
49
+        <source>Libraries in use</source>
50
+        <translation>المكتبات المستخدمة</translation>
51
+    </message>
52
+    <message>
53
+        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
54
+        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
55
+        <translation>تدوين الملاحظات والقراءة والترجمة باستخدام تحويل الكلام إلى نص، وتحويل النص إلى كلام، والترجمة الآلية</translation>
56
+    </message>
57
+    <message>
58
+        <location filename="../desktop/qml/AboutPage.qml" line="17"/>
59
+        <location filename="../desktop/qml/AboutPage.qml" line="63"/>
60
+        <source>About</source>
61
+        <translation>نبذة عن</translation>
62
+    </message>
63
+    <message>
64
+        <location filename="../desktop/qml/AboutPage.qml" line="67"/>
65
+        <source>Project website:</source>
66
+        <translation>الموقع الإلكتروني للمشروع</translation>
67
+    </message>
68
+    <message>
69
+        <location filename="../desktop/qml/AboutPage.qml" line="73"/>
70
+        <source>Report bugs at:</source>
71
+        <translation>الإبلاغ عن الأخطاء في:</translation>
72
+    </message>
73
+    <message>
74
+        <location filename="../desktop/qml/AboutPage.qml" line="79"/>
75
+        <source>Support e-mail:</source>
76
+        <translation>بريد إلكتروني الدعم:</translation>
77
+    </message>
78
+</context>
79
+<context>
80
+    <name>AddTextDialog</name>
81
+    <message>
82
+        <location filename="../sfos/qml/AddTextDialog.qml" line="33"/>
83
+        <location filename="../desktop/qml/AddTextDialog.qml" line="34"/>
84
+        <source>Add text to the current note or replace it?</source>
85
+        <translation>إضافة نص إلى الملاحظة الحالية أو استبدالها؟</translation>
86
+    </message>
87
+    <message>
88
+        <location filename="../sfos/qml/AddTextDialog.qml" line="41"/>
89
+        <location filename="../desktop/qml/AddTextDialog.qml" line="42"/>
90
+        <source>Add</source>
91
+        <translation>أضف</translation>
92
+    </message>
93
+    <message>
94
+        <location filename="../sfos/qml/AddTextDialog.qml" line="49"/>
95
+        <location filename="../desktop/qml/AddTextDialog.qml" line="50"/>
96
+        <source>Replace</source>
97
+        <translation>استبدل</translation>
98
+    </message>
99
+</context>
100
+<context>
101
+    <name>AddonInstallDialog</name>
102
+    <message>
103
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="17"/>
104
+        <source>Install Flatpak add-on</source>
105
+        <translation>ثبت وظيفة فلاتباك الإضافية</translation>
106
+    </message>
107
+    <message>
108
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="33"/>
109
+        <source>To install Flatpak add-on, which provides GPU acceleration support for %1 graphics card, follow one of the steps below.</source>
110
+        <translation>لتثبيت وظيفة فلاتباك الإضافية، التي توفر دعم تسريع GPU لبطاقة الرسومات %1، اتبع إحدى الخطوات التالية.</translation>
111
+    </message>
112
+    <message>
113
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="43"/>
114
+        <source>Use the software manager application on your system and install %1, or</source>
115
+        <translation>استخدم برنامج مدير التطبيقات على نظامك وثبت %1، أو</translation>
116
+    </message>
117
+    <message>
118
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="52"/>
119
+        <source>Run the following command in the terminal:</source>
120
+        <translation>نفذ الأمر التالي في الطرفية:</translation>
121
+    </message>
122
+    <message>
123
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="70"/>
124
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="85"/>
125
+        <source>The add-on enables faster processing when using the following Speech to Text and Text to Speech engines:</source>
126
+        <translation>تتيح لك الوظيفة الإضافية معالجة أسرع عند استخدام محركات تحويل الكلام إلى نص وتحويل النص إلى كلام:</translation>
127
+    </message>
128
+    <message>
129
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="97"/>
130
+        <source>If you&apos;re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
131
+        <translation>إذا كنت مهتمًا بمعالجة تحويل الكلام إلى نص بسرعة ودقة، ففكر في استخدام %1 مع مسرع أجهزة Vulkan، والذي يعمل دون تثبيت وظيفة إضافية.</translation>
132
+    </message>
133
+    <message>
134
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="106"/>
135
+        <source>Note that installing the add-on requires a significant amount of disk space.</source>
136
+        <translation>لاحظ أن تثبيت الوظيفة الإضافية يتطلب قدراً كبيراً من مساحة القرص.</translation>
137
+    </message>
138
+</context>
139
+<context>
140
+    <name>ChangelogPage</name>
141
+    <message>
142
+        <location filename="../sfos/qml/ChangelogPage.qml" line="28"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
144
+        <source>Changes</source>
145
+        <translation>التغييرات</translation>
146
+    </message>
147
+    <message>
148
+        <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
149
+        <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
150
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
151
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
152
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
153
+        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
154
+        <location filename="../desktop/qml/ChangelogPage.qml" line="117"/>
155
+        <location filename="../desktop/qml/ChangelogPage.qml" line="133"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="223"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="249"/>
158
+        <location filename="../desktop/qml/ChangelogPage.qml" line="321"/>
159
+        <location filename="../desktop/qml/ChangelogPage.qml" line="415"/>
160
+        <location filename="../desktop/qml/ChangelogPage.qml" line="515"/>
161
+        <location filename="../desktop/qml/ChangelogPage.qml" line="611"/>
162
+        <location filename="../desktop/qml/ChangelogPage.qml" line="628"/>
163
+        <location filename="../desktop/qml/ChangelogPage.qml" line="682"/>
164
+        <location filename="../desktop/qml/ChangelogPage.qml" line="718"/>
165
+        <location filename="../desktop/qml/ChangelogPage.qml" line="746"/>
166
+        <location filename="../desktop/qml/ChangelogPage.qml" line="761"/>
167
+        <location filename="../desktop/qml/ChangelogPage.qml" line="786"/>
168
+        <source>Version %1</source>
169
+        <translation>الاصدار %1</translation>
170
+    </message>
171
+    <message>
172
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
173
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
174
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
176
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
177
+        <location filename="../desktop/qml/ChangelogPage.qml" line="125"/>
178
+        <location filename="../desktop/qml/ChangelogPage.qml" line="187"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="240"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="301"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="383"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="489"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="541"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="632"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="722"/>
186
+        <source>Translator</source>
187
+        <translation>ترجم</translation>
188
+    </message>
189
+    <message>
190
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
191
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
192
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
193
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
194
+        <location filename="../desktop/qml/ChangelogPage.qml" line="56"/>
195
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
196
+        <location filename="../desktop/qml/ChangelogPage.qml" line="290"/>
197
+        <location filename="../desktop/qml/ChangelogPage.qml" line="362"/>
198
+        <location filename="../desktop/qml/ChangelogPage.qml" line="466"/>
199
+        <location filename="../desktop/qml/ChangelogPage.qml" line="568"/>
200
+        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
201
dsnote-4.8.1.tar.gz/translations/dsnote-ca_ES.ts Added
201
 
1
@@ -0,0 +1,5823 @@
2
+<?xml version="1.0" encoding="utf-8"?>
3
+<!DOCTYPE TS>
4
+<TS version="2.1" language="ca_ES" sourcelanguage="en_US">
5
+<context>
6
+    <name>AboutPage</name>
7
+    <message>
8
+        <location filename="../sfos/qml/AboutPage.qml" line="28"/>
9
+        <source>About %1</source>
10
+        <translation>Quant a %1</translation>
11
+    </message>
12
+    <message>
13
+        <location filename="../sfos/qml/AboutPage.qml" line="46"/>
14
+        <source>Version %1</source>
15
+        <translation>Versió %1</translation>
16
+    </message>
17
+    <message>
18
+        <location filename="../sfos/qml/AboutPage.qml" line="53"/>
19
+        <source>Project website</source>
20
+        <translation>Lloc web del projecte</translation>
21
+    </message>
22
+    <message>
23
+        <location filename="../sfos/qml/AboutPage.qml" line="57"/>
24
+        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
25
+        <source>Changes</source>
26
+        <translation>Canvis</translation>
27
+    </message>
28
+    <message>
29
+        <location filename="../sfos/qml/AboutPage.qml" line="63"/>
30
+        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
31
+        <source>Authors</source>
32
+        <translation>Autoria</translation>
33
+    </message>
34
+    <message>
35
+        <location filename="../sfos/qml/AboutPage.qml" line="77"/>
36
+        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
37
+        <source>%1 is developed as an open source project under %2.</source>
38
+        <translation>%1 s’ha desenrotllat com un projecte de codi obert en %2.</translation>
39
+    </message>
40
+    <message>
41
+        <location filename="../sfos/qml/AboutPage.qml" line="83"/>
42
+        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
43
+        <source>Translators</source>
44
+        <translation>Traducció</translation>
45
+    </message>
46
+    <message>
47
+        <location filename="../sfos/qml/AboutPage.qml" line="92"/>
48
+        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
49
+        <source>Libraries in use</source>
50
+        <translation>Biblioteques en ús</translation>
51
+    </message>
52
+    <message>
53
+        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
54
+        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
55
+        <translation>Presa de notes, lectura i traducció amb conversió de veu a text, conversió de text a veu i traducció automàtica</translation>
56
+    </message>
57
+    <message>
58
+        <location filename="../desktop/qml/AboutPage.qml" line="17"/>
59
+        <location filename="../desktop/qml/AboutPage.qml" line="63"/>
60
+        <source>About</source>
61
+        <translation>Quant a</translation>
62
+    </message>
63
+    <message>
64
+        <location filename="../desktop/qml/AboutPage.qml" line="67"/>
65
+        <source>Project website:</source>
66
+        <translation>Lloc web del projecte:</translation>
67
+    </message>
68
+    <message>
69
+        <location filename="../desktop/qml/AboutPage.qml" line="73"/>
70
+        <source>Report bugs at:</source>
71
+        <translation>Informeu d’errors en:</translation>
72
+    </message>
73
+    <message>
74
+        <location filename="../desktop/qml/AboutPage.qml" line="79"/>
75
+        <source>Support e-mail:</source>
76
+        <translation>Correu electrònic d’assistència tècnica:</translation>
77
+    </message>
78
+</context>
79
+<context>
80
+    <name>AddTextDialog</name>
81
+    <message>
82
+        <location filename="../sfos/qml/AddTextDialog.qml" line="33"/>
83
+        <location filename="../desktop/qml/AddTextDialog.qml" line="34"/>
84
+        <source>Add text to the current note or replace it?</source>
85
+        <translation>Voleu afegir text a la nota actual o substituir-la?</translation>
86
+    </message>
87
+    <message>
88
+        <location filename="../sfos/qml/AddTextDialog.qml" line="41"/>
89
+        <location filename="../desktop/qml/AddTextDialog.qml" line="42"/>
90
+        <source>Add</source>
91
+        <translation>Afig</translation>
92
+    </message>
93
+    <message>
94
+        <location filename="../sfos/qml/AddTextDialog.qml" line="49"/>
95
+        <location filename="../desktop/qml/AddTextDialog.qml" line="50"/>
96
+        <source>Replace</source>
97
+        <translation>Substituïx</translation>
98
+    </message>
99
+</context>
100
+<context>
101
+    <name>AddonInstallDialog</name>
102
+    <message>
103
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="17"/>
104
+        <source>Install Flatpak add-on</source>
105
+        <translation>Instal·la el complement Flatpak</translation>
106
+    </message>
107
+    <message>
108
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="33"/>
109
+        <source>To install Flatpak add-on, which provides GPU acceleration support for %1 graphics card, follow one of the steps below.</source>
110
+        <translation>Per a instal·lar el complement Flatpak, el qual facilita l’acceleració de la GPU per a la targeta gràfica %1, seguiu un dels passos següents.</translation>
111
+    </message>
112
+    <message>
113
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="43"/>
114
+        <source>Use the software manager application on your system and install %1, or</source>
115
+        <translation>Utilitzeu l’aplicació d’administrador del software del vostre sistema i instal·leu %1, o bé</translation>
116
+    </message>
117
+    <message>
118
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="52"/>
119
+        <source>Run the following command in the terminal:</source>
120
+        <translation>Executeu la següent orde en el terminal:</translation>
121
+    </message>
122
+    <message>
123
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="70"/>
124
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="85"/>
125
+        <source>The add-on enables faster processing when using the following Speech to Text and Text to Speech engines:</source>
126
+        <translation>El complement permet processar més ràpidament quan s’utilitzen els següents motors de conversió de veu a text i de text a veu:</translation>
127
+    </message>
128
+    <message>
129
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="97"/>
130
+        <source>If you&apos;re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
131
+        <translation type="unfinished"></translation>
132
+    </message>
133
+    <message>
134
+        <source>If you’re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
135
+        <translation type="vanished">Si vos interessa un processament ràpid i precís de la conversió de veu a text, considereu la possibilitat d’utilitzar %1 amb acceleració del hardware Vulkan, el qual funciona sense instal·lar cap complement.</translation>
136
+    </message>
137
+    <message>
138
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="106"/>
139
+        <source>Note that installing the add-on requires a significant amount of disk space.</source>
140
+        <translation>Tingueu en compte que instal·lar el complement requerix una quantitat important d’espai en el disc.</translation>
141
+    </message>
142
+</context>
143
+<context>
144
+    <name>ChangelogPage</name>
145
+    <message>
146
+        <location filename="../sfos/qml/ChangelogPage.qml" line="28"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
148
+        <source>Changes</source>
149
+        <translation>Canvis</translation>
150
+    </message>
151
+    <message>
152
+        <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
153
+        <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
154
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
155
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
156
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
158
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
159
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
160
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
161
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
162
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
163
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
164
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
165
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
166
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
167
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
168
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
169
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
170
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
171
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
172
+        <source>Version %1</source>
173
+        <translation>Versió %1</translation>
174
+    </message>
175
+    <message>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
177
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
178
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
179
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
190
+        <source>Translator</source>
191
+        <translation>Traductor</translation>
192
+    </message>
193
+    <message>
194
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
195
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
196
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
197
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
198
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
199
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
200
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
201
dsnote-4.7.1.tar.gz/translations/dsnote-de.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-de.ts Changed
201
 
1
@@ -16,46 +16,42 @@
2
     <message>
3
         <location filename="../sfos/qml/AboutPage.qml" line="53"/>
4
         <source>Project website</source>
5
-        <translation>Projekt Webseite</translation>
6
+        <translation>Projekt Internet-Präsenz</translation>
7
     </message>
8
     <message>
9
-        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
10
         <location filename="../sfos/qml/AboutPage.qml" line="57"/>
11
+        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
12
         <source>Changes</source>
13
         <translation>Änderungen</translation>
14
     </message>
15
     <message>
16
-        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
17
         <location filename="../sfos/qml/AboutPage.qml" line="63"/>
18
+        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
19
         <source>Authors</source>
20
         <translation>Autoren</translation>
21
     </message>
22
     <message>
23
-        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
24
         <location filename="../sfos/qml/AboutPage.qml" line="77"/>
25
+        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
26
         <source>%1 is developed as an open source project under %2.</source>
27
         <translation>%1 wurde entwickelt als Open Source-Projekt unter %2.</translation>
28
     </message>
29
     <message>
30
-        <location filename="../desktop/qml/AboutPage.qml" line="79"/>
31
-        <source>Support e-mail:</source>
32
-        <translation type="unfinished"></translation>
33
-    </message>
34
-    <message>
35
-        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
36
         <location filename="../sfos/qml/AboutPage.qml" line="83"/>
37
+        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
38
         <source>Translators</source>
39
         <translation>Übersetzer</translation>
40
     </message>
41
     <message>
42
-        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
43
         <location filename="../sfos/qml/AboutPage.qml" line="92"/>
44
+        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
45
         <source>Libraries in use</source>
46
         <translation>Verwendete Bibliotheken</translation>
47
     </message>
48
     <message>
49
-        <source>Libraries</source>
50
-        <translation type="vanished">Bibliotheken</translation>
51
+        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
52
+        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
53
+        <translation>Notizen machen, lesen und übersetzen mit Speech to Text, Text to Speech und maschineller Übersetzung</translation>
54
     </message>
55
     <message>
56
         <location filename="../desktop/qml/AboutPage.qml" line="17"/>
57
@@ -64,11 +60,6 @@
58
         <translation>Über</translation>
59
     </message>
60
     <message>
61
-        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
62
-        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
63
-        <translation>Notizen machen, lesen und übersetzen mit Speech to Text, Text to Speech und maschineller Übersetzung</translation>
64
-    </message>
65
-    <message>
66
         <location filename="../desktop/qml/AboutPage.qml" line="67"/>
67
         <source>Project website:</source>
68
         <translation>Projekt-Webseite:</translation>
69
@@ -78,110 +69,210 @@
70
         <source>Report bugs at:</source>
71
         <translation>Fehler melden unter:</translation>
72
     </message>
73
+    <message>
74
+        <location filename="../desktop/qml/AboutPage.qml" line="79"/>
75
+        <source>Support e-mail:</source>
76
+        <translation>E-mail-Adresse für technische Unterstützung</translation>
77
+    </message>
78
 </context>
79
 <context>
80
     <name>AddTextDialog</name>
81
     <message>
82
+        <location filename="../sfos/qml/AddTextDialog.qml" line="35"/>
83
         <location filename="../desktop/qml/AddTextDialog.qml" line="34"/>
84
-        <location filename="../sfos/qml/AddTextDialog.qml" line="33"/>
85
         <source>Add text to the current note or replace it?</source>
86
-        <translation type="unfinished"></translation>
87
+        <translation>Den Text der aktuellen Notiz hinzufügen oder diese ersetzen?</translation>
88
     </message>
89
     <message>
90
+        <location filename="../sfos/qml/AddTextDialog.qml" line="43"/>
91
         <location filename="../desktop/qml/AddTextDialog.qml" line="42"/>
92
-        <location filename="../sfos/qml/AddTextDialog.qml" line="41"/>
93
         <source>Add</source>
94
-        <translation type="unfinished"></translation>
95
+        <translation>Hinzufügen</translation>
96
     </message>
97
     <message>
98
+        <location filename="../sfos/qml/AddTextDialog.qml" line="51"/>
99
         <location filename="../desktop/qml/AddTextDialog.qml" line="50"/>
100
-        <location filename="../sfos/qml/AddTextDialog.qml" line="49"/>
101
         <source>Replace</source>
102
-        <translation type="unfinished"></translation>
103
+        <translation>Ersetzen</translation>
104
+    </message>
105
+</context>
106
+<context>
107
+    <name>AddonInstallDialog</name>
108
+    <message>
109
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="17"/>
110
+        <source>Install Flatpak add-on</source>
111
+        <translation>Flatpak-Erweiterung installieren</translation>
112
+    </message>
113
+    <message>
114
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="33"/>
115
+        <source>To install Flatpak add-on, which provides GPU acceleration support for %1 graphics card, follow one of the steps below.</source>
116
+        <translation>Führen Sie einen der folgenden Schritte aus, um das Flatpak-Add-on zu installieren, das GPU-Beschleunigung für %1 Grafikkarten unterstützt.</translation>
117
+    </message>
118
+    <message>
119
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="43"/>
120
+        <source>Use the software manager application on your system and install %1, or</source>
121
+        <translation>Benutzen Sie das Programm für die Paketverwaltung auf Ihrem System und installieren Sie %1, oder</translation>
122
+    </message>
123
+    <message>
124
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="52"/>
125
+        <source>Run the following command in the terminal:</source>
126
+        <translation>Geben Sie folgenden Befehl in die Konsole ein:</translation>
127
+    </message>
128
+    <message>
129
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="70"/>
130
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="88"/>
131
+        <source>The add-on enables faster processing when using the following Speech to Text and Text to Speech engines:</source>
132
+        <translation>Die Erweiterung ermöglicht eine schnellere Verarbeitung, wenn folgende Sprache-zu-Text und Text-zu-Sprache Module benutzt werden:</translation>
133
+    </message>
134
+    <message>
135
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="103"/>
136
+        <source>If you&apos;re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
137
+        <translation>Falls Sie an einer schnellen und präzisen Sprache-zu-Text Verarbeitung interessiert sind, ziehen Sie es in Betracht 1% mit Vulkan Geräte-Beschleunigung zu benutzen - welches ohne die Installation einer Erweiterung funktioniert.</translation>
138
+    </message>
139
+    <message>
140
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="112"/>
141
+        <source>Note that installing the add-on requires a significant amount of disk space.</source>
142
+        <translation>Bitte beachten Sie, daß die Erweiterung eine beträchtliche Menge an Speicherplatz benötigt.</translation>
143
     </message>
144
 </context>
145
 <context>
146
     <name>ChangelogPage</name>
147
     <message>
148
-        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
149
         <location filename="../sfos/qml/ChangelogPage.qml" line="28"/>
150
+        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
151
         <source>Changes</source>
152
         <translation>Änderungen</translation>
153
     </message>
154
     <message>
155
-        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
156
-        <location filename="../desktop/qml/ChangelogPage.qml" line="110"/>
157
-        <location filename="../desktop/qml/ChangelogPage.qml" line="210"/>
158
-        <location filename="../desktop/qml/ChangelogPage.qml" line="306"/>
159
-        <location filename="../desktop/qml/ChangelogPage.qml" line="323"/>
160
-        <location filename="../desktop/qml/ChangelogPage.qml" line="377"/>
161
-        <location filename="../desktop/qml/ChangelogPage.qml" line="413"/>
162
-        <location filename="../desktop/qml/ChangelogPage.qml" line="441"/>
163
-        <location filename="../desktop/qml/ChangelogPage.qml" line="456"/>
164
-        <location filename="../desktop/qml/ChangelogPage.qml" line="481"/>
165
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
166
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
167
+        <location filename="../sfos/qml/ChangelogPage.qml" line="98"/>
168
+        <location filename="../sfos/qml/ChangelogPage.qml" line="132"/>
169
+        <location filename="../sfos/qml/ChangelogPage.qml" line="149"/>
170
+        <location filename="../sfos/qml/ChangelogPage.qml" line="196"/>
171
+        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
172
+        <location filename="../desktop/qml/ChangelogPage.qml" line="42"/>
173
+        <location filename="../desktop/qml/ChangelogPage.qml" line="141"/>
174
+        <location filename="../desktop/qml/ChangelogPage.qml" line="157"/>
175
+        <location filename="../desktop/qml/ChangelogPage.qml" line="247"/>
176
+        <location filename="../desktop/qml/ChangelogPage.qml" line="273"/>
177
+        <location filename="../desktop/qml/ChangelogPage.qml" line="345"/>
178
+        <location filename="../desktop/qml/ChangelogPage.qml" line="439"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="539"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="635"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="652"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="742"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="770"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="810"/>
187
         <source>Version %1</source>
188
         <translation>Version %1</translation>
189
     </message>
190
     <message>
191
-        <location filename="../desktop/qml/ChangelogPage.qml" line="79"/>
192
-        <location filename="../desktop/qml/ChangelogPage.qml" line="184"/>
193
-        <location filename="../desktop/qml/ChangelogPage.qml" line="236"/>
194
-        <location filename="../desktop/qml/ChangelogPage.qml" line="327"/>
195
-        <location filename="../desktop/qml/ChangelogPage.qml" line="417"/>
196
-        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
197
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
198
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
199
+        <location filename="../sfos/qml/ChangelogPage.qml" line="123"/>
200
+        <location filename="../sfos/qml/ChangelogPage.qml" line="140"/>
201
dsnote-4.7.1.tar.gz/translations/dsnote-en.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-en.ts Changed
201
 
1
@@ -146,105 +146,123 @@
2
     <message>
3
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
4
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
5
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
6
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
7
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
8
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
9
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
10
-        <location filename="../desktop/qml/ChangelogPage.qml" line="94"/>
11
-        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
12
-        <location filename="../desktop/qml/ChangelogPage.qml" line="191"/>
13
-        <location filename="../desktop/qml/ChangelogPage.qml" line="284"/>
14
-        <location filename="../desktop/qml/ChangelogPage.qml" line="384"/>
15
-        <location filename="../desktop/qml/ChangelogPage.qml" line="480"/>
16
-        <location filename="../desktop/qml/ChangelogPage.qml" line="497"/>
17
-        <location filename="../desktop/qml/ChangelogPage.qml" line="551"/>
18
-        <location filename="../desktop/qml/ChangelogPage.qml" line="587"/>
19
-        <location filename="../desktop/qml/ChangelogPage.qml" line="615"/>
20
-        <location filename="../desktop/qml/ChangelogPage.qml" line="630"/>
21
-        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
22
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
23
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
24
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
25
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
26
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
27
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
28
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
29
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
30
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
31
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
32
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
33
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
34
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
35
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
36
         <source>Version %1</source>
37
         <translation type="unfinished"></translation>
38
     </message>
39
     <message>
40
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
41
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
42
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
43
-        <location filename="../desktop/qml/ChangelogPage.qml" line="63"/>
44
-        <location filename="../desktop/qml/ChangelogPage.qml" line="111"/>
45
-        <location filename="../desktop/qml/ChangelogPage.qml" line="172"/>
46
-        <location filename="../desktop/qml/ChangelogPage.qml" line="253"/>
47
-        <location filename="../desktop/qml/ChangelogPage.qml" line="358"/>
48
-        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
49
-        <location filename="../desktop/qml/ChangelogPage.qml" line="501"/>
50
-        <location filename="../desktop/qml/ChangelogPage.qml" line="591"/>
51
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
52
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
53
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
54
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
55
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
56
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
57
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
58
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
59
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
60
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
61
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
62
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
63
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
64
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
65
         <source>Translator</source>
66
         <translation type="unfinished"></translation>
67
     </message>
68
     <message>
69
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
70
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
71
-        <location filename="../desktop/qml/ChangelogPage.qml" line="58"/>
72
-        <location filename="../desktop/qml/ChangelogPage.qml" line="161"/>
73
-        <location filename="../desktop/qml/ChangelogPage.qml" line="232"/>
74
-        <location filename="../desktop/qml/ChangelogPage.qml" line="335"/>
75
-        <location filename="../desktop/qml/ChangelogPage.qml" line="437"/>
76
-        <location filename="../desktop/qml/ChangelogPage.qml" line="524"/>
77
-        <location filename="../desktop/qml/ChangelogPage.qml" line="565"/>
78
-        <location filename="../desktop/qml/ChangelogPage.qml" line="605"/>
79
-        <location filename="../desktop/qml/ChangelogPage.qml" line="619"/>
80
-        <location filename="../desktop/qml/ChangelogPage.qml" line="639"/>
81
-        <location filename="../desktop/qml/ChangelogPage.qml" line="659"/>
82
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
83
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
84
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
85
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
86
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
87
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
88
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
89
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
90
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
91
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
92
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
93
+        <location filename="../desktop/qml/ChangelogPage.qml" line="691"/>
94
+        <location filename="../desktop/qml/ChangelogPage.qml" line="731"/>
95
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
96
+        <location filename="../desktop/qml/ChangelogPage.qml" line="765"/>
97
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
98
         <source>Text to Speech</source>
99
         <translation type="unfinished"></translation>
100
     </message>
101
     <message>
102
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
103
         <location filename="../desktop/qml/ChangelogPage.qml" line="21"/>
104
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
105
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
106
         <source>General</source>
107
         <translation type="unfinished"></translation>
108
     </message>
109
     <message>
110
-        <location filename="../desktop/qml/ChangelogPage.qml" line="69"/>
111
-        <location filename="../desktop/qml/ChangelogPage.qml" line="106"/>
112
-        <location filename="../desktop/qml/ChangelogPage.qml" line="263"/>
113
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
114
+        <location filename="../desktop/qml/ChangelogPage.qml" line="188"/>
115
+        <location filename="../desktop/qml/ChangelogPage.qml" line="230"/>
116
         <location filename="../desktop/qml/ChangelogPage.qml" line="388"/>
117
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
118
         <source>Accessibility</source>
119
         <translation type="unfinished"></translation>
120
     </message>
121
     <message>
122
-        <location filename="../sfos/qml/ChangelogPage.qml" line="63"/>
123
-        <location filename="../sfos/qml/ChangelogPage.qml" line="117"/>
124
-        <location filename="../desktop/qml/ChangelogPage.qml" line="40"/>
125
-        <location filename="../desktop/qml/ChangelogPage.qml" line="131"/>
126
-        <location filename="../desktop/qml/ChangelogPage.qml" line="223"/>
127
-        <location filename="../desktop/qml/ChangelogPage.qml" line="312"/>
128
-        <location filename="../desktop/qml/ChangelogPage.qml" line="414"/>
129
-        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
130
-        <location filename="../desktop/qml/ChangelogPage.qml" line="505"/>
131
-        <location filename="../desktop/qml/ChangelogPage.qml" line="555"/>
132
-        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
133
-        <location filename="../desktop/qml/ChangelogPage.qml" line="646"/>
134
-        <location filename="../desktop/qml/ChangelogPage.qml" line="663"/>
135
+        <location filename="../sfos/qml/ChangelogPage.qml" line="62"/>
136
+        <location filename="../sfos/qml/ChangelogPage.qml" line="114"/>
137
+        <location filename="../sfos/qml/ChangelogPage.qml" line="168"/>
138
+        <location filename="../desktop/qml/ChangelogPage.qml" line="30"/>
139
+        <location filename="../desktop/qml/ChangelogPage.qml" line="159"/>
140
+        <location filename="../desktop/qml/ChangelogPage.qml" line="255"/>
141
+        <location filename="../desktop/qml/ChangelogPage.qml" line="348"/>
142
+        <location filename="../desktop/qml/ChangelogPage.qml" line="438"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
144
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
145
+        <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="749"/>
148
+        <location filename="../desktop/qml/ChangelogPage.qml" line="772"/>
149
+        <location filename="../desktop/qml/ChangelogPage.qml" line="789"/>
150
         <source>Speech to Text</source>
151
         <translation type="unfinished"></translation>
152
     </message>
153
     <message>
154
-        <location filename="../desktop/qml/ChangelogPage.qml" line="369"/>
155
-        <location filename="../desktop/qml/ChangelogPage.qml" line="462"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="495"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
158
         <source>Other</source>
159
         <translation type="unfinished"></translation>
160
     </message>
161
     <message>
162
-        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
163
-        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
164
-        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="31"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="102"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="124"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="195"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="299"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="399"/>
171
-        <location filename="../desktop/qml/ChangelogPage.qml" line="535"/>
172
-        <location filename="../desktop/qml/ChangelogPage.qml" line="580"/>
173
-        <location filename="../desktop/qml/ChangelogPage.qml" line="599"/>
174
-        <location filename="../desktop/qml/ChangelogPage.qml" line="634"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="58"/>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="87"/>
177
+        <location filename="../sfos/qml/ChangelogPage.qml" line="104"/>
178
+        <location filename="../sfos/qml/ChangelogPage.qml" line="151"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="26"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="143"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="226"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="425"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="525"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="661"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="725"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
190
         <source>User Interface</source>
191
         <translation type="unfinished"></translation>
192
     </message>
193
@@ -252,7 +270,7 @@
194
 <context>
195
     <name>DialogPage</name>
196
     <message>
197
-        <location filename="../desktop/qml/DialogPage.qml" line="82"/>
198
+        <location filename="../desktop/qml/DialogPage.qml" line="81"/>
199
         <source>Close</source>
200
         <translation type="unfinished"></translation>
201
dsnote-4.8.1.tar.gz/translations/dsnote-es.ts Added
201
 
1
@@ -0,0 +1,5643 @@
2
+<?xml version="1.0" encoding="utf-8"?>
3
+<!DOCTYPE TS>
4
+<TS version="2.1" language="es_ES" sourcelanguage="en_US">
5
+<context>
6
+    <name>AboutPage</name>
7
+    <message>
8
+        <location filename="../sfos/qml/AboutPage.qml" line="28"/>
9
+        <source>About %1</source>
10
+        <translation>Acerca de %1</translation>
11
+    </message>
12
+    <message>
13
+        <location filename="../sfos/qml/AboutPage.qml" line="46"/>
14
+        <source>Version %1</source>
15
+        <translation>Versión %1</translation>
16
+    </message>
17
+    <message>
18
+        <location filename="../sfos/qml/AboutPage.qml" line="53"/>
19
+        <source>Project website</source>
20
+        <translation>Sitio web del proyecto</translation>
21
+    </message>
22
+    <message>
23
+        <location filename="../sfos/qml/AboutPage.qml" line="57"/>
24
+        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
25
+        <source>Changes</source>
26
+        <translation>Cambios</translation>
27
+    </message>
28
+    <message>
29
+        <location filename="../sfos/qml/AboutPage.qml" line="63"/>
30
+        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
31
+        <source>Authors</source>
32
+        <translation>Autores</translation>
33
+    </message>
34
+    <message>
35
+        <location filename="../sfos/qml/AboutPage.qml" line="77"/>
36
+        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
37
+        <source>%1 is developed as an open source project under %2.</source>
38
+        <translation>%1 se desarrolla como un proyecto de código abierto bajo %2.</translation>
39
+    </message>
40
+    <message>
41
+        <location filename="../sfos/qml/AboutPage.qml" line="83"/>
42
+        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
43
+        <source>Translators</source>
44
+        <translation>Traductores</translation>
45
+    </message>
46
+    <message>
47
+        <location filename="../sfos/qml/AboutPage.qml" line="92"/>
48
+        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
49
+        <source>Libraries in use</source>
50
+        <translation>Librerías en uso</translation>
51
+    </message>
52
+    <message>
53
+        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
54
+        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
55
+        <translation>Toma de notas, lectura y traducción con Voz a texto, Texto a voz y Traducción automática</translation>
56
+    </message>
57
+    <message>
58
+        <location filename="../desktop/qml/AboutPage.qml" line="17"/>
59
+        <location filename="../desktop/qml/AboutPage.qml" line="63"/>
60
+        <source>About</source>
61
+        <translation>Acerca de</translation>
62
+    </message>
63
+    <message>
64
+        <location filename="../desktop/qml/AboutPage.qml" line="67"/>
65
+        <source>Project website:</source>
66
+        <translation>Sitio web del proyecto:</translation>
67
+    </message>
68
+    <message>
69
+        <location filename="../desktop/qml/AboutPage.qml" line="73"/>
70
+        <source>Report bugs at:</source>
71
+        <translation>Reportar errores en:</translation>
72
+    </message>
73
+    <message>
74
+        <location filename="../desktop/qml/AboutPage.qml" line="79"/>
75
+        <source>Support e-mail:</source>
76
+        <translation>Correo de soporte:</translation>
77
+    </message>
78
+</context>
79
+<context>
80
+    <name>AddTextDialog</name>
81
+    <message>
82
+        <location filename="../sfos/qml/AddTextDialog.qml" line="33"/>
83
+        <location filename="../desktop/qml/AddTextDialog.qml" line="35"/>
84
+        <source>Add text to the current note or replace it?</source>
85
+        <translation>¿Agregar texto a la nota actual o reemplazarlo?</translation>
86
+    </message>
87
+    <message>
88
+        <location filename="../sfos/qml/AddTextDialog.qml" line="41"/>
89
+        <location filename="../desktop/qml/AddTextDialog.qml" line="43"/>
90
+        <source>Add</source>
91
+        <translation>Agregar</translation>
92
+    </message>
93
+    <message>
94
+        <location filename="../sfos/qml/AddTextDialog.qml" line="49"/>
95
+        <location filename="../desktop/qml/AddTextDialog.qml" line="51"/>
96
+        <source>Replace</source>
97
+        <translation>Reemplazar</translation>
98
+    </message>
99
+</context>
100
+<context>
101
+    <name>AddonInstallDialog</name>
102
+    <message>
103
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="17"/>
104
+        <source>Install Flatpak add-on</source>
105
+        <translation>Instalar complemento Flatpak</translation>
106
+    </message>
107
+    <message>
108
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="33"/>
109
+        <source>To install Flatpak add-on, which provides GPU acceleration support for %1 graphics card, follow one of the steps below.</source>
110
+        <translation>Para instalar el complemento Flatpak, que proporciona soporte de aceleración GPU para la tarjeta gráfica %1, sigue uno de los pasos a continuación.</translation>
111
+    </message>
112
+    <message>
113
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="43"/>
114
+        <source>Use the software manager application on your system and install %1, or</source>
115
+        <translation>Usa la aplicación de gestión de software en tu sistema e instala %1, o</translation>
116
+    </message>
117
+    <message>
118
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="52"/>
119
+        <source>Run the following command in the terminal:</source>
120
+        <translation>Ejecuta el siguiente comando en la terminal:</translation>
121
+    </message>
122
+    <message>
123
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="70"/>
124
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="85"/>
125
+        <source>The add-on enables faster processing when using the following Speech to Text and Text to Speech engines:</source>
126
+        <translation>El complemento permite un procesamiento más rápido al usar los siguientes motores de reconocimiento y síntesis de voz:</translation>
127
+    </message>
128
+    <message>
129
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="97"/>
130
+        <source>If you&apos;re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
131
+        <translation>Si estás interesado en un procesamiento de reconocimiento de voz rápido y preciso, considera usar %1 con aceleración por hardware Vulkan, que funciona sin necesidad de instalar un complemento.</translation>
132
+    </message>
133
+    <message>
134
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="106"/>
135
+        <source>Note that installing the add-on requires a significant amount of disk space.</source>
136
+        <translation>Ten en cuenta que instalar el complemento requiere una cantidad significativa de espacio en disco.</translation>
137
+    </message>
138
+</context>
139
+<context>
140
+    <name>ChangelogPage</name>
141
+    <message>
142
+        <location filename="../sfos/qml/ChangelogPage.qml" line="28"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
144
+        <source>Changes</source>
145
+        <translation>Cambios</translation>
146
+    </message>
147
+    <message>
148
+        <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
149
+        <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
150
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
151
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
152
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
153
+        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
154
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
155
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
158
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
159
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
160
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
161
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
162
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
163
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
164
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
165
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
166
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
167
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
168
+        <source>Version %1</source>
169
+        <translation>Versión %1</translation>
170
+    </message>
171
+    <message>
172
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
173
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
174
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
176
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
177
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
178
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
186
+        <source>Translator</source>
187
+        <translation>Traductor</translation>
188
+    </message>
189
+    <message>
190
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
191
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
192
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
193
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
194
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
195
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
196
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
197
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
198
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
199
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
200
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
201
dsnote-4.7.1.tar.gz/translations/dsnote-fr.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-fr.ts Changed
201
 
1
@@ -16,13 +16,13 @@
2
     <message>
3
         <location filename="../sfos/qml/AboutPage.qml" line="53"/>
4
         <source>Project website</source>
5
-        <translation>Site du projet</translation>
6
+        <translation>Site Web du projet&#xa0;:</translation>
7
     </message>
8
     <message>
9
         <location filename="../sfos/qml/AboutPage.qml" line="57"/>
10
         <location filename="../desktop/qml/AboutPage.qml" line="58"/>
11
         <source>Changes</source>
12
-        <translation>Modifications</translation>
13
+        <translation>Changements</translation>
14
     </message>
15
     <message>
16
         <location filename="../sfos/qml/AboutPage.qml" line="63"/>
17
@@ -51,7 +51,7 @@
18
     <message>
19
         <location filename="../desktop/qml/AboutPage.qml" line="51"/>
20
         <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
21
-        <translation>Prise de notes, lecture et traduction avec reconnaissance vocale, synthèse vocale et traduction automatique</translation>
22
+        <translation>Prise de notes, lecture et traduction avec transcription automatique de la parole, synthèse vocale et traduction automatique</translation>
23
     </message>
24
     <message>
25
         <location filename="../desktop/qml/AboutPage.qml" line="17"/>
26
@@ -62,17 +62,17 @@
27
     <message>
28
         <location filename="../desktop/qml/AboutPage.qml" line="67"/>
29
         <source>Project website:</source>
30
-        <translation>Site web du projet&#x202f;:</translation>
31
+        <translation>Site Web du projet&#xa0;:</translation>
32
     </message>
33
     <message>
34
         <location filename="../desktop/qml/AboutPage.qml" line="73"/>
35
         <source>Report bugs at:</source>
36
-        <translation>Signalez les bogues à l’adresse suivante&#x202f;:</translation>
37
+        <translation>Signalez les bogues à l’adresse suivante&#xa0;:</translation>
38
     </message>
39
     <message>
40
         <location filename="../desktop/qml/AboutPage.qml" line="79"/>
41
         <source>Support e-mail:</source>
42
-        <translation>Courriel d&apos;assistance&#x202f;:</translation>
43
+        <translation>Courriel d’assistance&#xa0;:</translation>
44
     </message>
45
 </context>
46
 <context>
47
@@ -81,19 +81,19 @@
48
         <location filename="../sfos/qml/AddTextDialog.qml" line="33"/>
49
         <location filename="../desktop/qml/AddTextDialog.qml" line="34"/>
50
         <source>Add text to the current note or replace it?</source>
51
-        <translation type="unfinished"></translation>
52
+        <translation>Ajouter le texte à la note courante ou la remplacer&#xa0;?</translation>
53
     </message>
54
     <message>
55
         <location filename="../sfos/qml/AddTextDialog.qml" line="41"/>
56
         <location filename="../desktop/qml/AddTextDialog.qml" line="42"/>
57
         <source>Add</source>
58
-        <translation type="unfinished"></translation>
59
+        <translation>Ajouter</translation>
60
     </message>
61
     <message>
62
         <location filename="../sfos/qml/AddTextDialog.qml" line="49"/>
63
         <location filename="../desktop/qml/AddTextDialog.qml" line="50"/>
64
         <source>Replace</source>
65
-        <translation type="unfinished"></translation>
66
+        <translation>Remplacer</translation>
67
     </message>
68
 </context>
69
 <context>
70
@@ -101,38 +101,38 @@
71
     <message>
72
         <location filename="../desktop/qml/AddonInstallDialog.qml" line="17"/>
73
         <source>Install Flatpak add-on</source>
74
-        <translation type="unfinished"></translation>
75
+        <translation>Installer l’extension Flatpak</translation>
76
     </message>
77
     <message>
78
         <location filename="../desktop/qml/AddonInstallDialog.qml" line="33"/>
79
         <source>To install Flatpak add-on, which provides GPU acceleration support for %1 graphics card, follow one of the steps below.</source>
80
-        <translation type="unfinished"></translation>
81
+        <translation>Pour installer l’extension Flatpak, qui permet la prise en charge de l’accélération graphique avec la carte %1, effectuez l’une des actions ci-dessous.</translation>
82
     </message>
83
     <message>
84
         <location filename="../desktop/qml/AddonInstallDialog.qml" line="43"/>
85
         <source>Use the software manager application on your system and install %1, or</source>
86
-        <translation type="unfinished"></translation>
87
+        <translation>Utilisez le gestionnaire de logiciels de votre système pour installer %1.</translation>
88
     </message>
89
     <message>
90
         <location filename="../desktop/qml/AddonInstallDialog.qml" line="52"/>
91
         <source>Run the following command in the terminal:</source>
92
-        <translation type="unfinished"></translation>
93
+        <translation>Exécutez la commande qui suit dans un terminal&#xa0;:</translation>
94
     </message>
95
     <message>
96
         <location filename="../desktop/qml/AddonInstallDialog.qml" line="70"/>
97
         <location filename="../desktop/qml/AddonInstallDialog.qml" line="85"/>
98
         <source>The add-on enables faster processing when using the following Speech to Text and Text to Speech engines:</source>
99
-        <translation type="unfinished"></translation>
100
+        <translation>L’extension permet un traitement plus rapide en utilisant les moteurs de synthèse vocale et de transcription automatique de la parole suivants&#xa0;:</translation>
101
     </message>
102
     <message>
103
         <location filename="../desktop/qml/AddonInstallDialog.qml" line="97"/>
104
         <source>If you&apos;re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
105
-        <translation type="unfinished"></translation>
106
+        <translation>Si vous désirez un traitement rapide et juste de la transcription automatique de la parole, envisagez d’utiliser %1 avec l’accélération matérielle Vulkan, qui fonctionne sans devoir installer une extension.</translation>
107
     </message>
108
     <message>
109
         <location filename="../desktop/qml/AddonInstallDialog.qml" line="106"/>
110
         <source>Note that installing the add-on requires a significant amount of disk space.</source>
111
-        <translation type="unfinished"></translation>
112
+        <translation>Notez que l’installation de l’extension nécessite un espace disque important.</translation>
113
     </message>
114
 </context>
115
 <context>
116
@@ -141,124 +141,138 @@
117
         <location filename="../sfos/qml/ChangelogPage.qml" line="28"/>
118
         <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
119
         <source>Changes</source>
120
-        <translation>Modifications</translation>
121
+        <translation>Changements</translation>
122
     </message>
123
     <message>
124
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
125
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
126
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
127
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
128
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
129
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
130
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
131
-        <location filename="../desktop/qml/ChangelogPage.qml" line="94"/>
132
-        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
133
-        <location filename="../desktop/qml/ChangelogPage.qml" line="191"/>
134
-        <location filename="../desktop/qml/ChangelogPage.qml" line="284"/>
135
-        <location filename="../desktop/qml/ChangelogPage.qml" line="384"/>
136
-        <location filename="../desktop/qml/ChangelogPage.qml" line="480"/>
137
-        <location filename="../desktop/qml/ChangelogPage.qml" line="497"/>
138
-        <location filename="../desktop/qml/ChangelogPage.qml" line="551"/>
139
-        <location filename="../desktop/qml/ChangelogPage.qml" line="587"/>
140
-        <location filename="../desktop/qml/ChangelogPage.qml" line="615"/>
141
-        <location filename="../desktop/qml/ChangelogPage.qml" line="630"/>
142
-        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
144
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
145
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
148
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
149
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
150
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
151
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
152
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
153
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
154
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
155
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
157
         <source>Version %1</source>
158
         <translation>Version %1</translation>
159
     </message>
160
     <message>
161
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
162
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
163
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
164
-        <location filename="../desktop/qml/ChangelogPage.qml" line="63"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="111"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="172"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="253"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="358"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="501"/>
171
-        <location filename="../desktop/qml/ChangelogPage.qml" line="591"/>
172
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
173
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
174
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
176
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
177
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
178
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
186
         <source>Translator</source>
187
         <translation>Traducteurs</translation>
188
     </message>
189
     <message>
190
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
191
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
192
-        <location filename="../desktop/qml/ChangelogPage.qml" line="58"/>
193
-        <location filename="../desktop/qml/ChangelogPage.qml" line="161"/>
194
-        <location filename="../desktop/qml/ChangelogPage.qml" line="232"/>
195
-        <location filename="../desktop/qml/ChangelogPage.qml" line="335"/>
196
-        <location filename="../desktop/qml/ChangelogPage.qml" line="437"/>
197
-        <location filename="../desktop/qml/ChangelogPage.qml" line="524"/>
198
-        <location filename="../desktop/qml/ChangelogPage.qml" line="565"/>
199
-        <location filename="../desktop/qml/ChangelogPage.qml" line="605"/>
200
-        <location filename="../desktop/qml/ChangelogPage.qml" line="619"/>
201
dsnote-4.8.1.tar.gz/translations/dsnote-fr_CA.ts Added
201
 
1
@@ -0,0 +1,5785 @@
2
+<?xml version="1.0" encoding="utf-8"?>
3
+<!DOCTYPE TS>
4
+<TS version="2.1" language="fr_CA" sourcelanguage="en_US">
5
+<context>
6
+    <name>AboutPage</name>
7
+    <message>
8
+        <location filename="../sfos/qml/AboutPage.qml" line="28"/>
9
+        <source>About %1</source>
10
+        <translation>À propos de %1</translation>
11
+    </message>
12
+    <message>
13
+        <location filename="../sfos/qml/AboutPage.qml" line="46"/>
14
+        <source>Version %1</source>
15
+        <translation>Version %1</translation>
16
+    </message>
17
+    <message>
18
+        <location filename="../sfos/qml/AboutPage.qml" line="53"/>
19
+        <source>Project website</source>
20
+        <translation>Site Web du projet&#xa0;:</translation>
21
+    </message>
22
+    <message>
23
+        <location filename="../sfos/qml/AboutPage.qml" line="57"/>
24
+        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
25
+        <source>Changes</source>
26
+        <translation>Changements</translation>
27
+    </message>
28
+    <message>
29
+        <location filename="../sfos/qml/AboutPage.qml" line="63"/>
30
+        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
31
+        <source>Authors</source>
32
+        <translation>Auteurs</translation>
33
+    </message>
34
+    <message>
35
+        <location filename="../sfos/qml/AboutPage.qml" line="77"/>
36
+        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
37
+        <source>%1 is developed as an open source project under %2.</source>
38
+        <translation>%1 est un logiciel libre sous licence %2.</translation>
39
+    </message>
40
+    <message>
41
+        <location filename="../sfos/qml/AboutPage.qml" line="83"/>
42
+        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
43
+        <source>Translators</source>
44
+        <translation>Traducteurs</translation>
45
+    </message>
46
+    <message>
47
+        <location filename="../sfos/qml/AboutPage.qml" line="92"/>
48
+        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
49
+        <source>Libraries in use</source>
50
+        <translation>Bibliothèques utilisées</translation>
51
+    </message>
52
+    <message>
53
+        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
54
+        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
55
+        <translation>Prise de notes, lecture et traduction avec transcription automatique de la parole, synthèse vocale et traduction automatique</translation>
56
+    </message>
57
+    <message>
58
+        <location filename="../desktop/qml/AboutPage.qml" line="17"/>
59
+        <location filename="../desktop/qml/AboutPage.qml" line="63"/>
60
+        <source>About</source>
61
+        <translation>À propos</translation>
62
+    </message>
63
+    <message>
64
+        <location filename="../desktop/qml/AboutPage.qml" line="67"/>
65
+        <source>Project website:</source>
66
+        <translation>Site Web du projet&#xa0;:</translation>
67
+    </message>
68
+    <message>
69
+        <location filename="../desktop/qml/AboutPage.qml" line="73"/>
70
+        <source>Report bugs at:</source>
71
+        <translation>Signalez les bogues à l’adresse suivante&#xa0;:</translation>
72
+    </message>
73
+    <message>
74
+        <location filename="../desktop/qml/AboutPage.qml" line="79"/>
75
+        <source>Support e-mail:</source>
76
+        <translation>Courriel d’assistance&#xa0;:</translation>
77
+    </message>
78
+</context>
79
+<context>
80
+    <name>AddTextDialog</name>
81
+    <message>
82
+        <location filename="../sfos/qml/AddTextDialog.qml" line="33"/>
83
+        <location filename="../desktop/qml/AddTextDialog.qml" line="34"/>
84
+        <source>Add text to the current note or replace it?</source>
85
+        <translation>Ajouter le texte à la note actuelle ou la remplacer?</translation>
86
+    </message>
87
+    <message>
88
+        <location filename="../sfos/qml/AddTextDialog.qml" line="41"/>
89
+        <location filename="../desktop/qml/AddTextDialog.qml" line="42"/>
90
+        <source>Add</source>
91
+        <translation>Ajouter</translation>
92
+    </message>
93
+    <message>
94
+        <location filename="../sfos/qml/AddTextDialog.qml" line="49"/>
95
+        <location filename="../desktop/qml/AddTextDialog.qml" line="50"/>
96
+        <source>Replace</source>
97
+        <translation>Remplacer</translation>
98
+    </message>
99
+</context>
100
+<context>
101
+    <name>AddonInstallDialog</name>
102
+    <message>
103
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="17"/>
104
+        <source>Install Flatpak add-on</source>
105
+        <translation>Installer l’extension Flatpak</translation>
106
+    </message>
107
+    <message>
108
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="33"/>
109
+        <source>To install Flatpak add-on, which provides GPU acceleration support for %1 graphics card, follow one of the steps below.</source>
110
+        <translation>Pour installer l’extension Flatpak, qui permet la prise en charge de l’accélération graphique avec la carte %1, effectuez l’une des actions ci-dessous.</translation>
111
+    </message>
112
+    <message>
113
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="43"/>
114
+        <source>Use the software manager application on your system and install %1, or</source>
115
+        <translation>Utilisez le gestionnaire de logiciels de votre système pour installer %1.</translation>
116
+    </message>
117
+    <message>
118
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="52"/>
119
+        <source>Run the following command in the terminal:</source>
120
+        <translation>Exécutez la commande qui suit dans un terminal&#xa0;:</translation>
121
+    </message>
122
+    <message>
123
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="70"/>
124
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="85"/>
125
+        <source>The add-on enables faster processing when using the following Speech to Text and Text to Speech engines:</source>
126
+        <translation>L’extension permet un traitement plus rapide en utilisant les moteurs de synthèse vocale et de transcription automatique de la parole suivants&#xa0;:</translation>
127
+    </message>
128
+    <message>
129
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="97"/>
130
+        <source>If you&apos;re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
131
+        <translation>Si vous désirez un traitement rapide et juste de la transcription automatique de la parole, envisagez d’utiliser %1 avec l’accélération matérielle Vulkan, qui fonctionne sans devoir installer une extension.</translation>
132
+    </message>
133
+    <message>
134
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="106"/>
135
+        <source>Note that installing the add-on requires a significant amount of disk space.</source>
136
+        <translation>Notez que l’installation de l’extension nécessite un espace disque important.</translation>
137
+    </message>
138
+</context>
139
+<context>
140
+    <name>ChangelogPage</name>
141
+    <message>
142
+        <location filename="../sfos/qml/ChangelogPage.qml" line="28"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
144
+        <source>Changes</source>
145
+        <translation>Changements</translation>
146
+    </message>
147
+    <message>
148
+        <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
149
+        <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
150
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
151
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
152
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
153
+        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
154
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
155
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
158
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
159
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
160
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
161
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
162
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
163
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
164
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
165
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
166
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
167
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
168
+        <source>Version %1</source>
169
+        <translation>Version %1</translation>
170
+    </message>
171
+    <message>
172
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
173
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
174
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
176
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
177
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
178
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
186
+        <source>Translator</source>
187
+        <translation>Traducteurs</translation>
188
+    </message>
189
+    <message>
190
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
191
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
192
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
193
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
194
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
195
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
196
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
197
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
198
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
199
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
200
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
201
dsnote-4.7.1.tar.gz/translations/dsnote-it.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-it.ts Changed
201
 
1
@@ -146,105 +146,123 @@
2
     <message>
3
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
4
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
5
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
6
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
7
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
8
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
9
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
10
-        <location filename="../desktop/qml/ChangelogPage.qml" line="102"/>
11
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
12
         <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
13
-        <location filename="../desktop/qml/ChangelogPage.qml" line="199"/>
14
-        <location filename="../desktop/qml/ChangelogPage.qml" line="292"/>
15
-        <location filename="../desktop/qml/ChangelogPage.qml" line="392"/>
16
-        <location filename="../desktop/qml/ChangelogPage.qml" line="488"/>
17
-        <location filename="../desktop/qml/ChangelogPage.qml" line="505"/>
18
-        <location filename="../desktop/qml/ChangelogPage.qml" line="559"/>
19
-        <location filename="../desktop/qml/ChangelogPage.qml" line="595"/>
20
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
21
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
22
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
23
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
24
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
25
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
26
         <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
27
-        <location filename="../desktop/qml/ChangelogPage.qml" line="638"/>
28
-        <location filename="../desktop/qml/ChangelogPage.qml" line="663"/>
29
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
30
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
31
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
32
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
33
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
34
         <source>Version %1</source>
35
         <translation>Versione %1</translation>
36
     </message>
37
     <message>
38
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
39
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
40
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
41
-        <location filename="../desktop/qml/ChangelogPage.qml" line="71"/>
42
-        <location filename="../desktop/qml/ChangelogPage.qml" line="119"/>
43
-        <location filename="../desktop/qml/ChangelogPage.qml" line="180"/>
44
-        <location filename="../desktop/qml/ChangelogPage.qml" line="261"/>
45
-        <location filename="../desktop/qml/ChangelogPage.qml" line="366"/>
46
-        <location filename="../desktop/qml/ChangelogPage.qml" line="418"/>
47
-        <location filename="../desktop/qml/ChangelogPage.qml" line="509"/>
48
-        <location filename="../desktop/qml/ChangelogPage.qml" line="599"/>
49
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
50
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
51
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
52
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
53
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
54
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
55
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
56
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
57
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
58
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
59
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
60
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
61
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
62
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
63
         <source>Translator</source>
64
         <translation>Traduttore</translation>
65
     </message>
66
     <message>
67
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
68
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
69
-        <location filename="../desktop/qml/ChangelogPage.qml" line="66"/>
70
-        <location filename="../desktop/qml/ChangelogPage.qml" line="169"/>
71
-        <location filename="../desktop/qml/ChangelogPage.qml" line="240"/>
72
-        <location filename="../desktop/qml/ChangelogPage.qml" line="343"/>
73
-        <location filename="../desktop/qml/ChangelogPage.qml" line="445"/>
74
-        <location filename="../desktop/qml/ChangelogPage.qml" line="532"/>
75
-        <location filename="../desktop/qml/ChangelogPage.qml" line="573"/>
76
-        <location filename="../desktop/qml/ChangelogPage.qml" line="613"/>
77
-        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
78
-        <location filename="../desktop/qml/ChangelogPage.qml" line="647"/>
79
-        <location filename="../desktop/qml/ChangelogPage.qml" line="667"/>
80
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
81
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
82
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
83
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
84
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
85
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
86
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
87
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
88
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
89
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
90
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
91
+        <location filename="../desktop/qml/ChangelogPage.qml" line="691"/>
92
+        <location filename="../desktop/qml/ChangelogPage.qml" line="731"/>
93
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
94
+        <location filename="../desktop/qml/ChangelogPage.qml" line="765"/>
95
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
96
         <source>Text to Speech</source>
97
         <translation>Text to Speech</translation>
98
     </message>
99
     <message>
100
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
101
         <location filename="../desktop/qml/ChangelogPage.qml" line="21"/>
102
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
103
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
104
         <source>General</source>
105
         <translation>Generale</translation>
106
     </message>
107
     <message>
108
-        <location filename="../desktop/qml/ChangelogPage.qml" line="77"/>
109
-        <location filename="../desktop/qml/ChangelogPage.qml" line="114"/>
110
-        <location filename="../desktop/qml/ChangelogPage.qml" line="271"/>
111
-        <location filename="../desktop/qml/ChangelogPage.qml" line="396"/>
112
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
113
+        <location filename="../desktop/qml/ChangelogPage.qml" line="188"/>
114
+        <location filename="../desktop/qml/ChangelogPage.qml" line="230"/>
115
+        <location filename="../desktop/qml/ChangelogPage.qml" line="388"/>
116
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
117
         <source>Accessibility</source>
118
         <translation>Accessibilità</translation>
119
     </message>
120
     <message>
121
-        <location filename="../sfos/qml/ChangelogPage.qml" line="63"/>
122
-        <location filename="../sfos/qml/ChangelogPage.qml" line="117"/>
123
-        <location filename="../desktop/qml/ChangelogPage.qml" line="48"/>
124
-        <location filename="../desktop/qml/ChangelogPage.qml" line="139"/>
125
-        <location filename="../desktop/qml/ChangelogPage.qml" line="231"/>
126
-        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
127
-        <location filename="../desktop/qml/ChangelogPage.qml" line="422"/>
128
-        <location filename="../desktop/qml/ChangelogPage.qml" line="492"/>
129
-        <location filename="../desktop/qml/ChangelogPage.qml" line="513"/>
130
-        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
131
+        <location filename="../sfos/qml/ChangelogPage.qml" line="62"/>
132
+        <location filename="../sfos/qml/ChangelogPage.qml" line="114"/>
133
+        <location filename="../sfos/qml/ChangelogPage.qml" line="168"/>
134
+        <location filename="../desktop/qml/ChangelogPage.qml" line="30"/>
135
+        <location filename="../desktop/qml/ChangelogPage.qml" line="159"/>
136
+        <location filename="../desktop/qml/ChangelogPage.qml" line="255"/>
137
+        <location filename="../desktop/qml/ChangelogPage.qml" line="348"/>
138
+        <location filename="../desktop/qml/ChangelogPage.qml" line="438"/>
139
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
140
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
141
         <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
142
-        <location filename="../desktop/qml/ChangelogPage.qml" line="654"/>
143
-        <location filename="../desktop/qml/ChangelogPage.qml" line="671"/>
144
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
145
+        <location filename="../desktop/qml/ChangelogPage.qml" line="749"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="772"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="789"/>
148
         <source>Speech to Text</source>
149
         <translation>Speech to Text</translation>
150
     </message>
151
     <message>
152
-        <location filename="../desktop/qml/ChangelogPage.qml" line="377"/>
153
-        <location filename="../desktop/qml/ChangelogPage.qml" line="470"/>
154
+        <location filename="../desktop/qml/ChangelogPage.qml" line="495"/>
155
+        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
156
         <source>Other</source>
157
         <translation>Altro</translation>
158
     </message>
159
     <message>
160
-        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
161
-        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
162
-        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
163
-        <location filename="../desktop/qml/ChangelogPage.qml" line="32"/>
164
-        <location filename="../desktop/qml/ChangelogPage.qml" line="110"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="203"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="307"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="407"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="543"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
171
-        <location filename="../desktop/qml/ChangelogPage.qml" line="607"/>
172
-        <location filename="../desktop/qml/ChangelogPage.qml" line="642"/>
173
+        <location filename="../sfos/qml/ChangelogPage.qml" line="58"/>
174
+        <location filename="../sfos/qml/ChangelogPage.qml" line="87"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="104"/>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="151"/>
177
+        <location filename="../desktop/qml/ChangelogPage.qml" line="26"/>
178
+        <location filename="../desktop/qml/ChangelogPage.qml" line="143"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="226"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="425"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="525"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="661"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="725"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
188
         <source>User Interface</source>
189
         <translation>Interfaccia utente</translation>
190
     </message>
191
@@ -252,7 +270,7 @@
192
 <context>
193
     <name>DialogPage</name>
194
     <message>
195
-        <location filename="../desktop/qml/DialogPage.qml" line="82"/>
196
+        <location filename="../desktop/qml/DialogPage.qml" line="81"/>
197
         <source>Close</source>
198
         <translation>Chiudi</translation>
199
     </message>
200
@@ -699,8 +717,8 @@
201
dsnote-4.7.1.tar.gz/translations/dsnote-nl.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-nl.ts Changed
201
 
1
@@ -146,105 +146,123 @@
2
     <message>
3
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
4
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
5
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
6
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
7
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
8
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
9
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
10
-        <location filename="../desktop/qml/ChangelogPage.qml" line="94"/>
11
-        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
12
-        <location filename="../desktop/qml/ChangelogPage.qml" line="191"/>
13
-        <location filename="../desktop/qml/ChangelogPage.qml" line="284"/>
14
-        <location filename="../desktop/qml/ChangelogPage.qml" line="384"/>
15
-        <location filename="../desktop/qml/ChangelogPage.qml" line="480"/>
16
-        <location filename="../desktop/qml/ChangelogPage.qml" line="497"/>
17
-        <location filename="../desktop/qml/ChangelogPage.qml" line="551"/>
18
-        <location filename="../desktop/qml/ChangelogPage.qml" line="587"/>
19
-        <location filename="../desktop/qml/ChangelogPage.qml" line="615"/>
20
-        <location filename="../desktop/qml/ChangelogPage.qml" line="630"/>
21
-        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
22
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
23
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
24
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
25
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
26
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
27
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
28
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
29
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
30
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
31
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
32
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
33
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
34
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
35
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
36
         <source>Version %1</source>
37
         <translation>Versie %1</translation>
38
     </message>
39
     <message>
40
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
41
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
42
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
43
-        <location filename="../desktop/qml/ChangelogPage.qml" line="63"/>
44
-        <location filename="../desktop/qml/ChangelogPage.qml" line="111"/>
45
-        <location filename="../desktop/qml/ChangelogPage.qml" line="172"/>
46
-        <location filename="../desktop/qml/ChangelogPage.qml" line="253"/>
47
-        <location filename="../desktop/qml/ChangelogPage.qml" line="358"/>
48
-        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
49
-        <location filename="../desktop/qml/ChangelogPage.qml" line="501"/>
50
-        <location filename="../desktop/qml/ChangelogPage.qml" line="591"/>
51
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
52
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
53
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
54
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
55
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
56
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
57
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
58
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
59
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
60
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
61
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
62
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
63
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
64
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
65
         <source>Translator</source>
66
         <translation>Vertaling</translation>
67
     </message>
68
     <message>
69
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
70
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
71
-        <location filename="../desktop/qml/ChangelogPage.qml" line="58"/>
72
-        <location filename="../desktop/qml/ChangelogPage.qml" line="161"/>
73
-        <location filename="../desktop/qml/ChangelogPage.qml" line="232"/>
74
-        <location filename="../desktop/qml/ChangelogPage.qml" line="335"/>
75
-        <location filename="../desktop/qml/ChangelogPage.qml" line="437"/>
76
-        <location filename="../desktop/qml/ChangelogPage.qml" line="524"/>
77
-        <location filename="../desktop/qml/ChangelogPage.qml" line="565"/>
78
-        <location filename="../desktop/qml/ChangelogPage.qml" line="605"/>
79
-        <location filename="../desktop/qml/ChangelogPage.qml" line="619"/>
80
-        <location filename="../desktop/qml/ChangelogPage.qml" line="639"/>
81
-        <location filename="../desktop/qml/ChangelogPage.qml" line="659"/>
82
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
83
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
84
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
85
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
86
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
87
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
88
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
89
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
90
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
91
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
92
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
93
+        <location filename="../desktop/qml/ChangelogPage.qml" line="691"/>
94
+        <location filename="../desktop/qml/ChangelogPage.qml" line="731"/>
95
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
96
+        <location filename="../desktop/qml/ChangelogPage.qml" line="765"/>
97
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
98
         <source>Text to Speech</source>
99
         <translation>Tekst-naar-spraak</translation>
100
     </message>
101
     <message>
102
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
103
         <location filename="../desktop/qml/ChangelogPage.qml" line="21"/>
104
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
105
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
106
         <source>General</source>
107
         <translation type="unfinished"></translation>
108
     </message>
109
     <message>
110
-        <location filename="../desktop/qml/ChangelogPage.qml" line="69"/>
111
-        <location filename="../desktop/qml/ChangelogPage.qml" line="106"/>
112
-        <location filename="../desktop/qml/ChangelogPage.qml" line="263"/>
113
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
114
+        <location filename="../desktop/qml/ChangelogPage.qml" line="188"/>
115
+        <location filename="../desktop/qml/ChangelogPage.qml" line="230"/>
116
         <location filename="../desktop/qml/ChangelogPage.qml" line="388"/>
117
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
118
         <source>Accessibility</source>
119
         <translation>Toegankelijkheid</translation>
120
     </message>
121
     <message>
122
-        <location filename="../sfos/qml/ChangelogPage.qml" line="63"/>
123
-        <location filename="../sfos/qml/ChangelogPage.qml" line="117"/>
124
-        <location filename="../desktop/qml/ChangelogPage.qml" line="40"/>
125
-        <location filename="../desktop/qml/ChangelogPage.qml" line="131"/>
126
-        <location filename="../desktop/qml/ChangelogPage.qml" line="223"/>
127
-        <location filename="../desktop/qml/ChangelogPage.qml" line="312"/>
128
-        <location filename="../desktop/qml/ChangelogPage.qml" line="414"/>
129
-        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
130
-        <location filename="../desktop/qml/ChangelogPage.qml" line="505"/>
131
-        <location filename="../desktop/qml/ChangelogPage.qml" line="555"/>
132
-        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
133
-        <location filename="../desktop/qml/ChangelogPage.qml" line="646"/>
134
-        <location filename="../desktop/qml/ChangelogPage.qml" line="663"/>
135
+        <location filename="../sfos/qml/ChangelogPage.qml" line="62"/>
136
+        <location filename="../sfos/qml/ChangelogPage.qml" line="114"/>
137
+        <location filename="../sfos/qml/ChangelogPage.qml" line="168"/>
138
+        <location filename="../desktop/qml/ChangelogPage.qml" line="30"/>
139
+        <location filename="../desktop/qml/ChangelogPage.qml" line="159"/>
140
+        <location filename="../desktop/qml/ChangelogPage.qml" line="255"/>
141
+        <location filename="../desktop/qml/ChangelogPage.qml" line="348"/>
142
+        <location filename="../desktop/qml/ChangelogPage.qml" line="438"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
144
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
145
+        <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="749"/>
148
+        <location filename="../desktop/qml/ChangelogPage.qml" line="772"/>
149
+        <location filename="../desktop/qml/ChangelogPage.qml" line="789"/>
150
         <source>Speech to Text</source>
151
         <translation>Spraak-naar-tekst</translation>
152
     </message>
153
     <message>
154
-        <location filename="../desktop/qml/ChangelogPage.qml" line="369"/>
155
-        <location filename="../desktop/qml/ChangelogPage.qml" line="462"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="495"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
158
         <source>Other</source>
159
         <translation>Overig</translation>
160
     </message>
161
     <message>
162
-        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
163
-        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
164
-        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="31"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="102"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="124"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="195"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="299"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="399"/>
171
-        <location filename="../desktop/qml/ChangelogPage.qml" line="535"/>
172
-        <location filename="../desktop/qml/ChangelogPage.qml" line="580"/>
173
-        <location filename="../desktop/qml/ChangelogPage.qml" line="599"/>
174
-        <location filename="../desktop/qml/ChangelogPage.qml" line="634"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="58"/>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="87"/>
177
+        <location filename="../sfos/qml/ChangelogPage.qml" line="104"/>
178
+        <location filename="../sfos/qml/ChangelogPage.qml" line="151"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="26"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="143"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="226"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="425"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="525"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="661"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="725"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
190
         <source>User Interface</source>
191
         <translation>Vormgeving</translation>
192
     </message>
193
@@ -252,7 +270,7 @@
194
 <context>
195
     <name>DialogPage</name>
196
     <message>
197
-        <location filename="../desktop/qml/DialogPage.qml" line="82"/>
198
+        <location filename="../desktop/qml/DialogPage.qml" line="81"/>
199
         <source>Close</source>
200
         <translation>Sluiten</translation>
201
dsnote-4.7.1.tar.gz/translations/dsnote-no.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-no.ts Changed
201
 
1
@@ -146,105 +146,123 @@
2
     <message>
3
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
4
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
5
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
6
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
7
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
8
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
9
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
10
-        <location filename="../desktop/qml/ChangelogPage.qml" line="94"/>
11
-        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
12
-        <location filename="../desktop/qml/ChangelogPage.qml" line="191"/>
13
-        <location filename="../desktop/qml/ChangelogPage.qml" line="284"/>
14
-        <location filename="../desktop/qml/ChangelogPage.qml" line="384"/>
15
-        <location filename="../desktop/qml/ChangelogPage.qml" line="480"/>
16
-        <location filename="../desktop/qml/ChangelogPage.qml" line="497"/>
17
-        <location filename="../desktop/qml/ChangelogPage.qml" line="551"/>
18
-        <location filename="../desktop/qml/ChangelogPage.qml" line="587"/>
19
-        <location filename="../desktop/qml/ChangelogPage.qml" line="615"/>
20
-        <location filename="../desktop/qml/ChangelogPage.qml" line="630"/>
21
-        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
22
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
23
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
24
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
25
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
26
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
27
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
28
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
29
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
30
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
31
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
32
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
33
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
34
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
35
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
36
         <source>Version %1</source>
37
         <translation>Versjon %1</translation>
38
     </message>
39
     <message>
40
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
41
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
42
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
43
-        <location filename="../desktop/qml/ChangelogPage.qml" line="63"/>
44
-        <location filename="../desktop/qml/ChangelogPage.qml" line="111"/>
45
-        <location filename="../desktop/qml/ChangelogPage.qml" line="172"/>
46
-        <location filename="../desktop/qml/ChangelogPage.qml" line="253"/>
47
-        <location filename="../desktop/qml/ChangelogPage.qml" line="358"/>
48
-        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
49
-        <location filename="../desktop/qml/ChangelogPage.qml" line="501"/>
50
-        <location filename="../desktop/qml/ChangelogPage.qml" line="591"/>
51
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
52
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
53
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
54
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
55
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
56
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
57
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
58
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
59
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
60
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
61
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
62
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
63
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
64
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
65
         <source>Translator</source>
66
         <translation>Oversetter</translation>
67
     </message>
68
     <message>
69
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
70
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
71
-        <location filename="../desktop/qml/ChangelogPage.qml" line="58"/>
72
-        <location filename="../desktop/qml/ChangelogPage.qml" line="161"/>
73
-        <location filename="../desktop/qml/ChangelogPage.qml" line="232"/>
74
-        <location filename="../desktop/qml/ChangelogPage.qml" line="335"/>
75
-        <location filename="../desktop/qml/ChangelogPage.qml" line="437"/>
76
-        <location filename="../desktop/qml/ChangelogPage.qml" line="524"/>
77
-        <location filename="../desktop/qml/ChangelogPage.qml" line="565"/>
78
-        <location filename="../desktop/qml/ChangelogPage.qml" line="605"/>
79
-        <location filename="../desktop/qml/ChangelogPage.qml" line="619"/>
80
-        <location filename="../desktop/qml/ChangelogPage.qml" line="639"/>
81
-        <location filename="../desktop/qml/ChangelogPage.qml" line="659"/>
82
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
83
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
84
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
85
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
86
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
87
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
88
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
89
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
90
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
91
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
92
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
93
+        <location filename="../desktop/qml/ChangelogPage.qml" line="691"/>
94
+        <location filename="../desktop/qml/ChangelogPage.qml" line="731"/>
95
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
96
+        <location filename="../desktop/qml/ChangelogPage.qml" line="765"/>
97
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
98
         <source>Text to Speech</source>
99
         <translation>Tekst til Tale</translation>
100
     </message>
101
     <message>
102
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
103
         <location filename="../desktop/qml/ChangelogPage.qml" line="21"/>
104
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
105
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
106
         <source>General</source>
107
         <translation type="unfinished"></translation>
108
     </message>
109
     <message>
110
-        <location filename="../desktop/qml/ChangelogPage.qml" line="69"/>
111
-        <location filename="../desktop/qml/ChangelogPage.qml" line="106"/>
112
-        <location filename="../desktop/qml/ChangelogPage.qml" line="263"/>
113
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
114
+        <location filename="../desktop/qml/ChangelogPage.qml" line="188"/>
115
+        <location filename="../desktop/qml/ChangelogPage.qml" line="230"/>
116
         <location filename="../desktop/qml/ChangelogPage.qml" line="388"/>
117
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
118
         <source>Accessibility</source>
119
         <translation>Tilgjengelighet </translation>
120
     </message>
121
     <message>
122
-        <location filename="../sfos/qml/ChangelogPage.qml" line="63"/>
123
-        <location filename="../sfos/qml/ChangelogPage.qml" line="117"/>
124
-        <location filename="../desktop/qml/ChangelogPage.qml" line="40"/>
125
-        <location filename="../desktop/qml/ChangelogPage.qml" line="131"/>
126
-        <location filename="../desktop/qml/ChangelogPage.qml" line="223"/>
127
-        <location filename="../desktop/qml/ChangelogPage.qml" line="312"/>
128
-        <location filename="../desktop/qml/ChangelogPage.qml" line="414"/>
129
-        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
130
-        <location filename="../desktop/qml/ChangelogPage.qml" line="505"/>
131
-        <location filename="../desktop/qml/ChangelogPage.qml" line="555"/>
132
-        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
133
-        <location filename="../desktop/qml/ChangelogPage.qml" line="646"/>
134
-        <location filename="../desktop/qml/ChangelogPage.qml" line="663"/>
135
+        <location filename="../sfos/qml/ChangelogPage.qml" line="62"/>
136
+        <location filename="../sfos/qml/ChangelogPage.qml" line="114"/>
137
+        <location filename="../sfos/qml/ChangelogPage.qml" line="168"/>
138
+        <location filename="../desktop/qml/ChangelogPage.qml" line="30"/>
139
+        <location filename="../desktop/qml/ChangelogPage.qml" line="159"/>
140
+        <location filename="../desktop/qml/ChangelogPage.qml" line="255"/>
141
+        <location filename="../desktop/qml/ChangelogPage.qml" line="348"/>
142
+        <location filename="../desktop/qml/ChangelogPage.qml" line="438"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
144
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
145
+        <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="749"/>
148
+        <location filename="../desktop/qml/ChangelogPage.qml" line="772"/>
149
+        <location filename="../desktop/qml/ChangelogPage.qml" line="789"/>
150
         <source>Speech to Text</source>
151
         <translation>Tale til Tekst </translation>
152
     </message>
153
     <message>
154
-        <location filename="../desktop/qml/ChangelogPage.qml" line="369"/>
155
-        <location filename="../desktop/qml/ChangelogPage.qml" line="462"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="495"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
158
         <source>Other</source>
159
         <translation>Annet</translation>
160
     </message>
161
     <message>
162
-        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
163
-        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
164
-        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="31"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="102"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="124"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="195"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="299"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="399"/>
171
-        <location filename="../desktop/qml/ChangelogPage.qml" line="535"/>
172
-        <location filename="../desktop/qml/ChangelogPage.qml" line="580"/>
173
-        <location filename="../desktop/qml/ChangelogPage.qml" line="599"/>
174
-        <location filename="../desktop/qml/ChangelogPage.qml" line="634"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="58"/>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="87"/>
177
+        <location filename="../sfos/qml/ChangelogPage.qml" line="104"/>
178
+        <location filename="../sfos/qml/ChangelogPage.qml" line="151"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="26"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="143"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="226"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="425"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="525"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="661"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="725"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
190
         <source>User Interface</source>
191
         <translation>Bruker grensesnitt </translation>
192
     </message>
193
@@ -252,7 +270,7 @@
194
 <context>
195
     <name>DialogPage</name>
196
     <message>
197
-        <location filename="../desktop/qml/DialogPage.qml" line="82"/>
198
+        <location filename="../desktop/qml/DialogPage.qml" line="81"/>
199
         <source>Close</source>
200
         <translation>Lukk</translation>
201
dsnote-4.7.1.tar.gz/translations/dsnote-pl.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-pl.ts Changed
201
 
1
@@ -1,6 +1,6 @@
2
 <?xml version="1.0" encoding="utf-8"?>
3
 <!DOCTYPE TS>
4
-<TS version="2.1" language="pl" sourcelanguage="en_US">
5
+<TS version="2.1" language="pl_PL" sourcelanguage="en_US">
6
 <context>
7
     <name>AboutPage</name>
8
     <message>
9
@@ -162,105 +162,123 @@
10
     <message>
11
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
12
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
13
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
14
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
15
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
16
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
17
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
18
-        <location filename="../desktop/qml/ChangelogPage.qml" line="94"/>
19
-        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
20
-        <location filename="../desktop/qml/ChangelogPage.qml" line="191"/>
21
-        <location filename="../desktop/qml/ChangelogPage.qml" line="284"/>
22
-        <location filename="../desktop/qml/ChangelogPage.qml" line="384"/>
23
-        <location filename="../desktop/qml/ChangelogPage.qml" line="480"/>
24
-        <location filename="../desktop/qml/ChangelogPage.qml" line="497"/>
25
-        <location filename="../desktop/qml/ChangelogPage.qml" line="551"/>
26
-        <location filename="../desktop/qml/ChangelogPage.qml" line="587"/>
27
-        <location filename="../desktop/qml/ChangelogPage.qml" line="615"/>
28
-        <location filename="../desktop/qml/ChangelogPage.qml" line="630"/>
29
-        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
30
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
31
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
32
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
33
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
34
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
35
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
36
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
37
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
38
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
39
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
40
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
41
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
42
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
43
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
44
         <source>Version %1</source>
45
         <translation>Wersja %1</translation>
46
     </message>
47
     <message>
48
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
49
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
50
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
51
-        <location filename="../desktop/qml/ChangelogPage.qml" line="63"/>
52
-        <location filename="../desktop/qml/ChangelogPage.qml" line="111"/>
53
-        <location filename="../desktop/qml/ChangelogPage.qml" line="172"/>
54
-        <location filename="../desktop/qml/ChangelogPage.qml" line="253"/>
55
-        <location filename="../desktop/qml/ChangelogPage.qml" line="358"/>
56
-        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
57
-        <location filename="../desktop/qml/ChangelogPage.qml" line="501"/>
58
-        <location filename="../desktop/qml/ChangelogPage.qml" line="591"/>
59
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
60
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
61
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
62
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
63
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
64
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
65
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
66
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
67
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
68
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
69
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
70
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
71
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
72
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
73
         <source>Translator</source>
74
         <translation>Tłumacz</translation>
75
     </message>
76
     <message>
77
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
78
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
79
-        <location filename="../desktop/qml/ChangelogPage.qml" line="58"/>
80
-        <location filename="../desktop/qml/ChangelogPage.qml" line="161"/>
81
-        <location filename="../desktop/qml/ChangelogPage.qml" line="232"/>
82
-        <location filename="../desktop/qml/ChangelogPage.qml" line="335"/>
83
-        <location filename="../desktop/qml/ChangelogPage.qml" line="437"/>
84
-        <location filename="../desktop/qml/ChangelogPage.qml" line="524"/>
85
-        <location filename="../desktop/qml/ChangelogPage.qml" line="565"/>
86
-        <location filename="../desktop/qml/ChangelogPage.qml" line="605"/>
87
-        <location filename="../desktop/qml/ChangelogPage.qml" line="619"/>
88
-        <location filename="../desktop/qml/ChangelogPage.qml" line="639"/>
89
-        <location filename="../desktop/qml/ChangelogPage.qml" line="659"/>
90
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
91
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
92
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
93
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
94
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
95
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
96
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
97
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
98
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
99
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
100
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
101
+        <location filename="../desktop/qml/ChangelogPage.qml" line="691"/>
102
+        <location filename="../desktop/qml/ChangelogPage.qml" line="731"/>
103
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
104
+        <location filename="../desktop/qml/ChangelogPage.qml" line="765"/>
105
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
106
         <source>Text to Speech</source>
107
         <translation>Tekst na Mowę</translation>
108
     </message>
109
     <message>
110
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
111
         <location filename="../desktop/qml/ChangelogPage.qml" line="21"/>
112
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
113
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
114
         <source>General</source>
115
         <translation>Ogólne</translation>
116
     </message>
117
     <message>
118
-        <location filename="../desktop/qml/ChangelogPage.qml" line="69"/>
119
-        <location filename="../desktop/qml/ChangelogPage.qml" line="106"/>
120
-        <location filename="../desktop/qml/ChangelogPage.qml" line="263"/>
121
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
122
+        <location filename="../desktop/qml/ChangelogPage.qml" line="188"/>
123
+        <location filename="../desktop/qml/ChangelogPage.qml" line="230"/>
124
         <location filename="../desktop/qml/ChangelogPage.qml" line="388"/>
125
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
126
         <source>Accessibility</source>
127
         <translation>Dostępność</translation>
128
     </message>
129
     <message>
130
-        <location filename="../sfos/qml/ChangelogPage.qml" line="63"/>
131
-        <location filename="../sfos/qml/ChangelogPage.qml" line="117"/>
132
-        <location filename="../desktop/qml/ChangelogPage.qml" line="40"/>
133
-        <location filename="../desktop/qml/ChangelogPage.qml" line="131"/>
134
-        <location filename="../desktop/qml/ChangelogPage.qml" line="223"/>
135
-        <location filename="../desktop/qml/ChangelogPage.qml" line="312"/>
136
-        <location filename="../desktop/qml/ChangelogPage.qml" line="414"/>
137
-        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
138
-        <location filename="../desktop/qml/ChangelogPage.qml" line="505"/>
139
-        <location filename="../desktop/qml/ChangelogPage.qml" line="555"/>
140
-        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
141
-        <location filename="../desktop/qml/ChangelogPage.qml" line="646"/>
142
-        <location filename="../desktop/qml/ChangelogPage.qml" line="663"/>
143
+        <location filename="../sfos/qml/ChangelogPage.qml" line="62"/>
144
+        <location filename="../sfos/qml/ChangelogPage.qml" line="114"/>
145
+        <location filename="../sfos/qml/ChangelogPage.qml" line="168"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="30"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="159"/>
148
+        <location filename="../desktop/qml/ChangelogPage.qml" line="255"/>
149
+        <location filename="../desktop/qml/ChangelogPage.qml" line="348"/>
150
+        <location filename="../desktop/qml/ChangelogPage.qml" line="438"/>
151
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
152
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
153
+        <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
154
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
155
+        <location filename="../desktop/qml/ChangelogPage.qml" line="749"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="772"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="789"/>
158
         <source>Speech to Text</source>
159
         <translation>Mowa na Tekst</translation>
160
     </message>
161
     <message>
162
-        <location filename="../desktop/qml/ChangelogPage.qml" line="369"/>
163
-        <location filename="../desktop/qml/ChangelogPage.qml" line="462"/>
164
+        <location filename="../desktop/qml/ChangelogPage.qml" line="495"/>
165
+        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
166
         <source>Other</source>
167
         <translation>Inne</translation>
168
     </message>
169
     <message>
170
-        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
171
-        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
172
-        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
173
-        <location filename="../desktop/qml/ChangelogPage.qml" line="31"/>
174
-        <location filename="../desktop/qml/ChangelogPage.qml" line="102"/>
175
-        <location filename="../desktop/qml/ChangelogPage.qml" line="124"/>
176
-        <location filename="../desktop/qml/ChangelogPage.qml" line="195"/>
177
-        <location filename="../desktop/qml/ChangelogPage.qml" line="299"/>
178
-        <location filename="../desktop/qml/ChangelogPage.qml" line="399"/>
179
-        <location filename="../desktop/qml/ChangelogPage.qml" line="535"/>
180
-        <location filename="../desktop/qml/ChangelogPage.qml" line="580"/>
181
-        <location filename="../desktop/qml/ChangelogPage.qml" line="599"/>
182
-        <location filename="../desktop/qml/ChangelogPage.qml" line="634"/>
183
+        <location filename="../sfos/qml/ChangelogPage.qml" line="58"/>
184
+        <location filename="../sfos/qml/ChangelogPage.qml" line="87"/>
185
+        <location filename="../sfos/qml/ChangelogPage.qml" line="104"/>
186
+        <location filename="../sfos/qml/ChangelogPage.qml" line="151"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="26"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="143"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="226"/>
190
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
191
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
192
+        <location filename="../desktop/qml/ChangelogPage.qml" line="425"/>
193
+        <location filename="../desktop/qml/ChangelogPage.qml" line="525"/>
194
+        <location filename="../desktop/qml/ChangelogPage.qml" line="661"/>
195
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
196
+        <location filename="../desktop/qml/ChangelogPage.qml" line="725"/>
197
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
198
         <source>User Interface</source>
199
         <translation>Interfejs użytkownika</translation>
200
     </message>
201
dsnote-4.7.1.tar.gz/translations/dsnote-ru.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-ru.ts Changed
201
 
1
@@ -146,105 +146,123 @@
2
     <message>
3
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
4
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
5
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
6
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
7
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
8
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
9
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
10
-        <location filename="../desktop/qml/ChangelogPage.qml" line="94"/>
11
-        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
12
-        <location filename="../desktop/qml/ChangelogPage.qml" line="191"/>
13
-        <location filename="../desktop/qml/ChangelogPage.qml" line="284"/>
14
-        <location filename="../desktop/qml/ChangelogPage.qml" line="384"/>
15
-        <location filename="../desktop/qml/ChangelogPage.qml" line="480"/>
16
-        <location filename="../desktop/qml/ChangelogPage.qml" line="497"/>
17
-        <location filename="../desktop/qml/ChangelogPage.qml" line="551"/>
18
-        <location filename="../desktop/qml/ChangelogPage.qml" line="587"/>
19
-        <location filename="../desktop/qml/ChangelogPage.qml" line="615"/>
20
-        <location filename="../desktop/qml/ChangelogPage.qml" line="630"/>
21
-        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
22
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
23
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
24
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
25
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
26
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
27
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
28
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
29
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
30
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
31
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
32
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
33
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
34
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
35
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
36
         <source>Version %1</source>
37
         <translation>Версия %1</translation>
38
     </message>
39
     <message>
40
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
41
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
42
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
43
-        <location filename="../desktop/qml/ChangelogPage.qml" line="63"/>
44
-        <location filename="../desktop/qml/ChangelogPage.qml" line="111"/>
45
-        <location filename="../desktop/qml/ChangelogPage.qml" line="172"/>
46
-        <location filename="../desktop/qml/ChangelogPage.qml" line="253"/>
47
-        <location filename="../desktop/qml/ChangelogPage.qml" line="358"/>
48
-        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
49
-        <location filename="../desktop/qml/ChangelogPage.qml" line="501"/>
50
-        <location filename="../desktop/qml/ChangelogPage.qml" line="591"/>
51
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
52
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
53
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
54
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
55
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
56
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
57
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
58
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
59
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
60
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
61
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
62
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
63
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
64
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
65
         <source>Translator</source>
66
         <translation>Переводчик</translation>
67
     </message>
68
     <message>
69
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
70
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
71
-        <location filename="../desktop/qml/ChangelogPage.qml" line="58"/>
72
-        <location filename="../desktop/qml/ChangelogPage.qml" line="161"/>
73
-        <location filename="../desktop/qml/ChangelogPage.qml" line="232"/>
74
-        <location filename="../desktop/qml/ChangelogPage.qml" line="335"/>
75
-        <location filename="../desktop/qml/ChangelogPage.qml" line="437"/>
76
-        <location filename="../desktop/qml/ChangelogPage.qml" line="524"/>
77
-        <location filename="../desktop/qml/ChangelogPage.qml" line="565"/>
78
-        <location filename="../desktop/qml/ChangelogPage.qml" line="605"/>
79
-        <location filename="../desktop/qml/ChangelogPage.qml" line="619"/>
80
-        <location filename="../desktop/qml/ChangelogPage.qml" line="639"/>
81
-        <location filename="../desktop/qml/ChangelogPage.qml" line="659"/>
82
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
83
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
84
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
85
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
86
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
87
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
88
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
89
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
90
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
91
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
92
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
93
+        <location filename="../desktop/qml/ChangelogPage.qml" line="691"/>
94
+        <location filename="../desktop/qml/ChangelogPage.qml" line="731"/>
95
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
96
+        <location filename="../desktop/qml/ChangelogPage.qml" line="765"/>
97
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
98
         <source>Text to Speech</source>
99
         <translation>Текст-в-речь</translation>
100
     </message>
101
     <message>
102
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
103
         <location filename="../desktop/qml/ChangelogPage.qml" line="21"/>
104
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
105
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
106
         <source>General</source>
107
         <translation type="unfinished"></translation>
108
     </message>
109
     <message>
110
-        <location filename="../desktop/qml/ChangelogPage.qml" line="69"/>
111
-        <location filename="../desktop/qml/ChangelogPage.qml" line="106"/>
112
-        <location filename="../desktop/qml/ChangelogPage.qml" line="263"/>
113
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
114
+        <location filename="../desktop/qml/ChangelogPage.qml" line="188"/>
115
+        <location filename="../desktop/qml/ChangelogPage.qml" line="230"/>
116
         <location filename="../desktop/qml/ChangelogPage.qml" line="388"/>
117
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
118
         <source>Accessibility</source>
119
         <translation>Доступность</translation>
120
     </message>
121
     <message>
122
-        <location filename="../sfos/qml/ChangelogPage.qml" line="63"/>
123
-        <location filename="../sfos/qml/ChangelogPage.qml" line="117"/>
124
-        <location filename="../desktop/qml/ChangelogPage.qml" line="40"/>
125
-        <location filename="../desktop/qml/ChangelogPage.qml" line="131"/>
126
-        <location filename="../desktop/qml/ChangelogPage.qml" line="223"/>
127
-        <location filename="../desktop/qml/ChangelogPage.qml" line="312"/>
128
-        <location filename="../desktop/qml/ChangelogPage.qml" line="414"/>
129
-        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
130
-        <location filename="../desktop/qml/ChangelogPage.qml" line="505"/>
131
-        <location filename="../desktop/qml/ChangelogPage.qml" line="555"/>
132
-        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
133
-        <location filename="../desktop/qml/ChangelogPage.qml" line="646"/>
134
-        <location filename="../desktop/qml/ChangelogPage.qml" line="663"/>
135
+        <location filename="../sfos/qml/ChangelogPage.qml" line="62"/>
136
+        <location filename="../sfos/qml/ChangelogPage.qml" line="114"/>
137
+        <location filename="../sfos/qml/ChangelogPage.qml" line="168"/>
138
+        <location filename="../desktop/qml/ChangelogPage.qml" line="30"/>
139
+        <location filename="../desktop/qml/ChangelogPage.qml" line="159"/>
140
+        <location filename="../desktop/qml/ChangelogPage.qml" line="255"/>
141
+        <location filename="../desktop/qml/ChangelogPage.qml" line="348"/>
142
+        <location filename="../desktop/qml/ChangelogPage.qml" line="438"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
144
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
145
+        <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="749"/>
148
+        <location filename="../desktop/qml/ChangelogPage.qml" line="772"/>
149
+        <location filename="../desktop/qml/ChangelogPage.qml" line="789"/>
150
         <source>Speech to Text</source>
151
         <translation>Речь-в-текст</translation>
152
     </message>
153
     <message>
154
-        <location filename="../desktop/qml/ChangelogPage.qml" line="369"/>
155
-        <location filename="../desktop/qml/ChangelogPage.qml" line="462"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="495"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
158
         <source>Other</source>
159
         <translation>Другое</translation>
160
     </message>
161
     <message>
162
-        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
163
-        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
164
-        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="31"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="102"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="124"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="195"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="299"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="399"/>
171
-        <location filename="../desktop/qml/ChangelogPage.qml" line="535"/>
172
-        <location filename="../desktop/qml/ChangelogPage.qml" line="580"/>
173
-        <location filename="../desktop/qml/ChangelogPage.qml" line="599"/>
174
-        <location filename="../desktop/qml/ChangelogPage.qml" line="634"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="58"/>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="87"/>
177
+        <location filename="../sfos/qml/ChangelogPage.qml" line="104"/>
178
+        <location filename="../sfos/qml/ChangelogPage.qml" line="151"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="26"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="143"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="226"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="425"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="525"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="661"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="725"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
190
         <source>User Interface</source>
191
         <translation>Пользовательский интерфейс</translation>
192
     </message>
193
@@ -252,7 +270,7 @@
194
 <context>
195
     <name>DialogPage</name>
196
     <message>
197
-        <location filename="../desktop/qml/DialogPage.qml" line="82"/>
198
+        <location filename="../desktop/qml/DialogPage.qml" line="81"/>
199
         <source>Close</source>
200
         <translation>Закрыть</translation>
201
dsnote-4.7.1.tar.gz/translations/dsnote-sl.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-sl.ts Changed
201
 
1
@@ -146,105 +146,123 @@
2
     <message>
3
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
4
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
5
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
6
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
7
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
8
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
9
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
10
-        <location filename="../desktop/qml/ChangelogPage.qml" line="94"/>
11
-        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
12
-        <location filename="../desktop/qml/ChangelogPage.qml" line="191"/>
13
-        <location filename="../desktop/qml/ChangelogPage.qml" line="284"/>
14
-        <location filename="../desktop/qml/ChangelogPage.qml" line="384"/>
15
-        <location filename="../desktop/qml/ChangelogPage.qml" line="480"/>
16
-        <location filename="../desktop/qml/ChangelogPage.qml" line="497"/>
17
-        <location filename="../desktop/qml/ChangelogPage.qml" line="551"/>
18
-        <location filename="../desktop/qml/ChangelogPage.qml" line="587"/>
19
-        <location filename="../desktop/qml/ChangelogPage.qml" line="615"/>
20
-        <location filename="../desktop/qml/ChangelogPage.qml" line="630"/>
21
-        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
22
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
23
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
24
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
25
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
26
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
27
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
28
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
29
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
30
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
31
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
32
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
33
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
34
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
35
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
36
         <source>Version %1</source>
37
         <translation>Različica %1</translation>
38
     </message>
39
     <message>
40
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
41
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
42
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
43
-        <location filename="../desktop/qml/ChangelogPage.qml" line="63"/>
44
-        <location filename="../desktop/qml/ChangelogPage.qml" line="111"/>
45
-        <location filename="../desktop/qml/ChangelogPage.qml" line="172"/>
46
-        <location filename="../desktop/qml/ChangelogPage.qml" line="253"/>
47
-        <location filename="../desktop/qml/ChangelogPage.qml" line="358"/>
48
-        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
49
-        <location filename="../desktop/qml/ChangelogPage.qml" line="501"/>
50
-        <location filename="../desktop/qml/ChangelogPage.qml" line="591"/>
51
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
52
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
53
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
54
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
55
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
56
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
57
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
58
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
59
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
60
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
61
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
62
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
63
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
64
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
65
         <source>Translator</source>
66
         <translation>Prevajalec</translation>
67
     </message>
68
     <message>
69
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
70
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
71
-        <location filename="../desktop/qml/ChangelogPage.qml" line="58"/>
72
-        <location filename="../desktop/qml/ChangelogPage.qml" line="161"/>
73
-        <location filename="../desktop/qml/ChangelogPage.qml" line="232"/>
74
-        <location filename="../desktop/qml/ChangelogPage.qml" line="335"/>
75
-        <location filename="../desktop/qml/ChangelogPage.qml" line="437"/>
76
-        <location filename="../desktop/qml/ChangelogPage.qml" line="524"/>
77
-        <location filename="../desktop/qml/ChangelogPage.qml" line="565"/>
78
-        <location filename="../desktop/qml/ChangelogPage.qml" line="605"/>
79
-        <location filename="../desktop/qml/ChangelogPage.qml" line="619"/>
80
-        <location filename="../desktop/qml/ChangelogPage.qml" line="639"/>
81
-        <location filename="../desktop/qml/ChangelogPage.qml" line="659"/>
82
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
83
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
84
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
85
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
86
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
87
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
88
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
89
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
90
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
91
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
92
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
93
+        <location filename="../desktop/qml/ChangelogPage.qml" line="691"/>
94
+        <location filename="../desktop/qml/ChangelogPage.qml" line="731"/>
95
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
96
+        <location filename="../desktop/qml/ChangelogPage.qml" line="765"/>
97
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
98
         <source>Text to Speech</source>
99
         <translation>Besedilo v govor</translation>
100
     </message>
101
     <message>
102
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
103
         <location filename="../desktop/qml/ChangelogPage.qml" line="21"/>
104
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
105
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
106
         <source>General</source>
107
         <translation type="unfinished"></translation>
108
     </message>
109
     <message>
110
-        <location filename="../desktop/qml/ChangelogPage.qml" line="69"/>
111
-        <location filename="../desktop/qml/ChangelogPage.qml" line="106"/>
112
-        <location filename="../desktop/qml/ChangelogPage.qml" line="263"/>
113
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
114
+        <location filename="../desktop/qml/ChangelogPage.qml" line="188"/>
115
+        <location filename="../desktop/qml/ChangelogPage.qml" line="230"/>
116
         <location filename="../desktop/qml/ChangelogPage.qml" line="388"/>
117
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
118
         <source>Accessibility</source>
119
         <translation>Dostopnost</translation>
120
     </message>
121
     <message>
122
-        <location filename="../sfos/qml/ChangelogPage.qml" line="63"/>
123
-        <location filename="../sfos/qml/ChangelogPage.qml" line="117"/>
124
-        <location filename="../desktop/qml/ChangelogPage.qml" line="40"/>
125
-        <location filename="../desktop/qml/ChangelogPage.qml" line="131"/>
126
-        <location filename="../desktop/qml/ChangelogPage.qml" line="223"/>
127
-        <location filename="../desktop/qml/ChangelogPage.qml" line="312"/>
128
-        <location filename="../desktop/qml/ChangelogPage.qml" line="414"/>
129
-        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
130
-        <location filename="../desktop/qml/ChangelogPage.qml" line="505"/>
131
-        <location filename="../desktop/qml/ChangelogPage.qml" line="555"/>
132
-        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
133
-        <location filename="../desktop/qml/ChangelogPage.qml" line="646"/>
134
-        <location filename="../desktop/qml/ChangelogPage.qml" line="663"/>
135
+        <location filename="../sfos/qml/ChangelogPage.qml" line="62"/>
136
+        <location filename="../sfos/qml/ChangelogPage.qml" line="114"/>
137
+        <location filename="../sfos/qml/ChangelogPage.qml" line="168"/>
138
+        <location filename="../desktop/qml/ChangelogPage.qml" line="30"/>
139
+        <location filename="../desktop/qml/ChangelogPage.qml" line="159"/>
140
+        <location filename="../desktop/qml/ChangelogPage.qml" line="255"/>
141
+        <location filename="../desktop/qml/ChangelogPage.qml" line="348"/>
142
+        <location filename="../desktop/qml/ChangelogPage.qml" line="438"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
144
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
145
+        <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="749"/>
148
+        <location filename="../desktop/qml/ChangelogPage.qml" line="772"/>
149
+        <location filename="../desktop/qml/ChangelogPage.qml" line="789"/>
150
         <source>Speech to Text</source>
151
         <translation>Govor v besedilo</translation>
152
     </message>
153
     <message>
154
-        <location filename="../desktop/qml/ChangelogPage.qml" line="369"/>
155
-        <location filename="../desktop/qml/ChangelogPage.qml" line="462"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="495"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
158
         <source>Other</source>
159
         <translation>Drugo</translation>
160
     </message>
161
     <message>
162
-        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
163
-        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
164
-        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="31"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="102"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="124"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="195"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="299"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="399"/>
171
-        <location filename="../desktop/qml/ChangelogPage.qml" line="535"/>
172
-        <location filename="../desktop/qml/ChangelogPage.qml" line="580"/>
173
-        <location filename="../desktop/qml/ChangelogPage.qml" line="599"/>
174
-        <location filename="../desktop/qml/ChangelogPage.qml" line="634"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="58"/>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="87"/>
177
+        <location filename="../sfos/qml/ChangelogPage.qml" line="104"/>
178
+        <location filename="../sfos/qml/ChangelogPage.qml" line="151"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="26"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="143"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="226"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="425"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="525"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="661"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="725"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
190
         <source>User Interface</source>
191
         <translation>Uporabniški vmesnik</translation>
192
     </message>
193
@@ -252,7 +270,7 @@
194
 <context>
195
     <name>DialogPage</name>
196
     <message>
197
-        <location filename="../desktop/qml/DialogPage.qml" line="82"/>
198
+        <location filename="../desktop/qml/DialogPage.qml" line="81"/>
199
         <source>Close</source>
200
         <translation>Zapri</translation>
201
dsnote-4.7.1.tar.gz/translations/dsnote-sv.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-sv.ts Changed
201
 
1
@@ -146,105 +146,123 @@
2
     <message>
3
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
4
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
5
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
6
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
7
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
8
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
9
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
10
-        <location filename="../desktop/qml/ChangelogPage.qml" line="94"/>
11
-        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
12
-        <location filename="../desktop/qml/ChangelogPage.qml" line="191"/>
13
-        <location filename="../desktop/qml/ChangelogPage.qml" line="284"/>
14
-        <location filename="../desktop/qml/ChangelogPage.qml" line="384"/>
15
-        <location filename="../desktop/qml/ChangelogPage.qml" line="480"/>
16
-        <location filename="../desktop/qml/ChangelogPage.qml" line="497"/>
17
-        <location filename="../desktop/qml/ChangelogPage.qml" line="551"/>
18
-        <location filename="../desktop/qml/ChangelogPage.qml" line="587"/>
19
-        <location filename="../desktop/qml/ChangelogPage.qml" line="615"/>
20
-        <location filename="../desktop/qml/ChangelogPage.qml" line="630"/>
21
-        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
22
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
23
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
24
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
25
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
26
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
27
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
28
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
29
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
30
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
31
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
32
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
33
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
34
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
35
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
36
         <source>Version %1</source>
37
         <translation>Version %1</translation>
38
     </message>
39
     <message>
40
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
41
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
42
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
43
-        <location filename="../desktop/qml/ChangelogPage.qml" line="63"/>
44
-        <location filename="../desktop/qml/ChangelogPage.qml" line="111"/>
45
-        <location filename="../desktop/qml/ChangelogPage.qml" line="172"/>
46
-        <location filename="../desktop/qml/ChangelogPage.qml" line="253"/>
47
-        <location filename="../desktop/qml/ChangelogPage.qml" line="358"/>
48
-        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
49
-        <location filename="../desktop/qml/ChangelogPage.qml" line="501"/>
50
-        <location filename="../desktop/qml/ChangelogPage.qml" line="591"/>
51
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
52
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
53
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
54
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
55
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
56
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
57
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
58
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
59
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
60
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
61
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
62
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
63
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
64
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
65
         <source>Translator</source>
66
         <translation>Översättare</translation>
67
     </message>
68
     <message>
69
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
70
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
71
-        <location filename="../desktop/qml/ChangelogPage.qml" line="58"/>
72
-        <location filename="../desktop/qml/ChangelogPage.qml" line="161"/>
73
-        <location filename="../desktop/qml/ChangelogPage.qml" line="232"/>
74
-        <location filename="../desktop/qml/ChangelogPage.qml" line="335"/>
75
-        <location filename="../desktop/qml/ChangelogPage.qml" line="437"/>
76
-        <location filename="../desktop/qml/ChangelogPage.qml" line="524"/>
77
-        <location filename="../desktop/qml/ChangelogPage.qml" line="565"/>
78
-        <location filename="../desktop/qml/ChangelogPage.qml" line="605"/>
79
-        <location filename="../desktop/qml/ChangelogPage.qml" line="619"/>
80
-        <location filename="../desktop/qml/ChangelogPage.qml" line="639"/>
81
-        <location filename="../desktop/qml/ChangelogPage.qml" line="659"/>
82
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
83
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
84
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
85
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
86
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
87
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
88
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
89
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
90
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
91
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
92
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
93
+        <location filename="../desktop/qml/ChangelogPage.qml" line="691"/>
94
+        <location filename="../desktop/qml/ChangelogPage.qml" line="731"/>
95
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
96
+        <location filename="../desktop/qml/ChangelogPage.qml" line="765"/>
97
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
98
         <source>Text to Speech</source>
99
         <translation>Text-till-tal</translation>
100
     </message>
101
     <message>
102
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
103
         <location filename="../desktop/qml/ChangelogPage.qml" line="21"/>
104
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
105
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
106
         <source>General</source>
107
         <translation type="unfinished"></translation>
108
     </message>
109
     <message>
110
-        <location filename="../desktop/qml/ChangelogPage.qml" line="69"/>
111
-        <location filename="../desktop/qml/ChangelogPage.qml" line="106"/>
112
-        <location filename="../desktop/qml/ChangelogPage.qml" line="263"/>
113
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
114
+        <location filename="../desktop/qml/ChangelogPage.qml" line="188"/>
115
+        <location filename="../desktop/qml/ChangelogPage.qml" line="230"/>
116
         <location filename="../desktop/qml/ChangelogPage.qml" line="388"/>
117
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
118
         <source>Accessibility</source>
119
         <translation>Tillgänglighet</translation>
120
     </message>
121
     <message>
122
-        <location filename="../sfos/qml/ChangelogPage.qml" line="63"/>
123
-        <location filename="../sfos/qml/ChangelogPage.qml" line="117"/>
124
-        <location filename="../desktop/qml/ChangelogPage.qml" line="40"/>
125
-        <location filename="../desktop/qml/ChangelogPage.qml" line="131"/>
126
-        <location filename="../desktop/qml/ChangelogPage.qml" line="223"/>
127
-        <location filename="../desktop/qml/ChangelogPage.qml" line="312"/>
128
-        <location filename="../desktop/qml/ChangelogPage.qml" line="414"/>
129
-        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
130
-        <location filename="../desktop/qml/ChangelogPage.qml" line="505"/>
131
-        <location filename="../desktop/qml/ChangelogPage.qml" line="555"/>
132
-        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
133
-        <location filename="../desktop/qml/ChangelogPage.qml" line="646"/>
134
-        <location filename="../desktop/qml/ChangelogPage.qml" line="663"/>
135
+        <location filename="../sfos/qml/ChangelogPage.qml" line="62"/>
136
+        <location filename="../sfos/qml/ChangelogPage.qml" line="114"/>
137
+        <location filename="../sfos/qml/ChangelogPage.qml" line="168"/>
138
+        <location filename="../desktop/qml/ChangelogPage.qml" line="30"/>
139
+        <location filename="../desktop/qml/ChangelogPage.qml" line="159"/>
140
+        <location filename="../desktop/qml/ChangelogPage.qml" line="255"/>
141
+        <location filename="../desktop/qml/ChangelogPage.qml" line="348"/>
142
+        <location filename="../desktop/qml/ChangelogPage.qml" line="438"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
144
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
145
+        <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="749"/>
148
+        <location filename="../desktop/qml/ChangelogPage.qml" line="772"/>
149
+        <location filename="../desktop/qml/ChangelogPage.qml" line="789"/>
150
         <source>Speech to Text</source>
151
         <translation>Tal-till-text</translation>
152
     </message>
153
     <message>
154
-        <location filename="../desktop/qml/ChangelogPage.qml" line="369"/>
155
-        <location filename="../desktop/qml/ChangelogPage.qml" line="462"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="495"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
158
         <source>Other</source>
159
         <translation>Annat</translation>
160
     </message>
161
     <message>
162
-        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
163
-        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
164
-        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="31"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="102"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="124"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="195"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="299"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="399"/>
171
-        <location filename="../desktop/qml/ChangelogPage.qml" line="535"/>
172
-        <location filename="../desktop/qml/ChangelogPage.qml" line="580"/>
173
-        <location filename="../desktop/qml/ChangelogPage.qml" line="599"/>
174
-        <location filename="../desktop/qml/ChangelogPage.qml" line="634"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="58"/>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="87"/>
177
+        <location filename="../sfos/qml/ChangelogPage.qml" line="104"/>
178
+        <location filename="../sfos/qml/ChangelogPage.qml" line="151"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="26"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="143"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="226"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="425"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="525"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="661"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="725"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
190
         <source>User Interface</source>
191
         <translation>Användargränssnitt</translation>
192
     </message>
193
@@ -252,7 +270,7 @@
194
 <context>
195
     <name>DialogPage</name>
196
     <message>
197
-        <location filename="../desktop/qml/DialogPage.qml" line="82"/>
198
+        <location filename="../desktop/qml/DialogPage.qml" line="81"/>
199
         <source>Close</source>
200
         <translation>Stäng</translation>
201
dsnote-4.8.1.tar.gz/translations/dsnote-tr_TR.ts Added
201
 
1
@@ -0,0 +1,5658 @@
2
+<?xml version="1.0" encoding="utf-8"?>
3
+<!DOCTYPE TS>
4
+<TS version="2.1" language="tr_TR" sourcelanguage="en_US">
5
+<context>
6
+    <name>AboutPage</name>
7
+    <message>
8
+        <location filename="../sfos/qml/AboutPage.qml" line="28"/>
9
+        <source>About %1</source>
10
+        <translation>%1 Hakkında</translation>
11
+    </message>
12
+    <message>
13
+        <location filename="../sfos/qml/AboutPage.qml" line="46"/>
14
+        <source>Version %1</source>
15
+        <translation>Sürüm %1</translation>
16
+    </message>
17
+    <message>
18
+        <location filename="../sfos/qml/AboutPage.qml" line="53"/>
19
+        <source>Project website</source>
20
+        <translation>Projenin internet sayfası</translation>
21
+    </message>
22
+    <message>
23
+        <location filename="../sfos/qml/AboutPage.qml" line="57"/>
24
+        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
25
+        <source>Changes</source>
26
+        <translation>Değişiklikler</translation>
27
+    </message>
28
+    <message>
29
+        <location filename="../sfos/qml/AboutPage.qml" line="63"/>
30
+        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
31
+        <source>Authors</source>
32
+        <translation>Yazarlar</translation>
33
+    </message>
34
+    <message>
35
+        <location filename="../sfos/qml/AboutPage.qml" line="77"/>
36
+        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
37
+        <source>%1 is developed as an open source project under %2.</source>
38
+        <translation>%1, %2 altında açık kaynaklı bir proje olarak geliştirilmektedir.</translation>
39
+    </message>
40
+    <message>
41
+        <location filename="../sfos/qml/AboutPage.qml" line="83"/>
42
+        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
43
+        <source>Translators</source>
44
+        <translation>Çevirmenler</translation>
45
+    </message>
46
+    <message>
47
+        <location filename="../sfos/qml/AboutPage.qml" line="92"/>
48
+        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
49
+        <source>Libraries in use</source>
50
+        <translation>Kullanılan kütüphaneler</translation>
51
+    </message>
52
+    <message>
53
+        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
54
+        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
55
+        <translation>Konuşmadan Metne, Metinden Konuşmaya ve Makine Çevirisi ile not alma, okuma ve çevirme</translation>
56
+    </message>
57
+    <message>
58
+        <location filename="../desktop/qml/AboutPage.qml" line="17"/>
59
+        <location filename="../desktop/qml/AboutPage.qml" line="63"/>
60
+        <source>About</source>
61
+        <translation>Hakkında</translation>
62
+    </message>
63
+    <message>
64
+        <location filename="../desktop/qml/AboutPage.qml" line="67"/>
65
+        <source>Project website:</source>
66
+        <translation>Projenin internet sayfası:</translation>
67
+    </message>
68
+    <message>
69
+        <location filename="../desktop/qml/AboutPage.qml" line="73"/>
70
+        <source>Report bugs at:</source>
71
+        <translation>Hata bildirimleri için:</translation>
72
+    </message>
73
+    <message>
74
+        <location filename="../desktop/qml/AboutPage.qml" line="79"/>
75
+        <source>Support e-mail:</source>
76
+        <translation>Destek e-postası:</translation>
77
+    </message>
78
+</context>
79
+<context>
80
+    <name>AddTextDialog</name>
81
+    <message>
82
+        <location filename="../sfos/qml/AddTextDialog.qml" line="33"/>
83
+        <location filename="../desktop/qml/AddTextDialog.qml" line="34"/>
84
+        <source>Add text to the current note or replace it?</source>
85
+        <translation>Mevcut nota metin ekle veya değiştir?</translation>
86
+    </message>
87
+    <message>
88
+        <location filename="../sfos/qml/AddTextDialog.qml" line="41"/>
89
+        <location filename="../desktop/qml/AddTextDialog.qml" line="42"/>
90
+        <source>Add</source>
91
+        <translation>Ekle</translation>
92
+    </message>
93
+    <message>
94
+        <location filename="../sfos/qml/AddTextDialog.qml" line="49"/>
95
+        <location filename="../desktop/qml/AddTextDialog.qml" line="50"/>
96
+        <source>Replace</source>
97
+        <translation>Değiştir</translation>
98
+    </message>
99
+</context>
100
+<context>
101
+    <name>AddonInstallDialog</name>
102
+    <message>
103
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="17"/>
104
+        <source>Install Flatpak add-on</source>
105
+        <translation>Flatpak eklentisini kur</translation>
106
+    </message>
107
+    <message>
108
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="33"/>
109
+        <source>To install Flatpak add-on, which provides GPU acceleration support for %1 graphics card, follow one of the steps below.</source>
110
+        <translation>%1 grafik kartına yönelik GPU hızlandırma desteği sağlayan Flatpak eklentisini yüklemek için aşağıdaki adımlarından birini izleyin.</translation>
111
+    </message>
112
+    <message>
113
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="43"/>
114
+        <source>Use the software manager application on your system and install %1, or</source>
115
+        <translation>Sisteminizdeki yazılım yöneticisi uygulamasını kullanın ve %1&apos;i kurun veya</translation>
116
+    </message>
117
+    <message>
118
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="52"/>
119
+        <source>Run the following command in the terminal:</source>
120
+        <translation>Terminalde aşağıdaki komutu çalıştırın:</translation>
121
+    </message>
122
+    <message>
123
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="70"/>
124
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="88"/>
125
+        <source>The add-on enables faster processing when using the following Speech to Text and Text to Speech engines:</source>
126
+        <translation>Eklenti, aşağıdaki Konuşmadan Metne ve Metinden Konuşmaya motorlarını kullanırken daha hızlı işleme imkanı sağlar:</translation>
127
+    </message>
128
+    <message>
129
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="103"/>
130
+        <source>If you&apos;re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
131
+        <translation>Hızlı ve doğru Konuşmadan Metne işlevine ilgi duyuyorsanız, eklenti yüklemeye gerek kalmadan çalışan %1&apos;i Vulkan donanım hızlandırması ile kullanmayı düşünebilirsiniz.</translation>
132
+    </message>
133
+    <message>
134
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="112"/>
135
+        <source>Note that installing the add-on requires a significant amount of disk space.</source>
136
+        <translation>Eklentiyi kurmanın önemli miktarda disk alanı gerektirdiğini unutmayın.</translation>
137
+    </message>
138
+</context>
139
+<context>
140
+    <name>ChangelogPage</name>
141
+    <message>
142
+        <location filename="../sfos/qml/ChangelogPage.qml" line="28"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
144
+        <source>Changes</source>
145
+        <translation>Değişiklikler</translation>
146
+    </message>
147
+    <message>
148
+        <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
149
+        <location filename="../sfos/qml/ChangelogPage.qml" line="77"/>
150
+        <location filename="../sfos/qml/ChangelogPage.qml" line="111"/>
151
+        <location filename="../sfos/qml/ChangelogPage.qml" line="128"/>
152
+        <location filename="../sfos/qml/ChangelogPage.qml" line="175"/>
153
+        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
154
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
155
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="222"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
158
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
159
+        <location filename="../desktop/qml/ChangelogPage.qml" line="414"/>
160
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
161
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
162
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
163
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
164
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
165
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
166
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
167
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
168
+        <source>Version %1</source>
169
+        <translation>Sürüm %1</translation>
170
+    </message>
171
+    <message>
172
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
173
+        <location filename="../sfos/qml/ChangelogPage.qml" line="102"/>
174
+        <location filename="../sfos/qml/ChangelogPage.qml" line="119"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="165"/>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="213"/>
177
+        <location filename="../desktop/qml/ChangelogPage.qml" line="85"/>
178
+        <location filename="../desktop/qml/ChangelogPage.qml" line="124"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="186"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="239"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="300"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="382"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="488"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="721"/>
187
+        <source>Translator</source>
188
+        <translation>Çevirmen</translation>
189
+    </message>
190
+    <message>
191
+        <location filename="../sfos/qml/ChangelogPage.qml" line="57"/>
192
+        <location filename="../sfos/qml/ChangelogPage.qml" line="98"/>
193
+        <location filename="../sfos/qml/ChangelogPage.qml" line="159"/>
194
+        <location filename="../sfos/qml/ChangelogPage.qml" line="201"/>
195
+        <location filename="../desktop/qml/ChangelogPage.qml" line="55"/>
196
+        <location filename="../desktop/qml/ChangelogPage.qml" line="181"/>
197
+        <location filename="../desktop/qml/ChangelogPage.qml" line="289"/>
198
+        <location filename="../desktop/qml/ChangelogPage.qml" line="361"/>
199
+        <location filename="../desktop/qml/ChangelogPage.qml" line="465"/>
200
+        <location filename="../desktop/qml/ChangelogPage.qml" line="567"/>
201
dsnote-4.7.1.tar.gz/translations/dsnote-uk.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-uk.ts Changed
201
 
1
@@ -146,105 +146,123 @@
2
     <message>
3
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
4
         <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
5
-        <location filename="../sfos/qml/ChangelogPage.qml" line="96"/>
6
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
7
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
8
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
9
         <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
10
-        <location filename="../desktop/qml/ChangelogPage.qml" line="94"/>
11
-        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
12
-        <location filename="../desktop/qml/ChangelogPage.qml" line="191"/>
13
-        <location filename="../desktop/qml/ChangelogPage.qml" line="284"/>
14
-        <location filename="../desktop/qml/ChangelogPage.qml" line="384"/>
15
-        <location filename="../desktop/qml/ChangelogPage.qml" line="480"/>
16
-        <location filename="../desktop/qml/ChangelogPage.qml" line="497"/>
17
-        <location filename="../desktop/qml/ChangelogPage.qml" line="551"/>
18
-        <location filename="../desktop/qml/ChangelogPage.qml" line="587"/>
19
-        <location filename="../desktop/qml/ChangelogPage.qml" line="615"/>
20
-        <location filename="../desktop/qml/ChangelogPage.qml" line="630"/>
21
-        <location filename="../desktop/qml/ChangelogPage.qml" line="655"/>
22
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
23
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
24
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
25
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
26
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
27
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
28
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
29
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
30
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
31
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
32
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
33
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
34
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
35
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
36
         <source>Version %1</source>
37
         <translation>Версія %1</translation>
38
     </message>
39
     <message>
40
-        <location filename="../sfos/qml/ChangelogPage.qml" line="40"/>
41
-        <location filename="../sfos/qml/ChangelogPage.qml" line="86"/>
42
-        <location filename="../sfos/qml/ChangelogPage.qml" line="134"/>
43
-        <location filename="../desktop/qml/ChangelogPage.qml" line="63"/>
44
-        <location filename="../desktop/qml/ChangelogPage.qml" line="111"/>
45
-        <location filename="../desktop/qml/ChangelogPage.qml" line="172"/>
46
-        <location filename="../desktop/qml/ChangelogPage.qml" line="253"/>
47
-        <location filename="../desktop/qml/ChangelogPage.qml" line="358"/>
48
-        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
49
-        <location filename="../desktop/qml/ChangelogPage.qml" line="501"/>
50
-        <location filename="../desktop/qml/ChangelogPage.qml" line="591"/>
51
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
52
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
53
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
54
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
55
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
56
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
57
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
58
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
59
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
60
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
61
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
62
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
63
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
64
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
65
         <source>Translator</source>
66
         <translation>Перекладач</translation>
67
     </message>
68
     <message>
69
-        <location filename="../sfos/qml/ChangelogPage.qml" line="80"/>
70
-        <location filename="../sfos/qml/ChangelogPage.qml" line="122"/>
71
-        <location filename="../desktop/qml/ChangelogPage.qml" line="58"/>
72
-        <location filename="../desktop/qml/ChangelogPage.qml" line="161"/>
73
-        <location filename="../desktop/qml/ChangelogPage.qml" line="232"/>
74
-        <location filename="../desktop/qml/ChangelogPage.qml" line="335"/>
75
-        <location filename="../desktop/qml/ChangelogPage.qml" line="437"/>
76
-        <location filename="../desktop/qml/ChangelogPage.qml" line="524"/>
77
-        <location filename="../desktop/qml/ChangelogPage.qml" line="565"/>
78
-        <location filename="../desktop/qml/ChangelogPage.qml" line="605"/>
79
-        <location filename="../desktop/qml/ChangelogPage.qml" line="619"/>
80
-        <location filename="../desktop/qml/ChangelogPage.qml" line="639"/>
81
-        <location filename="../desktop/qml/ChangelogPage.qml" line="659"/>
82
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
83
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
84
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
85
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
86
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
87
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
88
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
89
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
90
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
91
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
92
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
93
+        <location filename="../desktop/qml/ChangelogPage.qml" line="691"/>
94
+        <location filename="../desktop/qml/ChangelogPage.qml" line="731"/>
95
+        <location filename="../desktop/qml/ChangelogPage.qml" line="745"/>
96
+        <location filename="../desktop/qml/ChangelogPage.qml" line="765"/>
97
+        <location filename="../desktop/qml/ChangelogPage.qml" line="785"/>
98
         <source>Text to Speech</source>
99
         <translation>Текст-у-мовлення</translation>
100
     </message>
101
     <message>
102
+        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
103
         <location filename="../desktop/qml/ChangelogPage.qml" line="21"/>
104
+        <location filename="../desktop/qml/ChangelogPage.qml" line="116"/>
105
+        <location filename="../desktop/qml/ChangelogPage.qml" line="132"/>
106
         <source>General</source>
107
         <translation type="unfinished"></translation>
108
     </message>
109
     <message>
110
-        <location filename="../desktop/qml/ChangelogPage.qml" line="69"/>
111
-        <location filename="../desktop/qml/ChangelogPage.qml" line="106"/>
112
-        <location filename="../desktop/qml/ChangelogPage.qml" line="263"/>
113
+        <location filename="../desktop/qml/ChangelogPage.qml" line="86"/>
114
+        <location filename="../desktop/qml/ChangelogPage.qml" line="188"/>
115
+        <location filename="../desktop/qml/ChangelogPage.qml" line="230"/>
116
         <location filename="../desktop/qml/ChangelogPage.qml" line="388"/>
117
+        <location filename="../desktop/qml/ChangelogPage.qml" line="514"/>
118
         <source>Accessibility</source>
119
         <translation>Доступність</translation>
120
     </message>
121
     <message>
122
-        <location filename="../sfos/qml/ChangelogPage.qml" line="63"/>
123
-        <location filename="../sfos/qml/ChangelogPage.qml" line="117"/>
124
-        <location filename="../desktop/qml/ChangelogPage.qml" line="40"/>
125
-        <location filename="../desktop/qml/ChangelogPage.qml" line="131"/>
126
-        <location filename="../desktop/qml/ChangelogPage.qml" line="223"/>
127
-        <location filename="../desktop/qml/ChangelogPage.qml" line="312"/>
128
-        <location filename="../desktop/qml/ChangelogPage.qml" line="414"/>
129
-        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
130
-        <location filename="../desktop/qml/ChangelogPage.qml" line="505"/>
131
-        <location filename="../desktop/qml/ChangelogPage.qml" line="555"/>
132
-        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
133
-        <location filename="../desktop/qml/ChangelogPage.qml" line="646"/>
134
-        <location filename="../desktop/qml/ChangelogPage.qml" line="663"/>
135
+        <location filename="../sfos/qml/ChangelogPage.qml" line="62"/>
136
+        <location filename="../sfos/qml/ChangelogPage.qml" line="114"/>
137
+        <location filename="../sfos/qml/ChangelogPage.qml" line="168"/>
138
+        <location filename="../desktop/qml/ChangelogPage.qml" line="30"/>
139
+        <location filename="../desktop/qml/ChangelogPage.qml" line="159"/>
140
+        <location filename="../desktop/qml/ChangelogPage.qml" line="255"/>
141
+        <location filename="../desktop/qml/ChangelogPage.qml" line="348"/>
142
+        <location filename="../desktop/qml/ChangelogPage.qml" line="438"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="540"/>
144
+        <location filename="../desktop/qml/ChangelogPage.qml" line="610"/>
145
+        <location filename="../desktop/qml/ChangelogPage.qml" line="631"/>
146
+        <location filename="../desktop/qml/ChangelogPage.qml" line="681"/>
147
+        <location filename="../desktop/qml/ChangelogPage.qml" line="749"/>
148
+        <location filename="../desktop/qml/ChangelogPage.qml" line="772"/>
149
+        <location filename="../desktop/qml/ChangelogPage.qml" line="789"/>
150
         <source>Speech to Text</source>
151
         <translation>Мовлення-у-текст</translation>
152
     </message>
153
     <message>
154
-        <location filename="../desktop/qml/ChangelogPage.qml" line="369"/>
155
-        <location filename="../desktop/qml/ChangelogPage.qml" line="462"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="495"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="588"/>
158
         <source>Other</source>
159
         <translation>Інші</translation>
160
     </message>
161
     <message>
162
-        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
163
-        <location filename="../sfos/qml/ChangelogPage.qml" line="53"/>
164
-        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="31"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="102"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="124"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="195"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="299"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="399"/>
171
-        <location filename="../desktop/qml/ChangelogPage.qml" line="535"/>
172
-        <location filename="../desktop/qml/ChangelogPage.qml" line="580"/>
173
-        <location filename="../desktop/qml/ChangelogPage.qml" line="599"/>
174
-        <location filename="../desktop/qml/ChangelogPage.qml" line="634"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="58"/>
176
+        <location filename="../sfos/qml/ChangelogPage.qml" line="87"/>
177
+        <location filename="../sfos/qml/ChangelogPage.qml" line="104"/>
178
+        <location filename="../sfos/qml/ChangelogPage.qml" line="151"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="26"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="143"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="226"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="248"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="320"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="425"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="525"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="661"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="706"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="725"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="760"/>
190
         <source>User Interface</source>
191
         <translation>Інтерфейс користувача</translation>
192
     </message>
193
@@ -252,7 +270,7 @@
194
 <context>
195
     <name>DialogPage</name>
196
     <message>
197
-        <location filename="../desktop/qml/DialogPage.qml" line="82"/>
198
+        <location filename="../desktop/qml/DialogPage.qml" line="81"/>
199
         <source>Close</source>
200
         <translation>Закрити</translation>
201
dsnote-4.7.1.tar.gz/translations/dsnote-zh_CN.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-zh_CN.ts Changed
201
 
1
@@ -16,182 +16,263 @@
2
     <message>
3
         <location filename="../sfos/qml/AboutPage.qml" line="53"/>
4
         <source>Project website</source>
5
-        <translation>项目网址</translation>
6
+        <translation>项目网站</translation>
7
     </message>
8
     <message>
9
-        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
10
         <location filename="../sfos/qml/AboutPage.qml" line="57"/>
11
+        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
12
         <source>Changes</source>
13
-        <translation>更新</translation>
14
+        <translation>变更</translation>
15
     </message>
16
     <message>
17
-        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
18
         <location filename="../sfos/qml/AboutPage.qml" line="63"/>
19
+        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
20
         <source>Authors</source>
21
         <translation>作者</translation>
22
     </message>
23
     <message>
24
-        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
25
         <location filename="../sfos/qml/AboutPage.qml" line="77"/>
26
+        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
27
         <source>%1 is developed as an open source project under %2.</source>
28
         <translation>%1 作为开源项目在 %2 下开发。</translation>
29
     </message>
30
     <message>
31
-        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
32
         <location filename="../sfos/qml/AboutPage.qml" line="83"/>
33
+        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
34
         <source>Translators</source>
35
-        <translation>翻译者</translation>
36
+        <translation>翻译人员</translation>
37
     </message>
38
     <message>
39
-        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
40
         <location filename="../sfos/qml/AboutPage.qml" line="92"/>
41
+        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
42
         <source>Libraries in use</source>
43
-        <translation type="unfinished"></translation>
44
+        <translation>正在使用的库</translation>
45
     </message>
46
     <message>
47
-        <source>Libraries</source>
48
-        <translation type="vanished">仓库</translation>
49
+        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
50
+        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
51
+        <translation>使用语音转文本、文本转语音和机器翻译进行笔记记录、朗读和翻译</translation>
52
     </message>
53
     <message>
54
         <location filename="../desktop/qml/AboutPage.qml" line="17"/>
55
         <location filename="../desktop/qml/AboutPage.qml" line="63"/>
56
         <source>About</source>
57
-        <translation type="unfinished"></translation>
58
-    </message>
59
-    <message>
60
-        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
61
-        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
62
-        <translation type="unfinished"></translation>
63
+        <translation>关于</translation>
64
     </message>
65
     <message>
66
         <location filename="../desktop/qml/AboutPage.qml" line="67"/>
67
         <source>Project website:</source>
68
-        <translation type="unfinished"></translation>
69
+        <translation>项目网站:</translation>
70
     </message>
71
     <message>
72
         <location filename="../desktop/qml/AboutPage.qml" line="73"/>
73
         <source>Report bugs at:</source>
74
-        <translation type="unfinished"></translation>
75
+        <translation>报告问题:</translation>
76
     </message>
77
     <message>
78
         <location filename="../desktop/qml/AboutPage.qml" line="79"/>
79
         <source>Support e-mail:</source>
80
-        <translation type="unfinished"></translation>
81
+        <translation>支持电子邮件:</translation>
82
     </message>
83
 </context>
84
 <context>
85
     <name>AddTextDialog</name>
86
     <message>
87
-        <location filename="../desktop/qml/AddTextDialog.qml" line="34"/>
88
         <location filename="../sfos/qml/AddTextDialog.qml" line="33"/>
89
+        <location filename="../desktop/qml/AddTextDialog.qml" line="35"/>
90
         <source>Add text to the current note or replace it?</source>
91
-        <translation type="unfinished"></translation>
92
+        <translation>将文本添加到当前笔记中还是替换它?</translation>
93
     </message>
94
     <message>
95
-        <location filename="../desktop/qml/AddTextDialog.qml" line="42"/>
96
         <location filename="../sfos/qml/AddTextDialog.qml" line="41"/>
97
+        <location filename="../desktop/qml/AddTextDialog.qml" line="43"/>
98
         <source>Add</source>
99
-        <translation type="unfinished"></translation>
100
+        <translation>添加</translation>
101
     </message>
102
     <message>
103
-        <location filename="../desktop/qml/AddTextDialog.qml" line="50"/>
104
         <location filename="../sfos/qml/AddTextDialog.qml" line="49"/>
105
+        <location filename="../desktop/qml/AddTextDialog.qml" line="51"/>
106
         <source>Replace</source>
107
-        <translation type="unfinished"></translation>
108
+        <translation>替换</translation>
109
+    </message>
110
+</context>
111
+<context>
112
+    <name>AddonInstallDialog</name>
113
+    <message>
114
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="17"/>
115
+        <source>Install Flatpak add-on</source>
116
+        <translation>安装 Flatpak 插件</translation>
117
+    </message>
118
+    <message>
119
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="33"/>
120
+        <source>To install Flatpak add-on, which provides GPU acceleration support for %1 graphics card, follow one of the steps below.</source>
121
+        <translation>要安装 Flatpak 插件,该插件为 %1 显卡提供 GPU 加速支持,请执行以下步骤之一。</translation>
122
+    </message>
123
+    <message>
124
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="43"/>
125
+        <source>Use the software manager application on your system and install %1, or</source>
126
+        <translation>使用您系统的软件管理器安装 %1,或者</translation>
127
+    </message>
128
+    <message>
129
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="52"/>
130
+        <source>Run the following command in the terminal:</source>
131
+        <translation>在终端中运行以下命令:</translation>
132
+    </message>
133
+    <message>
134
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="70"/>
135
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="85"/>
136
+        <source>The add-on enables faster processing when using the following Speech to Text and Text to Speech engines:</source>
137
+        <translation>插件启用后,在使用以下语音转文本和文本转语音引擎时,可以实现更快的处理速度:</translation>
138
+    </message>
139
+    <message>
140
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="97"/>
141
+        <source>If you&apos;re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
142
+        <translation>如果您对快速且准确的语音转文本处理感兴趣,可以考虑使用 %1,它支持 Vulkan 硬件加速,无需安装插件即可工作。</translation>
143
+    </message>
144
+    <message>
145
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="106"/>
146
+        <source>Note that installing the add-on requires a significant amount of disk space.</source>
147
+        <translation>请注意,安装此插件需要大量的磁盘空间。</translation>
148
     </message>
149
 </context>
150
 <context>
151
     <name>ChangelogPage</name>
152
     <message>
153
-        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
154
         <location filename="../sfos/qml/ChangelogPage.qml" line="28"/>
155
+        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
156
         <source>Changes</source>
157
-        <translation>更新</translation>
158
+        <translation>变更</translation>
159
     </message>
160
     <message>
161
-        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
162
-        <location filename="../desktop/qml/ChangelogPage.qml" line="110"/>
163
-        <location filename="../desktop/qml/ChangelogPage.qml" line="210"/>
164
-        <location filename="../desktop/qml/ChangelogPage.qml" line="306"/>
165
-        <location filename="../desktop/qml/ChangelogPage.qml" line="323"/>
166
-        <location filename="../desktop/qml/ChangelogPage.qml" line="377"/>
167
-        <location filename="../desktop/qml/ChangelogPage.qml" line="413"/>
168
-        <location filename="../desktop/qml/ChangelogPage.qml" line="441"/>
169
-        <location filename="../desktop/qml/ChangelogPage.qml" line="456"/>
170
-        <location filename="../desktop/qml/ChangelogPage.qml" line="481"/>
171
         <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
172
+        <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
173
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
174
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
176
+        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
177
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
178
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
186
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
187
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
188
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
189
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
190
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
191
         <source>Version %1</source>
192
         <translation>版本 %1</translation>
193
     </message>
194
     <message>
195
-        <location filename="../desktop/qml/ChangelogPage.qml" line="79"/>
196
-        <location filename="../desktop/qml/ChangelogPage.qml" line="184"/>
197
-        <location filename="../desktop/qml/ChangelogPage.qml" line="236"/>
198
-        <location filename="../desktop/qml/ChangelogPage.qml" line="327"/>
199
-        <location filename="../desktop/qml/ChangelogPage.qml" line="417"/>
200
-        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
201
dsnote-4.8.1.tar.gz/translations/dsnote-zh_TW.ts Added
201
 
1
@@ -0,0 +1,5641 @@
2
+<?xml version="1.0" encoding="utf-8"?>
3
+<!DOCTYPE TS>
4
+<TS version="2.1" language="zh_TW" sourcelanguage="en_US">
5
+<context>
6
+    <name>AboutPage</name>
7
+    <message>
8
+        <location filename="../sfos/qml/AboutPage.qml" line="28"/>
9
+        <source>About %1</source>
10
+        <translation>關於 %1</translation>
11
+    </message>
12
+    <message>
13
+        <location filename="../sfos/qml/AboutPage.qml" line="46"/>
14
+        <source>Version %1</source>
15
+        <translation>版本 %1</translation>
16
+    </message>
17
+    <message>
18
+        <location filename="../sfos/qml/AboutPage.qml" line="53"/>
19
+        <source>Project website</source>
20
+        <translation>專案網站</translation>
21
+    </message>
22
+    <message>
23
+        <location filename="../sfos/qml/AboutPage.qml" line="57"/>
24
+        <location filename="../desktop/qml/AboutPage.qml" line="58"/>
25
+        <source>Changes</source>
26
+        <translation>變更</translation>
27
+    </message>
28
+    <message>
29
+        <location filename="../sfos/qml/AboutPage.qml" line="63"/>
30
+        <location filename="../desktop/qml/AboutPage.qml" line="94"/>
31
+        <source>Authors</source>
32
+        <translation>作者</translation>
33
+    </message>
34
+    <message>
35
+        <location filename="../sfos/qml/AboutPage.qml" line="77"/>
36
+        <location filename="../desktop/qml/AboutPage.qml" line="86"/>
37
+        <source>%1 is developed as an open source project under %2.</source>
38
+        <translation>%1 作為開源專案在 %2 下開發。</translation>
39
+    </message>
40
+    <message>
41
+        <location filename="../sfos/qml/AboutPage.qml" line="83"/>
42
+        <location filename="../desktop/qml/AboutPage.qml" line="107"/>
43
+        <source>Translators</source>
44
+        <translation>翻譯人員</translation>
45
+    </message>
46
+    <message>
47
+        <location filename="../sfos/qml/AboutPage.qml" line="92"/>
48
+        <location filename="../desktop/qml/AboutPage.qml" line="117"/>
49
+        <source>Libraries in use</source>
50
+        <translation>正在使用的庫</translation>
51
+    </message>
52
+    <message>
53
+        <location filename="../desktop/qml/AboutPage.qml" line="51"/>
54
+        <source>Note taking, reading and translating with Speech to Text, Text to Speech and Machine Translation</source>
55
+        <translation>使用語音轉文字、文字轉語音和機器翻譯進行筆記記錄、朗讀和翻譯</translation>
56
+    </message>
57
+    <message>
58
+        <location filename="../desktop/qml/AboutPage.qml" line="17"/>
59
+        <location filename="../desktop/qml/AboutPage.qml" line="63"/>
60
+        <source>About</source>
61
+        <translation>關於</translation>
62
+    </message>
63
+    <message>
64
+        <location filename="../desktop/qml/AboutPage.qml" line="67"/>
65
+        <source>Project website:</source>
66
+        <translation>專案網站:</translation>
67
+    </message>
68
+    <message>
69
+        <location filename="../desktop/qml/AboutPage.qml" line="73"/>
70
+        <source>Report bugs at:</source>
71
+        <translation>報告問題:</translation>
72
+    </message>
73
+    <message>
74
+        <location filename="../desktop/qml/AboutPage.qml" line="79"/>
75
+        <source>Support e-mail:</source>
76
+        <translation>支援電子郵件:</translation>
77
+    </message>
78
+</context>
79
+<context>
80
+    <name>AddTextDialog</name>
81
+    <message>
82
+        <location filename="../sfos/qml/AddTextDialog.qml" line="33"/>
83
+        <location filename="../desktop/qml/AddTextDialog.qml" line="35"/>
84
+        <source>Add text to the current note or replace it?</source>
85
+        <translation>將文字新增到當前筆記中還是替換它?</translation>
86
+    </message>
87
+    <message>
88
+        <location filename="../sfos/qml/AddTextDialog.qml" line="41"/>
89
+        <location filename="../desktop/qml/AddTextDialog.qml" line="43"/>
90
+        <source>Add</source>
91
+        <translation>新增</translation>
92
+    </message>
93
+    <message>
94
+        <location filename="../sfos/qml/AddTextDialog.qml" line="49"/>
95
+        <location filename="../desktop/qml/AddTextDialog.qml" line="51"/>
96
+        <source>Replace</source>
97
+        <translation>替換</translation>
98
+    </message>
99
+</context>
100
+<context>
101
+    <name>AddonInstallDialog</name>
102
+    <message>
103
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="17"/>
104
+        <source>Install Flatpak add-on</source>
105
+        <translation>安裝 Flatpak 外掛</translation>
106
+    </message>
107
+    <message>
108
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="33"/>
109
+        <source>To install Flatpak add-on, which provides GPU acceleration support for %1 graphics card, follow one of the steps below.</source>
110
+        <translation>要安裝 Flatpak 外掛,該外掛為 %1 顯示卡提供 GPU 加速支援,請執行以下步驟之一。</translation>
111
+    </message>
112
+    <message>
113
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="43"/>
114
+        <source>Use the software manager application on your system and install %1, or</source>
115
+        <translation>使用您系統的軟體管理器安裝 %1,或者</translation>
116
+    </message>
117
+    <message>
118
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="52"/>
119
+        <source>Run the following command in the terminal:</source>
120
+        <translation>在終端中執行以下命令:</translation>
121
+    </message>
122
+    <message>
123
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="70"/>
124
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="85"/>
125
+        <source>The add-on enables faster processing when using the following Speech to Text and Text to Speech engines:</source>
126
+        <translation>外掛啟用後,在使用以下語音轉文字和文字轉語音引擎時,可以實現更快的處理速度:</translation>
127
+    </message>
128
+    <message>
129
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="97"/>
130
+        <source>If you&apos;re interested in fast and accurate Speech to Text processing, consider using %1 with Vulkan hardware acceleration, which works without installing an add-on.</source>
131
+        <translation>如果您對快速且準確的語音轉文字處理感興趣,可以考慮使用 %1,它支援 Vulkan 硬體加速,無需安裝外掛即可工作。</translation>
132
+    </message>
133
+    <message>
134
+        <location filename="../desktop/qml/AddonInstallDialog.qml" line="106"/>
135
+        <source>Note that installing the add-on requires a significant amount of disk space.</source>
136
+        <translation>請注意,安裝此外掛需要大量的磁碟空間。</translation>
137
+    </message>
138
+</context>
139
+<context>
140
+    <name>ChangelogPage</name>
141
+    <message>
142
+        <location filename="../sfos/qml/ChangelogPage.qml" line="28"/>
143
+        <location filename="../desktop/qml/ChangelogPage.qml" line="14"/>
144
+        <source>Changes</source>
145
+        <translation>變更</translation>
146
+    </message>
147
+    <message>
148
+        <location filename="../sfos/qml/ChangelogPage.qml" line="32"/>
149
+        <location filename="../sfos/qml/ChangelogPage.qml" line="49"/>
150
+        <location filename="../sfos/qml/ChangelogPage.qml" line="83"/>
151
+        <location filename="../sfos/qml/ChangelogPage.qml" line="100"/>
152
+        <location filename="../sfos/qml/ChangelogPage.qml" line="147"/>
153
+        <location filename="../desktop/qml/ChangelogPage.qml" line="17"/>
154
+        <location filename="../desktop/qml/ChangelogPage.qml" line="112"/>
155
+        <location filename="../desktop/qml/ChangelogPage.qml" line="128"/>
156
+        <location filename="../desktop/qml/ChangelogPage.qml" line="218"/>
157
+        <location filename="../desktop/qml/ChangelogPage.qml" line="244"/>
158
+        <location filename="../desktop/qml/ChangelogPage.qml" line="316"/>
159
+        <location filename="../desktop/qml/ChangelogPage.qml" line="410"/>
160
+        <location filename="../desktop/qml/ChangelogPage.qml" line="510"/>
161
+        <location filename="../desktop/qml/ChangelogPage.qml" line="606"/>
162
+        <location filename="../desktop/qml/ChangelogPage.qml" line="623"/>
163
+        <location filename="../desktop/qml/ChangelogPage.qml" line="677"/>
164
+        <location filename="../desktop/qml/ChangelogPage.qml" line="713"/>
165
+        <location filename="../desktop/qml/ChangelogPage.qml" line="741"/>
166
+        <location filename="../desktop/qml/ChangelogPage.qml" line="756"/>
167
+        <location filename="../desktop/qml/ChangelogPage.qml" line="781"/>
168
+        <source>Version %1</source>
169
+        <translation>版本 %1</translation>
170
+    </message>
171
+    <message>
172
+        <location filename="../sfos/qml/ChangelogPage.qml" line="74"/>
173
+        <location filename="../sfos/qml/ChangelogPage.qml" line="91"/>
174
+        <location filename="../sfos/qml/ChangelogPage.qml" line="137"/>
175
+        <location filename="../sfos/qml/ChangelogPage.qml" line="185"/>
176
+        <location filename="../desktop/qml/ChangelogPage.qml" line="82"/>
177
+        <location filename="../desktop/qml/ChangelogPage.qml" line="120"/>
178
+        <location filename="../desktop/qml/ChangelogPage.qml" line="182"/>
179
+        <location filename="../desktop/qml/ChangelogPage.qml" line="235"/>
180
+        <location filename="../desktop/qml/ChangelogPage.qml" line="296"/>
181
+        <location filename="../desktop/qml/ChangelogPage.qml" line="378"/>
182
+        <location filename="../desktop/qml/ChangelogPage.qml" line="484"/>
183
+        <location filename="../desktop/qml/ChangelogPage.qml" line="536"/>
184
+        <location filename="../desktop/qml/ChangelogPage.qml" line="627"/>
185
+        <location filename="../desktop/qml/ChangelogPage.qml" line="717"/>
186
+        <source>Translator</source>
187
+        <translation>翻譯器</translation>
188
+    </message>
189
+    <message>
190
+        <location filename="../sfos/qml/ChangelogPage.qml" line="36"/>
191
+        <location filename="../sfos/qml/ChangelogPage.qml" line="70"/>
192
+        <location filename="../sfos/qml/ChangelogPage.qml" line="131"/>
193
+        <location filename="../sfos/qml/ChangelogPage.qml" line="173"/>
194
+        <location filename="../desktop/qml/ChangelogPage.qml" line="53"/>
195
+        <location filename="../desktop/qml/ChangelogPage.qml" line="177"/>
196
+        <location filename="../desktop/qml/ChangelogPage.qml" line="285"/>
197
+        <location filename="../desktop/qml/ChangelogPage.qml" line="357"/>
198
+        <location filename="../desktop/qml/ChangelogPage.qml" line="461"/>
199
+        <location filename="../desktop/qml/ChangelogPage.qml" line="563"/>
200
+        <location filename="../desktop/qml/ChangelogPage.qml" line="650"/>
201
libxkbcommon-1.6.0.tar.xz Deleted
pythonbasic.tar Added
pythonmodules.tar.zst Deleted
pythonmodules1.tar.zst Added
pythonmodules2.tar.zst Added
rhvoice-71a1a8.tar.zst Deleted
rhvoice-846293.tar.zst Added
sources.tar.zst Changed