我可以使用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浏览器本身中,因为它是首先生成它的人?
在查看了一些服务/工具之后,我得出了一个结论.大多数文字转语音工具都太技术化,机器人 - 换句话说,质量差的c语音.
是的,最重要的是,看起来它们带有"硬编码"的语音模板,因此缩短了多样性/定制.有些工具可以让你设定阅读速度和音高',但这还不够.
我对情绪方面背后的问题的猜测 - 很难从纯文本中判断情绪,如果只是一两句话就更难判断.此外,好的电脑是机器 - 机器没有情感,但这是一个不同的故事.
困扰我的最重要的是质量.例如,有一些这样的工具,用于切断单词的顶点,从而产生这些技术性的声音.感觉像句子结构有问题.是的,当人们正在研究这样的工具时,我想知道,是什么让他们不再努力改善那些...切断顶点,这不是一个小问题!另外,必须记住,一个好的,高质量的文字转语音软件是值得的,嗯......很多!因此产生了一个非常有利可图的产品.
哦,在流利的情况下,我隐藏着问题,感叹等等.(可能那些不适用于流利,但我不是英语,请原谅我,如果是这样的话.)
- Loquendo:缺乏声音变化,有一些轻微的顶点/流畅性问题(取决于句子),在例子中太多的咳嗽和借口!
- Nuance Vocalizer:虽然仍然缺乏多样性,但一些提供的声音是值得的.
- eSpeak:那里最好的机器人之一,因此节目标识(?!)
- 自然读者(哑巴自动播放!!):嗯,它有一定的流畅性,但仍然有技术感觉开始.
- iSpeech:好笑的时候用英文文本将声音设置为日语.我打赌日本人对此不太满意.
- 倒谱 + 增强的声音 ......加上增强的声音会带来好的蹩脚结果,所以,除了5个以上的声音外,什么都没有增强.
- AT&T:流畅的流利,但是在句子结尾和过多的机器人方面遇到了问题!
- LumenVox TTS:看起来像是来自具有大量语音工具的背景,但仍然会产生机器人声音.
- 还有一些......
如果我错过了值得一看的东西,请分享.可以是免费的,商业的,超级昂贵的...只要它有效,我很感兴趣!
问题(-s)..
当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
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是否违反了规范(应该将其报告为错误),或者我的代码是否无效.
我有一个问题,在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) 我想合成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语音合成语法.
我正在使用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) 我在申请中发现了连续泄漏.在使用内存分析器进行检查后,我发现该课程是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 …
我一直在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
我正在尝试使用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)
但是由于某种奇怪的原因,文本被说了三遍而不是一遍。我该如何修复此代码?
speech-synthesis ×10
javascript ×4
.net ×2
audio ×1
c# ×1
macos ×1
memory-leaks ×1
php ×1
refresh ×1
sapi ×1
voice ×1