main
1from __future__ import annotations
2
3import sys
4from typing import TYPE_CHECKING, Any, Optional, cast
5from argparse import ArgumentParser
6
7from .._utils import get_client, print_model
8from ..._types import omit
9from .._models import BaseModel
10from .._progress import BufferReader
11from ...types.audio import Transcription
12
13if TYPE_CHECKING:
14 from argparse import _SubParsersAction
15
16
17def register(subparser: _SubParsersAction[ArgumentParser]) -> None:
18 # transcriptions
19 sub = subparser.add_parser("audio.transcriptions.create")
20
21 # Required
22 sub.add_argument("-m", "--model", type=str, default="whisper-1")
23 sub.add_argument("-f", "--file", type=str, required=True)
24 # Optional
25 sub.add_argument("--response-format", type=str)
26 sub.add_argument("--language", type=str)
27 sub.add_argument("-t", "--temperature", type=float)
28 sub.add_argument("--prompt", type=str)
29 sub.set_defaults(func=CLIAudio.transcribe, args_model=CLITranscribeArgs)
30
31 # translations
32 sub = subparser.add_parser("audio.translations.create")
33
34 # Required
35 sub.add_argument("-f", "--file", type=str, required=True)
36 # Optional
37 sub.add_argument("-m", "--model", type=str, default="whisper-1")
38 sub.add_argument("--response-format", type=str)
39 # TODO: doesn't seem to be supported by the API
40 # sub.add_argument("--language", type=str)
41 sub.add_argument("-t", "--temperature", type=float)
42 sub.add_argument("--prompt", type=str)
43 sub.set_defaults(func=CLIAudio.translate, args_model=CLITranslationArgs)
44
45
46class CLITranscribeArgs(BaseModel):
47 model: str
48 file: str
49 response_format: Optional[str] = None
50 language: Optional[str] = None
51 temperature: Optional[float] = None
52 prompt: Optional[str] = None
53
54
55class CLITranslationArgs(BaseModel):
56 model: str
57 file: str
58 response_format: Optional[str] = None
59 language: Optional[str] = None
60 temperature: Optional[float] = None
61 prompt: Optional[str] = None
62
63
64class CLIAudio:
65 @staticmethod
66 def transcribe(args: CLITranscribeArgs) -> None:
67 with open(args.file, "rb") as file_reader:
68 buffer_reader = BufferReader(file_reader.read(), desc="Upload progress")
69
70 model = cast(
71 "Transcription | str",
72 get_client().audio.transcriptions.create(
73 file=(args.file, buffer_reader),
74 model=args.model,
75 language=args.language or omit,
76 temperature=args.temperature or omit,
77 prompt=args.prompt or omit,
78 # casts required because the API is typed for enums
79 # but we don't want to validate that here for forwards-compat
80 response_format=cast(Any, args.response_format),
81 ),
82 )
83 if isinstance(model, str):
84 sys.stdout.write(model + "\n")
85 else:
86 print_model(model)
87
88 @staticmethod
89 def translate(args: CLITranslationArgs) -> None:
90 with open(args.file, "rb") as file_reader:
91 buffer_reader = BufferReader(file_reader.read(), desc="Upload progress")
92
93 model = cast(
94 "Transcription | str",
95 get_client().audio.translations.create(
96 file=(args.file, buffer_reader),
97 model=args.model,
98 temperature=args.temperature or omit,
99 prompt=args.prompt or omit,
100 # casts required because the API is typed for enums
101 # but we don't want to validate that here for forwards-compat
102 response_format=cast(Any, args.response_format),
103 ),
104 )
105 if isinstance(model, str):
106 sys.stdout.write(model + "\n")
107 else:
108 print_model(model)