Skip to content

Commit

Permalink
community[patch]: Skip OpenAIWhisperParser extremely small audio ch…
Browse files Browse the repository at this point in the history
…unks to avoid api error (langchain-ai#11450)

**Description**
This PR addresses a rare issue in `OpenAIWhisperParser` that causes it
to crash when processing an audio file with a duration very close to the
class's chunk size threshold of 20 minutes.

**Issue**
langchain-ai#11449

**Dependencies**
None

**Tag maintainer**
@agola11 @eyurtsev 

**Twitter handle**
leonardodiegues

---------

Co-authored-by: Leonardo Diegues <[email protected]>
Co-authored-by: Bagatur <[email protected]>
  • Loading branch information
3 people authored and al1p-R committed Feb 27, 2024
1 parent 55a361f commit 830b39a
Showing 1 changed file with 17 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,22 @@

class OpenAIWhisperParser(BaseBlobParser):
"""Transcribe and parse audio files.
Audio transcription is with OpenAI Whisper model."""
def __init__(self, api_key: Optional[str] = None):
Audio transcription is with OpenAI Whisper model.
Args:
api_key: OpenAI API key
chunk_duration_threshold: minimum duration of a chunk in seconds
NOTE: According to the OpenAI API, the chunk duration should be at least 0.1
seconds. If the chunk duration is less or equal than the threshold,
it will be skipped.
"""

def __init__(
self, api_key: Optional[str] = None, *, chunk_duration_threshold: float = 0.1
):
self.api_key = api_key
self.chunk_duration_threshold = chunk_duration_threshold

def lazy_parse(self, blob: Blob) -> Iterator[Document]:
"""Lazily parse the blob."""
Expand Down Expand Up @@ -57,6 +69,9 @@ def lazy_parse(self, blob: Blob) -> Iterator[Document]:
for split_number, i in enumerate(range(0, len(audio), chunk_duration_ms)):
# Audio chunk
chunk = audio[i : i + chunk_duration_ms]
# Skip chunks that are too short to transcribe
if chunk.duration_seconds <= self.chunk_duration_threshold:
continue
file_obj = io.BytesIO(chunk.export(format="mp3").read())
if blob.source is not None:
file_obj.name = blob.source + f"_part_{split_number}.mp3"
Expand Down

0 comments on commit 830b39a

Please sign in to comment.