download only audio from youtube video using youtube-dl in python script

Read on in the developer instructions for an amended example:

from __future__ import unicode_literals
import youtube_dl


ydl_opts = {
    'format': 'bestaudio/best',
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'mp3',
        'preferredquality': '192',
    }],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['http://www.youtube.com/watch?v=BaW_jenozKc'])

This will download an audio file if possible/supported. If the file is not mp3 already, the downloaded file be converted to mp3 using ffmpeg or avconv. For more information, refer to the format and postprocessors documentation entries in a current version of youtube-dl.


Use postprocessors argument. The list of all the available postprocessors can be found here.

If you want to pass additional ffmpeg or avconv options, which are not included in youtube-dl library (like audio bitrate - -ar <BR> in ffmpeg), add postprocessor_args as a list.

You can also prefer ffmpeg over avconv setting prefer_ffmpeg to True.

And to keep both original and converted audio file set 'keepvideo' to True.

For example:

from __future__ import unicode_literals
import youtube_dl

ydl_opts = {
    'format': 'bestaudio/best',
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'wav',
        'preferredquality': '192'
    }],
    'postprocessor_args': [
        '-ar', '16000'
    ],
    'prefer_ffmpeg': True,
    'keepvideo': True
}

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['http://www.youtube.com/watch?v=BaW_jenozKc'])

The list of all the available options is in the documentation. You can read ffmpeg posprocessor's code here.

And a less complex example is in their GitHub README.


I did not intend to answer this question, in fact, I came to find an answer for myself. In my search, none of these answers worked in a satisfactory manner. I did however find an excellent alternative that worked perfectly for me that I felt I should share: the module pytube.

from pytube import YouTube
import os

yt = YouTube('YOUR LINK HERE')

video = yt.streams.filter(only_audio=True).first()

out_file = video.download(output_path=".")

base, ext = os.path.splitext(out_file)
new_file = base + '.mp3'
os.rename(out_file, new_file)

As youtube_dl is discontinued, you can use tube_dl

Usage :

pip install tube_dl
from tube_dl import Youtube

In your case, here's how to get only audio.

from tube_dl import Youtube
youtube('Your URL').formats.filter(only_audio=True)[0]**.download(convert='mp3')

** Instead of 0, you can use your favourite quality. Just type:

print(youtube('Your URL').formats.filter(only_audio=True))

This will print all the audios supported. Then specify index of your choice and download

EDIT:

filter is deprecated, use filter_by instead