7

我正在为学校做一个项目,我们将第一次教孩子们计算。不幸的是,这些孩子不会阅读,所以任务将用当地语言对他们说,在这种情况下是荷兰语。

我一直在环顾四周,大多数文本到语音的 javascript 库都为英语提供了很好的支持,但对任何其他语言都没有。HTML5 speechSynthesis 也不支持荷兰语:

Chrome 35 目前支持的语音合成语音

在进一步的研究中,我遇到了一篇文章,您可以在其中使用 Google 翻译语音将任何文本生成语音。

您将此作为基本 URL: http ://translate.google.com/translate_tts

附上你想要的语言,在我的情况下是荷兰语

http://translate.google.com/translate_tts?tl=nl

并附上您的文字:

“这是一个测试”翻译成荷兰语

您可能希望这适用于较长的文本,但事实并非如此。

文本转语音不起作用

还有其他解决方案吗?谷歌语音荷兰语说得很好,所以我希望这个链接能以某种方式工作。

4

1 回答 1

3

免责声明:Google 可能不允许这样做。未经 Google 许可,请勿使用此功能。

可以将 Google 的文本转语音与任何大小的文本一起使用。不过,它需要一些调整。

这是脚本:

function textToSpeech(text, language) {
    if(text === undefined || text === null || text.length === 0)
        return

    var vid = document.createElement("video")
    var textParts = []

    text.split(" ").forEach(function(word) {
        var textPartsIndex = textParts.length - 1
        var currentStr = textParts[textPartsIndex]
        if(currentStr !== undefined && currentStr.length + word.length < 100)
            textParts[textPartsIndex] += " " + word
        else
            textParts.push(word)
    })

    function play(txt) {
        vid.src = "http://translate.google.com/translate_tts?tl=" + language + "&q=" + txt
        vid.load()
        vid.play()
    }

    var partIndex = 0
    play(textParts[partIndex])

    vid.addEventListener("ended", function() {
        var part = textParts[++partIndex]
        if(part !== undefined)
            play(part)
        else
            vid.removeEventListener("ended")
    })
}

在使用它之前,您必须关闭所有 Chrome 浏览器实例,并在 Windows 机器上打开“运行”(WIN+R) 并键入“chrome --no-referrers”而不使用“

在你的页面上,你现在可以写(我不懂荷兰语,所以这只是我找到的一些示例文本)

textToSpeech("Ik ga ervan uit dat de mens een groot vermogen bezit om externe informatie op te slorpen ,\" legt professor Georges uit . Hij kan zelfs 5 tot 6 maal méér informatie verwerken dan het debiet van het gesproken woord , 120 woorden per minuut . Teamgeest is voor mij geen ijdel woord . In de tweede plaats komen puur betekenisloze verhaspelingen niet in aanmerking , want die zijn niet ontstaan door verwarring met een ander woord .", "nl")

如果您的应用程序仅在本地运行,即未托管,则您不必使用 --no-referrers 命令运行 chrome。

禁用引荐来源网址的原因是如果有引荐来源网址,Google 会取消您的请求。

不需要的 IFRAME 版本 --no-referrers

http://jsfiddle.net/9tTeg/

<body>
<script>
textToSpeech("Ik ga ervan uit dat de mens een groot vermogen bezit om externe informatie op te slorpen ,\" legt professor Georges uit . Hij kan zelfs 5 tot 6 maal méér informatie verwerken dan het debiet van het gesproken woord , 120 woorden per minuut . Teamgeest is voor mij geen ijdel woord . In de tweede plaats komen puur betekenisloze verhaspelingen niet in aanmerking , want die zijn niet ontstaan door verwarring met een ander woord .", "nl")

function textToSpeech(text, language) {
    if(text === undefined || text === null || text.length === 0)
        return

    var vid = document.createElement("iframe")
    document.body.appendChild(vid)
    var textParts = []

    text.split(" ").forEach(function(word) {
        var textPartsIndex = textParts.length - 1
        var currentStr = textParts[textPartsIndex]
        if(currentStr !== undefined && currentStr.length + word.length < 100)
            textParts[textPartsIndex] += " " + word
        else
            textParts.push(word)
    })

    function play(txt) {
        vid.src = "http://translate.google.com/translate_tts?tl=" + language + "&q=" + txt
    }

    var partIndex = 0
    play(textParts[partIndex])

    var intervalId = setInterval(function() {
        var part = textParts[++partIndex]
        if(part !== undefined)
            play(part)
        else
            clearInterval(intervalId)       
    }, 9000)
}
</script>
</body>

改进:不再用单词分隔字符串,而是使用点和逗号,因此停顿更自然。目前每个部分的播放时间为 9 秒,但如果单词按点和逗号分组,您可以通过查看部分的长度来计算每个部分的时间量,因为 9 秒可能太多了.

于 2014-05-29T13:48:50.693 回答