Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ bandwidth/models/rbm_web_view_enum.py
bandwidth/models/recording_available_callback.py
bandwidth/models/recording_complete_callback.py
bandwidth/models/recording_state_enum.py
bandwidth/models/recording_transcription_clip.py
bandwidth/models/recording_transcription_metadata.py
bandwidth/models/recording_transcriptions.py
bandwidth/models/redirect_callback.py
Expand Down Expand Up @@ -380,6 +381,7 @@ docs/RbmWebViewEnum.md
docs/RecordingAvailableCallback.md
docs/RecordingCompleteCallback.md
docs/RecordingStateEnum.md
docs/RecordingTranscriptionClip.md
docs/RecordingTranscriptionMetadata.md
docs/RecordingTranscriptions.md
docs/RecordingsApi.md
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ Class | Method | HTTP request | Description
- [RecordingAvailableCallback](docs/RecordingAvailableCallback.md)
- [RecordingCompleteCallback](docs/RecordingCompleteCallback.md)
- [RecordingStateEnum](docs/RecordingStateEnum.md)
- [RecordingTranscriptionClip](docs/RecordingTranscriptionClip.md)
- [RecordingTranscriptionMetadata](docs/RecordingTranscriptionMetadata.md)
- [RecordingTranscriptions](docs/RecordingTranscriptions.md)
- [RedirectCallback](docs/RedirectCallback.md)
Expand Down
70 changes: 70 additions & 0 deletions bandwidth.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4354,6 +4354,72 @@ components:
type: array
items:
$ref: '#/components/schemas/transcription'
clips:
type: array
description: >-
A list of individual speech clips with speaker, timing, and
confidence information.
items:
$ref: '#/components/schemas/recordingTranscriptionClip'
example:
transcripts:
- speaker: 0
text: Hi, is Thursday at two still good for you? Perfect, talk soon.
confidence: 0.96
- speaker: 1
text: Yes, that works great. See you then! Sounds good, bye!
confidence: 0.97
clips:
- speaker: 0
text: Hi, is Thursday at two still good for you?
confidence: 0.97
startTimeSeconds: 0.4
endTimeSeconds: 3.1
- speaker: 1
text: Yes, that works great. See you then!
confidence: 0.95
startTimeSeconds: 3.8
endTimeSeconds: 6.2
- speaker: 0
text: Perfect, talk soon.
confidence: 0.94
startTimeSeconds: 6.9
endTimeSeconds: 8.1
- speaker: 1
text: Sounds good, bye!
confidence: 0.98
startTimeSeconds: 8.5
endTimeSeconds: 9.7
recordingTranscriptionClip:
type: object
properties:
speaker:
type: integer
description: Zero-based index identifying the speaker.
example: 0
text:
type: string
description: The transcribed text of this clip.
example: Hi there, thanks for calling!
confidence:
type: number
format: double
minimum: 0
maximum: 1
description: >-
How confident the transcription engine was in transcribing this clip
(from `0.0` to `1.0`).
example: 0.85
startTimeSeconds:
type: number
format: double
description: The start time of this clip within the recording, in seconds.
example: 2.3
endTimeSeconds:
type: number
format: double
description: The end time of this clip within the recording, in seconds.
example: 3.1
callTranscriptionMetadataList:
type: array
items:
Expand Down Expand Up @@ -5480,6 +5546,10 @@ components:
transcription:
type: object
properties:
speaker:
type: integer
description: Zero-based index identifying the speaker.
example: 0
text:
type: string
description: The transcribed text
Expand Down
2 changes: 2 additions & 0 deletions bandwidth/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@
"RecordingAvailableCallback",
"RecordingCompleteCallback",
"RecordingStateEnum",
"RecordingTranscriptionClip",
"RecordingTranscriptionMetadata",
"RecordingTranscriptions",
"RedirectCallback",
Expand Down Expand Up @@ -418,6 +419,7 @@
from bandwidth.models.recording_available_callback import RecordingAvailableCallback as RecordingAvailableCallback
from bandwidth.models.recording_complete_callback import RecordingCompleteCallback as RecordingCompleteCallback
from bandwidth.models.recording_state_enum import RecordingStateEnum as RecordingStateEnum
from bandwidth.models.recording_transcription_clip import RecordingTranscriptionClip as RecordingTranscriptionClip
from bandwidth.models.recording_transcription_metadata import RecordingTranscriptionMetadata as RecordingTranscriptionMetadata
from bandwidth.models.recording_transcriptions import RecordingTranscriptions as RecordingTranscriptions
from bandwidth.models.redirect_callback import RedirectCallback as RedirectCallback
Expand Down
1 change: 1 addition & 0 deletions bandwidth/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@
from bandwidth.models.recording_available_callback import RecordingAvailableCallback
from bandwidth.models.recording_complete_callback import RecordingCompleteCallback
from bandwidth.models.recording_state_enum import RecordingStateEnum
from bandwidth.models.recording_transcription_clip import RecordingTranscriptionClip
from bandwidth.models.recording_transcription_metadata import RecordingTranscriptionMetadata
from bandwidth.models.recording_transcriptions import RecordingTranscriptions
from bandwidth.models.redirect_callback import RedirectCallback
Expand Down
110 changes: 110 additions & 0 deletions bandwidth/models/recording_transcription_clip.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# coding: utf-8

