Commit d97a9d7a authored by Samuel Thibault's avatar Samuel Thibault Committed by Greg Kroah-Hartman

staging/speakup: Add inflection synth parameter

The inflection parameter, i.e. the pitch range, allows to change the
expressiveness of the synthesized voice.  This is supported by the DEC
talk synths, and software synthesizers such as espeak/espeak-ng.
Signed-off-by: default avatarSamuel Thibault <samuel.thibault@ens-lyon.org>
Link: https://lore.kernel.org/r/20200425193226.nv3zfd4k3xavi353@functionSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent de24e9b3
...@@ -43,6 +43,7 @@ static struct var_t vars[] = { ...@@ -43,6 +43,7 @@ static struct var_t vars[] = {
{ CAPS_STOP, .u.s = {"[:dv ap 100]" } }, { CAPS_STOP, .u.s = {"[:dv ap 100]" } },
{ RATE, .u.n = {"[:ra %d]", 7, 0, 9, 150, 25, NULL } }, { RATE, .u.n = {"[:ra %d]", 7, 0, 9, 150, 25, NULL } },
{ PITCH, .u.n = {"[:dv ap %d]", 100, 0, 100, 0, 0, NULL } }, { PITCH, .u.n = {"[:dv ap %d]", 100, 0, 100, 0, 0, NULL } },
{ INFLECTION, .u.n = {"[:dv pr %d] ", 100, 0, 10000, 0, 0, NULL } },
{ VOL, .u.n = {"[:dv gv %d]", 13, 0, 16, 0, 5, NULL } }, { VOL, .u.n = {"[:dv gv %d]", 13, 0, 16, 0, 5, NULL } },
{ PUNCT, .u.n = {"[:pu %c]", 0, 0, 2, 0, 0, "nsa" } }, { PUNCT, .u.n = {"[:pu %c]", 0, 0, 2, 0, 0, "nsa" } },
{ VOICE, .u.n = {"[:n%c]", 0, 0, 9, 0, 0, "phfdburwkv" } }, { VOICE, .u.n = {"[:n%c]", 0, 0, 9, 0, 0, "phfdburwkv" } },
...@@ -59,6 +60,8 @@ static struct kobj_attribute caps_stop_attribute = ...@@ -59,6 +60,8 @@ static struct kobj_attribute caps_stop_attribute =
__ATTR(caps_stop, 0644, spk_var_show, spk_var_store); __ATTR(caps_stop, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute pitch_attribute = static struct kobj_attribute pitch_attribute =
__ATTR(pitch, 0644, spk_var_show, spk_var_store); __ATTR(pitch, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute inflection_attribute =
__ATTR(inflection, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute punct_attribute = static struct kobj_attribute punct_attribute =
__ATTR(punct, 0644, spk_var_show, spk_var_store); __ATTR(punct, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute rate_attribute = static struct kobj_attribute rate_attribute =
...@@ -87,6 +90,7 @@ static struct attribute *synth_attrs[] = { ...@@ -87,6 +90,7 @@ static struct attribute *synth_attrs[] = {
&caps_start_attribute.attr, &caps_start_attribute.attr,
&caps_stop_attribute.attr, &caps_stop_attribute.attr,
&pitch_attribute.attr, &pitch_attribute.attr,
&inflection_attribute.attr,
&punct_attribute.attr, &punct_attribute.attr,
&rate_attribute.attr, &rate_attribute.attr,
&voice_attribute.attr, &voice_attribute.attr,
......
...@@ -139,6 +139,7 @@ static struct var_t vars[] = { ...@@ -139,6 +139,7 @@ static struct var_t vars[] = {
{ CAPS_STOP, .u.s = {"[:dv ap 100]" } }, { CAPS_STOP, .u.s = {"[:dv ap 100]" } },
{ RATE, .u.n = {"[:ra %d]", 9, 0, 18, 150, 25, NULL } }, { RATE, .u.n = {"[:ra %d]", 9, 0, 18, 150, 25, NULL } },
{ PITCH, .u.n = {"[:dv ap %d]", 80, 0, 100, 20, 0, NULL } }, { PITCH, .u.n = {"[:dv ap %d]", 80, 0, 100, 20, 0, NULL } },
{ INFLECTION, .u.n = {"[:dv pr %d] ", 100, 0, 10000, 0, 0, NULL } },
{ VOL, .u.n = {"[:vo se %d]", 5, 0, 9, 5, 10, NULL } }, { VOL, .u.n = {"[:vo se %d]", 5, 0, 9, 5, 10, NULL } },
{ PUNCT, .u.n = {"[:pu %c]", 0, 0, 2, 0, 0, "nsa" } }, { PUNCT, .u.n = {"[:pu %c]", 0, 0, 2, 0, 0, "nsa" } },
{ VOICE, .u.n = {"[:n%c]", 0, 0, 9, 0, 0, "phfdburwkv" } }, { VOICE, .u.n = {"[:n%c]", 0, 0, 9, 0, 0, "phfdburwkv" } },
...@@ -155,6 +156,8 @@ static struct kobj_attribute caps_stop_attribute = ...@@ -155,6 +156,8 @@ static struct kobj_attribute caps_stop_attribute =
__ATTR(caps_stop, 0644, spk_var_show, spk_var_store); __ATTR(caps_stop, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute pitch_attribute = static struct kobj_attribute pitch_attribute =
__ATTR(pitch, 0644, spk_var_show, spk_var_store); __ATTR(pitch, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute inflection_attribute =
__ATTR(inflection, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute punct_attribute = static struct kobj_attribute punct_attribute =
__ATTR(punct, 0644, spk_var_show, spk_var_store); __ATTR(punct, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute rate_attribute = static struct kobj_attribute rate_attribute =
...@@ -183,6 +186,7 @@ static struct attribute *synth_attrs[] = { ...@@ -183,6 +186,7 @@ static struct attribute *synth_attrs[] = {
&caps_start_attribute.attr, &caps_start_attribute.attr,
&caps_stop_attribute.attr, &caps_stop_attribute.attr,
&pitch_attribute.attr, &pitch_attribute.attr,
&inflection_attribute.attr,
&punct_attribute.attr, &punct_attribute.attr,
&rate_attribute.attr, &rate_attribute.attr,
&voice_attribute.attr, &voice_attribute.attr,
......
...@@ -44,7 +44,7 @@ static struct var_t vars[] = { ...@@ -44,7 +44,7 @@ static struct var_t vars[] = {
{ CAPS_START, .u.s = {"[:dv ap 160] " } }, { CAPS_START, .u.s = {"[:dv ap 160] " } },
{ CAPS_STOP, .u.s = {"[:dv ap 100 ] " } }, { CAPS_STOP, .u.s = {"[:dv ap 100 ] " } },
{ RATE, .u.n = {"[:ra %d] ", 180, 75, 650, 0, 0, NULL } }, { RATE, .u.n = {"[:ra %d] ", 180, 75, 650, 0, 0, NULL } },
{ PITCH, .u.n = {"[:dv ap %d] ", 122, 50, 350, 0, 0, NULL } }, { INFLECTION, .u.n = {"[:dv pr %d] ", 100, 0, 10000, 0, 0, NULL } },
{ VOL, .u.n = {"[:dv g5 %d] ", 86, 60, 86, 0, 0, NULL } }, { VOL, .u.n = {"[:dv g5 %d] ", 86, 60, 86, 0, 0, NULL } },
{ PUNCT, .u.n = {"[:pu %c] ", 0, 0, 2, 0, 0, "nsa" } }, { PUNCT, .u.n = {"[:pu %c] ", 0, 0, 2, 0, 0, "nsa" } },
{ VOICE, .u.n = {"[:n%c] ", 0, 0, 9, 0, 0, "phfdburwkv" } }, { VOICE, .u.n = {"[:n%c] ", 0, 0, 9, 0, 0, "phfdburwkv" } },
...@@ -61,6 +61,8 @@ static struct kobj_attribute caps_stop_attribute = ...@@ -61,6 +61,8 @@ static struct kobj_attribute caps_stop_attribute =
__ATTR(caps_stop, 0644, spk_var_show, spk_var_store); __ATTR(caps_stop, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute pitch_attribute = static struct kobj_attribute pitch_attribute =
__ATTR(pitch, 0644, spk_var_show, spk_var_store); __ATTR(pitch, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute inflection_attribute =
__ATTR(inflection, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute punct_attribute = static struct kobj_attribute punct_attribute =
__ATTR(punct, 0644, spk_var_show, spk_var_store); __ATTR(punct, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute rate_attribute = static struct kobj_attribute rate_attribute =
...@@ -89,6 +91,7 @@ static struct attribute *synth_attrs[] = { ...@@ -89,6 +91,7 @@ static struct attribute *synth_attrs[] = {
&caps_start_attribute.attr, &caps_start_attribute.attr,
&caps_stop_attribute.attr, &caps_stop_attribute.attr,
&pitch_attribute.attr, &pitch_attribute.attr,
&inflection_attribute.attr,
&punct_attribute.attr, &punct_attribute.attr,
&rate_attribute.attr, &rate_attribute.attr,
&voice_attribute.attr, &voice_attribute.attr,
......
...@@ -24,6 +24,7 @@ static struct var_t vars[] = { ...@@ -24,6 +24,7 @@ static struct var_t vars[] = {
{ PAUSE, .u.s = {"PAUSE\n"} }, { PAUSE, .u.s = {"PAUSE\n"} },
{ RATE, .u.n = {"RATE %d\n", 8, 1, 16, 0, 0, NULL } }, { RATE, .u.n = {"RATE %d\n", 8, 1, 16, 0, 0, NULL } },
{ PITCH, .u.n = {"PITCH %d\n", 8, 0, 16, 0, 0, NULL } }, { PITCH, .u.n = {"PITCH %d\n", 8, 0, 16, 0, 0, NULL } },
{ INFLECTION, .u.n = {"INFLECTION %d\n", 8, 0, 16, 0, 0, NULL } },
{ VOL, .u.n = {"VOL %d\n", 8, 0, 16, 0, 0, NULL } }, { VOL, .u.n = {"VOL %d\n", 8, 0, 16, 0, 0, NULL } },
{ TONE, .u.n = {"TONE %d\n", 8, 0, 16, 0, 0, NULL } }, { TONE, .u.n = {"TONE %d\n", 8, 0, 16, 0, 0, NULL } },
{ DIRECT, .u.n = {NULL, 0, 0, 1, 0, 0, NULL } }, { DIRECT, .u.n = {NULL, 0, 0, 1, 0, 0, NULL } },
...@@ -39,6 +40,8 @@ static struct kobj_attribute caps_stop_attribute = ...@@ -39,6 +40,8 @@ static struct kobj_attribute caps_stop_attribute =
__ATTR(caps_stop, 0644, spk_var_show, spk_var_store); __ATTR(caps_stop, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute pitch_attribute = static struct kobj_attribute pitch_attribute =
__ATTR(pitch, 0644, spk_var_show, spk_var_store); __ATTR(pitch, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute inflection_attribute =
__ATTR(inflection, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute rate_attribute = static struct kobj_attribute rate_attribute =
__ATTR(rate, 0644, spk_var_show, spk_var_store); __ATTR(rate, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute tone_attribute = static struct kobj_attribute tone_attribute =
...@@ -65,6 +68,7 @@ static struct attribute *synth_attrs[] = { ...@@ -65,6 +68,7 @@ static struct attribute *synth_attrs[] = {
&caps_start_attribute.attr, &caps_start_attribute.attr,
&caps_stop_attribute.attr, &caps_stop_attribute.attr,
&pitch_attribute.attr, &pitch_attribute.attr,
&inflection_attribute.attr,
&rate_attribute.attr, &rate_attribute.attr,
&tone_attribute.attr, &tone_attribute.attr,
&vol_attribute.attr, &vol_attribute.attr,
......
...@@ -38,6 +38,7 @@ static struct var_t vars[] = { ...@@ -38,6 +38,7 @@ static struct var_t vars[] = {
{ PAUSE, .u.n = {"\x01P" } }, { PAUSE, .u.n = {"\x01P" } },
{ RATE, .u.n = {"\x01%ds", 2, 0, 9, 0, 0, NULL } }, { RATE, .u.n = {"\x01%ds", 2, 0, 9, 0, 0, NULL } },
{ PITCH, .u.n = {"\x01%dp", 5, 0, 9, 0, 0, NULL } }, { PITCH, .u.n = {"\x01%dp", 5, 0, 9, 0, 0, NULL } },
{ INFLECTION, .u.n = {"\x01%dr", 5, 0, 9, 0, 0, NULL } },
{ VOL, .u.n = {"\x01%dv", 5, 0, 9, 0, 0, NULL } }, { VOL, .u.n = {"\x01%dv", 5, 0, 9, 0, 0, NULL } },
{ TONE, .u.n = {"\x01%dx", 1, 0, 2, 0, 0, NULL } }, { TONE, .u.n = {"\x01%dx", 1, 0, 2, 0, 0, NULL } },
{ PUNCT, .u.n = {"\x01%db", 0, 0, 2, 0, 0, NULL } }, { PUNCT, .u.n = {"\x01%db", 0, 0, 2, 0, 0, NULL } },
...@@ -57,6 +58,8 @@ static struct kobj_attribute freq_attribute = ...@@ -57,6 +58,8 @@ static struct kobj_attribute freq_attribute =
__ATTR(freq, 0644, spk_var_show, spk_var_store); __ATTR(freq, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute pitch_attribute = static struct kobj_attribute pitch_attribute =
__ATTR(pitch, 0644, spk_var_show, spk_var_store); __ATTR(pitch, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute inflection_attribute =
__ATTR(inflection, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute punct_attribute = static struct kobj_attribute punct_attribute =
__ATTR(punct, 0644, spk_var_show, spk_var_store); __ATTR(punct, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute rate_attribute = static struct kobj_attribute rate_attribute =
...@@ -96,6 +99,7 @@ static struct attribute *synth_attrs[] = { ...@@ -96,6 +99,7 @@ static struct attribute *synth_attrs[] = {
&freq_attribute.attr, &freq_attribute.attr,
/* &lang_attribute.attr, */ /* &lang_attribute.attr, */
&pitch_attribute.attr, &pitch_attribute.attr,
&inflection_attribute.attr,
&punct_attribute.attr, &punct_attribute.attr,
&rate_attribute.attr, &rate_attribute.attr,
&tone_attribute.attr, &tone_attribute.attr,
......
...@@ -42,7 +42,8 @@ enum var_id_t { ...@@ -42,7 +42,8 @@ enum var_id_t {
SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO, SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO,
SPELL_DELAY, PUNC_LEVEL, READING_PUNC, SPELL_DELAY, PUNC_LEVEL, READING_PUNC,
ATTRIB_BLEEP, BLEEPS, ATTRIB_BLEEP, BLEEPS,
RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG, DIRECT, PAUSE, RATE, PITCH, INFLECTION, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG,
DIRECT, PAUSE,
CAPS_START, CAPS_STOP, CHARTAB, CAPS_START, CAPS_STOP, CHARTAB,
MAXVARS MAXVARS
}; };
......
...@@ -406,6 +406,7 @@ freq ...@@ -406,6 +406,7 @@ freq
full_time full_time
jiffy_delta jiffy_delta
pitch pitch
inflection
punct punct
rate rate
tone tone
...@@ -518,9 +519,9 @@ All the entries in the Speakup sys system are readable, some are ...@@ -518,9 +519,9 @@ All the entries in the Speakup sys system are readable, some are
writable by root only, and some are writable by everyone. Unless you writable by root only, and some are writable by everyone. Unless you
know what you are doing, you should probably leave the ones that are know what you are doing, you should probably leave the ones that are
writable by root only alone. Most of the names are self explanatory. writable by root only alone. Most of the names are self explanatory.
Vol for controlling volume, pitch for pitch, rate for controlling speaking Vol for controlling volume, pitch for pitch, inflection for pitch range, rate
rate, etc. If you find one you aren't sure about, you can post a query for controlling speaking rate, etc. If you find one you aren't sure about, you
on the Speakup list. can post a query on the Speakup list.
6. Changing Synthesizers 6. Changing Synthesizers
......
...@@ -325,6 +325,12 @@ KernelVersion: 2.6 ...@@ -325,6 +325,12 @@ KernelVersion: 2.6
Contact: speakup@linux-speakup.org Contact: speakup@linux-speakup.org
Description: Gets or sets the pitch of the synthesizer. The range is 0-9. Description: Gets or sets the pitch of the synthesizer. The range is 0-9.
What: /sys/accessibility/speakup/soft/inflection
KernelVersion: 5.8
Contact: speakup@linux-speakup.org
Description: Gets or sets the inflection of the synthesizer, i.e. the pitch
range. The range is 0-9.
What: /sys/accessibility/speakup/soft/punct What: /sys/accessibility/speakup/soft/punct
KernelVersion: 2.6 KernelVersion: 2.6
Contact: speakup@linux-speakup.org Contact: speakup@linux-speakup.org
......
...@@ -37,6 +37,7 @@ static struct st_var_header var_headers[] = { ...@@ -37,6 +37,7 @@ static struct st_var_header var_headers[] = {
{ "bell_pos", BELL_POS, VAR_NUM, &spk_bell_pos, NULL }, { "bell_pos", BELL_POS, VAR_NUM, &spk_bell_pos, NULL },
{ "rate", RATE, VAR_NUM, NULL, NULL }, { "rate", RATE, VAR_NUM, NULL, NULL },
{ "pitch", PITCH, VAR_NUM, NULL, NULL }, { "pitch", PITCH, VAR_NUM, NULL, NULL },
{ "inflection", INFLECTION, VAR_NUM, NULL, NULL },
{ "vol", VOL, VAR_NUM, NULL, NULL }, { "vol", VOL, VAR_NUM, NULL, NULL },
{ "tone", TONE, VAR_NUM, NULL, NULL }, { "tone", TONE, VAR_NUM, NULL, NULL },
{ "punct", PUNCT, VAR_NUM, NULL, NULL }, { "punct", PUNCT, VAR_NUM, NULL, NULL },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment