.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "tutorials/effector_tutorial.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_tutorials_effector_tutorial.py: AudioEffector Usages ==================== **Author**: `Moto Hira `__ This tutorial shows how to use :py:class:`torchaudio.io.AudioEffector` to apply various effects and codecs to waveform tensor. .. GENERATED FROM PYTHON SOURCE LINES 13-19 .. note:: This tutorial requires FFmpeg libraries. Please refer to :ref:`FFmpeg dependency ` for the detail. .. GENERATED FROM PYTHON SOURCE LINES 22-34 Overview -------- :py:class:`~torchaudio.io.AudioEffector` combines in-memory encoding, decoding and filtering that are provided by :py:class:`~torchaudio.io.StreamWriter` and :py:class:`~torchaudio.io.StreamReader`. The following figure illustrates the process. .. image:: https://download.pytorch.org/torchaudio/tutorial-assets/AudioEffector.png .. GENERATED FROM PYTHON SOURCE LINES 34-40 .. code-block:: default import torch import torchaudio print(torch.__version__) print(torchaudio.__version__) .. rst-class:: sphx-glr-script-out .. code-block:: none 2.4.0.dev20240503 2.2.0.dev20240504 .. GENERATED FROM PYTHON SOURCE LINES 42-47 .. code-block:: default from torchaudio.io import AudioEffector, CodecConfig import matplotlib.pyplot as plt from IPython.display import Audio .. GENERATED FROM PYTHON SOURCE LINES 49-52 .. code-block:: default for k, v in torchaudio.utils.ffmpeg_utils.get_versions().items(): print(k, v) .. rst-class:: sphx-glr-script-out .. code-block:: none libavcodec (60, 3, 100) libavdevice (60, 1, 100) libavfilter (9, 3, 100) libavformat (60, 3, 100) libavutil (58, 2, 100) .. GENERATED FROM PYTHON SOURCE LINES 53-78 Usage ----- To use ``AudioEffector``, instantiate it with ``effect`` and ``format``, then either pass the waveform to :py:meth:`~torchaudio.io.AudioEffector.apply` or :py:meth:`~torchaudio.io.AudioEffector.stream` method. .. code:: python effector = AudioEffector(effect=..., format=...,) # Apply at once applied = effector.apply(waveform, sample_rate) ``apply`` method applies effect and codec to the entire waveform at once. So if the input waveform is long, and memory consumption is an issue, one can use ``stream`` method to process chunk by chunk. .. code:: python # Apply chunk by chunk for applied_chunk = effector.stream(waveform, sample_rate): ... .. GENERATED FROM PYTHON SOURCE LINES 80-83 Example ------- .. GENERATED FROM PYTHON SOURCE LINES 83-88 .. code-block:: default src = torchaudio.utils.download_asset("tutorial-assets/Lab41-SRI-VOiCES-src-sp0307-ch127535-sg0042.wav") waveform, sr = torchaudio.load(src, channels_first=False) .. GENERATED FROM PYTHON SOURCE LINES 89-92 Gallery ------- .. GENERATED FROM PYTHON SOURCE LINES 92-110 .. code-block:: default def show(effect, *, stereo=False): wf = torch.cat([waveform] * 2, dim=1) if stereo else waveform figsize = (6.4, 2.1 if stereo else 1.2) effector = AudioEffector(effect=effect, pad_end=False) result = effector.apply(wf, int(sr)) num_channels = result.size(1) f, ax = plt.subplots(num_channels, 1, squeeze=False, figsize=figsize, sharex=True) for i in range(num_channels): ax[i][0].specgram(result[:, i], Fs=sr) f.set_tight_layout(True) return Audio(result.numpy().T, rate=sr) .. GENERATED FROM PYTHON SOURCE LINES 111-114 Original -------- .. GENERATED FROM PYTHON SOURCE LINES 114-117 .. code-block:: default show(effect=None) .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_001.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_001.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 118-121 Effects ------- .. GENERATED FROM PYTHON SOURCE LINES 123-126 tempo ~~~~~ https://ffmpeg.org/ffmpeg-filters.html#atempo .. GENERATED FROM PYTHON SOURCE LINES 126-128 .. code-block:: default show("atempo=0.7") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_002.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_002.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 130-132 .. code-block:: default show("atempo=1.8") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_003.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_003.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 133-136 highpass ~~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#highpass .. GENERATED FROM PYTHON SOURCE LINES 136-138 .. code-block:: default show("highpass=frequency=1500") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_004.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_004.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 139-142 lowpass ~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#lowpass .. GENERATED FROM PYTHON SOURCE LINES 142-144 .. code-block:: default show("lowpass=frequency=1000") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_005.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_005.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 145-148 allpass ~~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#allpass .. GENERATED FROM PYTHON SOURCE LINES 148-150 .. code-block:: default show("allpass") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_006.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_006.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 151-154 bandpass ~~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#bandpass .. GENERATED FROM PYTHON SOURCE LINES 154-156 .. code-block:: default show("bandpass=frequency=3000") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_007.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_007.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 157-160 bandreject ~~~~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#bandreject .. GENERATED FROM PYTHON SOURCE LINES 160-162 .. code-block:: default show("bandreject=frequency=3000") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_008.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_008.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 163-166 echo ~~~~ https://ffmpeg.org/ffmpeg-filters.html#aecho .. GENERATED FROM PYTHON SOURCE LINES 166-168 .. code-block:: default show("aecho=in_gain=0.8:out_gain=0.88:delays=6:decays=0.4") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_009.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_009.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 170-172 .. code-block:: default show("aecho=in_gain=0.8:out_gain=0.88:delays=60:decays=0.4") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_010.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_010.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 174-176 .. code-block:: default show("aecho=in_gain=0.8:out_gain=0.9:delays=1000:decays=0.3") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_011.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_011.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 177-180 chorus ~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#chorus .. GENERATED FROM PYTHON SOURCE LINES 180-182 .. code-block:: default show("chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_012.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_012.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 183-186 fft filter ~~~~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#afftfilt .. GENERATED FROM PYTHON SOURCE LINES 186-194 .. code-block:: default # fmt: off show( "afftfilt=" "real='re * (1-clip(b * (b/nb), 0, 1))':" "imag='im * (1-clip(b * (b/nb), 0, 1))'" ) .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_013.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_013.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 196-205 .. code-block:: default show( "afftfilt=" "real='hypot(re,im) * sin(0)':" "imag='hypot(re,im) * cos(0)':" "win_size=512:" "overlap=0.75" ) .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_014.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_014.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 207-217 .. code-block:: default show( "afftfilt=" "real='hypot(re,im) * cos(2 * 3.14 * (random(0) * 2-1))':" "imag='hypot(re,im) * sin(2 * 3.14 * (random(1) * 2-1))':" "win_size=128:" "overlap=0.8" ) # fmt: on .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_015.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_015.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 218-221 vibrato ~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#vibrato .. GENERATED FROM PYTHON SOURCE LINES 221-223 .. code-block:: default show("vibrato=f=10:d=0.8") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_016.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_016.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none /pytorch/audio/ci_env/lib/python3.10/site-packages/IPython/lib/display.py:188: RuntimeWarning: invalid value encountered in cast return scaled.astype("

