Add meeting assistant speech and summary automation

This commit is contained in:
2026-05-21 09:55:39 +02:00
parent 1e97d2b9ff
commit 48d98d9cbb
63 changed files with 5143 additions and 151 deletions
+54 -9
View File
@@ -14,6 +14,8 @@ public sealed class MeetingAssistantOptions
public FunAsrOptions FunAsr { get; set; } = new();
public SpeakerIdentificationOptions SpeakerIdentification { get; set; } = new();
public AgentOptions Agent { get; set; } = new();
public ApiOptions Api { get; set; } = new();
@@ -26,22 +28,24 @@ public sealed class HotkeyOptions
public sealed class VaultOptions
{
public string TranscriptsFolder { get; set; } = @"%USERPROFILE%\OpenCloud\Persönlich\Vault\Meetings\Transcripts";
public string BaseFolder { get; set; } = @"%USERPROFILE%\OpenCloud\Persönlich\Vault\Exxeta";
public string MeetingNotesFolder { get; set; } = @"%USERPROFILE%\OpenCloud\Persönlich\Vault\Meetings\Notes";
public string TranscriptsFolder { get; set; } = @"Meetings\Transcripts";
public string AssistantContextFolder { get; set; } = @"%USERPROFILE%\OpenCloud\Persönlich\Vault\Meetings\Assistant Context";
public string MeetingNotesFolder { get; set; } = @"Meetings\Notes";
public string SummariesFolder { get; set; } = @"%USERPROFILE%\OpenCloud\Persönlich\Vault\Meetings\Summaries";
public string AssistantContextFolder { get; set; } = @"Meetings\Assistant Context";
public string ProjectsFolder { get; set; } = @"%USERPROFILE%\OpenCloud\Persönlich\Vault\Projects";
public string SummariesFolder { get; set; } = @"Meetings\Summaries";
public string DictationWordsPath { get; set; } = @"%USERPROFILE%\OpenCloud\Persönlich\Vault\Meetings\dictation-words.md";
public string ProjectsFolder { get; set; } = @"Projects";
public string DictationWordsPath { get; set; } = @"Meetings\dictation-words.md";
}
public sealed class RecordingOptions
{
public string TranscriptionProvider { get; set; } = "funasr";
public string TranscriptionProvider { get; set; } = "azure-speech";
public int SampleRate { get; set; } = 16000;
@@ -49,6 +53,12 @@ public sealed class RecordingOptions
public TimeSpan StopProcessingTimeout { get; set; } = TimeSpan.FromMinutes(10);
public TimeSpan MetadataLookupTimeout { get; set; } = TimeSpan.FromSeconds(10);
public TimeSpan BackgroundMetadataLookupTimeout { get; set; } = TimeSpan.FromMinutes(1);
public TimeSpan OpenMeetingNoteDelay { get; set; } = TimeSpan.FromSeconds(1);
public string TemporaryRecordingsFolder { get; set; } = @"%LOCALAPPDATA%\MeetingAssistant\Recordings";
}
@@ -92,11 +102,15 @@ public sealed class PyannoteDiarizationOptions
public sealed class AzureSpeechOptions
{
public string Endpoint { get; set; } = "https://germanywestcentral.api.cognitive.microsoft.com/";
public string Endpoint { get; set; } = "";
public string Region { get; set; } = "germanywestcentral";
public string Language { get; set; } = "en-US";
public string Language { get; set; } = "auto";
public string[] AutoDetectLanguages { get; set; } = ["de-DE", "en-US"];
public string LanguageIdMode { get; set; } = "Continuous";
public string? Key { get; set; }
@@ -105,6 +119,8 @@ public sealed class AzureSpeechOptions
public TimeSpan RecognitionStopTimeout { get; set; } = TimeSpan.FromSeconds(10);
public bool DiarizeIntermediateResults { get; set; } = true;
public double PhraseListWeight { get; set; } = 1.5;
}
public enum PyannoteAnnotationSource
@@ -192,6 +208,33 @@ public sealed class FunAsrDiarizationOptions
public TimeSpan CommandTimeout { get; set; } = TimeSpan.FromMinutes(30);
}
public sealed class SpeakerIdentificationOptions
{
public bool Enabled { get; set; } = true;
public string DatabasePath { get; set; } = @"%LOCALAPPDATA%\MeetingAssistant\SpeakerIdentity\speaker-identities.db";
public TimeSpan InitialDelay { get; set; } = TimeSpan.FromMinutes(2);
public TimeSpan Interval { get; set; } = TimeSpan.FromMinutes(2);
public int MatchBatchSize { get; set; } = 6;
public int MaxMatchCandidates { get; set; } = 100;
public TimeSpan MatchIdentityActiveAge { get; set; } = TimeSpan.FromDays(365);
public int MaxSnippetsPerSpeaker { get; set; } = 3;
public double SilenceBetweenSnippetsSeconds { get; set; } = 1;
public TimeSpan LiveSampleBufferDuration { get; set; } = TimeSpan.FromMinutes(10);
public TimeSpan MergeRecentIdentityAge { get; set; } = TimeSpan.FromDays(14);
public AzureSpeechOptions AzureSpeech { get; set; } = new();
}
public sealed class AgentOptions
{
public string Endpoint { get; set; } = "https://litellm.schweigert.cloud";
@@ -219,6 +262,8 @@ public sealed class AgentOptions
public double CompactionRemainingRatio { get; set; } = 0.10;
public string ResponsesCompactPath { get; set; } = "responses/compact";
public string? InitialPrompt { get; set; }
}
public sealed class ApiOptions