48 lines
1.2 KiB
C#
48 lines
1.2 KiB
C#
using SpeechLib;
|
|
using System;
|
|
using System.Globalization;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Cryville.EEW.Unity {
|
|
class TTSWorker : Core.Audio.TTSWorker {
|
|
readonly SpVoiceClass _voice;
|
|
|
|
public TTSWorker() : base(CreateSoundPlayer()) {
|
|
try {
|
|
_voice = new SpVoiceClass();
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
static SoundPlayer CreateSoundPlayer() {
|
|
try {
|
|
return new SoundPlayer();
|
|
}
|
|
catch (InvalidOperationException) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
protected override bool IsSpeaking() {
|
|
if (_voice == null) return false;
|
|
_voice.GetStatus(out var status, out _);
|
|
return (status.dwRunningState & (uint)SpeechRunState.SRSEIsSpeaking) != 0;
|
|
}
|
|
|
|
protected override Task Speak(CultureInfo culture, string content, CancellationToken cancellationToken) {
|
|
if (_voice == null) return Task.CompletedTask;
|
|
_voice.Speak(
|
|
string.Format(CultureInfo.InvariantCulture, "<LANG LANGID=\"{0:x}\">{1}</LANG>", culture.LCID, content),
|
|
SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak
|
|
);
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
protected override void StopCurrent() {
|
|
if (_voice == null) return;
|
|
_voice.Skip("SENTENCE", int.MaxValue);
|
|
}
|
|
}
|
|
}
|