fix: allow specifying transcription language

This commit is contained in:
k
2026-04-22 12:41:32 +08:00
committed by Xubin Ren
parent 1826ab44fa
commit 123d69bfb7
6 changed files with 104 additions and 12 deletions
+2 -1
View File
@@ -25,7 +25,7 @@ class BaseChannel(ABC):
transcription_provider: str = "groq"
transcription_api_key: str = ""
transcription_api_base: str = ""
transcription_language: str = ""
transcription_language: str | None = None
def __init__(self, config: Any, bus: MessageBus):
"""
@@ -49,6 +49,7 @@ class BaseChannel(ABC):
provider = OpenAITranscriptionProvider(
api_key=self.transcription_api_key,
api_base=self.transcription_api_base or None,
language=self.transcription_language or None,
)
else:
from nanobot.providers.transcription import GroqTranscriptionProvider
+2 -1
View File
@@ -63,6 +63,7 @@ class ChannelManager:
transcription_provider = self.config.channels.transcription_provider
transcription_key = self._resolve_transcription_key(transcription_provider)
transcription_base = self._resolve_transcription_base(transcription_provider)
transcription_language = self.config.channels.transcription_language
for name, cls in discover_all().items():
section = getattr(self.config.channels, name, None)
@@ -88,7 +89,7 @@ class ChannelManager:
channel.transcription_provider = transcription_provider
channel.transcription_api_key = transcription_key
channel.transcription_api_base = transcription_base
channel.transcription_language = getattr(self.config.channels, "transcription_language", "")
channel.transcription_language = transcription_language
self.channels[name] = channel
logger.info("{} channel enabled", cls.display_name)
except Exception as e:
+1 -1
View File
@@ -29,7 +29,7 @@ class ChannelsConfig(Base):
send_tool_hints: bool = False # stream tool-call hints (e.g. read_file("…"))
send_max_retries: int = Field(default=3, ge=0, le=10) # Max delivery attempts (initial send included)
transcription_provider: str = "groq" # Voice transcription backend: "groq" or "openai"
transcription_language: str = "" # Language code for Whisper STT (e.g. "en", "ru", "zh")
transcription_language: str | None = None # Optional ISO-639-1 hint for audio transcription
class DreamConfig(Base):
+15 -2
View File
@@ -10,13 +10,19 @@ from loguru import logger
class OpenAITranscriptionProvider:
"""Voice transcription provider using OpenAI's Whisper API."""
def __init__(self, api_key: str | None = None, api_base: str | None = None):
def __init__(
self,
api_key: str | None = None,
api_base: str | None = None,
language: str | None = None,
):
self.api_key = api_key or os.environ.get("OPENAI_API_KEY")
self.api_url = (
api_base
or os.environ.get("OPENAI_TRANSCRIPTION_BASE_URL")
or "https://api.openai.com/v1/audio/transcriptions"
)
self.language = language
async def transcribe(self, file_path: str | Path) -> str:
if not self.api_key:
@@ -30,6 +36,8 @@ class OpenAITranscriptionProvider:
async with httpx.AsyncClient() as client:
with open(path, "rb") as f:
files = {"file": (path.name, f), "model": (None, "whisper-1")}
if self.language:
files["language"] = (None, self.language)
headers = {"Authorization": f"Bearer {self.api_key}"}
response = await client.post(
self.api_url, headers=headers, files=files, timeout=60.0,
@@ -48,7 +56,12 @@ class GroqTranscriptionProvider:
Groq offers extremely fast transcription with a generous free tier.
"""
def __init__(self, api_key: str | None = None, api_base: str | None = None, language: str | None = None):
def __init__(
self,
api_key: str | None = None,
api_base: str | None = None,
language: str | None = None,
):
self.api_key = api_key or os.environ.get("GROQ_API_KEY")
self.api_url = api_base or os.environ.get("GROQ_BASE_URL") or "https://api.groq.com/openai/v1/audio/transcriptions"
self.language = language