Compare commits

..

3 Commits

Author SHA1 Message Date
Gitea Actions
d263be2ac1 chore: bump sidecar version to 1.0.15 [skip ci] 2026-04-12 17:44:51 +00:00
Developer
1c8c6ad7e8 Fix display user not updating locally until app restart
All checks were successful
Tests / Python Backend Tests (push) Successful in 5s
Tests / Frontend Tests (push) Successful in 7s
Tests / Rust Sidecar Tests (push) Successful in 3m12s
Engines now read user.name from the config object at transcription time
instead of caching it at init, so name changes take effect immediately.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 10:40:46 -07:00
Gitea Actions
023bc0218b chore: bump version to 2.0.20 [skip ci] 2026-04-12 02:12:38 +00:00
10 changed files with 23 additions and 31 deletions

View File

@@ -276,7 +276,6 @@ class AppController:
self.current_model_size = model self.current_model_size = model
self.current_device_config = device_config self.current_device_config = device_config
user_name = self.config.get('user.name', 'User')
continuous_mode = self.config.get('transcription.continuous_mode', False) continuous_mode = self.config.get('transcription.continuous_mode', False)
if continuous_mode: if continuous_mode:
@@ -293,7 +292,6 @@ class AppController:
if remote_mode in ('managed', 'byok'): if remote_mode in ('managed', 'byok'):
self.transcription_engine = DeepgramTranscriptionEngine( self.transcription_engine = DeepgramTranscriptionEngine(
config=self.config, config=self.config,
user_name=user_name,
input_device_index=audio_device, input_device_index=audio_device,
) )
self.transcription_engine.set_callbacks( self.transcription_engine.set_callbacks(
@@ -343,7 +341,7 @@ class AppController:
initial_prompt=self.config.get('transcription.initial_prompt', ''), initial_prompt=self.config.get('transcription.initial_prompt', ''),
no_log_file=self.config.get('transcription.no_log_file', True), no_log_file=self.config.get('transcription.no_log_file', True),
input_device_index=audio_device, input_device_index=audio_device,
user_name=user_name, app_config=self.config,
) )
self.transcription_engine.set_callbacks( self.transcription_engine.set_callbacks(
realtime_callback=self._on_realtime_transcription, realtime_callback=self._on_realtime_transcription,

View File

@@ -36,18 +36,16 @@ class DeepgramTranscriptionEngine:
# Construction / configuration # Construction / configuration
# ------------------------------------------------------------------ # # ------------------------------------------------------------------ #
def __init__(self, config, user_name: str = "User", input_device_index: Optional[int] = None): def __init__(self, config, input_device_index: Optional[int] = None):
""" """
Initialise the engine from a :class:`client.config.Config` object. Initialise the engine from a :class:`client.config.Config` object.
Args: Args:
config: Application ``Config`` instance. config: Application ``Config`` instance.
user_name: Display name attached to transcriptions.
input_device_index: Index of the audio input device to use input_device_index: Index of the audio input device to use
(``None`` for the system default). (``None`` for the system default).
""" """
self.config = config self.config = config
self.user_name = user_name
self.input_device_index = input_device_index self.input_device_index = input_device_index
# Mode: 'managed' (proxy) or 'byok' (direct Deepgram) # Mode: 'managed' (proxy) or 'byok' (direct Deepgram)
@@ -454,7 +452,7 @@ class DeepgramTranscriptionEngine:
text=text, text=text,
is_final=is_final, is_final=is_final,
timestamp=datetime.now(), timestamp=datetime.now(),
user_name=self.user_name, user_name=self.config.get('user.name', 'User'),
) )
if is_final: if is_final:
if self.final_callback: if self.final_callback:
@@ -505,7 +503,7 @@ class DeepgramTranscriptionEngine:
text=transcript, text=transcript,
is_final=is_final, is_final=is_final,
timestamp=datetime.now(), timestamp=datetime.now(),
user_name=self.user_name, user_name=self.config.get('user.name', 'User'),
) )
if is_final: if is_final:
if self.final_callback: if self.final_callback:
@@ -536,10 +534,6 @@ class DeepgramTranscriptionEngine:
pass pass
self._ws = None self._ws = None
def set_user_name(self, user_name: str):
"""Update the user name attached to future transcriptions."""
self.user_name = user_name
def is_recording_active(self) -> bool: def is_recording_active(self) -> bool:
"""Return ``True`` if audio is currently being captured.""" """Return ``True`` if audio is currently being captured."""
return self._is_recording return self._is_recording

View File

