Text to speech settings

This commit is contained in:
Jakub Melka
2020-02-13 18:31:00 +01:00
parent d10f988019
commit 7df807470b
8 changed files with 429 additions and 6 deletions

View File

@ -4,7 +4,7 @@
#
#-------------------------------------------------
QT += core gui winextras printsupport
QT += core gui winextras printsupport texttospeech
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

View File

@ -36,5 +36,6 @@
<file>resources/rotate-left.svg</file>
<file>resources/rotate-right.svg</file>
<file>resources/print.svg</file>
<file>resources/speech.svg</file>
</qresource>
</RCC>

View File

@ -69,6 +69,15 @@ void PDFViewerSettings::readSettings(QSettings& settings, const pdf::PDFCMSSetti
m_colorManagementSystemSettings.profileDirectory = settings.value("profileDirectory", defaultCMSSettings.profileDirectory).toString();
settings.endGroup();
settings.beginGroup("SpeechSettings");
m_settings.m_speechEngine = settings.value("speechEngine", defaultSettings.m_speechEngine).toString();
m_settings.m_speechLocale = settings.value("speechLocale", defaultSettings.m_speechLocale).toString();
m_settings.m_speechVoice = settings.value("speechVoice", defaultSettings.m_speechVoice).toString();
m_settings.m_speechRate = settings.value("speechRate", defaultSettings.m_speechRate).toDouble();
m_settings.m_speechPitch = settings.value("speechPitch", defaultSettings.m_speechPitch).toDouble();
m_settings.m_speechVolume = settings.value("speechVolume", defaultSettings.m_speechVolume).toDouble();
settings.endGroup();
emit settingsChanged();
}
@ -105,6 +114,15 @@ void PDFViewerSettings::writeSettings(QSettings& settings)
settings.setValue("deviceCMYK", m_colorManagementSystemSettings.deviceCMYK);
settings.setValue("profileDirectory", m_colorManagementSystemSettings.profileDirectory);
settings.endGroup();
settings.beginGroup("SpeechSettings");
settings.setValue("speechEngine", m_settings.m_speechEngine);
settings.setValue("speechLocale", m_settings.m_speechLocale);
settings.setValue("speechVoice", m_settings.m_speechVoice);
settings.setValue("speechRate", m_settings.m_speechRate);
settings.setValue("speechPitch", m_settings.m_speechPitch);
settings.setValue("speechVolume", m_settings.m_speechVolume);
settings.endGroup();
}
QString PDFViewerSettings::getDirectory() const
@ -205,7 +223,10 @@ PDFViewerSettings::Settings::Settings() :
m_thumbnailsCacheLimit(PIXMAP_CACHE_LIMIT),
m_fontCacheLimit(pdf::DEFAULT_FONT_CACHE_LIMIT),
m_instancedFontCacheLimit(pdf::DEFAULT_REALIZED_FONT_CACHE_LIMIT),
m_multithreadingStrategy(pdf::PDFExecutionPolicy::Strategy::PageMultithreaded)
m_multithreadingStrategy(pdf::PDFExecutionPolicy::Strategy::PageMultithreaded),
m_speechRate(0.0),
m_speechPitch(0.0),
m_speechVolume(1.0)
{
}

View File

@ -63,6 +63,14 @@ public:
int m_thumbnailsCacheLimit;
int m_fontCacheLimit;
int m_instancedFontCacheLimit;
// Speech settings
QString m_speechEngine;
QString m_speechLocale;
QString m_speechVoice;
double m_speechRate;
double m_speechPitch;
double m_speechVolume;
};
const Settings& getSettings() const { return m_settings; }

View File

