audio.py 3.7 KB

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