Skip to content

Commit

Permalink
Fix narrator
Browse files Browse the repository at this point in the history
  • Loading branch information
viachaslavic committed Jan 30, 2024
1 parent eabdc19 commit c29c6c7
Show file tree
Hide file tree
Showing 7 changed files with 290 additions and 312 deletions.
7 changes: 7 additions & 0 deletions accessibility.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,13 @@ bool accessibility_speak_priority(
unsigned accessibility_narrator_speech_speed,
const char* speak_text, int priority);

bool narrator_speak_priority(
bool accessibility_enable,
const char *voice,
unsigned accessibility_narrator_speech_speed,
const char *speak_text,
int priority);

access_state_t *access_state_get_ptr(void);

#endif
3 changes: 1 addition & 2 deletions frontend/drivers/platform_darwin.m
Original file line number Diff line number Diff line change
Expand Up @@ -884,11 +884,10 @@ static bool is_narrator_running_macos(void)
return (kill(speak_pid, 0) == 0);
}

static bool accessibility_speak_macos(int speed,
static bool accessibility_speak_macos(const char* voice, int speed,
const char* speak_text, int priority)
{
int pid;
const char *voice = get_user_language_iso639_1(false);
char* language_speaker = accessibility_mac_language_code(voice);
char* speeds[10] = {"80", "100", "125", "150", "170", "210",
"260", "310", "380", "450"};
Expand Down
239 changes: 96 additions & 143 deletions frontend/drivers/platform_unix.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@
#include "../../msg_hash.h"
#include "../../paths.h"
#include "../../retroarch.h"
#include "../../translation_defines.h"
#include "../../verbosity.h"

#ifdef HAVE_MENU
Expand Down Expand Up @@ -798,7 +797,7 @@ static void check_proc_acpi_sysfs_battery(const char *node,
}

fill_pathname_join_special(path, basenode, "type", sizeof(path));

if (!filestream_exists(path))
goto status;

Expand Down Expand Up @@ -2789,152 +2788,106 @@ static bool is_narrator_running_unix(void)
return (kill(speak_pid, 0) == 0);
}

/**
* Returns the espeak-compatible string representation of the translation language enum value.
*/
static const char* espeak_get_str(enum translation_lang id)
{
switch (id)
{
case TRANSLATION_LANG_EN:
return "en";
case TRANSLATION_LANG_ES:
return "es";
case TRANSLATION_LANG_FR:
return "fr";
case TRANSLATION_LANG_IT:
return "it";
case TRANSLATION_LANG_DE:
return "de";
case TRANSLATION_LANG_JP:
return "ja";
case TRANSLATION_LANG_NL:
return "nl";
case TRANSLATION_LANG_CS:
return "cs";
case TRANSLATION_LANG_DA:
return "da";
case TRANSLATION_LANG_SV:
return "sv";
case TRANSLATION_LANG_HR:
return "hr";
case TRANSLATION_LANG_KO:
return "ko";
case TRANSLATION_LANG_ZH_CN:
case TRANSLATION_LANG_ZH_TW:
return "cmn";
case TRANSLATION_LANG_CA:
return "ca";
case TRANSLATION_LANG_BG:
return "bg";
case TRANSLATION_LANG_BN:
return "bn";
case TRANSLATION_LANG_EU:
return "eu";
case TRANSLATION_LANG_AZ:
return "az";
case TRANSLATION_LANG_AR:
return "ar";
case TRANSLATION_LANG_SQ:
return "sq";
case TRANSLATION_LANG_AF:
return "af";
case TRANSLATION_LANG_EO:
return "eo";
case TRANSLATION_LANG_ET:
return "et";
case TRANSLATION_LANG_FI:
return "fi";
case TRANSLATION_LANG_KA:
return "ka";
case TRANSLATION_LANG_EL:
return "el";
case TRANSLATION_LANG_GU:
return "gu";
case TRANSLATION_LANG_HT:
return "ht";
case TRANSLATION_LANG_HE:
return "he";
case TRANSLATION_LANG_HI:
return "hi";
case TRANSLATION_LANG_HU:
return "hu";
case TRANSLATION_LANG_IS:
return "is";
case TRANSLATION_LANG_ID:
return "id";
case TRANSLATION_LANG_GA:
return "ga";
case TRANSLATION_LANG_KN:
return "kn";
case TRANSLATION_LANG_LA:
return "la";
case TRANSLATION_LANG_LV:
return "lv";
case TRANSLATION_LANG_LT:
return "lt";
case TRANSLATION_LANG_MK:
return "mk";
case TRANSLATION_LANG_MS:
return "ms";
case TRANSLATION_LANG_MT:
return "mt";
case TRANSLATION_LANG_NO:
return "nb";
case TRANSLATION_LANG_FA:
return "fa";
case TRANSLATION_LANG_PL:
return "pl";
case TRANSLATION_LANG_PT:
return "pt";
case TRANSLATION_LANG_RO:
return "ro";
case TRANSLATION_LANG_RU:
return "ru";
case TRANSLATION_LANG_SR:
return "sr";
case TRANSLATION_LANG_SK:
return "sk";
case TRANSLATION_LANG_SL:
return "sl";
case TRANSLATION_LANG_SW:
return "sw";
case TRANSLATION_LANG_TA:
return "ta";
case TRANSLATION_LANG_TE:
return "te";
case TRANSLATION_LANG_TH:
return "th";
case TRANSLATION_LANG_TR:
return "tr";
case TRANSLATION_LANG_UK:
return "uk";
case TRANSLATION_LANG_BE:
return "be";
case TRANSLATION_LANG_UR:
return "ur";
case TRANSLATION_LANG_VI:
return "vi";
case TRANSLATION_LANG_CY:
return "cy";
case TRANSLATION_LANG_AST:
case TRANSLATION_LANG_TL:
case TRANSLATION_LANG_GL:
case TRANSLATION_LANG_YI:
case TRANSLATION_LANG_DONT_CARE:
case TRANSLATION_LANG_LAST:
break;
}
static const char* accessibility_unix_language_code(const char* language)
{
if (
string_is_equal(language, "en") ||
string_is_equal(language, "it") ||
string_is_equal(language, "sv") ||
string_is_equal(language, "fr") ||
string_is_equal(language, "de") ||
string_is_equal(language, "he") ||
string_is_equal(language, "id") ||
string_is_equal(language, "es") ||
string_is_equal(language, "nl") ||
string_is_equal(language, "ro") ||
string_is_equal(language, "th") ||
string_is_equal(language, "ja") ||
string_is_equal(language, "sk") ||
string_is_equal(language, "hi") ||
string_is_equal(language, "ar") ||
string_is_equal(language, "hu") ||
string_is_equal(language, "el") ||
string_is_equal(language, "ru") ||
string_is_equal(language, "nb") ||
string_is_equal(language, "da") ||
string_is_equal(language, "fi") ||
string_is_equal(language, "tr") ||
string_is_equal(language, "ko") ||
string_is_equal(language, "pl") ||
string_is_equal(language, "cs") ||
string_is_equal(language, "eo") ||
string_is_equal(language, "vi") ||
string_is_equal(language, "fa") ||
string_is_equal(language, "uk") ||
string_is_equal(language, "be") ||
string_is_equal(language, "hr") ||
string_is_equal(language, "bg") ||
string_is_equal(language, "bn") ||
string_is_equal(language, "eu") ||
string_is_equal(language, "az") ||
string_is_equal(language, "sq") ||
string_is_equal(language, "af") ||
string_is_equal(language, "et") ||
string_is_equal(language, "ka") ||
string_is_equal(language, "gu") ||
string_is_equal(language, "ht") ||
string_is_equal(language, "is") ||
string_is_equal(language, "ga") ||
string_is_equal(language, "kn") ||
string_is_equal(language, "la") ||
string_is_equal(language, "lv") ||
string_is_equal(language, "lt") ||
string_is_equal(language, "mk") ||
string_is_equal(language, "ms") ||
string_is_equal(language, "mt") ||
string_is_equal(language, "sr") ||
string_is_equal(language, "sl") ||
string_is_equal(language, "sw") ||
string_is_equal(language, "ta") ||
string_is_equal(language, "te") ||
string_is_equal(language, "ur") ||
string_is_equal(language, "cy")
)
return language;
else if (
string_is_equal(language, "no") ||
string_is_equal(language, "nb")
)
return "nb";
else if (string_is_equal(language, "en_gb"))
return "en-gb";
else if (
string_is_equal(language, "ca") ||
string_is_equal(language, "ca_ES@valencia")
)
return "ca";
else if (
string_is_equal(language, "pt_pt") ||
string_is_equal(language, "pt")
)
return "pt";
else if (string_is_equal(language, "pt_bt"))
return "pt-br";
else if (
string_is_equal(language, "zh") ||
string_is_equal(language, "zh_cn") ||
string_is_equal(language, "zh_tw") ||
string_is_equal(language, "zh-CN") ||
string_is_equal(language, "zh-TW")
)
return "cmn";
else if (string_is_equal(language, "zh_hk"))
return "yue";
/* default voice as fallback */
return "en";
}

static bool accessibility_speak_unix(int speed,
static bool accessibility_speak_unix(const char* voice, int speed,
const char* speak_text, int priority)
{
int pid;
settings_t *settings = config_get_ptr();
unsigned target_lang = settings->uints.ai_service_target_lang;
const char *language = espeak_get_str((enum translation_lang)target_lang);
const char* language = accessibility_unix_language_code(voice);
char* voice_out = (char*)malloc(3 + strlen(language));
char* speed_out = (char*)malloc(3 + 3);
const char* speeds[10] = {"80", "100", "125", "150", "170", "210", "260", "310", "380", "450"};
Expand Down Expand Up @@ -2994,7 +2947,7 @@ static bool accessibility_speak_unix(int speed,
/* Tell the system that we'll ignore the exit status of the child
* process. This prevents zombie processes. */
signal(SIGCHLD, SIG_IGN);
}
}
}

end:
Expand Down
31 changes: 24 additions & 7 deletions frontend/drivers/platform_win32.c
Original file line number Diff line number Diff line change
Expand Up @@ -831,7 +831,7 @@ static const char *accessibility_win_language_id(const char* language)
return "401";
else if (string_is_equal(language,"hu"))
return "040e";
else if (string_is_equal(language,"zh_tw") || string_is_equal(language,"zh"))
else if (string_is_equal(language, "zh_tw") || string_is_equal(language,"zh"))
return "804";
else if (string_is_equal(language,"el"))
return "408";
Expand Down Expand Up @@ -896,30 +896,48 @@ static const char *accessibility_win_language_code(const char* language)
return "Microsoft Naayf Desktop";
else if (string_is_equal(language,"hu"))
return "Microsoft Szabolcs Desktop";
else if (string_is_equal(language,"zh_tw") || string_is_equal(language,"zh"))
else if (string_is_equal(language, "zh_tw")
|| string_is_equal(language,"zh-TW")
|| string_is_equal(language,"zh"))
return "Microsoft Zhiwei Desktop";
else if (string_is_equal(language,"el"))
return "Microsoft Stefanos Desktop";
else if (string_is_equal(language,"ru"))
return "Microsoft Pavel Desktop";
else if (string_is_equal(language,"nb"))
else if (string_is_equal(language,"no") || string_is_equal(language,"nb"))
return "Microsoft Jon Desktop";
else if (string_is_equal(language,"da"))
return "Microsoft Helle Desktop";
else if (string_is_equal(language,"fi"))
return "Microsoft Heidi Desktop";
else if (string_is_equal(language,"zh_hk"))
return "Microsoft Danny Desktop";
else if (string_is_equal(language,"zh_cn"))
else if (string_is_equal(language,"zh_cn") || (string_is_equal(language,"zh-CN"))
return "Microsoft Kangkang Desktop";
else if (string_is_equal(language,"tr"))
return "Microsoft Tolga Desktop";
else if (string_is_equal(language,"ko"))
return "Microsoft Heami Desktop";
else if (string_is_equal(language,"pl"))
return "Microsoft Adam Desktop";
else if (string_is_equal(language,"cs"))
else if (string_is_equal(language,"cs"))
return "Microsoft Jakub Desktop";
else if (string_is_equal(language,"vi"))
return "Microsoft An Desktop";
else if (string_is_equal(language,"hr"))
return "Microsoft Matej Desktop";
else if (string_is_equal(language,"bg"))
return "Microsoft Ivan Desktop";
else if (string_is_equal(language,"ms"))
return "Microsoft Rizwan Desktop";
else if (string_is_equal(language,"sl"))
return "Microsoft Lado Desktop";
else if (string_is_equal(language,"ta"))
return "Microsoft Valluvar Desktop";
else if (string_is_equal(language,"en_gb"))
return "Microsoft George Desktop";
else if (string_is_equal(language,"ca") || string_is_equal(language,"ca_ES@valencia"))
return "Microsoft Herena Desktop";
return "";
}

Expand Down Expand Up @@ -1016,11 +1034,10 @@ static bool is_narrator_running_windows(void)
return false;
}

static bool accessibility_speak_windows(int speed,
static bool accessibility_speak_windows(const char* voice, int speed,
const char* speak_text, int priority)
{
char cmd[512];
const char *voice = get_user_language_iso639_1(true);
const char *language = accessibility_win_language_code(voice);
const char *langid = accessibility_win_language_id(voice);
bool res = false;
Expand Down
2 changes: 1 addition & 1 deletion frontend/frontend_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ typedef struct frontend_ctx_driver
const char* (*get_cpu_model_name)(void);
enum retro_language (*get_user_language)(void);
bool (*is_narrator_running)(void);
bool (*accessibility_speak)(int speed,
bool (*accessibility_speak)(const char* voice, int speed,
const char* speak_text, int priority);
bool (*set_gamemode)(bool on);

Expand Down
Loading

0 comments on commit c29c6c7

Please sign in to comment.