标签: speech-synthesis

将HTML5 SpeechSynthesisUtterance生成的语音记录到文件中

我可以使用Chrome的Speech Synthesis API(版本33.0.1750.112 beta-m)以下列方式从文本生成语音

var transcript = document.getElementById("speechTxt").value; 
var msg = new SpeechSynthesisUtterance(transcript); 
speechSynthesis.speak(msg);
Run Code Online (Sandbox Code Playgroud)

现在我想将这个语音保存在一个文件中(可能使用WebAudio API).这有可能通过一些函数调用吗?

我已经查看了语音合成API中的方法,没有什么可以保存这些语音数据.使用WebAudio API我能够在麦克风中捕获这种语音,但会引入许多不必要的噪音.是否无法将此语音数据保存在Chrome浏览器本身中,因为它是首先生成它的人?

speech-synthesis web-audio-api

13
推荐指数
1
解决办法
1967
查看次数

高品质,情感,流畅和可变的文字转语音引擎?

在查看了一些服务/工具之后,我得出了一个结论.大多数文字转语音工具都太技术化,机器人 - 换句话说,质量差的c语音.

是的,最重要的是,看起来它们带有"硬编码"的语音模板,因此缩短了多样性/定制.有些工具可以让你设定阅读速度和音高',但这还不够.

我对情绪方面背后的问题的猜测 - 很难从纯文本中判断情绪,如果只是一两句话就更难判断.此外,好的电脑是机器 - 机器没有情感,但这是一个不同的故事.

困扰我的最重要的是质量.例如,有一些这样的工具,用于切断单词的顶点,从而产生这些技术性的声音.感觉像句子结构有问题.是的,当人们正在研究这样的工具时,我想知道,是什么让他们不再努力改善那些...切断顶点,这不是一个小问题!另外,必须记住,一个好的,高质量的文字转语音软件是值得的,嗯......很多!因此产生了一个非常有利可图的产品.

哦,在流利的情况下,我隐藏着问题,感叹等等.(可能那些不适用于流利,但我不是英语,请原谅我,如果是这样的话.)

我研究过的工具列表:

相当令人印象深刻,但仍有改进空间(++)

- Loquendo:缺乏声音变化,有一些轻微的顶点/流畅性问题(取决于句子),在例子中太多的咳嗽和借口!
- Nuance Vocalizer:虽然仍然缺乏多样性,但一些提供的声音是值得的.


也可以合作获得更多的资源,然后在不同的,但几乎相同的产品上工作( - )

- eSpeak:那里最好的机器人之一,因此节目标识(?!)
- 自然读者(哑巴自动播放!!):嗯,它有一定的流畅性,但仍然有技术感觉开始.
- iSpeech:好笑的时候用英文文本将声音设置为日语.我打赌日本人对此不太满意.
- 倒谱 + 增强的声音 ......加上增强的声音会带来好的蹩脚结果,所以,除了5个以上的声音外,什么都没有增强.
- AT&T:流畅的流利,但是在句子结尾和过多的机器人方面遇到了问题!
- LumenVox TTS:看起来像是来自具有大量语音工具的背景,但仍然会产生机器人声音.
- 还有一些......


如果我错过了值得一看的东西,请分享.可以是免费的,商业的,超级昂贵的...只要它有效,我很感兴趣!

问题(-s)..

  1. 您认为这些声音的质量,流畅性和多样性背后的主要问题是什么? 由于情绪方面难以判断,我不介意你跳过它,但如果你有一两个想法,我不介意你分享你的想法
  2. 文本如何转化为语音? 比如,这些工具背后使用了哪些算法?也许一两个新理论可以派上用场.
  3. 这些驱动器/引擎实际上是不同的引擎/驱动程序还是不同的语音模式?
  4. 它只是我,或者多年来第一批 Text2Speech工具之间的质量变化不大(或根本没有)? 不得不承认,这个老式的Apple工具提供的结果比2000年以上的工具更好,至少在将视频与我所研究的内容进行比较时.)

audio voice text-to-speech speech-synthesis

12
推荐指数
1
解决办法
2万
查看次数

在Google Chrome中,SpeechSynthesis.speak(在Web Speech API中)会在几秒钟后停止

speak在Web Speech API中使用该功能时,在Chrome中,语音在几秒钟之后突然停止,在给予它的文本中间,在一个看似随机的地方(没有到达终点).这只发生在Chrome(适用于Firefox),在两台不同的计算机/系统上进行测试.

看看这个jsfiddle看/听:https://jsfiddle.net/fv9ochpq/

您可以看到SpeechSynthesis对象.speaking标志在停止讲话后保持打开(true).

我没有看到传递给话语的文本有任何记录限制.这是Google Chrome错误吗?顺便说一下,自2014年以来我就已经知道了这一点 - 当时我试图将语音功能添加到我制作的浏览器扩展中(那时它是可用于Chrome扩展的TTS API - 同样的事情也发生在那里),但最终还没有不要因为这个明显的错误而这样做.现在我想要克服这个问题 - 如果这是一个错误,我会感谢任何人指导我到最好的地方报告它.