@@ -58,8 +58,8 @@ class RealtimeTranscriptionEngine:
no_log_file: bool = True, no_log_file: bool = True,
# Audio device # Audio device
input_device_index: Optional[int] = None, input_device_index: Optional[int] = None,
# User name # App config (for reading user.name at transcription time)
user_name: str = "" app_config=None
): ):
""" """
Initialize RealtimeSTT transcription engine. Initialize RealtimeSTT transcription engine.
@@ -82,7 +82,7 @@ class RealtimeTranscriptionEngine:
initial_prompt: Optional prompt to guide transcription initial_prompt: Optional prompt to guide transcription
no_log_file: Disable RealtimeSTT logging no_log_file: Disable RealtimeSTT logging
input_device_index: Audio input device index input_device_index: Audio input device index
user_name: User name for transcriptions app_config: App Config object for reading user.name dynamically
""" """
self.model = model self.model = model
self.language = language self.language = language
@@ -100,7 +100,7 @@ class RealtimeTranscriptionEngine:
self.enable_realtime = enable_realtime_transcription self.enable_realtime = enable_realtime_transcription
self.realtime_model = realtime_model self.realtime_model = realtime_model
self.realtime_processing_pause = realtime_processing_pause self.realtime_processing_pause = realtime_processing_pause
self.user_name = user_name self.app_config = app_config
# Callbacks # Callbacks
self.realtime_callback: Optional[Callable[[TranscriptionResult], None]] = None self.realtime_callback: Optional[Callable[[TranscriptionResult], None]] = None
@@ -162,6 +162,11 @@ class RealtimeTranscriptionEngine:
self.realtime_callback = realtime_callback self.realtime_callback = realtime_callback
self.final_callback = final_callback self.final_callback = final_callback
def _get_user_name(self) -> str:
if self.app_config:
return self.app_config.get('user.name', '')
return ''
def _on_realtime_transcription(self, text: str): def _on_realtime_transcription(self, text: str):
"""Internal callback for realtime transcriptions.""" """Internal callback for realtime transcriptions."""
if self.realtime_callback and text.strip(): if self.realtime_callback and text.strip():
@@ -169,7 +174,7 @@ class RealtimeTranscriptionEngine:
text=text, text=text,
is_final=False, is_final=False,
timestamp=datetime.now(), timestamp=datetime.now(),
user_name=self.user_name user_name=self._get_user_name()
) )
self.realtime_callback(result) self.realtime_callback(result)
@@ -180,7 +185,7 @@ class RealtimeTranscriptionEngine:
text=text, text=text,
is_final=True, is_final=True,
timestamp=datetime.now(), timestamp=datetime.now(),
user_name=self.user_name user_name=self._get_user_name()
) )
self.final_callback(result) self.final_callback(result)
@@ -406,10 +411,6 @@ class RealtimeTranscriptionEngine:
if self.is_recording: if self.is_recording:
print("VAD settings updated. Restart transcription to apply changes.") print("VAD settings updated. Restart transcription to apply changes.")
def set_user_name(self, user_name: str):
"""Set the user name for transcriptions."""
self.user_name = user_name
def __repr__(self) -> str: def __repr__(self) -> str:
return f"RealtimeTranscriptionEngine(model={self.model}, device={self.device}, running={self.is_recording})" return f"RealtimeTranscriptionEngine(model={self.model}, device={self.device}, running={self.is_recording})"

View File

@@ -401,7 +401,6 @@ class MainWindow(QMainWindow):
# Use Deepgram-based remote transcription # Use Deepgram-based remote transcription
self.transcription_engine = DeepgramTranscriptionEngine( self.transcription_engine = DeepgramTranscriptionEngine(
config=self.config, config=self.config,
user_name=user_name,
input_device_index=audio_device input_device_index=audio_device
) )
self.transcription_engine.set_callbacks( self.transcription_engine.set_callbacks(
@@ -431,7 +430,7 @@ class MainWindow(QMainWindow):
initial_prompt=self.config.get('transcription.initial_prompt', ''), initial_prompt=self.config.get('transcription.initial_prompt', ''),
no_log_file=self.config.get('transcription.no_log_file', True), no_log_file=self.config.get('transcription.no_log_file', True),
input_device_index=audio_device, input_device_index=audio_device,
user_name=user_name app_config=self.config
) )
# Set up callbacks for transcription results # Set up callbacks for transcription results

View File

@@ -90,7 +90,7 @@ class TranscriptionCLI:
initial_prompt=self.config.get('transcription.initial_prompt', ''), initial_prompt=self.config.get('transcription.initial_prompt', ''),
no_log_file=True, no_log_file=True,
input_device_index=audio_device, input_device_index=audio_device,
user_name=user_name app_config=self.config
) )
# Set up callbacks # Set up callbacks

View File

@@ -1,7 +1,7 @@
{ {
"name": "local-transcription", "name": "local-transcription",
"private": true, "private": true,
"version": "2.0.19", "version": "2.0.20",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "local-transcription" name = "local-transcription"
version = "1.0.14" version = "1.0.15"
description = "A standalone desktop application for real-time speech-to-text transcription using Whisper models" description = "A standalone desktop application for real-time speech-to-text transcription using Whisper models"
readme = "README.md" readme = "README.md"
requires-python = ">=3.9" requires-python = ">=3.9"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "local-transcription" name = "local-transcription"
version = "2.0.19" version = "2.0.20"
description = "Real-time speech-to-text transcription for streamers" description = "Real-time speech-to-text transcription for streamers"
authors = ["Local Transcription Contributors"] authors = ["Local Transcription Contributors"]
edition = "2021" edition = "2021"

View File

@@ -1,6 +1,6 @@
{ {
"productName": "Local Transcription", "productName": "Local Transcription",
"version": "2.0.19", "version": "2.0.20",
"identifier": "net.anhonesthost.local-transcription", "identifier": "net.anhonesthost.local-transcription",
"build": { "build": {
"frontendDist": "../dist", "frontendDist": "../dist",

View File

@@ -1,7 +1,7 @@
"""Version information for Local Transcription.""" """Version information for Local Transcription."""
__version__ = "2.0.19" __version__ = "2.0.20"
__version_info__ = (2, 0, 19) __version_info__ = (2, 0, 20)
# Version history: # Version history:
# 1.4.0 - Auto-update feature: # 1.4.0 - Auto-update feature: