C# 文字转语音 播放SpVoice
最近拿到一个需求,需要调整一下现有的语音播放逻辑,因为有的语音需要循环播放,有的不需要
我们以前的逻辑是都不循环的,所以采用了SpVoice (引入SpeechLib.dll)的异步播放,我拿到了之后发现异步和同步其实应该是都可以实现的,但是异步我认为有一个问题就是不知道什么时候能让循环停止,
搜了很多也没有解决我的问题,于是我尝试了用同步来解决这个问题
以下是我改进的代码:
/// <summary>
/// 同步播放语音
/// </summary>
/// <param name="voiceContent">语音内容</param>
/// <param name="isLoop">是否循环播放</param>
/// <param name="isSelectOver">查询是否结束</param>
public void playSoundAsync(string voiceContent, bool isLoop, bool isSelectOver = false)
{
VoiceContent = voiceContent;
int i = 1;
//是否循环播放
if (isLoop)
{
//最多循环10次
while (i <= 10)
{
//如果查询结束
if (isSelectOver)
{
//关闭当前语音
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
break;
}
else
{
//播放语音
voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);
i++;
}
}
/// 同步播放语音
/// </summary>
/// <param name="voiceContent">语音内容</param>
/// <param name="isLoop">是否循环播放</param>
/// <param name="isSelectOver">查询是否结束</param>
public void playSoundAsync(string voiceContent, bool isLoop, bool isSelectOver = false)
{
VoiceContent = voiceContent;
int i = 1;
//是否循环播放
if (isLoop)
{
//最多循环10次
while (i <= 10)
{
//如果查询结束
if (isSelectOver)
{
//关闭当前语音
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
break;
}
else
{
//播放语音
voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);
i++;
}
}
}
else
{
//如果查询结束
if (isSelectOver)
{
//关闭语音
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
}
else
{
//播放语音
voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);
}
}
else
{
//如果查询结束
if (isSelectOver)
{
//关闭语音
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
}
else
{
//播放语音
voice.Speak(voiceContent, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync);
}
}
}
此时还有一个问题,循环的时候第二个参数传true ,但是后续还有要播放的内容时,需要先停止上一个循环,也就是第三个参数需要传true(默认false)
而后还要再调用以下方法来播放新的语音,我认为这里其实可能会有更好的办法,目前我还没有想到,如果有哪位大神有好的意见,欢迎一起头脑风暴。