将以下SSML(语音合成标记语言)文档传递给com.svox.pico TextToSpeech引擎会导致读取XML主体,但无法通过音素元素或强调元素进行控制.这个结果(没有明显的SSML控制)在运行Android 2.2的Nexus One以及运行SDK级别为8的AVD的模拟器上是相同的.
String text = "<?xml version=\"1.0\"?>" +
"<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://www.w3.org/2001/10/synthesis " +
"http://www.w3.org/TR/speech-synthesis/synthesis.xsd\" " +
"xml:lang=\"en-US\">" +
"tomato " +
"<phoneme alphabet=\"ipa\" ph=\"t&#x259;mei&#x325;&#x27E;ou&#x325;\"> tomato </phoneme> " +
"That is a big car! " +
"That <emphasis> is </emphasis> a big car! " +
"That is a <emphasis> big </emphasis> car! " +
"That is a huge bank account! " +
"That <emphasis level=\"strong\"> is </emphasis> a huge bank account! …Run Code Online (Sandbox Code Playgroud) 据我所知,Android目前有7个音频流:
STREAM_ALARM (for alarms)
STREAM_DTMF (for DTMF Tones)
STREAM_MUSIC (for music playback)
STREAM_NOTIFICATION (for notifications)
STREAM_RING (for the phone ring)
STREAM_SYSTEM (for system sounds)
STREAM_VOICE_CALL (for phone calls)
Run Code Online (Sandbox Code Playgroud)
我也知道可以明确告诉TTS引擎使用哪个流:
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));
mTts.speak(text, TextToSpeech.QUEUE_ADD, params);
Run Code Online (Sandbox Code Playgroud)
但是,我没有找到的是当我没有指定音频流时默认使用的流.
Android的TextToSpeech引擎的默认音频流是什么?
有没有办法查询Android的TextToSpeech引擎当前正在使用哪个流?
UPDATE: TextToSpeech.Engine有一个常量定义为DEFAULT_STREAM,但不清楚它所引用的7个流中的哪一个.但它具有与STREAM_MUSIC相同的十六进制值(0x3).是这个吗?
首先:这不是Delphi和SAPI的重复.我对"Delphi中的SAPI"主题有一个具体问题.
我在Delphi 2009中使用了优秀的Import Type-Library指南来获取组件面板中的TSpVoice组件.这非常有效.同
var
SpVoice: TSpVoice;
Run Code Online (Sandbox Code Playgroud)
我可以写
SpVoice.Speak('This is an example.', 1);
Run Code Online (Sandbox Code Playgroud)
获得异步音频输出.
第一个问题
根据文档,我可以写
SpVoice.Speak('This is an example.', 0);
Run Code Online (Sandbox Code Playgroud)
获得同步音频输出,但我获得了EZeroDivide异常.为什么?
第二个问题
但更重要的是,我希望能够动态创建SpVoice对象(我认为这被称为"后期绑定"SpVoice对象),部分原因是我的应用程序的所有会话中只有一小部分会使用它,部分是因为我不想假设最终用户系统上存在SAPI服务器.
为此,我试过了
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: Variant;
begin
SpVoice := CreateOleObject('SAPI.SpVoice');
SpVoice.Speak('this is a test', 0);
end;
Run Code Online (Sandbox Code Playgroud)
显然什么也没做!(将0替换为0可以获得EZeroDivide异常.)
放弃
我是COM/OLE自动化的新手.对于我在这篇文章中所表现出的任何无知或愚蠢,我感到很抱歉......
为了让每个人遇到与我一样的问题,François的视频解释说SAPI/Windows中存在一个错误(某些地方不兼容),这使得以下代码引发了EZeroDivide异常:
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: variant;
begin
SpVoice := CreateOleObject('SAPI.SpVoice');
SpVoice.Speak('This is a text.');
end;
Run Code Online (Sandbox Code Playgroud)
视频中提供的解决方案是更改FPU控制字:
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: variant;
SavedCW: Word;
begin
SpVoice := CreateOleObject('SAPI.SpVoice'); …Run Code Online (Sandbox Code Playgroud) 即使我正确设置它:
HashMap<String, String> myHashRender = new HashMap<String, String>();
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "utid");
mTts.speak("Speak something", TextToSpeech.QUEUE_ADD, myHashRender);
Run Code Online (Sandbox Code Playgroud)
也
mTts.setOnUtteranceCompletedListener(this);
Run Code Online (Sandbox Code Playgroud)
在onInit函数中返回成功.onUtteranceCompleted仍未被调用.虽然有重复的问题,但没有我能找到答案的地方.
我的Activity还实现了OnUtteranceCompletedListener.
请帮忙.
我正在创建HTML5语音合成应用程序,如下面的链接.
http://updates.html5rocks.com/2014/01/Web-apps-that-talk---Introduction-to-the-Speech-Synthesis-API
Windows7和Android Chrome33beta或Mac的Safari可以正常使用.
但Windows7-Firefox 27似乎支持Speech-Synthesis-API,但因为返回空语音列表而无法正常工作.
有什么解决方案吗?
我想用音频和文本方式做出聊天机器人的响应。
所有使用 gTTS 的示例代码似乎都需要“将文本保存到文件中,然后播放该文件”。
是否有另一种方法可以简化流程,例如使用 gTTS 自动播放“聊天机器人的响应”?
我使用区域和语言下的“添加语言”添加了许多声音。这些显示在“语音”中的“文本转语音”下。(我使用的是Windows 10)
我想在我的应用程序中将这些SpeechSynthesizer与 System.Speech.Synthesis.
当在我的应用程序中列出可用的语音时,仅显示少数实际可用的语音:
static void Main()
{
SpeechSynthesizer speech = new SpeechSynthesizer();
ReadOnlyCollection<InstalledVoice> voices = speech.GetInstalledVoices();
if (File.Exists("available_voices.txt"))
{
File.WriteAllText("available_voices.txt", string.Empty);
}
using (StreamWriter sw = File.AppendText("available_voices.txt"))
{
foreach (InstalledVoice voice in voices)
{
sw.WriteLine(voice.VoiceInfo.Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
查看available_voices.txt仅列出这些声音:
Microsoft David Desktop
Microsoft Hazel Desktop
Microsoft Zira Desktop
Microsoft Irina Desktop
Run Code Online (Sandbox Code Playgroud)
但是在设置中的“文本转语音”下还有更多内容,例如Microsoft George和Microsoft Mark。
这里接受的答案: SpeechSynthesizer 没有获取所有已安装的声音 建议将平台更改为 x86。我尝试过,但没有看到任何变化。
这个答案: SpeechSynthesizer 没有获取所有已安装的声音 2 建议使用 .NET v4.5,因为 .NET v4.5 中存在错误 …
此问题仅适用于Android 2.2:
以下屏幕截图显示了安装的3种不同的文本到语音引擎:
在此屏幕截图中,您可以看到并非所有3都已选中(已启用).相反,IVONA未经检查,仅留下Pico(暗示,因为它是硬编码的)和SVOX(已检查).

我希望能够以编程方式从我的应用程序查询特定的TTS引擎(如IVONA)是否被选中(假设我知道在编码时的包名,当然).
在安卓2.2所有我是getDefaultEngine()不能在一个情况下真正帮助碧被选定为默认和SVOX检查(换句话说,我怎么知道SVOX如果被选中的Pico是默认?)
如何在Android 2.2中实现这一目标?
这是可能吗?
PS Android 4.x(API> = 14)引入了getEngines(),这可能会让您相信ICS +已经解决了这个问题,但仔细研究后发现:
我正在尝试使用Android Text To Speech讲出大量文本.我使用默认的Google语音引擎.以下是我的代码.
public class Talk extends Activity implements TextToSpeech.OnInitListener {
private ImageView playBtn;
private EditText textField;
private TextToSpeech tts;
private boolean isSpeaking = false;
private String finalText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_talk);
//Intialize the instance variables
playBtn = (ImageView)findViewById(R.id.playBtn);
textField = (EditText)findViewById(R.id.textField);
//Resister the listeners
playBtn.setOnClickListener(new PlayBtnAction());
//Other things
tts = new TextToSpeech(this,this);
//Get the web page text if called from Share-Via
if (Intent.ACTION_SEND.equals(getIntent().getAction()))
{
new GetWebText().execute("");
}
}
//This class will execute the text …Run Code Online (Sandbox Code Playgroud) 获取"所有"AVSpeechSynthesisVoice对象列表的标准方法是要求它:
[AVSpeechSynthesisVoice speechVoices]
Run Code Online (Sandbox Code Playgroud)
但是,这仅显示每个语言区域对的唯一默认语音.例如,对于en-US:
"Language: en-US, Name: Samantha, Quality: Default",
Run Code Online (Sandbox Code Playgroud)
如果我查看常规→辅助功能→语音→语音→英语下的设置应用程序,我看到我选择了'Siri Female(增强版)',但该语音无法从代码中选择.完整列表是

所以最大的问题是:如何从代码中选择Alex或Siri Female作为声音?