@ -27,6 +27,7 @@
#include <QMessageBox>
#include <QFileDialog>
#include <QListWidgetItem>
#include <QTextToSpeech>
namespace pdfviewer
{
@ -46,6 +47,8 @@ PDFViewerSettingsDialog::PDFViewerSettingsDialog(const PDFViewerSettings::Settin
{
ui->setupUi(this);
m_textToSpeechEngines = QTextToSpeech::availableEngines();
new QListWidgetItem(QIcon(":/resources/engine.svg"), tr("Engine"), ui->optionsPagesWidget, EngineSettings);
new QListWidgetItem(QIcon(":/resources/rendering.svg"), tr("Rendering"), ui->optionsPagesWidget, RenderingSettings);
new QListWidgetItem(QIcon(":/resources/shading.svg"), tr("Shading"), ui->optionsPagesWidget, ShadingSettings);
@ -54,6 +57,7 @@ PDFViewerSettingsDialog::PDFViewerSettingsDialog(const PDFViewerSettings::Settin
new QListWidgetItem(QIcon(":/resources/cms.svg"), tr("Colors"), ui->optionsPagesWidget, ColorManagementSystemSettings);
new QListWidgetItem(QIcon(":/resources/security.svg"), tr("Security"), ui->optionsPagesWidget, SecuritySettings);
new QListWidgetItem(QIcon(":/resources/ui.svg"), tr("UI"), ui->optionsPagesWidget, UISettings);
new QListWidgetItem(QIcon(":/resources/speech.svg"), tr("Speech"), ui->optionsPagesWidget, SpeechSettings);
ui->renderingEngineComboBox->addItem(tr("Software"), static_cast<int>(pdf::RendererEngine::Software));
ui->renderingEngineComboBox->addItem(tr("Hardware accelerated (OpenGL)"), static_cast<int>(pdf::RendererEngine::OpenGL));
@ -130,6 +134,12 @@ PDFViewerSettingsDialog::PDFViewerSettingsDialog(const PDFViewerSettings::Settin
}
}
// Text to speech
for (const QString& engine : m_textToSpeechEngines)
{
ui->speechEnginesComboBox->addItem(engine, engine);
}
ui->optionsPagesWidget->setCurrentRow(0);
adjustSize();
loadData();
@ -179,6 +189,10 @@ void PDFViewerSettingsDialog::on_optionsPagesWidget_currentItemChanged(QListWidg
ui->stackedWidget->setCurrentWidget(ui->uiPage);
break;
case SpeechSettings:
ui->stackedWidget->setCurrentWidget(ui->speechPage);
break;
default:
Q_ASSERT(false);
break;
@ -289,6 +303,16 @@ void PDFViewerSettingsDialog::loadData()
ui->cmsProfileDirectoryEdit->setEnabled(false);
ui->cmsProfileDirectoryEdit->setText(QString());
}
// Text-to-speech
ui->speechEnginesComboBox->setCurrentIndex(ui->speechEnginesComboBox->findData(m_settings.m_speechEngine));
QString speechEngine = ui->speechEnginesComboBox->currentData().toString();
setSpeechEngine(speechEngine);
ui->speechLocaleComboBox->setCurrentIndex(ui->speechLocaleComboBox->findData(m_settings.m_speechLocale));
ui->speechVoiceComboBox->setCurrentIndex(ui->speechVoiceComboBox->findData(m_settings.m_speechVoice));
ui->speechRateEdit->setValue(m_settings.m_speechRate);
ui->speechPitchEdit->setValue(m_settings.m_speechPitch);
ui->speechVolumeEdit->setValue(m_settings.m_speechVolume);
}
void PDFViewerSettingsDialog::saveData()
@ -424,8 +448,36 @@ void PDFViewerSettingsDialog::saveData()
{
m_otherSettings.maximumRecentFileCount = ui->maximumRecentFileCountEdit->value();
}
else if (sender == ui->speechEnginesComboBox)
{
m_settings.m_speechEngine = ui->speechEnginesComboBox->currentData().toString();
}
else if (sender == ui->speechLocaleComboBox)
{
m_settings.m_speechLocale = ui->speechLocaleComboBox->currentData().toString();
}
else if (sender == ui->speechVoiceComboBox)
{
m_settings.m_speechVoice = ui->speechVoiceComboBox->currentData().toString();
}
else if (sender == ui->speechRateEdit)
{
m_settings.m_speechRate = ui->speechRateEdit->value();
}
else if (sender == ui->speechPitchEdit)
{
m_settings.m_speechPitch = ui->speechPitchEdit->value();
}
else if (sender == ui->speechVolumeEdit)
{
m_settings.m_speechVolume = ui->speechVolumeEdit->value();
}
loadData();
const bool loadData = !qobject_cast<const QDoubleSpinBox*>(sender) && !qobject_cast<const QSpinBox*>(sender);
if (loadData)
{
this->loadData();
}
}
void PDFViewerSettingsDialog::loadActionShortcutsTable()
@ -480,6 +532,35 @@ bool PDFViewerSettingsDialog::saveActionShortcutsTable()
return true;
}
void PDFViewerSettingsDialog::setSpeechEngine(const QString& engine)
{
if (m_currentSpeechEngine == engine)
{
return;
}
m_currentSpeechEngine = engine;
QTextToSpeech textToSpeech(engine, nullptr);
QVector<QLocale> locales = textToSpeech.availableLocales();
ui->speechLocaleComboBox->setUpdatesEnabled(false);
ui->speechLocaleComboBox->clear();
for (const QLocale& locale : locales)
{
ui->speechLocaleComboBox->addItem(QString("%1 (%2)").arg(locale.nativeLanguageName(), locale.nativeCountryName()), locale.name());
}
ui->speechLocaleComboBox->setUpdatesEnabled(true);
QVector<QVoice> voices = textToSpeech.availableVoices();
ui->speechVoiceComboBox->setUpdatesEnabled(false);
ui->speechVoiceComboBox->clear();
for (const QVoice& voice : voices)
{
ui->speechVoiceComboBox->addItem(QString("%1 (%2, %3)").arg(voice.name(), QVoice::genderName(voice.gender()), QVoice::ageName(voice.age())), voice.name());
}
ui->speechVoiceComboBox->setUpdatesEnabled(true);
}
void PDFViewerSettingsDialog::accept()
{
if (saveActionShortcutsTable())

View File

@ -69,7 +69,8 @@ public:
ShortcutSettings,
ColorManagementSystemSettings,
SecuritySettings,
UISettings
UISettings,
SpeechSettings
};
const PDFViewerSettings::Settings& getSettings() const { return m_settings; }
@ -78,7 +79,6 @@ public:
private slots:
void on_optionsPagesWidget_currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous);
void on_cmsProfileDirectoryButton_clicked();
private:
@ -88,12 +88,16 @@ private:
void loadActionShortcutsTable();
bool saveActionShortcutsTable();
void setSpeechEngine(const QString& engine);
Ui::PDFViewerSettingsDialog* ui;
PDFViewerSettings::Settings m_settings;
pdf::PDFCMSSettings m_cmsSettings;
OtherSettings m_otherSettings;
QList<QAction*> m_actions;
bool m_isLoadingData;
QStringList m_textToSpeechEngines;
QString m_currentSpeechEngine;
};
} // namespace pdfviewer

