73 lines
1.9 KiB
C#
73 lines
1.9 KiB
C#
using Ryuclaw.Shared.Speech;
|
|
using AVFoundation;
|
|
|
|
namespace Ryuclaw.Speech.MacOS {
|
|
|
|
public class TTS : ISpeech {
|
|
private float Rate { get; set; }
|
|
private float Pitch { get; set; }
|
|
private AVSpeechSynthesizer Synth;
|
|
private AVSpeechSynthesisVoice Voice;
|
|
|
|
public TTS()
|
|
{
|
|
Synth = new AVSpeechSynthesizer();
|
|
Rate = 1;
|
|
Pitch = 1;
|
|
Voice = AVSpeechSynthesisVoice.FromIdentifier(AVSpeechSynthesisVoice.IdentifierAlex);
|
|
|
|
}
|
|
|
|
public void SetRate(float rate)
|
|
{
|
|
Rate = rate;
|
|
}
|
|
|
|
public void SetPitch(float pitch)
|
|
{
|
|
Pitch = pitch;
|
|
}
|
|
|
|
public List<string> GetVoices()
|
|
{
|
|
var availableVoices = AVSpeechSynthesisVoice.GetSpeechVoices();
|
|
List<string> voices = new();
|
|
foreach (var voice in availableVoices)
|
|
{
|
|
voices.Add(voice.Name);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public void SetVoice(string name)
|
|
{
|
|
foreach (var voice in AVSpeechSynthesisVoice.GetSpeechVoices())
|
|
{
|
|
if (voice.Name.Equals(name))
|
|
{
|
|
Voice = voice;
|
|
return;
|
|
}
|
|
}
|
|
Voice = AVSpeechSynthesisVoice.FromIdentifier(AVSpeechSynthesisVoice.IdentifierAlex);
|
|
}
|
|
|
|
public void Speak(string text)
|
|
{
|
|
var utterance = new AVSpeechUtterance(text);
|
|
utterance.Rate = Rate;
|
|
utterance.PitchMultiplier = Pitch;
|
|
utterance.Voice = Voice;
|
|
utterance.PrefersAssistiveTechnologySettings = true;
|
|
|
|
Synth.SpeakUtterance(utterance);
|
|
}
|
|
|
|
public void Stop()
|
|
{
|
|
Synth.StopSpeaking(AVSpeechBoundary.Immediate);
|
|
}
|
|
|
|
}
|
|
}
|