如何让 SpeechSynthesizer 通过特定设备说话?
How can I make the SpeechSynthesizer speak through a particular device?
我是语音识别的新手,所以如果问题很基础,请原谅。
我的应用程序会捕捉我通过麦克风说的话。我已经使用我的 c# 代码为我说的每个命令编写了一些响应,并且 SpeechSynthesizer 使用下面提到的代码没有任何问题地做到了这一点。
但我希望 SpeechSynthesizer 通过我的笔记本电脑扬声器而不是我的默认输入设备(我的麦克风)做出回应。可行吗?
我目前使用的代码如下。我正在寻找可以让所有播放设备可用然后 select 并使用我的扬声器回复的东西。
public void SpeakTheText(string text)
{
SpeechInput = text;
SpeechSynthesizer _synthesizer = new SpeechSynthesizer();
_synthesizer.SelectVoiceByHints(VoiceGender.Male);
_synthesizer.SetOutputToDefaultAudioDevice();//Microphone
_synthesizer.SpeakAsync(SpeechInput);
}
您可以使用 System.Media.SoundPlayer class 从流中输出音频。请参阅 MSDN
中的示例
public void SpeakTheText(string text)
{
// Initialize a new instance of the speech synthesizer.
using (SpeechSynthesizer synth = new SpeechSynthesizer())
using (MemoryStream streamAudio = new MemoryStream())
{
// Create a SoundPlayer instance to play the output audio file.
System.Media.SoundPlayer m_SoundPlayer = new System.Media.SoundPlayer();
// Set voice to male
synth.SelectVoiceByHints(VoiceGender.Male);
// Configure the synthesizer to output to an audio stream.
synth.SetOutputToWaveStream(streamAudio);
// Speak a phrase.
synth.Speak(text);
streamAudio.Position = 0;
m_SoundPlayer.Stream = streamAudio;
m_SoundPlayer.Play();
// Set the synthesizer output to null to release the stream.
synth.SetOutputToNull();
// Insert code to persist or process the stream contents here.
}
}
我不确定 SoundPlayer 是否可以指定输出设备,但它应该使用您的默认输出设备进行输出。
查看 NAudio, it has implemented this feature. You can have a look at the implementation on their GIT 实现并复制您需要的代码或克隆/获取程序包。
根据实现,您可以简单地遍历它们
[TestFixture]
public class DirectSoundTests
{
[Test]
[Category("IntegrationTest")]
public void CanEnumerateDevices()
{
foreach(var device in DirectSoundOut.Devices)
{
Debug.WriteLine(String.Format("{0} {1} {2}", device.Description, device.ModuleName, device.Guid));
}
}
}
基于 Microsoft docs for the method - 控制面板决定了你的音频输出 - 它不应该是麦克风 - 它应该是带扬声器的音频设备..确保你已经配置好了 - 并且在控制面板中测试
我是语音识别的新手,所以如果问题很基础,请原谅。
我的应用程序会捕捉我通过麦克风说的话。我已经使用我的 c# 代码为我说的每个命令编写了一些响应,并且 SpeechSynthesizer 使用下面提到的代码没有任何问题地做到了这一点。 但我希望 SpeechSynthesizer 通过我的笔记本电脑扬声器而不是我的默认输入设备(我的麦克风)做出回应。可行吗?
我目前使用的代码如下。我正在寻找可以让所有播放设备可用然后 select 并使用我的扬声器回复的东西。
public void SpeakTheText(string text)
{
SpeechInput = text;
SpeechSynthesizer _synthesizer = new SpeechSynthesizer();
_synthesizer.SelectVoiceByHints(VoiceGender.Male);
_synthesizer.SetOutputToDefaultAudioDevice();//Microphone
_synthesizer.SpeakAsync(SpeechInput);
}
您可以使用 System.Media.SoundPlayer class 从流中输出音频。请参阅 MSDN
中的示例public void SpeakTheText(string text)
{
// Initialize a new instance of the speech synthesizer.
using (SpeechSynthesizer synth = new SpeechSynthesizer())
using (MemoryStream streamAudio = new MemoryStream())
{
// Create a SoundPlayer instance to play the output audio file.
System.Media.SoundPlayer m_SoundPlayer = new System.Media.SoundPlayer();
// Set voice to male
synth.SelectVoiceByHints(VoiceGender.Male);
// Configure the synthesizer to output to an audio stream.
synth.SetOutputToWaveStream(streamAudio);
// Speak a phrase.
synth.Speak(text);
streamAudio.Position = 0;
m_SoundPlayer.Stream = streamAudio;
m_SoundPlayer.Play();
// Set the synthesizer output to null to release the stream.
synth.SetOutputToNull();
// Insert code to persist or process the stream contents here.
}
}
我不确定 SoundPlayer 是否可以指定输出设备,但它应该使用您的默认输出设备进行输出。
查看 NAudio, it has implemented this feature. You can have a look at the implementation on their GIT 实现并复制您需要的代码或克隆/获取程序包。
根据实现,您可以简单地遍历它们
[TestFixture]
public class DirectSoundTests
{
[Test]
[Category("IntegrationTest")]
public void CanEnumerateDevices()
{
foreach(var device in DirectSoundOut.Devices)
{
Debug.WriteLine(String.Format("{0} {1} {2}", device.Description, device.ModuleName, device.Guid));
}
}
}
基于 Microsoft docs for the method - 控制面板决定了你的音频输出 - 它不应该是麦克风 - 它应该是带扬声器的音频设备..确保你已经配置好了 - 并且在控制面板中测试