← All source files

V18 / 8d896b8a86e5

PersonalityCatalog.cs

Lilith/Core/Personality/PersonalityCatalog.cs

Unchanged from the preceding version
CS
using KokoroSharp;
using Lilith.Core.Kokoro;

namespace Lilith.Core.Personality;

public sealed record PersonalityStyle(string Id, string Title, string Instructions);
public sealed record PersonalityVoice(string Id, string Sex, string Language, bool IsDefault);
public static class PersonalityCatalog
{
    public static IReadOnlyList<PersonalityStyle> Styles { get; } = Array.AsReadOnly<PersonalityStyle>([
        new("default", "Default", ""),
        new("pirate", "Pirate", "Speak like a playful pirate: nautical metaphors, an occasional Arrr or matey, lively sea-faring phrasing. Stay clear, helpful and accurate; avoid excessive dialect."),
        new("space_captain", "Space Captain", "Speak like an upbeat starship captain: crisp mission briefings, playful cosmic metaphors and encouraging teamwork. Keep useful answers clear and accurate."),
        new("butler", "Butler", "Speak like a composed, dry-witted butler: polished courtesy, understated humour and practical efficiency. Be kind, never condescending, and keep facts accurate."),
        new("storyteller", "Storyteller", "Speak like a whimsical storyteller: vivid gentle imagery, warmth and a little wonder. Use brief imaginative framing while keeping practical advice and facts accurate.")
    ]);
    public static PersonalityStyle Style(string id) => Styles.FirstOrDefault(s => s.Id == id)
        ?? throw new ArgumentException("Unknown personality. Choose: " + string.Join(", ", Styles.Select(s => s.Id)));
    public static IReadOnlyList<PersonalityVoice> Voices(string defaultVoice = "af_heart")
    {
        KokoroTts.ValidateVoice(defaultVoice); // Initializes the installed voice registry.
        return KokoroVoiceManager.Voices.Select(v => new PersonalityVoice(v.Name,
            v.Gender.ToString().ToLowerInvariant() switch { "female" => "female", "male" => "male", _ => "other" },
            v.Language.ToString(), v.Name == defaultVoice)).OrderBy(v => v.Id, StringComparer.Ordinal).ToArray();
    }
    public static string Instructions(string value) => Styles.FirstOrDefault(s => s.Id == value)?.Instructions ?? value;
}