diff --git a/PROJECT_KNOWLEDGE.md b/PROJECT_KNOWLEDGE.md index df8ca65..a5f28ce 100644 --- a/PROJECT_KNOWLEDGE.md +++ b/PROJECT_KNOWLEDGE.md @@ -1,5 +1,14 @@ # Project Knowledge +## Meeting language + +The GUI's `meeting_language` is passed through `MeetingDetails.language` to both +Meeting Context `meeting.language` and `MvpMeetingConfig.language` (Whisper). +Meeting Lab derives explicit protocol output language from the persisted context, +also during regeneration, and records derived `output_language` provenance in +protocol runtime metadata. Missing context language defaults to German. There is +no separate protocol-language setting or automatic context/transcript translation. + ## Vision Meeting Assistant turns recorded meetings into reviewed, user-facing protocols diff --git a/README.md b/README.md index f7fa2f7..c40717b 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,13 @@ reference recorder, but imported audio is not tied to OBS-specific behavior. ## Processing Pipeline +The existing **Meeting language** selector controls both transcription and protocol +output: `de` means German for both, and `en` means English for both. The selection +is saved in Meeting Context (`meeting.language`) and reused for protocol-only +regeneration without retranscription. Older contexts without a language retain +German protocol output. Names, speaker mappings and authored Meeting Context are +preserved; no transcript translation stage is added. + ```text Audio file -> FFmpeg preparation (mono, 16 kHz PCM WAV; normalization optional) diff --git a/src/mka/ui/streamlit_app.py b/src/mka/ui/streamlit_app.py index 648f4bf..6946ffb 100644 --- a/src/mka/ui/streamlit_app.py +++ b/src/mka/ui/streamlit_app.py @@ -458,7 +458,10 @@ def main() -> None: description = st.text_area("Description / context", height=100, key="meeting_description") metadata_columns = st.columns(3) language = metadata_columns[0].selectbox( - "Meeting language", options=["de", "en"], key="meeting_language" + "Meeting language", + options=["de", "en"], + key="meeting_language", + help="Language for both transcription and the generated protocol.", ) has_date = metadata_columns[1].checkbox( "Meeting date is known", value=True, key="meeting_has_date" diff --git a/tests/test_meeting_service.py b/tests/test_meeting_service.py index 106f928..736de78 100644 --- a/tests/test_meeting_service.py +++ b/tests/test_meeting_service.py @@ -323,19 +323,28 @@ def test_build_context_translates_mentioned_only_person(tmp_path: Path) -> None: ] +@pytest.mark.parametrize("language", ["de", "en"]) def test_process_translates_configuration_and_disables_diarization( tmp_path: Path, + language: str, ) -> None: service, gateway = make_service(tmp_path) audio = tmp_path / "meeting.wav" audio.write_bytes(b"audio") outcome = service.process( - audio, meeting(), participants(), ProcessingOptions(diarization_enabled=False) + audio, + replace(meeting(), language=language), + participants(), + ProcessingOptions(diarization_enabled=False), ) assert outcome.succeeded assert gateway.config_values is not None + assert gateway.config_values["language"] == language + assert service.build_context(replace(meeting(), language=language), participants()).data[ + "meeting" + ]["language"] == language assert gateway.config_values["diarization"] == "off" assert gateway.config_values["model"] == "test:model" assert gateway.config_values["protocol_num_ctx"] == 32_768