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)