View File

@ -26,7 +26,7 @@
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
<number>7</number>
<number>8</number>
</property>
<widget class="QWidget" name="enginePage">
<layout class="QVBoxLayout" name="enginePageLayout">
@ -887,6 +887,136 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="speechPage">
<layout class="QVBoxLayout" name="speechPageLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="speechGroupBox">
<property name="title">
<string>Speech Settings</string>
</property>
<layout class="QVBoxLayout" name="speechGroupBoxLayout">
<item>
<layout class="QGridLayout" name="speechWidgetsLayout">
<item row="2" column="0">
<widget class="QLabel" name="speechVoiceLabel">
<property name="text">
<string>Voice</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="speechPitchLabel">
<property name="text">
<string>Pitch</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="speechVolumeLabe">
<property name="text">
<string>Volume</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="speechRateLabel">
<property name="text">
<string>Rate</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="speechSynthethiserLabel">
<property name="text">
<string>Voice synthetiser</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="speechLocaleLabel">
<property name="text">
<string>Locale</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="speechEnginesComboBox"/>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="speechLocaleComboBox"/>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="speechVoiceComboBox"/>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="speechRateEdit">
<property name="minimum">
<double>-1.000000000000000</double>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QDoubleSpinBox" name="speechVolumeEdit">
<property name="maximum">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QDoubleSpinBox" name="speechPitchEdit">
<property name="minimum">
<double>-1.000000000000000</double>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="speechInfoLabel">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set speech settings to enable document reading. These settings are default settings for text to speech functionality, but some can be changed later. Pitch can have values from -1.0 to 1.0 and 0.0 is default. Rate can also have values ranging from -1.0 to 1.0, while 0.0 is normal speech flow. Volume can have values from 0.0 to 1.0.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>288</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>