"""
Bandwidth

Bandwidth's Communication APIs

The version of the OpenAPI document: 1.0.0
Contact: letstalk@bandwidth.com
Generated by OpenAPI Generator (https://openapi-generator.tech)

Do not edit the class manually.
""" # noqa: E501


from __future__ import annotations
import pprint
import re # noqa: F401
import json

from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr
from typing import Any, ClassVar, Dict, List, Optional, Union
from typing_extensions import Annotated
from typing import Optional, Set
from typing_extensions import Self

class RecordingTranscriptionClip(BaseModel):
"""
RecordingTranscriptionClip
""" # noqa: E501
speaker: Optional[StrictInt] = Field(default=None, description="Zero-based index identifying the speaker.")
text: Optional[StrictStr] = Field(default=None, description="The transcribed text of this clip.")
confidence: Optional[Union[Annotated[float, Field(le=1, strict=True, ge=0)], Annotated[int, Field(le=1, strict=True, ge=0)]]] = Field(default=None, description="How confident the transcription engine was in transcribing this clip (from `0.0` to `1.0`).")
start_time_seconds: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="The start time of this clip within the recording, in seconds.", alias="startTimeSeconds")
end_time_seconds: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="The end time of this clip within the recording, in seconds.", alias="endTimeSeconds")
additional_properties: Dict[str, Any] = {}
__properties: ClassVar[List[str]] = ["speaker", "text", "confidence", "startTimeSeconds", "endTimeSeconds"]

model_config = ConfigDict(
populate_by_name=True,
validate_assignment=True,
protected_namespaces=(),
)


def to_str(self) -> str:
"""Returns the string representation of the model using alias"""
return pprint.pformat(self.model_dump(by_alias=True))

def to_json(self) -> str:
"""Returns the JSON representation of the model using alias"""
# TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
return json.dumps(self.to_dict())

@classmethod
def from_json(cls, json_str: str) -> Optional[Self]:
"""Create an instance of RecordingTranscriptionClip from a JSON string"""
return cls.from_dict(json.loads(json_str))

def to_dict(self) -> Dict[str, Any]:
"""Return the dictionary representation of the model using alias.

This has the following differences from calling pydantic's
`self.model_dump(by_alias=True)`:

* `None` is only added to the output dict for nullable fields that
were set at model initialization. Other fields with value `None`
are ignored.
* Fields in `self.additional_properties` are added to the output dict.
"""
excluded_fields: Set[str] = set([
"additional_properties",
])

_dict = self.model_dump(
by_alias=True,
exclude=excluded_fields,
exclude_none=True,
)
# puts key-value pairs in additional_properties in the top level
if self.additional_properties is not None:
for _key, _value in self.additional_properties.items():
_dict[_key] = _value

return _dict

@classmethod
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
"""Create an instance of RecordingTranscriptionClip from a dict"""
if obj is None:
return None

if not isinstance(obj, dict):
return cls.model_validate(obj)

_obj = cls.model_validate({
"speaker": obj.get("speaker"),
"text": obj.get("text"),
"confidence": obj.get("confidence"),
"startTimeSeconds": obj.get("startTimeSeconds"),
"endTimeSeconds": obj.get("endTimeSeconds")
})
# store additional fields in additional_properties
for _key in obj.keys():
if _key not in cls.__properties:
_obj.additional_properties[_key] = obj.get(_key)

return _obj


16 changes: 13 additions & 3 deletions bandwidth/models/recording_transcriptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
import re # noqa: F401
import json

