Fedir Zadniprovskyi commited on
Commit
7f77e4b
·
1 Parent(s): 1f91376

feat: add chat, speech, and transcription dependencies

Browse files
src/faster_whisper_server/config.py CHANGED
@@ -236,3 +236,14 @@ class Config(BaseSettings):
236
  Controls how many latest seconds of audio are being passed through VAD.
237
  Should be greater than `max_inactivity_seconds`
238
  """
 
 
 
 
 
 
 
 
 
 
 
 
236
  Controls how many latest seconds of audio are being passed through VAD.
237
  Should be greater than `max_inactivity_seconds`
238
  """
239
+
240
+ chat_completion_base_url: str = "https://api.openai.com/v1"
241
+ chat_completion_api_key: str | None = None
242
+
243
+ speech_base_url: str | None = None
244
+ speech_api_key: str | None = None
245
+ speech_model: str = "piper"
246
+ speech_extra_body: dict = {"sample_rate": 24000}
247
+
248
+ transcription_base_url: str | None = None
249
+ transcription_api_key: str | None = None
src/faster_whisper_server/dependencies.py CHANGED
@@ -3,6 +3,10 @@ from typing import Annotated
3
 
4
  from fastapi import Depends, HTTPException, status
5
  from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
 
 
 
 
6
 
7
  from faster_whisper_server.config import Config
8
  from faster_whisper_server.model_manager import PiperModelManager, WhisperModelManager
@@ -45,3 +49,56 @@ async def verify_api_key(
45
 
46
 
47
  ApiKeyDependency = Depends(verify_api_key)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  from fastapi import Depends, HTTPException, status
5
  from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
6
+ from httpx import ASGITransport, AsyncClient
7
+ from openai import AsyncOpenAI
8
+ from openai.resources.audio import AsyncSpeech, AsyncTranscriptions
9
+ from openai.resources.chat.completions import AsyncCompletions
10
 
11
  from faster_whisper_server.config import Config
12
  from faster_whisper_server.model_manager import PiperModelManager, WhisperModelManager
 
49
 
50
 
51
  ApiKeyDependency = Depends(verify_api_key)
52
+
53
+
54
+ @lru_cache
55
+ def get_completion_client() -> AsyncCompletions:
56
+ config = get_config() # HACK
57
+ oai_client = AsyncOpenAI(base_url=config.chat_completion_base_url, api_key=config.chat_completion_api_key)
58
+ return oai_client.chat.completions
59
+
60
+
61
+ CompletionClientDependency = Annotated[AsyncCompletions, Depends(get_completion_client)]
62
+
63
+
64
+ @lru_cache
65
+ def get_speech_client() -> AsyncSpeech:
66
+ config = get_config() # HACK
67
+ if config.speech_base_url is None:
68
+ # this might not work as expected if the `speech_router` won't have shared state with the main FastAPI `app`. TODO: verify # noqa: E501
69
+ from faster_whisper_server.routers.speech import (
70
+ router as speech_router,
71
+ )
72
+
73
+ http_client = AsyncClient(
74
+ transport=ASGITransport(speech_router), base_url="http://test/v1"
75
+ ) # NOTE: "test" can be replaced with any other value
76
+ oai_client = AsyncOpenAI(http_client=http_client, api_key=config.speech_api_key)
77
+ else:
78
+ oai_client = AsyncOpenAI(base_url=config.speech_base_url, api_key=config.speech_api_key)
79
+ return oai_client.audio.speech
80
+
81
+
82
+ SpeechClientDependency = Annotated[AsyncSpeech, Depends(get_speech_client)]
83
+
84
+
85
+ @lru_cache
86
+ def get_transcription_client() -> AsyncTranscriptions:
87
+ config = get_config()
88
+ if config.transcription_base_url is None:
89
+ # this might not work as expected if the `transcription_router` won't have shared state with the main FastAPI `app`. TODO: verify # noqa: E501
90
+ from faster_whisper_server.routers.stt import (
91
+ router as stt_router,
92
+ )
93
+
94
+ http_client = AsyncClient(
95
+ transport=ASGITransport(stt_router), base_url="http://test/v1"
96
+ ) # NOTE: "test" can be replaced with any other value
97
+
98
+ oai_client = AsyncOpenAI(http_client=http_client, api_key=config.transcription_api_key)
99
+ else:
100
+ oai_client = AsyncOpenAI(base_url=config.transcription_base_url, api_key=config.transcription_api_key)
101
+ return oai_client.audio.transcriptions
102
+
103
+
104
+ TranscriptionClientDependency = Annotated[AsyncTranscriptions, Depends(get_transcription_client)]