2
0
mirror of https://github.com/9ParsonsB/Pulsar.git synced 2025-04-11 14:34:44 -04:00
Jonathan Miller 1950d477fd
Herald v2 ()
* Add speech rate setting

* Add volume slider

* New speech manager skeleton

* User API key from resx

* Implement voice list retrieve via new api

* Rewrite to use ObAPI, remove all dependancies

* Use volume setting

* Clean up using statements

* Volume and timing adjustments

* Lookup rate value

* Use numeric rates for tighter spread

* Manage plugin data folder via core interface

* Add check that nullable settings are not null.

* Get file size before it's deleted.

* Improve old settings migration.

* Ignore cache sizes below 1MB

* Re-index orphaned files in cache, purge legacy wav files.

* Call top level error logging for native voice exception.

* Async title and detail requests to remove pause

* Remove NetCoreAudio use of temp files.

* Remove orphan using.
2022-04-04 11:58:30 -02:30

106 lines
3.6 KiB
C#

using Observatory.Framework;
using Observatory.Framework.Interfaces;
using System.Text.Json;
namespace Observatory.Herald
{
public class HeraldNotifier : IObservatoryNotifier
{
public HeraldNotifier()
{
heraldSettings = DefaultSettings;
}
private static HeraldSettings DefaultSettings
{
get => new HeraldSettings()
{
SelectedVoice = "American - Christopher",
SelectedRate = "Default",
Volume = 75,
Enabled = false,
ApiEndpoint = "https://api.observatory.xjph.net/AzureVoice",
CacheSize = 100
};
}
public string Name => "Observatory Herald";
public string ShortName => "Herald";
public string Version => typeof(HeraldNotifier).Assembly.GetName().Version.ToString();
public PluginUI PluginUI => new (PluginUI.UIType.None, null);
public object Settings
{
get => heraldSettings;
set
{
// Need to perform migration here, older
// version settings object not fully compatible.
var savedSettings = (HeraldSettings)value;
if (string.IsNullOrWhiteSpace(savedSettings.SelectedRate))
{
heraldSettings.SelectedVoice = savedSettings.SelectedVoice;
heraldSettings.Enabled = savedSettings.Enabled;
}
else
{
heraldSettings = savedSettings;
}
}
}
public void Load(IObservatoryCore observatoryCore)
{
var speechManager = new SpeechRequestManager(heraldSettings, observatoryCore.HttpClient, observatoryCore.PluginStorageFolder);
heraldSpeech = new HeraldQueue(speechManager);
heraldSettings.Test = TestVoice;
}
private void TestVoice()
{
heraldSpeech.Enqueue(
new NotificationArgs()
{
Title = "Herald voice testing",
Detail = $"This is {heraldSettings.SelectedVoice.Split(" - ")[1]}."
},
GetAzureNameFromSetting(heraldSettings.SelectedVoice),
GetAzureStyleNameFromSetting(heraldSettings.SelectedVoice),
heraldSettings.Rate[heraldSettings.SelectedRate].ToString(),
heraldSettings.Volume);
}
public void OnNotificationEvent(NotificationArgs notificationEventArgs)
{
if (heraldSettings.Enabled)
heraldSpeech.Enqueue(
notificationEventArgs,
GetAzureNameFromSetting(heraldSettings.SelectedVoice),
GetAzureStyleNameFromSetting(heraldSettings.SelectedVoice),
heraldSettings.Rate[heraldSettings.SelectedRate].ToString(),
heraldSettings.Volume);
}
private string GetAzureNameFromSetting(string settingName)
{
var voiceInfo = (JsonElement)heraldSettings.Voices[settingName];
return voiceInfo.GetProperty("ShortName").GetString();
}
private string GetAzureStyleNameFromSetting(string settingName)
{
string[] settingParts = settingName.Split(" - ");
if (settingParts.Length == 3)
return settingParts[2];
else
return string.Empty;
}
private HeraldSettings heraldSettings;
private HeraldQueue heraldSpeech;
}
}