1
0
mirror of https://github.com/ijaric/voice_assistant.git synced 2025-05-24 14:33:26 +00:00

feat: [#49] Improved error display

This commit is contained in:
Григорич 2023-10-14 02:10:54 +03:00
parent 9cb2357df5
commit 6abd748e45
3 changed files with 22 additions and 11 deletions

View File

@ -1,6 +1,5 @@
from .base import HealthResponse, VoiceResponse from .base import HealthResponse
__all__ = [ __all__ = [
"HealthResponse", "HealthResponse",
"VoiceResponse",
] ]

View File

@ -3,7 +3,3 @@ import pydantic
class HealthResponse(pydantic.BaseModel): class HealthResponse(pydantic.BaseModel):
status: str = pydantic.Field(default=..., examples=["healthy"], description="Схема доступности сервиса") status: str = pydantic.Field(default=..., examples=["healthy"], description="Схема доступности сервиса")
class VoiceResponse(pydantic.BaseModel):
voice: bytes = pydantic.Field(default=..., description="Голосовой ответ")

View File

@ -1,6 +1,8 @@
import http
import mimetypes import mimetypes
import tempfile import tempfile
import fastapi
import magic import magic
import openai import openai
import pydantic import pydantic
@ -25,8 +27,13 @@ class OpenaiSpeechRepository:
async def speech_to_text(self, audio: bytes) -> str: async def speech_to_text(self, audio: bytes) -> str:
file_extension = self.__get_file_extension_from_bytes(audio) file_extension = self.__get_file_extension_from_bytes(audio)
if not file_extension: print(self.settings.voice)
raise ValueError("File extension is not supported") if not file_extension or file_extension not in self.settings.voice.available_formats:
raise fastapi.HTTPException(
status_code=http.HTTPStatus.UNSUPPORTED_MEDIA_TYPE,
detail=f"File extension is not supported. "
f"Available extensions: {self.settings.voice.available_formats}",
)
try: try:
voice: stt.models.SttVoice = stt.models.SttVoice( voice: stt.models.SttVoice = stt.models.SttVoice(
audio_size=len(audio) // 1024, # audio size in MB, audio_size=len(audio) // 1024, # audio size in MB,
@ -35,7 +42,10 @@ class OpenaiSpeechRepository:
voice_settings=self.settings.voice, voice_settings=self.settings.voice,
) )
except (pydantic.ValidationError, ValueError) as e: except (pydantic.ValidationError, ValueError) as e:
raise ValueError(f"Voice validation error: {e}") raise fastapi.HTTPException(
status_code=http.HTTPStatus.BAD_REQUEST,
detail=f"Voice validation error: {e}",
)
try: try:
with tempfile.NamedTemporaryFile(suffix=f".{file_extension}") as temp_file: with tempfile.NamedTemporaryFile(suffix=f".{file_extension}") as temp_file:
@ -43,8 +53,14 @@ class OpenaiSpeechRepository:
temp_file.seek(0) temp_file.seek(0)
transcript = openai.Audio.transcribe(self.settings.openai.stt_model, temp_file) # type: ignore transcript = openai.Audio.transcribe(self.settings.openai.stt_model, temp_file) # type: ignore
except openai.error.InvalidRequestError as e: # type: ignore[reportGeneralTypeIssues] except openai.error.InvalidRequestError as e: # type: ignore[reportGeneralTypeIssues]
raise ValueError(f"OpenAI API error: {e}") raise fastapi.HTTPException(
status_code=http.HTTPStatus.BAD_REQUEST,
detail=f"OpenAI request error: {e}",
)
except openai.error.OpenAIError as e: # type: ignore[reportGeneralTypeIssues] except openai.error.OpenAIError as e: # type: ignore[reportGeneralTypeIssues]
raise ValueError(f"OpenAI API error: {e}") raise fastapi.HTTPException(
status_code=http.HTTPStatus.BAD_REQUEST,
detail=f"OpenAI API error: {e}",
)
return transcript.text # type: ignore[reportUnknownVariableType] return transcript.text # type: ignore[reportUnknownVariableType]