Russian TTS
This commit is contained in:
Alexander Novikov
2017-12-05 20:02:10 +01:00
committed by Bertrand Songis
parent 421f16d0dd
commit 23eeccec9c
4 changed files with 497 additions and 1 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ include(Bitmaps)
set(PCB_TYPES X7 X9D X9D+ X9E X10 X12S 9X 9XR 9X128 9XR128 9X2561 GRUVIN9X MEGA2560 SKY9X 9XRPRO AR9X)
set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL)
set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU)
set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU RU)
set(PCB "X9D+" CACHE STRING "Radio type, one of: ${PCB_TYPES}")
set_property(CACHE PCB PROPERTY STRINGS ${PCB_TYPES})
+2
View File
@@ -843,6 +843,7 @@ extern const pm_char STR_BLCOLOR[];
extern const LanguagePack skLanguagePack;
extern const LanguagePack seLanguagePack;
extern const LanguagePack huLanguagePack;
extern const LanguagePack ruLanguagePack;
extern const LanguagePack * const languagePacks[];
#if defined(LANGUAGE_PACKS_DEFINITION)
const LanguagePack * const languagePacks[] = {
@@ -856,6 +857,7 @@ extern const pm_char STR_BLCOLOR[];
&itLanguagePack,
&plLanguagePack,
&ptLanguagePack,
&ruLanguagePack,
&seLanguagePack,
&skLanguagePack,
NULL
+222
View File
@@ -0,0 +1,222 @@
/*
* Author
* - Alexander Novikov (mr.pokryshkin@gmail.com)
*
* tts_ru is based on tts_de and tts_en
*
* opentx is based on code named
* gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/,
* er9x by Erez Raviv: http://code.google.com/p/er9x/,
* and the original (and ongoing) project by
* Thomas Husterer, th9x: http://code.google.com/p/th9x/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include "opentx.h"
enum RusPrompts {
RU_PROMPT_NUMBERS_BASE = 0,
RU_PROMPT_ZERO = RU_PROMPT_NUMBERS_BASE+0, //02-99
RU_PROMPT_HUNDRED = RU_PROMPT_NUMBERS_BASE+100, //100,200 .. 900
RU_PROMPT_AND = RU_PROMPT_NUMBERS_BASE+110, // и
RU_PROMPT_MINUS = RU_PROMPT_NUMBERS_BASE+111, // минус
RU_PROMPT_UNITS_BASE = RU_PROMPT_NUMBERS_BASE + 113,
RU_PROMPT_POINT_BASE = RU_PROMPT_NUMBERS_BASE + 165, //.0 - .9
RU_PROMPT_FEMALE_ONE = RU_PROMPT_NUMBERS_BASE + 180,
RU_PROMPT_FEMALE_TWO = RU_PROMPT_NUMBERS_BASE + 190,
RU_PROMPT_THOUSAND1 = RU_PROMPT_NUMBERS_BASE+200, //1000
RU_PROMPT_THOUSAND2 = RU_PROMPT_NUMBERS_BASE+201, //2000
RU_PROMPT_THOUSAND5 = RU_PROMPT_NUMBERS_BASE+202, //5000
};
#define MALE 0x00
#define FEMALE 0x01
#define RU_FEMALE_UNIT 0xFF
#if defined(VOICE)
#if defined(CPUARM)
#define RU_PUSH_UNIT_PROMPT(u, p) ru_pushUnitPrompt((u), (p), id)
#else
#define RU_PUSH_UNIT_PROMPT(u, p) pushUnitPrompt((u), (p))
#endif
I18N_PLAY_FUNCTION(ru, pushUnitPrompt, uint8_t unitprompt, int16_t number)
{
#if defined(CPUARM)
if (number < 0){ // if negative number, we have to use 2 units form (for example value = 1.3)
PUSH_UNIT_PROMPT(unitprompt, 2);
}
else{
int16_t mod10 = number % 10;
if (number == 0)
PUSH_UNIT_PROMPT(unitprompt, 0);
else if (number == 1)
PUSH_UNIT_PROMPT(unitprompt, 1);
else if (number>=2 && number <=4)
PUSH_UNIT_PROMPT(unitprompt, 2);
else if (number>=5 && number <=20)
PUSH_UNIT_PROMPT(unitprompt, 5);
else if (mod10 == 1)
PUSH_UNIT_PROMPT(unitprompt, 1);
else if (mod10 >= 2 && mod10 <=4)
PUSH_UNIT_PROMPT(unitprompt, 2);
else
PUSH_UNIT_PROMPT(unitprompt, 5);
}
#else
// TODO: add rules for Russian language
unitprompt = RU_PROMPT_UNITS_BASE + unitprompt*4;
if (number == 1)
PUSH_NUMBER_PROMPT(unitprompt);
else
PUSH_NUMBER_PROMPT(unitprompt+1);
#endif
}
I18N_PLAY_FUNCTION(ru, playNumber, getvalue_t number, uint8_t unit, uint8_t att)
{
if (number < 0) {
PUSH_NUMBER_PROMPT(RU_PROMPT_MINUS);
number = -number;
}
#if !defined(CPUARM)
if (unit) {
unit--;
convertUnit(number, unit);
if (IS_IMPERIAL_ENABLE()) {
if (unit == UNIT_DIST) {
unit = UNIT_FEET;
}
if (unit == UNIT_SPEED) {
unit = UNIT_KTS;
}
}
unit++;
}
#endif
div_t qr = div(number, 10);
int8_t mode = MODE(att);
if (mode > 0 && att != RU_FEMALE_UNIT) {
#if defined(CPUARM)
if (mode == 2) {
number /= 10;
}
#else
// we assume that we are PREC1
#endif
if (qr.rem) {
PLAY_NUMBER(qr.quot, 0, 0);
PUSH_NUMBER_PROMPT(RU_PROMPT_POINT_BASE + qr.rem);
number = -1;
}
else {
number = qr.quot;
}
}
int16_t tmp = number;
if (number >= 1000) {
PLAY_NUMBER(number / 1000, RU_FEMALE_UNIT, 0); // female
uint8_t thousands = number / 1000;
int16_t mod10 = thousands % 10;
if (thousands == 1)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND1);
else if (thousands>=2 && thousands <=4)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND2);
else if (thousands>=5 && thousands <=20)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND5);
else if (mod10 == 1)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND1);
else if (mod10 >= 2 && mod10 <=4)
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND2);
else
PUSH_NUMBER_PROMPT(RU_PROMPT_THOUSAND5);
number %= 1000;
if (number == 0)
number = -1;
}
if (number >= 100) {
PUSH_NUMBER_PROMPT(RU_PROMPT_HUNDRED + (number/100)-1);
number %= 100;
if (number == 0)
number = -1;
}
if (number >= 0) {
uint8_t attr = MALE;
switch(unit) {
case RU_FEMALE_UNIT:
case UNIT_MPH:
case UNIT_FLOZ:
case UNIT_MINUTES:
case UNIT_SECONDS:
attr = FEMALE;
break;
default:
attr = MALE;
break;
}
uint8_t lastDigit = number % 10;
uint8_t ten=(number - (number % 10))/10;
if (lastDigit == 1 && number != 11 && attr == FEMALE)
PUSH_NUMBER_PROMPT(RU_PROMPT_FEMALE_ONE + ten);
else if (lastDigit == 2 && number !=12 && attr == FEMALE)
PUSH_NUMBER_PROMPT(RU_PROMPT_FEMALE_TWO + ten);
else
PUSH_NUMBER_PROMPT(RU_PROMPT_ZERO + number);
}
if (unit) {
if (mode > 0 && qr.rem) // number with decimal point
RU_PUSH_UNIT_PROMPT(unit, -1); // force 2 units form, if float value
else
RU_PUSH_UNIT_PROMPT(unit, tmp);
}
}
I18N_PLAY_FUNCTION(ru, playDuration, int seconds PLAY_DURATION_ATT)
{
if (seconds == 0) {
PLAY_NUMBER(seconds, 0, 0);
return;
}
if (seconds < 0) {
PUSH_NUMBER_PROMPT(RU_PROMPT_MINUS);
seconds = -seconds;
}
uint8_t tmp = seconds / 3600;
seconds %= 3600;
if (tmp > 0 || IS_PLAY_TIME()) {
PLAY_NUMBER(tmp, UNIT_HOURS, 0);
}
tmp = seconds / 60;
seconds %= 60;
if (tmp > 0) {
PLAY_NUMBER(tmp, UNIT_MINUTES, 0);
if (seconds > 0)
PUSH_NUMBER_PROMPT(RU_PROMPT_AND);
}
if (seconds > 0) {
PLAY_NUMBER(seconds, UNIT_SECONDS, 0);
}
}
LANGUAGE_PACK_DECLARE(ru, "Russian");
#endif
+272
View File
@@ -0,0 +1,272 @@
SYSTEM|0000|0
SYSTEM|0001|1
SYSTEM|0002|2
SYSTEM|0003|3
SYSTEM|0004|4
SYSTEM|0005|5
SYSTEM|0006|6
SYSTEM|0007|7
SYSTEM|0008|8
SYSTEM|0009|9
SYSTEM|0010|10
SYSTEM|0011|11
SYSTEM|0012|12
SYSTEM|0013|13
SYSTEM|0014|14
SYSTEM|0015|15
SYSTEM|0016|16
SYSTEM|0017|17
SYSTEM|0018|18
SYSTEM|0019|19
SYSTEM|0020|20
SYSTEM|0021|21
SYSTEM|0022|22
SYSTEM|0023|23
SYSTEM|0024|24
SYSTEM|0025|25
SYSTEM|0026|26
SYSTEM|0027|27
SYSTEM|0028|28
SYSTEM|0029|29
SYSTEM|0030|30
SYSTEM|0031|31
SYSTEM|0032|32
SYSTEM|0033|33
SYSTEM|0034|34
SYSTEM|0035|35
SYSTEM|0036|36
SYSTEM|0037|37
SYSTEM|0038|38
SYSTEM|0039|39
SYSTEM|0040|40
SYSTEM|0041|41
SYSTEM|0042|42
SYSTEM|0043|43
SYSTEM|0044|44
SYSTEM|0045|45
SYSTEM|0046|46
SYSTEM|0047|47
SYSTEM|0048|48
SYSTEM|0049|49
SYSTEM|0050|50
SYSTEM|0051|51
SYSTEM|0052|52
SYSTEM|0053|53
SYSTEM|0054|54
SYSTEM|0055|55
SYSTEM|0056|56
SYSTEM|0057|57
SYSTEM|0058|58
SYSTEM|0059|59
SYSTEM|0060|60
SYSTEM|0061|61
SYSTEM|0062|62
SYSTEM|0063|63
SYSTEM|0064|64
SYSTEM|0065|65
SYSTEM|0066|66
SYSTEM|0067|67
SYSTEM|0068|68
SYSTEM|0069|69
SYSTEM|0070|70
SYSTEM|0071|71
SYSTEM|0072|72
SYSTEM|0073|73
SYSTEM|0074|74
SYSTEM|0075|75
SYSTEM|0076|76
SYSTEM|0077|77
SYSTEM|0078|78
SYSTEM|0079|79
SYSTEM|0080|80
SYSTEM|0081|81
SYSTEM|0082|82
SYSTEM|0083|83
SYSTEM|0084|84
SYSTEM|0085|85
SYSTEM|0086|86
SYSTEM|0087|87
SYSTEM|0088|88
SYSTEM|0089|89
SYSTEM|0090|90
SYSTEM|0091|91
SYSTEM|0092|92
SYSTEM|0093|93
SYSTEM|0094|94
SYSTEM|0095|95
SYSTEM|0096|96
SYSTEM|0097|97
SYSTEM|0098|98
SYSTEM|0099|99
SYSTEM|0100|100
SYSTEM|0101|200
SYSTEM|0102|300
SYSTEM|0103|400
SYSTEM|0104|500
SYSTEM|0105|600
SYSTEM|0106|700
SYSTEM|0107|800
SYSTEM|0108|900
SYSTEM|0109|1000
SYSTEM|0110|č
SYSTEM|0111|ěčíóń
SYSTEM|0112|
SYSTEM|0165|đîâíî
SYSTEM|0166|č îäíŕ äĺń˙ňŕ˙
SYSTEM|0167|č äâĺ äĺń˙ňűő
SYSTEM|0168|č ňđč äĺń˙ňűő
SYSTEM|0169|č ÷ĺňűđĺ äĺń˙ňűő
SYSTEM|0170|č ď˙ňü äĺń˙ňűő
SYSTEM|0171|č řĺńňü äĺń˙ňűő
SYSTEM|0172|č ńĺěü äĺń˙ňűő
SYSTEM|0173|č âîńĺěü äĺń˙ňűő
SYSTEM|0174|č äĺâ˙ňü äĺń˙ňűő
SYSTEM|volt0|âîëüň
SYSTEM|volt1|âîëüň
SYSTEM|volt2|âîëüňŕ
SYSTEM|volt5|âîëüň
SYSTEM|amp0|ŕěďĺđ
SYSTEM|amp1|ŕěďĺđ
SYSTEM|amp2|ŕěďĺđŕ
SYSTEM|amp5|ŕěďĺđ
SYSTEM|mamp0|ěčëëčŕěďĺđ
SYSTEM|mamp1|ěčëëčŕěďĺđ
SYSTEM|mamp2|ěčëëčŕěďĺđŕ
SYSTEM|mamp5|ěčëëčŕěďĺđ
SYSTEM|knot0|óçëîâ
SYSTEM|knot1|óçĺë
SYSTEM|knot2|óçëŕ
SYSTEM|knot5|óçëîâ
SYSTEM|mps0|ěĺňđîâ â ńĺęóíäó
SYSTEM|mps1|ěĺňđ â ńĺęóíäó
SYSTEM|mps2|ěĺňđŕ â ńĺęóíäó
SYSTEM|mps5|ěĺňđîâ â ńĺęóíäó
SYSTEM|celsius0|ăđŕäóńîâ
SYSTEM|celsius1|ăđŕäóń
SYSTEM|celsius2|ăđŕäóńŕ
SYSTEM|celsius5|ăđŕäóńîâ
SYSTEM|db0|äĺöčáĺë
SYSTEM|db1|äĺöčáĺë
SYSTEM|db2|äĺöčáĺëŕ
SYSTEM|db5|äĺöčáĺë
SYSTEM|degree0|ăđŕäóńîâ
SYSTEM|degree1|ăđŕäóń
SYSTEM|degree2|ăđŕäóńŕ
SYSTEM|degree5|ăđŕäóńîâ
SYSTEM|fahr0|ăđŕäóńîâ ďî ôŕđĺíăĺéňó
SYSTEM|fahr1|ăđŕäóń ďî ôŕđĺíăĺéňó
SYSTEM|fahr2|ăđŕäóńŕ ďî ôŕđĺíăĺéňó
SYSTEM|fahr5|ăđŕäóńîâ ďî ôŕđĺíăĺéňó
SYSTEM|foot0|ôóňîâ
SYSTEM|foot1|ôóň
SYSTEM|foot2|ôóňŕ
SYSTEM|foot5|ôóňîâ
SYSTEM|founce0|óíöčé
SYSTEM|founce1|óíöč˙
SYSTEM|founce2|óíöčč
SYSTEM|founce5|óíöčé
SYSTEM|fps0|ôóňîâ â ńĺęóíäó
SYSTEM|fps1|ôóň â ńĺęóíäó
SYSTEM|fps2|ôóňŕ â ńĺęóíäó
SYSTEM|fps5|ôóňîâ â ńĺęóíäó
SYSTEM|g0|äćč
SYSTEM|g1|äćč
SYSTEM|g2|äćč
SYSTEM|g5|äćč
SYSTEM|hour0|÷ŕńîâ
SYSTEM|hour1|÷ŕń
SYSTEM|hour2|÷ŕńŕ
SYSTEM|hour5|÷ŕńîâ
SYSTEM|kph0|ęčëîěĺňđîâ â ÷ŕń
SYSTEM|kph1|ęčëîěĺňđ â ÷ŕń
SYSTEM|kph2|ęčëîěĺňđŕ â ÷ŕń
SYSTEM|kph5|ęčëîěĺňđîâ â ÷ŕń
SYSTEM|mamph0|ěčëëčŕěďĺđ â ÷ŕń
SYSTEM|mamph1|ěčëëčŕěďĺđ â ÷ŕń
SYSTEM|mamph2|ěčëëčŕěďĺđŕ â ÷ŕń
SYSTEM|mamph5|ěčëëčŕěďĺđ â ÷ŕń
SYSTEM|meter0|ěĺňđîâ
SYSTEM|meter1|ěĺňđ
SYSTEM|meter2|ěĺňđŕ
SYSTEM|meter5|ěĺňđîâ
SYSTEM|minute0|ěčíóň
SYSTEM|minute1|ěčíóňŕ
SYSTEM|minute2|ěčíóňű
SYSTEM|minute5|ěčíóň
SYSTEM|ml0|ěčëëčëčňđîâ
SYSTEM|ml1|ěčëëčëčňđ
SYSTEM|ml2|ěčëëčëčňđŕ
SYSTEM|ml5|ěčëëčëčňđîâ
SYSTEM|mph0|ěčëü â ÷ŕń
SYSTEM|mph1|ěčë˙ â ÷ŕń
SYSTEM|mph2|ěčëč â ÷ŕń
SYSTEM|mph5|ěčëü â ÷ŕń
SYSTEM|mwatt0|ěčëëčâŕňň
SYSTEM|mwatt1|ěčëëčâŕňň
SYSTEM|mwatt2|ěčëëčâŕňňŕ
SYSTEM|mwatt5|ěčëëčâŕňň
SYSTEM|percent0|ďđîöĺíňîâ
SYSTEM|percent1|ďđîöĺíň
SYSTEM|percent2|ďđîöĺíňŕ
SYSTEM|percent5|ďđîöĺíňîâ
SYSTEM|radian0|đŕäčŕí
SYSTEM|radian1|đŕäčŕí
SYSTEM|radian2|đŕäčŕíŕ
SYSTEM|radian5|đŕäčŕí
SYSTEM|rpm0|îáîđîňîâ â ěčíóňó
SYSTEM|rpm1|îáîđîň â ěčíóňó
SYSTEM|rpm2|îáîđîňŕ â ěčíóňó
SYSTEM|rpm5|îáîđîňîâ â ěčíóňó
SYSTEM|second0|ńĺęóíä
SYSTEM|second1|ńĺęóíäŕ
SYSTEM|second2|ńĺęóíäű
SYSTEM|second5|ńĺęóíä
SYSTEM|watt0|âŕňň
SYSTEM|watt1|âŕňň
SYSTEM|watt2|âŕňňŕ
SYSTEM|watt5|âŕňň
SYSTEM|eebad|Îřčáęŕ ďŕě˙ňč
SYSTEM|hello|Ňŕęč çäđŕâńňâóéňĺ!
SYSTEM|inactiv|ß ňóň! Ďđî ěĺí˙ çŕáűëč!
SYSTEM|lowbatt|Ŕęęóěóë˙ňîđ đŕçđ˙ćĺí
SYSTEM|maxtrim|Ňđčěěĺđ ěŕęńčěóě
SYSTEM|midtrim|Ňđčěěĺđ ďî öĺíňđó
SYSTEM|mintrim|Ňđčěěĺđ ěčíčěóě
SYSTEM|rssi_org|Ńëŕáűé ńčăíŕë!
SYSTEM|rssi_red|Î÷ĺíü ńëŕáűé ńčăíŕë!
SYSTEM|rxko|
SYSTEM|sensorko|Ńĺíńîđ îňęëţ÷ĺí
SYSTEM|servoko|
SYSTEM|swalert|Ďđîâĺđü ňóěáëĺđű!
SYSTEM|swr_red|Ďđîáëĺěű ń ŕíňĺííîé ďĺđĺäŕň÷čęŕ!
SYSTEM|telemko|Ďîňĺđ˙í ńčăíŕë ňĺëĺěĺňđčč
SYSTEM|telemok|Ňĺëĺěĺňđč˙ âîńńňŕíîâëĺíŕ
SYSTEM|thralert|Óáĺđč ăŕç!
SYSTEM|timovr1|Ňŕéěĺđ 1. Âđĺě˙ âűřëî
SYSTEM|timovr2|Ňŕéěĺđ 2. Âđĺě˙ âűřëî
SYSTEM|timovr3|Ňŕéěĺđ 3. Âđĺě˙ âűřëî
SYSTEM|trainko|Ňđĺíĺđńęčé ńčăíŕë ďîňĺđ˙í
SYSTEM|trainok|Ďî˙âčëń˙ ňđĺíĺđńęčé ńčăíŕë
SYSTEM|0180|îäíŕ
SYSTEM|0181|îäčííŕäöŕňü
SYSTEM|0182|äâŕäöŕňü îäíŕ
SYSTEM|0183|ňđčäöŕňü îäíŕ
SYSTEM|0184|ńîđîę îäíŕ
SYSTEM|0185|ď˙ňüäĺń˙ň îäíŕ
SYSTEM|0186|řĺńňüäĺń˙ň îäíŕ
SYSTEM|0187|ńĺěüäĺń˙ň îäíŕ
SYSTEM|0188|âîńĺěüäĺń˙ň îäíŕ
SYSTEM|0189|äĺâ˙íîńňî îäíŕ
SYSTEM|0190|äâĺ
SYSTEM|0191|äâĺíŕäöŕňü
SYSTEM|0192|äâŕäöŕňü äâĺ
SYSTEM|0193|ňđčäöŕňü äâĺ
SYSTEM|0194|ńîđîę äâĺ
SYSTEM|0195|ď˙ňüäĺń˙ň äâĺ
SYSTEM|0196|řĺńňüäĺń˙ň äâĺ
SYSTEM|0197|ńĺěüäĺń˙ň äâĺ
SYSTEM|0198|âîńĺěüäĺń˙ň äâĺ
SYSTEM|0199|äĺâ˙íîńňî äâĺ
SYSTEM|0200|ňűń˙÷ŕ
SYSTEM|0201|ňűń˙÷č
SYSTEM|0202|ňűń˙÷