Hello, I tried to use tyiannak/pyAudioAnalysis for splitting song data into some melody parts.
GitHub

Environments

  • Python 3.7.4
  • pip 19.2.3

Step 1: install

Read README and try install

$ pip install numpy matplotlib scipy sklearn hmmlearn simplejson eyed3 pydub
$ git clone https://github.com/tyiannak/pyAudioAnalysis.git
$ pip install -e .

Step: 2: run sample Segmentation

In this time, I want to split a song into some melodies.
pyAudioAnalysis supports its function. Wiki
I try to it.

Note: input file path is name_ (underbar), not name.wav

$ cd pyAudioAnalysis/pyAudioAnalysis

$ # I put test.wav to data (pyAudioAnalysis/pyAudioAnalysis/data)
$ cp **.wav to data/

$ python audioAnalysis.py classifyFolder -i data/test_ --model svm --classifier data/svmSM --detail
Unable to revert mtime: /Library/Fonts
Traceback (most recent call last):
  File "audioAnalysis.py", line 7, in <module>
    from pyAudioAnalysis import audioFeatureExtraction as aF
  File "/Users/mizuki/.ghq/github.com/tyiannak/pyAudioAnalysis/pyAudioAnalysis/audioFeatureExtraction.py", line 10, in <module>
    from pyAudioAnalysis import audioBasicIO
  File "/Users/mizuki/.ghq/github.com/tyiannak/pyAudioAnalysis/pyAudioAnalysis/audioBasicIO.py", line 2, in <module>
    import aifc, os, glob, eyed3, ntpath, shutil, numpy
  File "/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/eyed3/__init__.py", line 32, in <module>
    from .utils.log import log                                          # noqa: E402
  File "/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/eyed3/utils/__init__.py", line 27, in <module>
    import magic
  File "/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/magic.py", line 181, in <module>
    raise ImportError('failed to find libmagic.  Check your installation')
ImportError: failed to find libmagic.  Check your installation

It’s failed…, I found this gist.
it requires libmagic.

$ brew install libmagic

Step 3: modify code

It runs without ImportError, but it happens TypeError.

python audioAnalysis.py classifyFolder -i data/test_ --model svm --classifier data/svmSM --detail
/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/sklearn/base.py:306: UserWarning: Trying to unpickle estimator SVC from version 0.19.1 when using version 0.21.3. This might lead to breaking code or invalid results. Use at your own risk.
  UserWarning)
data/test_10.800-12.150.wav	music
/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/sklearn/base.py:306: UserWarning: Trying to unpickle estimator SVC from version 0.19.1 when using version 0.21.3. This might lead to breaking code or invalid results. Use at your own risk.
  UserWarning)
Traceback (most recent call last):
  File "audioAnalysis.py", line 600, in <module>
    args.details)
  File "audioAnalysis.py", line 138, in classifyFolderWrapper
    print("{0:s}\t{1:s}".format(wavFile, classNames[Result]))
TypeError: 'int' object is not subscriptable

In my environments, classNames will be int (-1). so I add check type expression.
But I think this solution is maybe wrong…

diff --git a/pyAudioAnalysis/audioAnalysis.py b/pyAudioAnalysis/audioAnalysis.py
index 78af676..57ecfa8 100644
--- a/pyAudioAnalysis/audioAnalysis.py
+++ b/pyAudioAnalysis/audioAnalysis.py
@@ -134,16 +134,18 @@ def classifyFolderWrapper(inputFolder, model_type, model_name,
                                                         model_type)
         Result = int(Result)
         Results.append(Result)
-        if outputMode:
+        if outputMode and type(classNames) is list:
             print("{0:s}\t{1:s}".format(wavFile, classNames[Result]))
     Results = numpy.array(Results)

     # print distribution of classes:
