We truncated the diff of some files because they were too big.
If you want to see the full diff for every file, click here.
Changes of Revision 5
speechnote.changes
Changed
x
1
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
31
'rubberband'
32
'taglib'
33
'vulkan-icd-loader'
34
+ 'wayland'
35
'xz'
36
)
37
makedepends=(
38
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
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
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
13
'fmt'
14
'glslang'
15
'hicolor-icon-theme'
16
+ 'kconfigwidgets5'
17
'kdbusaddons5'
18
+ 'kiconthemes5'
19
+ 'kirigami2'
20
'libarchive'
21
'libpulse'
22
'libxinerama'
23
24
'openblas'
25
'perl'
26
'python>=3.11'
27
- 'qqc2-desktop-style5'
28
'qt5-base'
29
'qt5-declarative'
30
'qt5-multimedia'
31
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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<QPair<QString,QVariantMap>>"/>
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
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
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
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
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
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
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
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
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
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
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
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
3
set -e
4
5
-VERSION="4.6.1"
6
+VERSION="4.7.1"
7
REV="1"
8
ARCH="amd64"
9
LDIR="$(
10
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
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
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
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
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
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
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
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> → <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
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
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
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
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> → <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
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
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
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
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
}
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
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
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
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> → <i>" +
14
+ .arg("<i>" + qsTr("Advanced") + "</i> → <i>" +
15
qsTr("Override GPU version") + "</i>")
16
label.textFormat: Text.RichText
17
}
18
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
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
"<p>" + qsTr("To get started, you first need to set up the languages you want to use.") + "</p>" +
9
"<p>→ " +
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
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
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
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
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
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
17
modelFilteringWidget.close()
18
modelFilteringWidget.reset()
19
modelFilteringWidget.update()
20
+
21
}
22
23
function switchToModels(langId, langName) {
24
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
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
41
verticalAlignment: Text.AlignVCenter
42
Layout.alignment: Qt.AlignVCenter
43
Layout.fillWidth: true
44
+ horizontalAlignment: Text.AlignLeft
45
}
46
47
BusyIndicator {
48
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
15
16
onOpened: {
17
if ((_settings.hint_done_flags & Settings.HintDoneRules) == 0) {
18
- helpDialog.open()
19
+ appWin.openPopup(helpDialog)
20
}
21
}
22
23
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
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
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
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
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
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
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
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
18
Repeater {
19
id: featureRepeter
20
21
- model: root.features
22
+ model: appWin.features
23
24
RowLayout {
25
Layout.fillWidth: true
26
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
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
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
2
color: "red"
3
}
4
5
+ LayoutFixer {
6
+ id: fixer
7
+ }
8
+
9
TabBar {
10
id: bar
11
12
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 → <a href='https://github.com/huggingface/parler-tts'>https://github.com/huggingface/parler-tts</a></li>" +
97
+ "<li>Parler TTS Expresso → <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
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
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
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
108
}
109
110
ToastNotification {
111
- id: toast
112
+ id: _toast
113
}
114
115
Connections {
116
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
105
only-arches:
106
- x86_64
107
buildsystem: simple
108
+ build-options:
109
+ strip: true
110
build-commands:
111
- |
112
set -e
113
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
165
only-arches:
166
- x86_64
167
buildsystem: cmake-ninja
168
+ build-options:
169
+ strip: true
170
cleanup:
171
- /bin
172
- /include
173
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
94
To enable, use the option in the settings (<i>Speech to Text</i> → <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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
2
LA, /** Latin - 拉丁 */
3
LV, /** Latvia - 拉脱维亚 */
4
MK, /** Macedonia - 马其顿 */
5
+ ML, /** Malayalam */
6
MS, /** Malay - 马来 */
7
MR, /** Mara - 马拉地 */
8
MN, /** Mongolia - 蒙古 */
9
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
44
}
45
46
update_available_tts_ref_voices();
47
- register_hotkeys();
48
handle_note_changed();
49
update_audio_sources();
50
51
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
200
void intermediate_text_changed();
201
dsnote-4.8.1.tar.gz/src/f5_engine.cpp
Added
160
1
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
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
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
#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
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
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
#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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
81
return download_urls();
82
case DownloadSizeRole:
83
return download_size();
84
+ case InfoRole:
85
+ return info();
86
default:
87
break;
88
}
89
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
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
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
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
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
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
92
LicenseUrlRole,
93
LicenseAccceptRequiredRole,
94
DownloadUrlsRole,
95
- DownloadSizeRole
96
+ DownloadSizeRole,
97
+ InfoRole
98
};
99
100
struct License {
101
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
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
8
#include <functional>
9
#include <iostream>
10
#include <set>
11
-#include <sstream>
12
#include <string>
13
#include <thread>
14
#include <utility>
15
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
#include <taglib/fileref.h>
9
#include <taglib/tag.h>
10
11
+#include <limits>
12
+
13
#include "logger.hpp"
14
15
namespace mtag_tools {
16
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
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
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
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
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
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
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
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
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
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
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
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
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
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
#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
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
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
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
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
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
#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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
16
#include <unistd.h>
17
18
#include <algorithm>
19
+#include <cctype>
20
#include <cstdlib>
21
#include <cwctype>
22
#include <libnumbertext/Numbertext.hxx>
23
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
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
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
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
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
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
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
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
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
#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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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'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
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'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
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
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
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'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
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
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
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'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
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 :</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
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
27
<message>
28
<location filename="../desktop/qml/AboutPage.qml" line="67"/>
29
<source>Project website:</source>
30
- <translation>Site web du projet :</translation>
31
+ <translation>Site Web du projet :</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 :</translation>
37
+ <translation>Signalez les bogues à l’adresse suivante :</translation>
38
</message>
39
<message>
40
<location filename="../desktop/qml/AboutPage.qml" line="79"/>
41
<source>Support e-mail:</source>
42
- <translation>Courriel d'assistance :</translation>
43
+ <translation>Courriel d’assistance :</translation>
44
</message>
45
</context>
46
<context>
47
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 ?</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
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 :</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 :</translation>
101
</message>
102
<message>
103
<location filename="../desktop/qml/AddonInstallDialog.qml" line="97"/>
104
<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>
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
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
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 :</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 :</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 :</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 :</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 :</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 :</translation>
127
+ </message>
128
+ <message>
129
+ <location filename="../desktop/qml/AddonInstallDialog.qml" line="97"/>
130
+ <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>
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
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
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
201
dsnote-4.7.1.tar.gz/translations/dsnote-nl.ts -> dsnote-4.8.1.tar.gz/translations/dsnote-nl.ts
Changed
201
1
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
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
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
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
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
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
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
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
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
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
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
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
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'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'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'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
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
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
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'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
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'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