From 5501ae09b34b6311c6d3d19ad247416c6008f26e Mon Sep 17 00:00:00 2001 From: AssemblyAI Date: Tue, 30 May 2023 13:56:52 +0200 Subject: [PATCH 1/2] Project import generated by Copybara. GitOrigin-RevId: dc2cd0449f89ca91511a1e2044cf2b1154d9ee48 --- README.md | 23 +---- assemblyai.png | Bin 32151 -> 0 bytes assemblyai/types.py | 186 ++++++++++++++++++++------------------ tests/unit/test_config.py | 20 ++++ 4 files changed, 117 insertions(+), 112 deletions(-) delete mode 100644 assemblyai.png create mode 100644 tests/unit/test_config.py diff --git a/README.md b/README.md index 6a69e51..beb3435 100644 --- a/README.md +++ b/README.md @@ -81,22 +81,6 @@ print(transcript.text) ``` -
- Add Punctuation, Casing, and Formatting to a Transcript - -```python -import assemblyai as aai - -config = aai.TranscriptionConfig( - punctuate = True, - format_text = True, -) - -transcriber = aai.Transcriber() -transcript = transcriber.transcribe("https://example.org/audio.mp3", config) -``` -
-
Export Subtitles of an Audio File @@ -120,13 +104,8 @@ print(transcript.export_subtitles_vtt()) ```python import assemblyai as aai -config = aai.TranscriptionConfig( - punctuate = True, - format_text = True, -) - transcriber = aai.Transcriber() -transcript = transcriber.transcribe("https://example.org/audio.mp3", config) +transcript = transcriber.transcribe("https://example.org/audio.mp3") sentences = transcript.get_sentences() for sentence in sentences: diff --git a/assemblyai.png b/assemblyai.png deleted file mode 100644 index dca925a0aa34a5ed01572fe0ca3dfeacc3de01c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32151 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 None: """ @@ -515,37 +515,37 @@ def language_code(self, language_code: LanguageCode) -> None: self._raw_transcription_config.language_code = language_code @property - def punctuate(self) -> bool: + def punctuate(self) -> Optional[bool]: "Returns the status of the Automatic Punctuation feature." return self._raw_transcription_config.punctuate @punctuate.setter - def punctuate(self, enable: bool) -> None: + def punctuate(self, enable: Optional[bool]) -> None: "Enable Automatic Punctuation feature." self._raw_transcription_config.punctuate = enable @property - def format_text(self) -> bool: + def format_text(self) -> Optional[bool]: "Returns the status of the Text Formatting feature." return self._raw_transcription_config.format_text @format_text.setter - def format_text(self, enable: bool) -> None: + def format_text(self, enable: Optional[bool]) -> None: "Enables Formatting Text feature." self._raw_transcription_config.format_text = enable @property - def dual_channel(self) -> bool: + def dual_channel(self) -> Optional[bool]: "Returns the status of the Dual Channel transcription feature" return self._raw_transcription_config.dual_channel @dual_channel.setter - def dual_channel(self, enable: bool = True) -> None: + def dual_channel(self, enable: Optional[bool]) -> None: "Enable Dual Channel transcription" self._raw_transcription_config.dual_channel = enable @@ -581,7 +581,7 @@ def audio_end_at(self) -> Optional[int]: return self._raw_transcription_config.audio_end_at @property - def word_boost(self) -> List[str]: + def word_boost(self) -> Optional[List[str]]: "Returns the list of custom vocabulary to boost accuracy for." return self._raw_transcription_config.word_boost @@ -593,49 +593,49 @@ def boost_param(self) -> Optional[WordBoost]: return self._raw_transcription_config.boost_param @property - def filter_profanity(self) -> bool: + def filter_profanity(self) -> Optional[bool]: "Returns the status of whether filtering profanity is enabled or not." return self._raw_transcription_config.filter_profanity @filter_profanity.setter - def filter_profanity(self, enable: bool) -> None: + def filter_profanity(self, enable: Optional[bool]) -> None: "Filter profanity from the transcribed text." self._raw_transcription_config.filter_profanity = enable @property - def redact_pii(self) -> bool: + def redact_pii(self) -> Optional[bool]: "Returns the status of the PII Redaction feature." return self._raw_transcription_config.redact_pii @property - def redact_pii_audio(self) -> bool: + def redact_pii_audio(self) -> Optional[bool]: "Whether or not to generate a copy of the original media file with spoken PII 'beeped' out." return self._raw_transcription_config.redact_pii_audio @property - def redact_pii_policies(self) -> List[PIIRedactionPolicy]: + def redact_pii_policies(self) -> Optional[List[PIIRedactionPolicy]]: "Returns a list of set of defined PII redaction policies." return self._raw_transcription_config.redact_pii_policies @property - def redact_pii_sub(self) -> PIISubstitutionPolicy: + def redact_pii_sub(self) -> Optional[PIISubstitutionPolicy]: "Returns the replacement logic for detected PII." return self._raw_transcription_config.redact_pii_sub @property - def speaker_labels(self) -> bool: + def speaker_labels(self) -> Optional[bool]: "Returns the status of the Speaker Diarization feature." return self._raw_transcription_config.speaker_labels @speaker_labels.setter - def speaker_labels(self, enable: bool) -> None: + def speaker_labels(self, enable: Optional[bool]) -> None: "Enable Speaker Diarization feature." self._raw_transcription_config.speaker_labels = enable @@ -665,9 +665,12 @@ def speaker_labels(self, enable: bool) -> None: # self._raw_transcription_config.iab_categories = enable @property - def custom_spelling(self) -> Dict[str, List[str]]: + def custom_spelling(self) -> Optional[Dict[str, List[str]]]: "Returns the current set custom spellings." + if self._raw_transcription_config.custom_spelling is None: + return None + custom_spellings = {} for custom_spelling in self._raw_transcription_config.custom_spelling: custom_spellings[custom_spelling["from"]] = custom_spelling["to"] @@ -675,13 +678,13 @@ def custom_spelling(self) -> Dict[str, List[str]]: return custom_spellings @property - def disfluencies(self) -> bool: + def disfluencies(self) -> Optional[bool]: "Returns whether to transcribing filler words is enabled or not." return self._raw_transcription_config.disfluencies @disfluencies.setter - def disfluencies(self, enable: bool) -> None: + def disfluencies(self, enable: Optional[bool]) -> None: "Transcribe filler words, like 'umm', in your media file." self._raw_transcription_config.disfluencies = enable @@ -725,7 +728,7 @@ def disfluencies(self, enable: bool) -> None: # self._raw_transcription_config.entity_detection = enable @property - def summarization(self) -> bool: + def summarization(self) -> Optional[bool]: "Returns whether the Summarization feature is enabled or not." return self._raw_transcription_config.summarization @@ -755,13 +758,13 @@ def summary_type(self) -> Optional[SummarizationType]: # self._raw_transcription_config.auto_highlights = enable @property - def language_detection(self) -> bool: + def language_detection(self) -> Optional[bool]: "Returns whether Automatic Language Detection is enabled or not." return self._raw_transcription_config.language_detection @language_detection.setter - def language_detection(self, enable: bool) -> None: + def language_detection(self, enable: Optional[bool]) -> None: """ Identify the dominant language that's spoken in an audio file, and route the file to the appropriate model for the detected language. @@ -899,8 +902,8 @@ def set_redact_pii( """ if not enable: - self._raw_transcription_config.redact_pii = False - self._raw_transcription_config.redact_pii_audio = False + self._raw_transcription_config.redact_pii = None + self._raw_transcription_config.redact_pii_audio = None self._raw_transcription_config.redact_pii_policies = None self._raw_transcription_config.redact_pii_sub = None @@ -915,7 +918,7 @@ def set_redact_pii( def set_custom_spelling( self, - replacement: Dict[str, Union[str, Sequence[str]]], + replacement: Optional[Dict[str, Union[str, Sequence[str]]]], override: bool = True, ) -> Self: """ @@ -933,6 +936,9 @@ def set_custom_spelling( }) ``` """ + if replacement is None: + self._raw_transcription_config.custom_spelling = None + return self if self._raw_transcription_config.custom_spelling is None or override: self._raw_transcription_config.custom_spelling = [] @@ -952,7 +958,7 @@ def set_custom_spelling( def set_summarize( self, - enable: bool, + enable: bool = True, model: Optional[SummarizationModel] = None, type: Optional[SummarizationType] = None, ) -> Self: @@ -966,7 +972,7 @@ def set_summarize( """ if not enable: - self._raw_transcription_config.summarization = False + self._raw_transcription_config.summarization = None self._raw_transcription_config.summary_model = None self._raw_transcription_config.summary_type = None @@ -1220,43 +1226,43 @@ class BaseTranscript(BaseModel): audio_url: str "The URL of your media file to transcribe." - punctuate: bool = False + punctuate: Optional[bool] "Enable Automatic Punctuation" - format_text: bool = False + format_text: Optional[bool] "Enable Text Formatting" - dual_channel: bool = False + dual_channel: Optional[bool] "Enable Dual Channel transcription" - webhook_url: Optional[str] = None + webhook_url: Optional[str] "The URL we should send webhooks to when your transcript is complete." - webhook_auth_header_name: Optional[str] = None + webhook_auth_header_name: Optional[str] "The name of the header that is sent when the `webhook_url` is being called." - audio_start_from: Optional[int] = None + audio_start_from: Optional[int] "The point in time, in milliseconds, to begin transcription from in your media file." - audio_end_at: Optional[int] = None + audio_end_at: Optional[int] "The point in time, in milliseconds, to stop transcribing in your media file." - word_boost: Optional[List[str]] = None + word_boost: Optional[List[str]] "A list of custom vocabulary to boost accuracy for." - boost_param: Optional[WordBoost] = None + boost_param: Optional[WordBoost] "The weight to apply to words/phrases in the word_boost array." - filter_profanity: bool = False + filter_profanity: Optional[bool] "Filter profanity from the transcribed text." - redact_pii: bool = False + redact_pii: Optional[bool] "Redact PII from the transcribed text." - redact_pii_audio: bool = False + redact_pii_audio: Optional[bool] "Generate a copy of the original media file with spoken PII 'beeped' out." - redact_pii_policies: Optional[List[PIIRedactionPolicy]] = None + redact_pii_policies: Optional[List[PIIRedactionPolicy]] "The list of PII Redaction policies to enable." - redact_pii_sub: Optional[PIISubstitutionPolicy] = None + redact_pii_sub: Optional[PIISubstitutionPolicy] "The replacement logic for detected PII." - speaker_labels: bool = False + speaker_labels: Optional[bool] "Enable Speaker Diarization." # content_safety: bool = False @@ -1265,10 +1271,10 @@ class BaseTranscript(BaseModel): # iab_categories: bool = False # "Enable Topic Detection." - custom_spelling: Optional[List[dict]] = None + custom_spelling: Optional[List[dict]] "Customize how words are spelled and formatted using to and from values" - disfluencies: bool = False + disfluencies: Optional[bool] "Transcribe Filler Words, like 'umm', in your media file." # sentiment_analysis: bool = False @@ -1280,19 +1286,19 @@ class BaseTranscript(BaseModel): # entity_detection: bool = False # "Enable Entity Detection." - summarization: bool = False + summarization: Optional[bool] "Enable Summarization" - summary_model: Optional[SummarizationModel] = None + summary_model: Optional[SummarizationModel] "The summarization model to use in case `summarization` is enabled" - summary_type: Optional[SummarizationType] = None + summary_type: Optional[SummarizationType] "The summarization type to use in case `summarization` is enabled" # auto_highlights: bool = False # "Detect important phrases and words in your transcription text." - language_detection: bool = False + language_detection: Optional[bool] """ - Identify the dominant language that’s spoken in an audio file, and route the file to the appropriate model for the detected language. + Identify the dominant language that's spoken in an audio file, and route the file to the appropriate model for the detected language. Automatic Language Detection is supported for the following languages: @@ -1323,27 +1329,27 @@ class TranscriptResponse(BaseTranscript): status: TranscriptStatus "The status of your transcription. queued, processing, completed, or error" - error: Optional[str] = None + error: Optional[str] "The error message in case the transcription fails" - text: Optional[str] = None + text: Optional[str] "The text transcription of your media file" - words: Optional[List[Word]] = None + words: Optional[List[Word]] "A list of all the individual words transcribed" - utterances: Optional[List[Utterance]] = None + utterances: Optional[List[Utterance]] "When `dual_channel` or `speaker_labels` is enabled, a list of turn-by-turn utterances" - confidence: Optional[float] = None + confidence: Optional[float] "The confidence our model has in the transcribed text, between 0.0 and 1.0" - audio_duration: Optional[float] = None + audio_duration: Optional[float] "The duration of your media file, in seconds" - webhook_status_code: Optional[str] = None + webhook_status_code: Optional[str] "The status code we received from your server when delivering your webhook" - webhook_auth: bool = False + webhook_auth: Optional[bool] "Whether the webhook was sent with an HTTP authentication header" # auto_highlights_result: Optional[AutohighlightResponse] = None diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py new file mode 100644 index 0000000..30ceb79 --- /dev/null +++ b/tests/unit/test_config.py @@ -0,0 +1,20 @@ +import inspect + +import assemblyai as aai + +import pytest + + +def test_configuration_are_none_by_default(): + """ + Tests whether all configurations are None by default. + """ + + config = aai.TranscriptionConfig() + fields = config.raw.__fields_set__ - {"language_code"} + + for name, value in inspect.getmembers(config): + if name in fields and value is not None: + pytest.fail( + f"Configuration field {name} is {value} and not None by default." + ) From 73a463ee8ea81e3319f8ea993566c0116a617ed0 Mon Sep 17 00:00:00 2001 From: Soheyl Date: Tue, 30 May 2023 15:00:54 +0200 Subject: [PATCH 2/2] build: bump version to `0.3.3` --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 40bfae7..7387091 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name="assemblyai", - version="0.3.2", + version="0.3.3", description="AssemblyAI Python SDK", author="AssemblyAI", author_email="engineering.sdk@assemblyai.com",