View File

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="speech.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="-720.23371"
inkscape:cy="504.12186"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#ffffff;fill-opacity:0.9948007;stroke:#000000;stroke-width:1.39999998;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect827"
width="7.0398064"
height="7.2760415"
x="5.5562501"
y="278.05869" />
<path
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.596056,278.05869 5.87753,-5.69801"
id="path831"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.596056,285.33472 5.69801,5.87753"
id="path831-3"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 18.473586,272.36068 -0.17952,18.85157"
id="path848"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="21.426525"
y="275.73883"
id="text854"><tspan
sodipodi:role="line"
id="tspan852"
x="21.426525"
y="285.39432"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="25.962238"
y="272.19531"
id="text858"><tspan
sodipodi:role="line"
id="tspan856"
x="25.962238"
y="281.8508"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332" /></text>
<g
id="g4572">
<g
id="text862"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
aria-label="~">
<path
inkscape:connector-curvature="0"
id="path864"
style="stroke-width:0.26458332"
d="m 27.160395,274.77545 q -0.01034,0.5116 -0.118856,1.00769 -0.103353,0.4961 -0.335897,0.88367 -0.237711,0.39791 -0.573608,0.62528 -0.335897,0.22738 -0.852661,0.22738 -0.485758,0 -0.862996,-0.20154 -0.377238,-0.2067 -0.81132,-0.7338 -0.5271,-0.64596 -0.764812,-0.81132 -0.237711,-0.16537 -0.496093,-0.16537 -0.485759,0 -0.744141,0.45475 -0.258382,0.44959 -0.304891,1.46245 h -0.862996 q 0.01033,-0.51677 0.113688,-1.00252 0.10852,-0.49093 0.335897,-0.88884 0.222208,-0.38241 0.578776,-0.61495 0.356567,-0.23771 0.852661,-0.23771 0.480591,0 0.857829,0.20154 0.382405,0.19637 0.821655,0.7338 0.413411,0.50643 0.676961,0.74414 0.26355,0.23255 0.578776,0.23255 0.532267,0 0.780314,-0.52193 0.253215,-0.52194 0.268718,-1.39527 z" />
</g>
</g>
<g
transform="translate(-0.03100652,3.6756618)"
id="g4572-2">
<g
id="text862-6"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
aria-label="~">
<path
inkscape:connector-curvature="0"
id="path864-3"
style="stroke-width:0.26458332"
d="m 27.160395,274.77545 q -0.01034,0.5116 -0.118856,1.00769 -0.103353,0.4961 -0.335897,0.88367 -0.237711,0.39791 -0.573608,0.62528 -0.335897,0.22738 -0.852661,0.22738 -0.485758,0 -0.862996,-0.20154 -0.377238,-0.2067 -0.81132,-0.7338 -0.5271,-0.64596 -0.764812,-0.81132 -0.237711,-0.16537 -0.496093,-0.16537 -0.485759,0 -0.744141,0.45475 -0.258382,0.44959 -0.304891,1.46245 h -0.862996 q 0.01033,-0.51677 0.113688,-1.00252 0.10852,-0.49093 0.335897,-0.88884 0.222208,-0.38241 0.578776,-0.61495 0.356567,-0.23771 0.852661,-0.23771 0.480591,0 0.857829,0.20154 0.382405,0.19637 0.821655,0.7338 0.413411,0.50643 0.676961,0.74414 0.26355,0.23255 0.578776,0.23255 0.532267,0 0.780314,-0.52193 0.253215,-0.52194 0.268718,-1.39527 z" />
</g>
</g>
<g
transform="translate(-0.08637403,6.8460108)"
id="g4572-5">
<g
id="text862-1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
aria-label="~">
<path
inkscape:connector-curvature="0"
id="path864-0"
style="stroke-width:0.26458332"
d="m 27.160395,274.77545 q -0.01034,0.5116 -0.118856,1.00769 -0.103353,0.4961 -0.335897,0.88367 -0.237711,0.39791 -0.573608,0.62528 -0.335897,0.22738 -0.852661,0.22738 -0.485758,0 -0.862996,-0.20154 -0.377238,-0.2067 -0.81132,-0.7338 -0.5271,-0.64596 -0.764812,-0.81132 -0.237711,-0.16537 -0.496093,-0.16537 -0.485759,0 -0.744141,0.45475 -0.258382,0.44959 -0.304891,1.46245 h -0.862996 q 0.01033,-0.51677 0.113688,-1.00252 0.10852,-0.49093 0.335897,-0.88884 0.222208,-0.38241 0.578776,-0.61495 0.356567,-0.23771 0.852661,-0.23771 0.480591,0 0.857829,0.20154 0.382405,0.19637 0.821655,0.7338 0.413411,0.50643 0.676961,0.74414 0.26355,0.23255 0.578776,0.23255 0.532267,0 0.780314,-0.52193 0.253215,-0.52194 0.268718,-1.39527 z" />
</g>
</g>
<g
transform="translate(-0.11738003,10.521682)"
id="g4572-2-8">
<g
id="text862-6-6"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
aria-label="~">
<path
inkscape:connector-curvature="0"
id="path864-3-3"
style="stroke-width:0.26458332"
d="m 27.160395,274.77545 q -0.01034,0.5116 -0.118856,1.00769 -0.103353,0.4961 -0.335897,0.88367 -0.237711,0.39791 -0.573608,0.62528 -0.335897,0.22738 -0.852661,0.22738 -0.485758,0 -0.862996,-0.20154 -0.377238,-0.2067 -0.81132,-0.7338 -0.5271,-0.64596 -0.764812,-0.81132 -0.237711,-0.16537 -0.496093,-0.16537 -0.485759,0 -0.744141,0.45475 -0.258382,0.44959 -0.304891,1.46245 h -0.862996 q 0.01033,-0.51677 0.113688,-1.00252 0.10852,-0.49093 0.335897,-0.88884 0.222208,-0.38241 0.578776,-0.61495 0.356567,-0.23771 0.852661,-0.23771 0.480591,0 0.857829,0.20154 0.382405,0.19637 0.821655,0.7338 0.413411,0.50643 0.676961,0.74414 0.26355,0.23255 0.578776,0.23255 0.532267,0 0.780314,-0.52193 0.253215,-0.52194 0.268718,-1.39527 z" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB