54 lines
1.6 KiB
C#
54 lines
1.6 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 ISpVoice _voice;
|
|
|
|
public TTSWorker() : base(CreateSoundPlayer()) {
|
|
App.MainLogger.Log(1, "Audio", null, "Initializing TTS worker");
|
|
try {
|
|
_voice = new SpVoiceClass();
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
static SoundPlayer CreateSoundPlayer() {
|
|
App.MainLogger.Log(1, "Audio", null, "Creating sound player");
|
|
try {
|
|
return new SoundPlayer();
|
|
}
|
|
catch (InvalidOperationException ex) {
|
|
App.MainLogger.Log(3, "Audio", null, "An error occurred when creating sound player: {0}", ex);
|
|
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),
|
|
(uint)(SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak),
|
|
out _
|
|
);
|
|
App.MainLogger.Log(0, "Audio", null, "TTS ({0}): {1}", culture, content);
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
protected override void StopCurrent() {
|
|
if (_voice == null) return;
|
|
App.MainLogger.Log(0, "Audio", null, "TTS stopping current");
|
|
_voice.Skip("SENTENCE", int.MaxValue, out _);
|
|
}
|
|
}
|
|
}
|