Unsupported operand type (s) error when processing audio with deep learning

Viewed 71

I want to run a function for processing mp3 file with deep learning. But I get the following error. I looked for solutions for similar errors, but it did not help. What could be the problem?

def createSpectrogramsFromAudio():
    genresID = dict()
    files = os.listdir(rawDataPath)
    files = [file for file in files if file.endswith(".mp3")]
    nbFiles = len(files)

    if not os.path.exists(os.path.dirname(spectrogramsPath)):
        try:
            os.makedirs(os.path.dirname(spectrogramsPath))
        except OSError as exc: # Guard against race condition
            if exc.errno != errno.EEXIST:
                raise

    for index,filename in enumerate(files):
        print ("Creating spectrogram for file {}/{}...".format(index+1,nbFiles))
        fileGenre = getGenre(rawDataPath+filename)
        genresID[fileGenre] = genresID[fileGenre] + 1 if fileGenre in genresID else 1
        fileID = genresID[fileGenre]
        newFilename = fileGenre+"_"+str(fileID)
        createSpectrogram(filename,newFilename)

ERROR:

Creating spectrograms...
Creating spectrogram for file 1/1...
Traceback (most recent call last):
  File "main.py", line 33, in <module>
    createSlicesFromAudio()
  File "/content/drive/My Drive/Colab Notebooks/DeepAudioClassification/songToData.py", line 72, in createSlicesFromAudio
    createSpectrogramsFromAudio()
  File "/content/drive/My Drive/Colab Notebooks/DeepAudioClassification/songToData.py", line 66, in createSpectrogramsFromAudio
    newFilename = fileGenre+"_"+str(fileID)
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
1 Answers

fileGenre is None and you can't concatenate None with _ (str), as indicated by the exception.

The code seems to be closely related to this repo and hence getGenre is defined as:

def getGenre(filename):
    audiofile = eyed3.load(filename)
    #No genre
    if not audiofile.tag.genre:
        return None
    else:
        return audiofile.tag.genre.name.encode('utf-8')

As you can see, if no genre is defined, you get None. Later it results in the exception.

fileGenre = getGenre(rawDataPath+filename) # -> None
genresID[fileGenre] = genresID[fileGenre] + 1 if fileGenre in genresID else 1 # -> 1
fileID = genresID[fileGenre] # whatever
newFilename = fileGenre+"_"+str(fileID) # EXCEPTION

It'd seem that your audio files do not have a genre tag and hence the error.

Related