-    [Histogram, _] = numpy.histogram(Results,
+    if type(classNames) is list:
+       [Histogram, _] = numpy.histogram(Results,
                                      bins=numpy.arange(len(classNames) + 1))
-    for i, h in enumerate(Histogram):
-        print("{0:20s}\t\t{1:d}".format(classNames[i], h))
-
+       for i, h in enumerate(Histogram):
+          print("{0:20s}\t\t{1:d}".format(classNames[i], h))

 def regressionFolderWrapper(inputFolder, model_type, model_name):
     files = "*.wav"

Step4: re run

Re try! terminal shows this text.

data/test_10.800-12.150.wav	music
data/test_106.450-107.550.wav	music
data/test_112.900-114.200.wav	music
data/test_114.900-117.500.wav	music
data/test_117.650-119.500.wav	music
data/test_120.750-125.000.wav	music
data/test_125.650-126.950.wav	music
data/test_127.250-137.100.wav	music
data/test_137.700-140.950.wav	music
data/test_141.250-145.300.wav	music
data/test_147.300-150.850.wav	music
data/test_15.150-16.550.wav	music
data/test_151.350-154.850.wav	music
data/test_155.400-168.550.wav	music
data/test_168.950-175.850.wav	music
data/test_17.400-20.700.wav	music
data/test_177.850-199.300.wav	music
data/test_199.450-214.950.wav	music
data/test_216.650-219.800.wav	music
data/test_22.250-23.500.wav	music
data/test_220.500-221.550.wav	music
data/test_225.800-231.000.wav	music
data/test_232.250-236.350.wav	music
data/test_236.950-238.150.wav	music
data/test_24.200-27.350.wav	music
data/test_241.600-247.300.wav	music
data/test_44.400-45.600.wav	music
data/test_49.150-50.550.wav	music
data/test_55.900-60.350.wav	music
data/test_61.200-63.500.wav	music
data/test_64.300-67.900.wav	music
data/test_71.350-92.650.wav	music
-1

And I get these files. any files are part of song. not bad.

$ ls data/test_*
data/test_10.800-12.150.wav    data/test_120.750-125.000.wav  data/test_151.350-154.850.wav  data/test_22.250-23.500.wav    data/test_24.200-27.350.wav    data/test_55.900-60.350.wav
data/test_102.400-102.850.wav  data/test_125.650-126.950.wav  data/test_155.400-168.550.wav  data/test_220.500-221.550.wav  data/test_240.300-240.650.wav  data/test_61.200-63.500.wav
data/test_104.300-105.250.wav  data/test_127.250-137.100.wav  data/test_168.950-175.850.wav  data/test_222.400-222.750.wav  data/test_241.600-247.300.wav  data/test_64.300-67.900.wav
data/test_106.450-107.550.wav  data/test_137.700-140.950.wav  data/test_17.400-20.700.wav    data/test_225.800-231.000.wav  data/test_44.400-45.600.wav    data/test_68.350-68.600.wav
data/test_112.450-112.750.wav  data/test_141.250-145.300.wav  data/test_177.850-199.300.wav  data/test_23.750-24.050.wav    data/test_48.100-48.300.wav    data/test_71.350-92.650.wav
data/test_112.900-114.200.wav  data/test_146.150-146.550.wav  data/test_199.450-214.950.wav  data/test_231.150-231.350.wav  data/test_49.150-50.550.wav    data/test_9.300-10.150.wav
data/test_114.900-117.500.wav  data/test_147.300-150.850.wav  data/test_21.650-21.950.wav    data/test_232.250-236.350.wav  data/test_52.550-53.550.wav
data/test_117.650-119.500.wav  data/test_15.150-16.550.wav    data/test_216.650-219.800.wav  data/test_236.950-238.150.wav  data/test_54.400-55.350.wav

As can be seen from the figure, not perfect. (some parts are only 1~5 sec)

Summary

In my case, I input Japanese song, but library returns not bad result. Next step, I should update a model.

Memo

I want to remove this warning.

UserWarning: Trying to unpickle estimator SVC from version 0.19.1 when using version 0.21.3. This might lead to breaking code or invalid results. Use at your own risk.

So, degrade scikit-learn version. but…

pip install scikit-learn==0.19.1

It happens an error.

    sklearn/cluster/_dbscan_inner.cpp:5971:22: error: no member named 'exc_traceback' in '_ts'; did you mean 'curexc_traceback'?
        tmp_tb = tstate->exc_traceback;
                         ^~~~~~~~~~~~~
                         curexc_traceback
    /usr/local/var/pyenv/versions/3.7.4/include/python3.7m/pystate.h:241:15: note: 'curexc_traceback' declared here
        PyObject *curexc_traceback;
                  ^
    fatal error: too many errors emitted, stopping now [-ferror-limit=]
    216 warnings and 20 errors generated.
    error: Command "g++ -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include -I/usr/local/opt/llvm/include -I/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/numpy/core/include -I/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/numpy/core/include -I/usr/local/var/pyenv/versions/3.7.4/include/python3.7m -c sklearn/cluster/_dbscan_inner.cpp -o build/temp.macosx-10.14-x86_64-3.7/sklearn/cluster/_dbscan_inner.o -MMD -MF build/temp.macosx-10.14-x86_64-3.7/sklearn/cluster/_dbscan_inner.o.d" failed with exit status 1
    ----------------------------------------
  Rolling back uninstall of scikit-learn
  Moving to /usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/scikit_learn-0.21.3.dist-info/
   from /usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/~cikit_learn-0.21.3.dist-info
  Moving to /usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/sklearn/
   from /usr/local/var/pyenv/versions/3.7.4/lib/python3.7/site-packages/~klearn
ERROR: Command errored out with exit status 1: /usr/local/var/pyenv/versions/3.7.4/bin/python3.7 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/dw/tpv6_7p57sq8nr0qktf5d6400000gn/T/pip-install-1r3myvu1/scikit-learn/setup.py'"'"'; __file__='"'"'/private/var/folders/dw/tpv6_7p57sq8nr0qktf5d6400000gn/T/pip-install-1r3myvu1/scikit-learn/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/dw/tpv6_7p57sq8nr0qktf5d6400000gn/T/pip-record-la3xnsm4/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.

So I recommend using 0.19.2

pip install scikit-learn==0.19.2