diff --git a/CHANGELOG.md b/CHANGELOG.md index 53b6a0e55..fcced9255 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added a new `SOXRStreamAudioResampler` for processing audio in chunks or streams. + - Added new `DailyParams.audio_in_user_tracks` to allow receiving one track per user (default) or a single track from the room (all participants mixed). @@ -56,6 +58,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Updated all the services to use the new `SOXRStreamAudioResampler`, ensuring smooth + transitions and eliminating clicks. + - Upgraded `daily-python` to 0.19.4. - Updated `google` optional dependency to use `google-genai` version `1.24.0`. diff --git a/src/pipecat/audio/utils.py b/src/pipecat/audio/utils.py index 7b72be1a9..6d5a12929 100644 --- a/src/pipecat/audio/utils.py +++ b/src/pipecat/audio/utils.py @@ -15,15 +15,41 @@ import audioop import numpy as np import pyloudnorm as pyln -import soxr from pipecat.audio.resamplers.base_audio_resampler import BaseAudioResampler from pipecat.audio.resamplers.soxr_resampler import SOXRAudioResampler +from pipecat.audio.resamplers.soxr_stream_resampler import SOXRStreamAudioResampler def create_default_resampler(**kwargs) -> BaseAudioResampler: """Create a default audio resampler instance. + . deprecated:: 0.0.74 + This function is deprecated and will be removed in a future version. + Use `create_stream_resampler` for real-time processing scenarios or + `create_file_resampler` for batch processing of complete audio files. + + Args: + **kwargs: Additional keyword arguments passed to the resampler constructor. + + Returns: + A configured SOXRAudioResampler instance. + """ + import warnings + + warnings.warn( + "`create_default_resampler` is deprecated. " + "Use `create_stream_resampler` for real-time processing scenarios or " + "`create_file_resampler` for batch processing of complete audio files.", + DeprecationWarning, + stacklevel=2, + ) + return SOXRAudioResampler(**kwargs) + + +def create_file_resampler(**kwargs) -> BaseAudioResampler: + """Create an audio resampler instance for batch processing of complete audio files. + Args: **kwargs: Additional keyword arguments passed to the resampler constructor. @@ -33,6 +59,18 @@ def create_default_resampler(**kwargs) -> BaseAudioResampler: return SOXRAudioResampler(**kwargs) +def create_stream_resampler(**kwargs) -> BaseAudioResampler: + """Create a stream audio resampler instance. + + Args: + **kwargs: Additional keyword arguments passed to the resampler constructor. + + Returns: + A configured SOXRStreamAudioResampler instance. + """ + return SOXRStreamAudioResampler(**kwargs) + + def mix_audio(audio1: bytes, audio2: bytes) -> bytes: """Mix two audio streams together by adding their samples.