编辑:它似乎在大约15秒后停止.每运行14秒添加一个间隔.resume()似乎"修复"了这个.请参阅:https ://jsfiddle.net/fv9ochpq/1/
但这是一个黑客攻击.

javascript google-chrome text-to-speech speech-synthesis webspeech-api

12
推荐指数
1
解决办法
1476
查看次数

使用Web Speech API使用SSML的正确方法

Web Speech API规范说:

text属性
此属性指定要为此话语合成和说出的文本.这可以是纯文本或完整的,格式良好的SSML文档.对于不支持SSML或仅支持某些标签的语音合成引擎,用户代理或语音引擎必须剥离它们不支持的标签并说出文本.

它没有提供使用textSSML文档的示例.

我在Chrome 33中尝试了以下内容:

var msg = new SpeechSynthesisUtterance();
msg.text = '<?xml version="1.0"?>\r\n<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">ABCD</speak>';
speechSynthesis.speak(msg);
Run Code Online (Sandbox Code Playgroud)

它不起作用 - 声音试图叙述XML标签.这段代码有效吗?
我必须提供一个XMLDocument对象吗?

我试图了解Chrome是否违反了规范(应该将其报告为错误),或者我的代码是否无效.

google-chrome speech-synthesis webspeech-api

11
推荐指数
1
解决办法
3889
查看次数

当页面自动刷新时,语音在Firefox中被截断,但在Google Chrome中不被截断

我有一个问题,在Firefox中,如果页面自动刷新,语音会被截断,但是在谷歌浏览器中,即使页面是自动刷新的,语音也会结束。我如何解决这个问题,以便即使页面自动刷新也不会在Firefox中被切断?

msg = new SpeechSynthesisUtterance("please finish saying this entire sentence.");
window.speechSynthesis.speak(msg);

