如何在 'gTTS' 中为单个输入行使用多语言?

How to use muti-language in 'gTTS' for single input line?

我想将包含多种语言的文档中的文本转换为语音。当我尝试执行以下代码时,我会提取问题以清楚地记录每种语言。这种类型的混音器文本音频如何保存清晰?

from gtts import gTTS
mytext = 'Welcome to gtts! আজ একটি ভাল দিন। tumi kemon acho? ٱلْحَمْدُ لِلَّٰهِ'
language = 'ar' # arabic
myobj = gTTS(text=mytext, tld='co.in', lang=language, slow=False)
myobj.save("audio.mp3")

仅使用文字转语音是不够的,因为它只能使用一种语言。
为了解决这个问题,我们需要为句子的每个部分检测语言。
然后 运行 通过文本到语音并将其附加到我们最终的口语句子中。
最好使用一些神经网络(有很多)来为你做这个分类。
为了证明概念,我使用 googletrans 来检测句子每个部分的语言,并使用 gtts 从中制作 mp3 文件。

它不是防弹的,尤其是阿拉伯语文本。 googletrans 以某种方式检测到 gtts 无法识别的不同语言代码。出于这个原因,我们必须使用 code_table 来选择适用于 gtts 的正确语言代码。

这是工作示例:

from googletrans import Translator
from gtts import gTTS

input_text = "Welcome to gtts! আজ একটি ভাল দিন। tumi kemon acho? ٱلْحَمْدُ لِلَّٰه"
words = input_text.split(" ")
translator = Translator()
language, sentence = None, ""

lang_code_table = {"sd": "ar"}

with open('output.mp3', 'wb') as ff:
    for word in words:
        if word == " ":
            continue
        # Detect language of current word
        word_language = translator.detect(word).lang

        if word_language == language:
            # Same language, append word to the sentence
            sentence += " " + word
        else:
            if language is None:
                # No language set yet, initialize and continue
                language, sentence = word_language, word
                continue

            if word.endswith(("?", ".", "!")):
                # If word endswith one of the punctuation marks, it should be part of previous sentence
                sentence += " " + word
                continue

            # We have whole previous sentence, translate it into speech and append to mp3 file
            gTTS(text=sentence, lang=lang_code_table.get(language, language), slow=False).write_to_fp(ff)

            # Continue with other language
            language, sentence = word_language, word

    if language and sentence:
        # Append last detected sentence
        gTTS(text=sentence, lang=lang_code_table.get(language, language), slow=False).write_to_fp(ff)

显然速度不快,不适合较长的文本。
它还需要更好的分词器和正确的错误处理。
同样,这只是概念验证。