Skip to content

Commit

Permalink
Support French in TTS (#397)
Browse files Browse the repository at this point in the history
  • Loading branch information
csukuangfj authored Oct 28, 2023
1 parent 64ab1ea commit 157628b
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 4 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(sherpa-onnx)

set(SHERPA_ONNX_VERSION "1.8.6")
set(SHERPA_ONNX_VERSION "1.8.7")

# Disable warning about
#
Expand Down
4 changes: 4 additions & 0 deletions sherpa-onnx/csrc/lexicon.cc
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ std::vector<int64_t> Lexicon::ConvertTextToTokenIds(
return ConvertTextToTokenIdsGerman(text);
case Language::kSpanish:
return ConvertTextToTokenIdsSpanish(text);
case Language::kFrench:
return ConvertTextToTokenIdsFrench(text);
case Language::kChinese:
return ConvertTextToTokenIdsChinese(text);
default:
Expand Down Expand Up @@ -254,6 +256,8 @@ void Lexicon::InitLanguage(const std::string &_lang) {
language_ = Language::kGerman;
} else if (lang == "spanish") {
language_ = Language::kSpanish;
} else if (lang == "french") {
language_ = Language::kFrench;
} else if (lang == "chinese") {
language_ = Language::kChinese;
} else {
Expand Down
6 changes: 6 additions & 0 deletions sherpa-onnx/csrc/lexicon.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ class Lexicon {
return ConvertTextToTokenIdsEnglish(text);
}

std::vector<int64_t> ConvertTextToTokenIdsFrench(
const std::string &text) const {
return ConvertTextToTokenIdsEnglish(text);
}

std::vector<int64_t> ConvertTextToTokenIdsEnglish(
const std::string &text) const;

Expand All @@ -62,6 +67,7 @@ class Lexicon {
kEnglish,
kGerman,
kSpanish,
kFrench,
kChinese,
kUnknown,
};
Expand Down
88 changes: 85 additions & 3 deletions sherpa-onnx/csrc/text-utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ template bool SplitStringToFloats(const std::string &full, const char *delim,
std::vector<double> *out);

static bool IsPunct(char c) { return c != '\'' && std::ispunct(c); }
static bool IsGermanUmlauts(const std::string &word) {
static bool IsGermanUmlaut(const std::string &word) {
// ä 0xC3 0xA4
// ö 0xC3 0xB6
// ü 0xC3 0xBC
Expand All @@ -187,6 +187,7 @@ static bool IsGermanUmlauts(const std::string &word) {
}

// see https://www.tandem.net/blog/spanish-accents
// https://www.compart.com/en/unicode/U+00DC
static bool IsSpanishDiacritic(const std::string &word) {
// á 0xC3 0xA1
// é 0xC3 0xA9
Expand All @@ -195,22 +196,103 @@ static bool IsSpanishDiacritic(const std::string &word) {
// ú 0xC3 0xBA
// ü 0xC3 0xBC
// ñ 0xC3 0xB1
//
// uppercase
//
// Á 0xC3 0x81
// É 0xC3 0x89
// Í 0xC3 0x8D
// Ó 0xC3 0x93
// Ú 0xC3 0x9A
// Ü 0xC3 0x9C
// Ñ 0xC3 0x91

if (word.size() != 2 || static_cast<uint8_t>(word[0]) != 0xc3) {
return false;
}

auto c = static_cast<uint8_t>(word[1]);
if (c == 0xa1 || c == 0xa9 || c == 0xad || c == 0xb3 || c == 0xba ||
c == 0xbc || c == 0xb1) {
c == 0xbc || c == 0xb1 || c == 0x81 || c == 0x89 || c == 0x8d ||
c == 0x93 || c == 0x9a || c == 0x9c || c == 0x91) {
return true;
}

return false;
}

// see https://www.busuu.com/en/french/accent-marks
static bool IsFrenchDiacritic(const std::string &word) {
// acute accent
// é 0xC3 0xA9
//
// grave accent
// à 0xC3 0xA0
// è 0xC3 0xA8
// ù 0xC3 0xB9
//
// cedilla
// ç 0xC3 0xA7
//
// circumflex
// â 0xC3 0xA2
// ê 0xC3 0xAA
// î 0xC3 0xAE
// ô 0xC3 0xB4
// û 0xC3 0xBB
//
// trema
// ë 0xC3 0xAB
// ï 0xC3 0xAF
// ü 0xC3 0xBC
//
// É 0xC3 0x89
//
// À 0xC3 0x80
// È 0xC3 0x88
// Ù 0xC3 0x99
// Ç 0xC3 0x87
// Â 0xC3 0x82
// Ê 0xC3 0x8A
// Î 0xC3 0x8E
// Ô 0xC3 0x94
// Û 0xC3 0x9B
// Ë 0xC3 0x8B
// Ï 0xC3 0x8F
// Ü 0xC3 0x9C

if (word.size() != 2 || static_cast<uint8_t>(word[0]) != 0xc3) {
return false;
}

auto c = static_cast<uint8_t>(word[1]);
if (c == 0xa9 || c == 0xa0 || c == 0xa8 || c == 0xb9 || c == 0xa7 ||
c == 0xa2 || c == 0xaa || c == 0xae || c == 0xb4 || c == 0xbb ||
c == 0xab || c == 0xaf || c == 0xbc || c == 0x89 || c == 0x80 ||
c == 0x88 || c == 0x99 || c == 0x87 || c == 0x82 || c == 0x8a ||
c == 0x8e || c == 0x94 || c == 0x9b || c == 0x8b || c == 0x8f ||
c == 0x9c) {
return true;
}
return false;
}

static bool IsSpecial(const std::string &w) {
return IsGermanUmlauts(w) || IsSpanishDiacritic(w);
bool ans = IsGermanUmlaut(w) || IsSpanishDiacritic(w) || IsFrenchDiacritic(w);

// for french d’impossible
// ’ 0xE2 0x80 0x99
bool ans2 = false;
if (w.size() == 3) {
auto c0 = static_cast<uint8_t>(w[0]);
auto c1 = static_cast<uint8_t>(w[1]);
auto c2 = static_cast<uint8_t>(w[2]);
if (c0 == 0xe2 && c1 == 0x80 && c2 == 0x99) {
ans2 = true;
}
}

return ans || ans2;
}

static std::vector<std::string> MergeCharactersIntoWords(
Expand Down

0 comments on commit 157628b

Please sign in to comment.