from pydantic import BaseModel, ConfigDict
from pydantic import BaseModel, ConfigDict, Field
from typing import Any, ClassVar, Dict, List, Optional
from bandwidth.models.recording_transcription_clip import RecordingTranscriptionClip
from bandwidth.models.transcription import Transcription
from typing import Optional, Set
from typing_extensions import Self
Expand All @@ -29,8 +30,9 @@ class RecordingTranscriptions(BaseModel):
RecordingTranscriptions
""" # noqa: E501
transcripts: Optional[List[Transcription]] = None
clips: Optional[List[RecordingTranscriptionClip]] = Field(default=None, description="A list of individual speech clips with speaker, timing, and confidence information.")
additional_properties: Dict[str, Any] = {}
__properties: ClassVar[List[str]] = ["transcripts"]
__properties: ClassVar[List[str]] = ["transcripts", "clips"]

model_config = ConfigDict(
populate_by_name=True,
Expand Down Expand Up @@ -80,6 +82,13 @@ def to_dict(self) -> Dict[str, Any]:
if _item_transcripts:
_items.append(_item_transcripts.to_dict())
_dict['transcripts'] = _items
# override the default output from pydantic by calling `to_dict()` of each item in clips (list)
_items = []
if self.clips:
for _item_clips in self.clips:
if _item_clips:
_items.append(_item_clips.to_dict())
_dict['clips'] = _items
# puts key-value pairs in additional_properties in the top level
if self.additional_properties is not None:
for _key, _value in self.additional_properties.items():
Expand All @@ -97,7 +106,8 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
return cls.model_validate(obj)

_obj = cls.model_validate({
"transcripts": [Transcription.from_dict(_item) for _item in obj["transcripts"]] if obj.get("transcripts") is not None else None
"transcripts": [Transcription.from_dict(_item) for _item in obj["transcripts"]] if obj.get("transcripts") is not None else None,
"clips": [RecordingTranscriptionClip.from_dict(_item) for _item in obj["clips"]] if obj.get("clips") is not None else None
})
# store additional fields in additional_properties
for _key in obj.keys():
Expand Down
4 changes: 3 additions & 1 deletion bandwidth/models/transcription.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@ class Transcription(BaseModel):
"""
Transcription
""" # noqa: E501
speaker: Optional[StrictInt] = Field(default=None, description="Zero-based index identifying the speaker.")
text: Optional[StrictStr] = Field(default=None, description="The transcribed text")
confidence: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="The confidence on the recognized content, ranging from `0.0` to `1.0` with `1.0` being the highest confidence.")
additional_properties: Dict[str, Any] = {}
__properties: ClassVar[List[str]] = ["text", "confidence"]
__properties: ClassVar[List[str]] = ["speaker", "text", "confidence"]

model_config = ConfigDict(
populate_by_name=True,
Expand Down Expand Up @@ -90,6 +91,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
return cls.model_validate(obj)

_obj = cls.model_validate({
"speaker": obj.get("speaker"),
"text": obj.get("text"),
"confidence": obj.get("confidence")
})
Expand Down
33 changes: 33 additions & 0 deletions docs/RecordingTranscriptionClip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# RecordingTranscriptionClip


## Properties

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**speaker** | **int** | Zero-based index identifying the speaker. | [optional]
**text** | **str** | The transcribed text of this clip. | [optional]
**confidence** | **float** | How confident the transcription engine was in transcribing this clip (from `0.0` to `1.0`). | [optional]
**start_time_seconds** | **float** | The start time of this clip within the recording, in seconds. | [optional]
**end_time_seconds** | **float** | The end time of this clip within the recording, in seconds. | [optional]

## Example

```python
from bandwidth.models.recording_transcription_clip import RecordingTranscriptionClip

# TODO update the JSON string below
json = "{}"
# create an instance of RecordingTranscriptionClip from a JSON string
recording_transcription_clip_instance = RecordingTranscriptionClip.from_json(json)
# print the JSON string representation of the object
print(RecordingTranscriptionClip.to_json())

# convert the object into a dict
recording_transcription_clip_dict = recording_transcription_clip_instance.to_dict()
# create an instance of RecordingTranscriptionClip from a dict
recording_transcription_clip_from_dict = RecordingTranscriptionClip.from_dict(recording_transcription_clip_dict)
```
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)


1 change: 1 addition & 0 deletions docs/RecordingTranscriptions.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**transcripts** | [**List[Transcription]**](Transcription.md) | | [optional]
**clips** | [**List[RecordingTranscriptionClip]**](RecordingTranscriptionClip.md) | A list of individual speech clips with speaker, timing, and confidence information. | [optional]

## Example

Expand Down
1 change: 1 addition & 0 deletions docs/Transcription.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**speaker** | **int** | Zero-based index identifying the speaker. | [optional]
**text** | **str** | The transcribed text | [optional]
**confidence** | **float** | The confidence on the recognized content, ranging from `0.0` to `1.0` with `1.0` being the highest confidence. | [optional]

Expand Down
1 change: 1 addition & 0 deletions test/unit/api/test_recordings_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ def test_get_recording_transcription(self) -> None:
assert_that(response.data, instance_of(RecordingTranscriptions))
assert_that(response.data.transcripts, instance_of(list))
assert_that(response.data.transcripts[0], instance_of(Transcription))
assert_that(response.data.transcripts[0].speaker, instance_of(int))
assert_that(response.data.transcripts[0].text, instance_of(str))
assert_that(response.data.transcripts[0].confidence, instance_of(float))

Expand Down
Loading