(function ($) {
  'use strict';
  if (window == window.top) {
    var body = $('body').empty();
    var myframe = $('<iframe>')
      .attr({ src: location.href })
      .css({ height: '95vh', width: '100%' })
      .appendTo(body)
      .on('load', function () {
        var interval;
        interval = 750; 
        setTimeout(function () {
          myframe.attr({ src: location.href });
        }, interval);
      });
  }
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

javascript refresh speech-synthesis webspeech-api

11
推荐指数
1
解决办法
389
查看次数

愚蠢的想法:来自PHP服务器的Mac语音?

我想合成Mac OS X语音,但我正在使用PC.我可以在家里的Macbook上设置一个PHP服务器,让它为我合成文本,然后通过网络请求将它返回给我吗?

喜欢 http://mymacbook.com/speak.php?t=why+hello+there

什么秘密的PHP代码将解锁这种可能性?我知道我可以在命令行上合成语音,say -o "output.aiff" -f "input.txt"但我需要帮助这里的结缔组织.

- 我不想要链接到Cepstral或AT&T的在线语音合成器,因为我想使用特殊的Mac语音合成语法.

php macos speech-synthesis

9
推荐指数
1
解决办法
493
查看次数

使用SpeechSynthesizer使用SpeechAudioFormatInfo进行流式传输

我正在使用System.Speech.Synthesis.SpeechSynthesizer将文本转换为语音.由于微软的文档不足(参见我的链接,没有任何评论或代码示例),我无法解决两种方法之间的差异:

SetOutputToAudioStream和SetOutputToWaveStream.

这是我推断的:

SetOutputToAudioStream接受一个流和一个SpeechAudioFormatInfo实例,该实例定义波形文件的格式(每秒采样数,每秒位数,音频通道等)并将文本写入流.

SetOutputToWaveStream只接收一个流,并将16位单声道22kHz PCM波形文件写入流中.没有办法传入SpeechAudioFormatInfo.

我的问题是SetOutputToAudioStream不会将有效的wave文件写入流.例如,在将流传递给System.Media.SoundPlayer时,我得到一个InvalidOperationException("wave header is corrupt").如果我将流写入磁盘并尝试使用WMP播放,我会收到"Windows Media Player无法播放文件..."错误,但SetOutputToWaveStream写入的流在两者中都正常播放.我的理论是SetOutputToAudioStream没有写一个(有效的)头.

奇怪的是,SetOutputTo*Blah*的命名约定是不一致的.SetOutputToWaveFile采用SpeechAudioFormatInfo,而SetOutputToWaveStream则不采用.

我需要能够将8kHz,16位单声道波文件写入流中,这是SetOutputToAudioStream或SetOutputToWaveStream都不允许我这样做的.有没有人深入了解SpeechSynthesizer和这两种方法?

作为参考,这里是一些代码:

Stream ret = new MemoryStream();
using (SpeechSynthesizer synth = new SpeechSynthesizer())
{
  synth.SelectVoice(voiceName);
  synth.SetOutputToWaveStream(ret);
  //synth.SetOutputToAudioStream(ret, new SpeechAudioFormatInfo(8000, AudioBitsPerSample.Sixteen, AudioChannel.Mono));
  synth.Speak(textToSpeak);
}
Run Code Online (Sandbox Code Playgroud)

解:

非常感谢@Hans Passant,这是我现在使用的要点:

Stream ret = new MemoryStream();
using (SpeechSynthesizer synth = new SpeechSynthesizer())
{
  var mi = synth.GetType().GetMethod("SetOutputStream", BindingFlags.Instance | BindingFlags.NonPublic);
  var fmt = new SpeechAudioFormatInfo(8000, AudioBitsPerSample.Sixteen, AudioChannel.Mono);
  mi.Invoke(synth, new object[] { ret, fmt, true, true });
  synth.SelectVoice(voiceName);
  synth.Speak(textToSpeak);
}
return …
Run Code Online (Sandbox Code Playgroud)

.net text-to-speech speech-synthesis speechsynthesizer

8
推荐指数
1
解决办法
4746
查看次数

.Net Speech.Synthesizer中的内存泄漏?

我在申请中发现了连续泄漏.在使用内存分析器进行检查后,我发现该课程是Microsoft Speech.Synthesizer中的一些对象

所以我建立了一个玩具项目来验证这个假设:

//在Speech.Synthesizer对象中显示内存泄漏的玩具示例

static void Main(string[] args)
{
    string text = "hello world. This is a long sentence";
    PromptBuilder pb = new PromptBuilder();
    pb.StartStyle(new PromptStyle(PromptRate.ExtraFast));
    pb.AppendText(text);
    pb.EndStyle();
    SpeechSynthesizer tts = new SpeechSynthesizer();

while (true)
{
    //SpeechSynthesizer tts = new SpeechSynthesizer();
    Console.WriteLine("Speaking..."); 
    tts.Speak(pb);

    //Print private working set sieze
    Console.WriteLine("Memory: {0} KB\n", (Process.GetCurrentProcess().PrivateMemorySize64 / 1024).ToString("0"));

    //tts.Dispose();    //also this doesn't work as well
    //tts = null;

    GC.Collect();   //a little help, but still leaks
}
}
Run Code Online (Sandbox Code Playgroud)

结果实际证实内存泄漏来自Speech.Synthesizer

Speaking...
Run Code Online (Sandbox Code Playgroud)

内存:42184 KB

说到......内存:42312 KB

说到......内存:42440 …

.net c# memory-leaks sapi speech-synthesis

8
推荐指数
1
解决办法
2577
查看次数

当函数运行超过1次时,为什么我的Speech Synthesis API语音会改变?

我一直在Chrome(33及以上版本)中使用新的语音合成API来制作基于Web的通信辅助工具.我希望用户能够改变男性和女性之间的声音,API允许我这样做.但是,当首次加载页面并且第一次运行该功能时(来自onclick事件),它将使用默认的女性语音.然后在任何时候运行它,它使用我试图使用的男性声音.我怎样才能让男声第一次出现?

这是调用javascript的按钮:

<button type="button" name="speakMe"id="speakMe" onclick="speakPhrase($('phraseBar').getValue());" ><img src="images/speakMe.png" /></button>
Run Code Online (Sandbox Code Playgroud)

这里是speakPhrase函数被调用:

function speakPhrase(phrase) {
    if(phrase =="")
    {
        alert("Please enter a phrase before asking me to speak for you. Thank you!");
    }
    else
    {
        var speech = new SpeechSynthesisUtterance(phrase);
        var voices = window.speechSynthesis.getVoices();
        speech.voice = voices.filter(function(voice) { return voice.name == 'Google UK English Male'; })[0];
        window.speechSynthesis.speak(speech);

    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

javascript text-to-speech speech-synthesis google-text-to-speech

8
推荐指数
2
解决办法
5708
查看次数

如何在语音合成中改变声音?

我正在尝试使用Speechsynthesis 的一个简单示例。

<script>

voices = window.speechSynthesis.getVoices()
var utterance = new SpeechSynthesisUtterance("Hello World");
utterance.voice = voices[4];
utterance.lang = voices[4].lang;
window.speechSynthesis.speak(utterance);

</script>
Run Code Online (Sandbox Code Playgroud)

但这会导致声音未定义的错误。我发现 getVoices() 是异步加载的。我看到了这个答案并更新了我的代码,如下所示使用回调。

<script>
window.speechSynthesis.onvoiceschanged = function() {
voices = window.speechSynthesis.getVoices()
var utterance = new SpeechSynthesisUtterance("Hello World");
utterance.voice = voices[4];
utterance.lang = voices[4].lang;
window.speechSynthesis.speak(utterance);
};
</script>
Run Code Online (Sandbox Code Playgroud)

但是由于某种奇怪的原因,文本被说了三遍而不是一遍。我该如何修复此代码?

javascript text-to-speech speech-synthesis

8
推荐指数
1
解决办法
1万
查看次数