Files
DocsGPT/docsgpt/stt/faster_whisper_stt.py
Alex 574f96341e refactor: rename the application package to docsgpt
The backend import package is now docsgpt, the name it will carry on PyPI;
application was far too generic to install into anyone's site-packages.
git mv plus a mechanical rewrite of every import, dotted string and path
reference: 734 Python files, the compose files, Dockerfile, workflows, docs,
setup scripts, devcontainer, k8s manifests, vscode config, pytest and coverage
config, .gitignore. Behaviour is unchanged.

Kept for one release:
- A top-level application package whose meta-path finder resolves
  application.x.y to the already-imported docsgpt.x.y object, so old imports
  and entry points (celery -A application.app.celery,
  uvicorn application.asgi:asgi_app) keep working with a FutureWarning.
- Celery registers every application.* task name as an alias of its
  docsgpt.* task on start-up, so messages queued by the previous release still
  run. The redbeat key prefix moves to redbeat:docsgpt:v2: so schedule entries
  the previous release wrote are left unread instead of firing twice.

The backend image builds from the repository root (docker build -f
docsgpt/Dockerfile .) so it can ship the alias package; a root .dockerignore
allow-lists docsgpt/ and application/ and keeps caches, local data, .env
files, the sample index files and the Dockerfile out. Compose and the image
workflows point at the new context.
2026-09-07 10:20:43 +01:00

71 lines
2.0 KiB
Python

from pathlib import Path
from typing import Dict, Optional
from docsgpt.stt.base import BaseSTT
class FasterWhisperSTT(BaseSTT):
def __init__(
self,
model_size: str = "base",
device: str = "auto",
compute_type: str = "int8",
):
self.model_size = model_size
self.device = device
self.compute_type = compute_type
self._model = None
def _get_model(self):
if self._model is None:
try:
from faster_whisper import WhisperModel
except ImportError as exc:
raise ImportError(
"faster-whisper is required to use the faster_whisper STT provider."
) from exc
self._model = WhisperModel(
self.model_size,
device=self.device,
compute_type=self.compute_type,
)
return self._model
def transcribe(
self,
file_path: Path,
language: Optional[str] = None,
timestamps: bool = False,
diarize: bool = False,
) -> Dict[str, object]:
_ = diarize
model = self._get_model()
segments_iter, info = model.transcribe(
str(file_path),
language=language,
word_timestamps=timestamps,
)
segments = []
text_parts = []
for segment in segments_iter:
segment_text = getattr(segment, "text", "").strip()
if segment_text:
text_parts.append(segment_text)
segments.append(
{
"start": getattr(segment, "start", None),
"end": getattr(segment, "end", None),
"text": segment_text,
}
)
return {
"text": " ".join(text_parts).strip(),
"language": getattr(info, "language", language),
"duration_s": getattr(info, "duration", None),
"segments": segments if timestamps else [],
"provider": "faster_whisper",
}