.. GENERATED FROM PYTHON SOURCE LINES 224-227 tremolo ~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#tremolo .. GENERATED FROM PYTHON SOURCE LINES 227-229 .. code-block:: default show("tremolo=f=8:d=0.8") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_017.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_017.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 230-233 crystalizer ~~~~~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#crystalizer .. GENERATED FROM PYTHON SOURCE LINES 233-235 .. code-block:: default show("crystalizer") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_018.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_018.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 236-239 flanger ~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#flanger .. GENERATED FROM PYTHON SOURCE LINES 239-241 .. code-block:: default show("flanger") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_019.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_019.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 242-245 phaser ~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#aphaser .. GENERATED FROM PYTHON SOURCE LINES 245-247 .. code-block:: default show("aphaser") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_020.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_020.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 248-251 pulsator ~~~~~~~~ https://ffmpeg.org/ffmpeg-filters.html#apulsator .. GENERATED FROM PYTHON SOURCE LINES 251-253 .. code-block:: default show("apulsator", stereo=True) .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_021.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_021.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 254-257 haas ~~~~ https://ffmpeg.org/ffmpeg-filters.html#haas .. GENERATED FROM PYTHON SOURCE LINES 257-259 .. code-block:: default show("haas") .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_022.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_022.png :class: sphx-glr-single-img .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 260-263 Codecs ------ .. GENERATED FROM PYTHON SOURCE LINES 263-281 .. code-block:: default def show_multi(configs): results = [] for config in configs: effector = AudioEffector(**config) results.append(effector.apply(waveform, int(sr))) num_configs = len(configs) figsize = (6.4, 0.3 + num_configs * 0.9) f, axes = plt.subplots(num_configs, 1, figsize=figsize, sharex=True) for result, ax in zip(results, axes): ax.specgram(result[:, 0], Fs=sr) f.set_tight_layout(True) return [Audio(r.numpy().T, rate=sr) for r in results] .. GENERATED FROM PYTHON SOURCE LINES 282-285 ogg ~~~ .. GENERATED FROM PYTHON SOURCE LINES 285-294 .. code-block:: default results = show_multi( [ {"format": "ogg"}, {"format": "ogg", "encoder": "vorbis"}, {"format": "ogg", "encoder": "opus"}, ] ) .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_023.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_023.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 295-298 ogg - default encoder (flac) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 298-300 .. code-block:: default results[0] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 301-304 ogg - vorbis ^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 304-306 .. code-block:: default results[1] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 307-310 ogg - opus ^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 310-312 .. code-block:: default results[2] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 313-316 mp3 ~~~ https://trac.ffmpeg.org/wiki/Encode/MP3 .. GENERATED FROM PYTHON SOURCE LINES 316-329 .. code-block:: default results = show_multi( [ {"format": "mp3"}, {"format": "mp3", "codec_config": CodecConfig(compression_level=1)}, {"format": "mp3", "codec_config": CodecConfig(compression_level=9)}, {"format": "mp3", "codec_config": CodecConfig(bit_rate=192_000)}, {"format": "mp3", "codec_config": CodecConfig(bit_rate=8_000)}, {"format": "mp3", "codec_config": CodecConfig(qscale=9)}, {"format": "mp3", "codec_config": CodecConfig(qscale=1)}, ] ) .. image-sg:: /tutorials/images/sphx_glr_effector_tutorial_024.png :alt: effector tutorial :srcset: /tutorials/images/sphx_glr_effector_tutorial_024.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 330-332 default ^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 332-334 .. code-block:: default results[0] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 335-337 compression_level=1 ^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 337-339 .. code-block:: default results[1] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 340-342 compression_level=9 ^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 342-344 .. code-block:: default results[2] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 345-347 bit_rate=192k ^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 347-349 .. code-block:: default results[3] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 350-352 bit_rate=8k ^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 352-354 .. code-block:: default results[4] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 355-357 qscale=9 ^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 357-359 .. code-block:: default results[5] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 360-362 qscale=1 ^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 362-364 .. code-block:: default results[6] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 365-366 Tag: :obj:`torchaudio.io` .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 3.044 seconds) .. _sphx_glr_download_tutorials_effector_tutorial.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: effector_tutorial.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: effector_tutorial.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_