\n",
"There are several ways to read and write audio files in Python, using different packages. This notebooks lists some options and discusses advantages as well as disadvantages. For detailed explanations on how to integrate audio files into the notebooks, we refer to the FMP notebook on Multimedia.
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## LibROSA"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One option to read audio is to use LibROSA's function [`librosa.load`](https://librosa.org/doc/latest/generated/librosa.load.html). \n",
"\n",
"* Per default, `librosa.load` resamples the audio to $22050~\\mathrm{Hz}$. Setting `sr=None` keeps the native sampling rate.\n",
"* The loaded audio is converted to a float with amplitude values lying in the range of $[-1, 1]$.\n",
"* `librosa.load` is essentially a wrapper that uses either [`PySoundFile`](https://pysoundfile.readthedocs.io) or [`audioread`](https://github.com/beetbox/audioread).\n",
"* When reading audio, `librosa.load` first tries to use [`PySoundFile`](https://pysoundfile.readthedocs.io). This works for many formats, such as WAV, FLAC, and OGG. However, MP3 is not supported. When `PySoundFile` fails to read the audio file (e.g., for MP3), a warning is issued, and `librosa.load` falls back to another library called [`audioread`](https://github.com/beetbox/audioread). When [`ffmpeg`](https://ffmpeg.org/) is available, this library can read MP3 files."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-15T09:01:06.483819Z",
"iopub.status.busy": "2024-02-15T09:01:06.483526Z",
"iopub.status.idle": "2024-02-15T09:01:09.115296Z",
"shell.execute_reply": "2024-02-15T09:01:09.114753Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WAV file: Fs = 11025, x.shape = (45504,), x.dtype = float32\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Generate signal\n",
"Fs = 8000\n",
"x = 0.5 * np.cos(2 * np.pi * 440 * np.arange(0, Fs) / Fs)\n",
"x[2000:2200] = 2\n",
"print_plot_play(x=x,Fs=Fs,text='Generated signal: ')\n",
"\n",
"# Write signal\n",
"# Default: 'PCM_16'\n",
"# Equivalent to pre-processing (dithering + quantization) \n",
"# x = np.int16(np.round(x*(2**15)))\n",
"# \n",
"print('Default for writing files:', sf.default_subtype('WAV'))\n",
"fn_out = os.path.join('..', 'output', 'B', 'FMP_B_PythonAudio_sine.wav')\n",
"sf.write(fn_out, x, Fs, subtype='PCM_16')\n",
"\n",
"# Read generated signal\n",
"x, Fs = sf.read(fn_out)\n",
"print_plot_play(x=x,Fs=Fs,text='Signal after writing and reading: ')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## SciPy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Scipy offers the [`scipy.io.wavfile`](https://docs.scipy.org/doc/scipy/reference/io.html#module-scipy.io.wavfile) module, which also has functionalities for reading and writing wav files. However, not all variants of the wav format are support. For example, $24$-bit integer `WAV`-files are not allowed. Furthermore, certain metadata fields in a wav file may also lead to errors. Therefore, we do not recommend this option."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-15T09:01:09.653224Z",
"iopub.status.busy": "2024-02-15T09:01:09.652863Z",
"iopub.status.idle": "2024-02-15T09:01:09.998720Z",
"shell.execute_reply": "2024-02-15T09:01:09.998099Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Signal after writing and reading: Fs = 11025, x.shape = (45504,), x.dtype = int16\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy.io import wavfile\n",
"\n",
"Fs, x = wavfile.read(fn_wav)\n",
"print_plot_play(x=x,Fs=Fs,text='Signal after writing and reading: ')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wrapper Functions in `libfmp`\n",
"\n",
"Wrapper functions for reading and writing audio have also been included in `libfmp`.\n",
"These wrappers reflect our default recommendations to use `librosa` for loading audio, and `PySoundFile` for writing audio.\n",
"In the following code cell, we call these functions:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-15T09:01:10.001740Z",
"iopub.status.busy": "2024-02-15T09:01:10.001532Z",
"iopub.status.idle": "2024-02-15T09:01:10.009828Z",
"shell.execute_reply": "2024-02-15T09:01:10.009314Z"
}
},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append('..')\n",
"\n",
"import libfmp.b\n",
"\n",
"fn_wav = os.path.join('..', 'data', 'B', 'FMP_B_Note-C4_Piano.wav')\n",
"fn_out = os.path.join('..', 'output', 'B', 'FMP_B_Note-C4_Piano.wav')\n",
"\n",
"x, Fs = libfmp.b.read_audio(fn_wav)\n",
"libfmp.b.write_audio(fn_out, x, Fs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Normalized Audio Playback \n",
"\n",
"In the [FMP notebook on multimedia](../B/B_Multimedia.html), we introduced the class\n",
"\n",
"`IPython.display.Audio(data=None, filename=None, url=None, embed=None, rate=None, autoplay=False, normalize=True, *, element_id=None)`\n",
"\n",
"for audio playback ([`IPython` version 6.0 or higher](https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html)), which is frequently used in the FMP notebooks. As default, this class **normalizes** the audio (dividing by the maximum over all sample values) before playback. This may be unwanted for certain applications, where the volume of the audio should be kept to its original level. To avoid normalization, one has to set the parameter `normalize=False`. However, this requires that all samples of the audio lie within the range between $-1$ and $-1$. In the following code cell, we give an illustrative examples for the two options."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-15T09:01:10.012478Z",
"iopub.status.busy": "2024-02-15T09:01:10.012282Z",
"iopub.status.idle": "2024-02-15T09:01:10.118575Z",
"shell.execute_reply": "2024-02-15T09:01:10.118083Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Audio playback with default settings (normalized audio)\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Audio playback without normalization (original audio) \n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Fs = 8000\n",
"x = 0.1 * np.cos(2 * np.pi * 440 * np.arange(0, 2 * Fs) / Fs)\n",
"\n",
"plt.figure(figsize=(6, 1.5))\n",
"plt.plot(x, color='gray')\n",
"plt.xlim([0, x.shape[0]])\n",
"plt.ylim([-1, 1])\n",
"plt.xlabel('Time (samples)')\n",
"plt.ylabel('Amplitude')\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"print('Audio playback with default settings (normalized audio)')\n",
"ipd.display(ipd.Audio(data=x, rate=Fs))\n",
"\n",
"print('Audio playback without normalization (original audio) ')\n",
"ipd.display(ipd.Audio(data=x, rate=Fs, normalize=False))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Audio Playback List\n",
"\n",
"In the following code cell, we provide a function for placing several audio players next to each other. Furthermore, the function allows for adapting the width and the height of the individual players. Note that, when the width of the audio player becomes too small, some playback information may be hidden or the playback bottom may be placed in a drop-down menu."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-15T09:01:10.121074Z",
"iopub.status.busy": "2024-02-15T09:01:10.120892Z",
"iopub.status.idle": "2024-02-15T09:01:10.220517Z",
"shell.execute_reply": "2024-02-15T09:01:10.219964Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"