Public Access
Make meeting lifecycle stateful
This commit is contained in:
@@ -188,3 +188,197 @@ When configured, Meeting Assistant SHALL manage a local FunASR backend lifecycle
|
||||
- **WHEN** Meeting Assistant stops after starting a managed FunASR backend
|
||||
- **THEN** Meeting Assistant stops the managed backend process or container
|
||||
|
||||
### Requirement: Meeting Assistant learns speaker identities locally
|
||||
Meeting Assistant SHALL maintain a local SQLite speaker identity database in the user's application data folder.
|
||||
|
||||
The speaker identity database SHALL store speaker identities, optional canonical names, aliases, candidate names, meeting file references, and a bounded set of WAV snippets per identity.
|
||||
|
||||
Meeting file references SHALL include the meeting note file address and the transcript file address.
|
||||
|
||||
Meeting Assistant SHALL calculate speaker identity participation counts from meeting file references when needed instead of persisting a denormalized transcript count.
|
||||
|
||||
Each speaker identity SHALL store a last-modified timestamp used by active-age filtering, and Meeting Assistant SHALL update it whenever the identity is created or modified by identification, candidate updates, snippet changes, reference changes, or merge operations.
|
||||
|
||||
The configured maximum snippet count per identity SHALL prevent unbounded growth.
|
||||
|
||||
#### Scenario: Unknown speaker is learned from meeting attendees
|
||||
- **WHEN** a finished transcript contains an unmatched diarized speaker and the meeting note has attendees
|
||||
- **THEN** Meeting Assistant stores a new unnamed speaker identity with candidate names from the attendees that were not already matched in that meeting
|
||||
- **AND** stores a meeting file reference for that identity
|
||||
|
||||
#### Scenario: Speaker snippets are bounded
|
||||
- **WHEN** Meeting Assistant adds a snippet for an identity that already has the configured maximum number of snippets
|
||||
- **THEN** Meeting Assistant does not store more snippets for that identity
|
||||
|
||||
#### Scenario: Identity modification updates active-age timestamp
|
||||
- **WHEN** Meeting Assistant creates, identifies, updates candidates for, stores snippets for, stores references for, or merges a speaker identity
|
||||
- **THEN** Meeting Assistant updates that identity's last-modified timestamp
|
||||
|
||||
### Requirement: Speaker identities can be merged diagnostically
|
||||
Meeting Assistant SHALL expose a diagnostic endpoint that merges duplicate speaker identities.
|
||||
|
||||
The merge process SHALL compare recently-created identities, using a configurable recent age that defaults to two weeks, against all other identities in matcher batches bounded by the configured batch size.
|
||||
|
||||
The merge process SHALL require a match and a second validation match using a different source sample before merging two identities.
|
||||
|
||||
When identities are merged, Meeting Assistant SHALL retain one identity, move useful names from the merged identity into aliases, combine meeting file references, retain a bounded set of snippets from both identities, and append an audit line to each referenced transcript in the form `<date> <name 1> and <name 2> were merged`.
|
||||
|
||||
#### Scenario: Recently-created duplicate identity is merged
|
||||
- **GIVEN** a recently-created identity and an older identity have matching speaker snippets
|
||||
- **WHEN** the diagnostic merge endpoint is triggered
|
||||
- **THEN** Meeting Assistant validates the match twice with different source snippets
|
||||
- **AND** merges the recent identity into the older identity
|
||||
- **AND** stores the recent identity name as an alias on the retained identity
|
||||
- **AND** keeps meeting file references from both identities
|
||||
- **AND** appends the merge audit line to the referenced transcripts
|
||||
|
||||
#### Scenario: Old identities are not used as merge sources
|
||||
- **GIVEN** two identities older than the configured recent age
|
||||
- **WHEN** the diagnostic merge endpoint is triggered
|
||||
- **THEN** Meeting Assistant does not compare them as source identities
|
||||
|
||||
### Requirement: Speaker candidates are eliminated across meetings
|
||||
Meeting Assistant SHALL update candidate names for a matched unnamed identity using the intersection of its existing candidate names and the current meeting attendees.
|
||||
|
||||
Meeting Assistant SHALL treat identity aliases as acceptable names during candidate elimination and when excluding already-matched attendees from new unmatched speaker candidates.
|
||||
|
||||
When the candidate intersection leaves exactly one candidate, Meeting Assistant SHALL promote that candidate to the canonical speaker name.
|
||||
|
||||
When an identity receives a canonical name, Meeting Assistant SHALL append an audit line to each referenced transcript in the form `<date> <speaker label> was identified as <name>`.
|
||||
|
||||
When the candidate intersection is empty, Meeting Assistant SHALL replace the oldest stored snippet for that identity and reset candidates from the current meeting attendees, because the previous snippet may have been dirty.
|
||||
|
||||
#### Scenario: Candidate elimination promotes canonical name
|
||||
- **GIVEN** an unnamed identity has candidate names `John` and `Mike`
|
||||
- **WHEN** that identity matches a speaker in a later meeting with attendees `Jane`, `John`, and `Chris`
|
||||
- **THEN** Meeting Assistant removes `Mike` from the identity candidates and promotes `John` as the canonical name
|
||||
- **AND** appends the identity naming audit line to the identity's referenced transcripts
|
||||
|
||||
#### Scenario: Alias participates in candidate elimination
|
||||
- **GIVEN** an unnamed identity has candidate name `Michael` and alias `Mike`
|
||||
- **WHEN** that identity matches a speaker in a later meeting with attendee `Mike`
|
||||
- **THEN** Meeting Assistant treats `Mike` as matching `Michael`
|
||||
- **AND** promotes `Michael` as the canonical name
|
||||
|
||||
#### Scenario: Empty candidate intersection resets candidates
|
||||
- **GIVEN** an unnamed identity has candidate names `John` and `Mike`
|
||||
- **WHEN** that identity matches a speaker in a later meeting with attendees `Jane` and `Chris`
|
||||
- **THEN** Meeting Assistant resets the identity candidates to `Jane` and `Chris`
|
||||
- **AND** replaces the oldest stored snippet for that identity with the current speaker snippet
|
||||
|
||||
### Requirement: Speaker identity matches relabel transcripts
|
||||
Meeting Assistant SHALL attempt to match unknown diarized speaker snippets against known speaker identities ordered by calculated meeting reference count.
|
||||
|
||||
Speaker identity matching SHALL use a dedicated Azure Speech diarization verifier component rather than the configured speech recognition pipeline.
|
||||
|
||||
The matcher SHALL test at most the configured batch size of known people per diarization session and continue with later batches until a match is found or no candidates remain.
|
||||
|
||||
The matcher SHALL prioritize identities whose canonical name or aliases match current meeting attendees.
|
||||
|
||||
After attendee-matched identities, the matcher SHALL order identities by calculated meeting reference count, filter out non-attendee identities whose last update is older than the configured active age, and cap the candidate set at the configured maximum match candidate count.
|
||||
|
||||
When a match is confirmed in final identity processing, Meeting Assistant SHALL store a meeting file reference for that identity.
|
||||
|
||||
When a match is confirmed and the identity has a canonical name, Meeting Assistant SHALL rewrite finished transcript segments for that diarized speaker with the canonical name.
|
||||
|
||||
When a match is confirmed and the matched speaker is not already listed in meeting note attendees by display name or alias, Meeting Assistant SHALL add the speaker display name to the attendee list.
|
||||
|
||||
When Meeting Assistant writes attendees from calendar metadata, it SHALL match attendee display names exactly against known identity canonical names and aliases, replace matches with the identity display name, and deduplicate attendees that map to the same identity.
|
||||
|
||||
#### Scenario: Finished transcript is relabeled after a confirmed match
|
||||
- **GIVEN** the speaker identity database contains canonical speaker `Chris`
|
||||
- **WHEN** a finished transcript has diarized speaker `Guest03` and the matching backend confirms it is `Chris`
|
||||
- **THEN** Meeting Assistant rewrites `Guest03` segments in the transcript as `Chris`
|
||||
|
||||
#### Scenario: Confirmed match stores meeting reference
|
||||
- **GIVEN** the speaker identity database contains canonical speaker `Chris`
|
||||
- **WHEN** a finished transcript has diarized speaker `Guest03` and the matching backend confirms it is `Chris`
|
||||
- **THEN** Meeting Assistant stores the meeting note and transcript file addresses as a reference for `Chris`
|
||||
|
||||
### Requirement: Speaker matching runs during active transcription
|
||||
Meeting Assistant SHALL start speaker identity matching only after the configured initial transcription duration has elapsed.
|
||||
|
||||
For backends that emit live diarized transcript segments, Meeting Assistant SHALL keep a bounded in-memory sliding audio buffer with chunk timestamps and extract candidate WAV snippets from that buffer when live diarized segments arrive.
|
||||
|
||||
Meeting Assistant SHALL keep only the configured best candidate snippets per diarized speaker in memory. Better snippets SHALL be preferred when the segment looks like a continuous medium-length sentence.
|
||||
|
||||
Meeting Assistant SHALL periodically match unresolved diarized speaker samples while transcription is active and attempt to match them against the local identity database.
|
||||
|
||||
Meeting Assistant SHALL run live matching incrementally at the configured interval only when at least one new unmapped diarized speaker sample appears or the meeting note attendee frontmatter changes while unmapped speaker samples still exist.
|
||||
|
||||
When a speaker is matched during transcription, Meeting Assistant SHALL rewrite already-written live transcript segments for that diarized speaker and write future transcript segments using the canonical name.
|
||||
|
||||
Live speaker matching SHALL be read-only with respect to the speaker identity database. Candidate elimination, canonical promotion, transcription counters, stored snippet updates, and new unmatched identity creation SHALL happen only after transcription is finished, using the latest meeting note frontmatter.
|
||||
|
||||
For backends that only provide diarization after finalization, Meeting Assistant SHALL defer speaker identity matching until finished diarization is available, extract candidate snippets from the completed temporary recording, complete identity matching, and only then allow summary generation to start.
|
||||
|
||||
#### Scenario: Matching waits for useful speech duration
|
||||
- **WHEN** transcription has been active for less than the configured speaker identification initial delay
|
||||
- **THEN** Meeting Assistant does not run speaker identity matching yet
|
||||
|
||||
#### Scenario: Live matching uses in-memory speaker samples
|
||||
- **WHEN** a live diarized transcript segment identifies an unresolved speaker
|
||||
- **THEN** Meeting Assistant extracts a WAV snippet for that segment from the in-memory sliding audio buffer
|
||||
- **AND** uses retained speaker samples for live identity matching without reading the temporary recording file
|
||||
|
||||
#### Scenario: Live match rewrites current and future transcript writes
|
||||
- **WHEN** periodic matching confirms that diarized speaker `Guest03` is canonical speaker `Chris`
|
||||
- **THEN** already-written live transcript segments for `Guest03` are rewritten as `Chris`
|
||||
- **AND** later live transcript segments for `Guest03` are written as `Chris`
|
||||
|
||||
#### Scenario: New live speaker triggers another identification round
|
||||
- **GIVEN** live matching already checked the current unresolved speaker samples
|
||||
- **WHEN** a new unmapped diarized speaker sample appears
|
||||
- **THEN** Meeting Assistant runs another live matching round at the next configured interval
|
||||
|
||||
#### Scenario: Attendee changes trigger another identification round
|
||||
- **GIVEN** live matching already checked unresolved speaker samples
|
||||
- **WHEN** the meeting note attendee frontmatter changes
|
||||
- **THEN** Meeting Assistant runs another live matching round at the next configured interval using the latest attendees
|
||||
|
||||
#### Scenario: Live matching does not make final identity decisions
|
||||
- **WHEN** live matching finds a possible speaker identity during transcription
|
||||
- **THEN** Meeting Assistant does not change candidate names, promote canonical names, increment counters, store snippets, or create unmatched identities
|
||||
- **AND** the final speaker identity pass uses the latest meeting note attendees after transcription finishes
|
||||
|
||||
### Requirement: Speech recognition diagnostics are launch-profile aware
|
||||
Meeting Assistant SHALL preserve existing ASR diagnostic endpoint URLs as default-profile URLs.
|
||||
|
||||
Meeting Assistant SHALL provide equivalent named-profile ASR diagnostic endpoint URLs that include the profile name.
|
||||
|
||||
When a named-profile ASR diagnostic endpoint is used, Meeting Assistant SHALL create the speech recognition pipeline from the resolved profile configuration.
|
||||
|
||||
#### Scenario: Default ASR diagnostic URL uses default profile
|
||||
- **WHEN** the user submits a WAV file to the existing ASR diagnostic endpoint URL
|
||||
- **THEN** Meeting Assistant streams the WAV through the default launch profile's configured speech recognition pipeline
|
||||
|
||||
#### Scenario: Named ASR diagnostic URL uses named profile
|
||||
- **WHEN** the user submits a WAV file to the ASR diagnostic endpoint URL for profile `english`
|
||||
- **THEN** Meeting Assistant streams the WAV through the resolved `english` launch profile's configured speech recognition pipeline
|
||||
|
||||
### Requirement: Azure Speech post-stream refinement is configurable
|
||||
Meeting Assistant SHALL allow the Azure Speech streaming transcription provider to configure the Speech SDK post-processing option.
|
||||
|
||||
When configured for a compatible Azure Speech SDK recognizer, Meeting Assistant SHALL set `SpeechServiceResponse_PostProcessingOption` on the Azure Speech SDK `SpeechConfig`.
|
||||
|
||||
The default application configuration SHALL keep `PostProcessingOption` empty while using live `ConversationTranscriber` and SHALL use a region that supports post-stream refinement for future compatible recognizer paths.
|
||||
|
||||
Meeting Assistant SHALL keep using the existing Azure live streaming transcription flow rather than switching to batch or offline processing.
|
||||
|
||||
When the Azure live streaming backend uses `ConversationTranscriber`, Meeting Assistant SHALL prefer working live diarized transcription over applying a post-processing option that is only documented for `SpeechRecognizer`.
|
||||
|
||||
#### Scenario: Azure Speech post-refinement is configured
|
||||
- **WHEN** `AzureSpeech.PostProcessingOption` is `PostRefinement`
|
||||
- **AND** the configured Azure Speech recognizer supports SDK post-processing
|
||||
- **THEN** Meeting Assistant sets `SpeechServiceResponse_PostProcessingOption` to `PostRefinement` on the Azure Speech SDK configuration
|
||||
|
||||
#### Scenario: Azure live conversation transcription remains available
|
||||
- **WHEN** `AzureSpeech.PostProcessingOption` is `PostRefinement`
|
||||
- **AND** the Azure backend is using live `ConversationTranscriber`
|
||||
- **THEN** Meeting Assistant skips the post-processing SDK property
|
||||
- **AND** continues using live conversation transcription
|
||||
|
||||
#### Scenario: Azure Speech post-processing is unset
|
||||
- **WHEN** `AzureSpeech.PostProcessingOption` is empty
|
||||
- **THEN** Meeting Assistant does not set a post-processing option on the Azure Speech SDK configuration
|
||||
|
||||
|
||||
Reference in New Issue
Block a user