Let's leverage! - Part II

Nach dem gestrigen Frusterlebnis geht es heute schöner weiter.

PortAudio lässt sich nur bis Julia-Version 1.0 verwenden, ich habe 1.2. Klar, daß das nicht klappern kann, unabhängig von der Home-Variablen. Das build.jl  im Pfad ~/.julia/clones/15043945597277091340_full/deps hat übrigens nach den fehlgeschlagenen Versuchen folgenden Inhalt:

using BinDeps
using Compat

@BinDeps.setup

ENV["JULIA_ROOT"] = abspath(JULIA_HOME, "../../")

libportaudio = library_dependency("libportaudio", aliases=["libportaudio-2"])

provides(AptGet, "portaudio19-dev", libportaudio)
provides(Pacman, "portaudio", libportaudio)

@osx_only begin
    using Homebrew
    provides(Homebrew.HB, "portaudio", libportaudio)
end

@windows_only begin
    using WinRPM
    provides(WinRPM.RPM, "libportaudio2", libportaudio, os = :Windows)
end

@BinDeps.install @compat Dict(:libportaudio => :libportaudio)

Aber die Fehlermeldung war ja eindeutig:

ERROR: Unsatisfiable requirements detected for package PortAudio [80ea8bcb]:
 PortAudio [80ea8bcb] log:
 ├─possible versions are: [0.2.1, 0.3.0, 0.4.0, 0.5.0, 1.0.0] or uninstalled
 ├─restricted to versions 0.0.0-* by MusicProcessing [1b8316d5], leaving only versions [0.2.1, 0.3.0, 0.4.0, 0.5.0, 1.0.0]
 │ └─MusicProcessing [1b8316d5] log:
 │   ├─possible versions are: 0.0.0 or uninstalled
 │   └─MusicProcessing [1b8316d5] is fixed to version 0.0.0
 └─restricted by julia compatibility requirements to versions: uninstalled — no versions left

Folglich habe ich mich nach einem Ersatz für PortAudio umgegugged, genauer gesagt habe ich mich gefragt, was ich eigentlich wirklich brauche. Und das ist ja dem Projekt Getting Started with Audio Data Analysis (Voice) using Deep Learning eindeutig zu entnehmen, ich war mal wieder zu oberflächlich: Als Erstes wird eine Wav-Datei eingelesen, um geplottet werden zu können (in dieser Reihenfolge). Durch Googlen und Stöbern in den Julia-Paketen bin ich dann fündig geworden:

GitHub - dancasimiro/WAV.jl: Julia package for working with WAV files
Readme · WAV.jl

Also:

julia> using Pkg

julia> Pkg.add("WAV")
 Resolving package versions...
 Installed WAV ──── v1.0.2
 Installed FileIO ─ v1.0.7
  Updating `~/.julia/environments/v1.2/Project.toml`
  [8149f6b0] + WAV v1.0.2
  Updating `~/.julia/environments/v1.2/Manifest.toml`
  [5789e2e9] + FileIO v1.0.7
  [8149f6b0] + WAV v1.0.2

julia> using WAV
[ Info: Precompiling WAV [8149f6b0-98f6-5db9-b78f-408fbbb8ef88]


julia> y,Fs,nbits,opt = wavread("/home/heide/python-wave-analysis/Train/3749.wav")
([0.022919400616473892 0.023773918881801814; 0.021179845576342053 0.02264473403118992; … ; 0.0005798516800439467 0.013885921811578723; 0.008423108615375225 0.016998809778130435], 44100.0f0, 0x0010, WAVChunk[WAVChunk(Symbol("fmt "), UInt8[0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00])])


julia> y
176400×2 Array{Float64,2}:
  0.0229194     0.0237739 
  0.0211798     0.0226447 
  0.021424      0.0238655 
  0.0198981     0.0227668 
  0.0122684     0.014008  
  0.00674459    0.00555437
  0.00933866    0.00360118
  0.0118412     0.000640889
  0.00726341   -0.00946074
  0.000305185  -0.0213019 
  ⋮                       
  0.00756859    0.0126041 
  0.00625629    0.0174261 
  0.00592059    0.0220954 
  0.00314341    0.0225837 
 -0.000366222   0.0202948 
 -0.0019837     0.0179754 
 -0.00241096    0.0149236 
  0.000579852   0.0138859 
  0.00842311    0.0169988 

Damit habe ich alles für den ersten Schritt, bzw. den ersten Schritt schon ausgeführt. Jetzt ist zu klären, wie ich das am besten plotte. In Python gibt es die Methode/Funktion wavplot - "Gibt es sowas auch in Julia?", sollte die erste Frage lauten.

Und diese Frage stösst meine Nase auf das hier:

A really brief introduction to audio signal processing in Julia | seaandsailor

Wunderbar, noch zwei Pakete zu installieren, dann kann's gleich losgehen mit was noch Wunderbarerem!

julia> Pkg.add("DSP")
 Resolving package versions...
  Updating `~/.julia/environments/v1.2/Project.toml`
 [no changes]
  Updating `~/.julia/environments/v1.2/Manifest.toml`
 [no changes]

julia> Pkg.add("PyPlot")
 Resolving package versions...
  Updating `~/.julia/environments/v1.2/Project.toml`
 [no changes]
  Updating `~/.julia/environments/v1.2/Manifest.toml`
 [no changes]

 Und dann einfach:

using DSP, WAV, PyPlot # "using" makes the listed modules available for the
                       # user, like "import" in other languages

# Loading and plotting an audio signal
s, fs = wavread("test.wav")

plot(0:1/fs:(length(s)-1)/fs, s)
xlabel("Time [s]")
 
 So steht's in der Anleitung, und das schmeisse ich jetzt in den REPL,
 allerdings mit der Anpassung:
 
 
 s, fs = wavread("/home/heide/python-wave-analysis/Train/3749.wav")
 
 
ERROR!
julia> plot(0:1/fs:(length(s)-1)/fs, s)
ERROR: PyError ($(Expr(:escape, :(ccall(#= /home/heide/.julia/packages/PyCall/ttONZ/src/pyfncall.jl:44 =# @pysym(:PyObject_Call), PyPtr, (PyPtr, PyPtr, PyPtr), o, pyargsptr, kw))))) <class 'ValueError'>
ValueError('x and y must have same first dimension, but have shapes (352800,) and (176400, 2)')


 Es ist schon wie verhext, warum klappt immer wieder iwas nicht???
 
Die Fehlermeldung ist allerdings verständlich, ich gugge mol ...
 
 
using Plots

plot(size=(500,500),leg=false)

s, fs = wavread("/home/heide/python-wave-analysis/Train/3749.wav")
([0.022919400616473892 0.023773918881801814; 0.021179845576342053 0.02264473403118992; … ; 0.0005798516800439467 0.013885921811578723; 0.008423108615375225 0.016998809778130435], 44100.0f0, 0x0010, WAVChunk[WAVChunk(Symbol("fmt "), UInt8[0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00])])

x = s
y = collect(1:length(s)/2)

Plots.scatter(y,x)
 
Das bringt ein Ergebnis, was hoffen lässt:
 
 
 
 
Aber, was für ein Gebastel (wieder mal) !!
 
Und mit meiner Umwandlung der Variablen zu x und y klappert nun auch PyPlot:
 
julia> plot(y, x, color="red", linewidth=2.0, linestyle="--")
2-element Array{PyCall.PyObject,1}:
PyObject <matplotlib.lines.Line2D object at 0x7f25d04badd8>
PyObject <matplotlib.lines.Line2D object at 0x7f25d04baf28>

 
 

Die Spektrogramm-Funktion funzt natürlich trotzdem nicht, egal. Eigentlich habe ich mein Ziel doch erreicht: Ich habe die Werte und ich kann damit plotten.

Jetzt muss ich das alles aber erstmal sich setzen lassen (bin leider nicht so leistungsfähig wie ich gerne wäre).

Eine kurze und saubere Zusammenfassung und Testlauf mit einem anderen Wav, dann Pause:

using WAV
using Plots
using PyPlot

Plots.plot(size=(500,500),leg=false)

s, fs, nbits = wavread("/home/heide/python-wave-analysis/Train/3333.wav")


x = s
y = collect(1:length(s)/2)

Plots.scatter(y,x) # Mit Plots plotten
PyPlot.plot(y, x, color="red", linewidth=2.0, linestyle="--") # Mit PyPlot plotten
Und die zwei Diagramme (Plots und PyPlot):





Es fällt auf, daß mit Plots die zwei Werte, die im s-Array (bzw. y) enthalten sind, unterschiedlich farbig dargestellt sind. Auch das muss ich erstmal auf mich wirken lassen - aber im Grunde scheint mir das nix Schlechtes zu sein ;-) .
{fim könnte auch sagen, es sei stereoid}



..........................................
PAUSE
Update coming soon!
...............................................................


Kurze Pausenunterbrechung

Wow!
Das kann Plots:

julia> using Plots

julia> pyplot()
Plots.PyPlotBackend()

julia> n = 100
100

julia> ts = range(0, stop=8π, length=n)
0.0:0.25386607301735703:25.132741228718345

julia> x = ts .* map(cos, ts)
100-element Array{Float64,1}:
   0.0               
   0.2457293357057433
   0.44368141953074  
   0.5511945544881852
   0.535378636228072 
   0.37689004841714446
   0.07247660470089555
  -0.36395425184635477
  -0.9018675768027828
  -1.4962223060995836
   ⋮                 
 -10.258743686131666 
  -4.783398738552129 
   1.123387372863821 
   7.085532910242319 
  12.715242610416697 
  17.638225743621895 
  21.518548847240854 
  24.081474899162842 
  25.132741228718345 

julia> y = (0.1ts) .* map(sin, ts)
100-element Array{Float64,1}:
  0.0                 
  0.006375795325187411
  0.02468577122153645 
  0.05255629461499901 
  0.08628658321770741 
  0.12120864107543958 
  0.15214711731821198 
  0.17393931329623008 
  0.18196993674187328 
  0.17267325896326916 
  ⋮                   
 -2.0699080304388078  
 -2.286059546179023   
 -2.358280318432286   
 -2.278722452218264   
 -2.049306351420552   
 -1.6818014276799718  
 -1.1972599042445233  
 -0.6248279418683662  
 -2.462298487963891e-15

julia> z = 1:n
1:100

julia> plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5)

julia> plot!(zeros(n), zeros(n), 1:n, w=10)




Aus dieser Anleitung, die ich mir demnächst auch mal zu Gemüte führe (-n muss!):

PyPlot - Plots 

....................................................................................
Kurze, diesmal längere Pause
.......................................................................................................

Erleichterung!

MFCC lässt sich installieren (wird später gebraucht!):

julia> using Pkg

julia> Pkg.clone("https://github.com/JuliaDSP/MFCC.jl")
┌ Warning: Pkg.clone is only kept for legacy CI script reasons, please use `add`
└ @ Pkg.API /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.2/Pkg/src/API.jl:406
  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
   Cloning git-repo `https://github.com/JuliaDSP/MFCC.jl`
  Updating git-repo `https://github.com/JuliaDSP/MFCC.jl`
 Resolving package versions...
 Installed CMakeWrapper ─ v0.2.3
 Installed Parameters ─── v0.12.0
 Installed CMake ──────── v1.1.2
 Installed Blosc ──────── v0.5.1
 Installed HDF5 ───────── v0.12.3
  Updating `~/.julia/environments/v1.2/Project.toml`
  [ca7b5df7] + MFCC v0.3.1 [`~/.julia/dev/MFCC`]
  Updating `~/.julia/environments/v1.2/Manifest.toml`
  [a74b3585] + Blosc v0.5.1
  [631607c0] + CMake v1.1.2
  [d5fb7624] + CMakeWrapper v0.2.3
  [f67ccb44] + HDF5 v0.12.3
  [ca7b5df7] + MFCC v0.3.1 [`~/.julia/dev/MFCC`]
  [d96e819e] + Parameters v0.12.0
  Building CMake → `~/.julia/packages/CMake/nSK2r/deps/build.log`
  Building Blosc → `~/.julia/packages/Blosc/lzFr0/deps/build.log`
  Building HDF5 ─→ `~/.julia/packages/HDF5/DktP4/deps/build.log`

julia> Pkg.add("MFCC")
 Resolving package versions...
 Installed MFCC ─ v0.3.1
  Updating `~/.julia/environments/v1.2/Project.toml`
  [ca7b5df7] ~ MFCC v0.3.1 [`~/.julia/dev/MFCC`] ⇒ v0.3.1
  Updating `~/.julia/environments/v1.2/Manifest.toml`
  [ca7b5df7] ~ MFCC v0.3.1 [`~/.julia/dev/MFCC`] ⇒ v0.3.1

julia> using MFCC
[ Info: Precompiling MFCC [ca7b5df7-6146-5dcc-89ec-36256279a339]

Kurzes Antesten:



julia> xxx = s[:,1]
192000-element Array{Float64,1}:
 -0.01824820259192021 
 -0.01125228539136474 
 -0.04153991240738778 
 -0.05123484745441049 
 -0.023036363486810145
 -0.027330282608304335
 -0.11188138865010604 
 -0.19148065942295306 
 -0.18373479649243313 
 -0.1282304678237996  
  ⋮                   
 -0.02427196792029952 
 -0.014850975853321059
  0.05568636127547756 
 -0.0035723452058249957
 -0.02259397776055071 
  0.04742312996663212 
 -0.001614093972932574
  0.01595831107596291 
  0.09108186853907925 

julia> using WAV

julia> s, fs, nbits = wavread("/home/heide/python-wave-analysis/Train/333.wav")

julia> mfcc(xxx)
WARNING: importing deprecated binding DSP.TFFilter into MFCC.
WARNING: DSP.TFFilter is deprecated, use PolynomialRatio instead.
  likely near REPL[32]:1
WARNING: DSP.TFFilter is deprecated, use PolynomialRatio instead.
  likely near REPL[32]:1
WARNING: DSP.TFFilter is deprecated, use PolynomialRatio instead.
  likely near REPL[32]:1
([57.4531468912109 -27.73316795343109 … 22.823570249214814 -1.4146078755582179; 58.82735802304498 -27.779058254429884 … 7.245296946487178 -3.159404151816054; … ; 57.83297135523631 -27.726655957446464 … -1.3990747768010916 -8.614757379535735; 59.19000060832642 -27.39098921955706 … 5.070660721460177 -4.713343945635979], [0.1626766103102681 0.050504398669389654 … 2.0957412418614467 1.0356297559012744; 0.009960126523007392 0.18173197089772247 … 2.1721591070611237 0.028258873617370926; … ; 0.4165337713097423 0.005178387690094411 … 0.5422838149048227 0.41372362799449836; 0.19831811582274833 0.2619970543796346 … 1.6145276365931778 3.162222639131572], Dict{String,Any}("wintime" => 0.025,"dither" => false,"nbands" => 20,"sr" => 16000.0,"lifterexp" => -22,"minfreq" => 0.0,"steptime" => 0.01,"maxfreq" => 8000.0,"bwidth" => 1.0,"usecmp" => false…))

julia> x3 = mfcc(xxx);

julia> typeof(x3)
Tuple{Array{Float64,2},LinearAlgebra.Adjoint{Float64,Array{Float64,2}},Dict{String,Any}}

julia> x3[1]
1198×13 Array{Float64,2}:
 57.4531  -27.7332  -16.582   -1.89949  …  -13.6614   22.8236     -1.41461
 58.8274  -27.7791  -18.8798  -4.39089       2.1125    7.2453     -3.1594 
 59.384   -27.5139  -20.239   -7.59582     -11.893     3.57257    -1.2454 
 57.5924  -29.8153  -21.7553  -5.00514      -6.44092   6.66226    -0.362519
 58.6192  -27.1755  -22.5674  -4.95148     -13.4815    7.47711    -3.414  
 58.1777  -25.8779  -18.7457  -2.27715  …  -14.4897    7.23825     0.44233
 59.1601  -25.2422  -20.533   -4.33352     -10.3032    2.55512   -12.4936 
 58.9033  -25.1229  -17.0571  -5.12279     -11.5265    3.61758   -10.7758 
 57.5654  -29.1325  -21.5958  -3.1881      -10.3754   -2.73956    -7.79718
 57.8824  -27.8373  -24.0646  -9.69728      -7.89044   0.150403  -10.0823 
  ⋮                                     ⋱    ⋮                            
 57.4224  -30.8348  -23.3281  -6.86854      -5.58065  -1.73506   -15.3048 
 58.8938  -27.0019  -22.8276  -6.5307   …   -5.35299  -0.070953   -9.29681
 58.6552  -27.0932  -20.39    -8.49929      -8.92984  -4.03827   -12.4387 
 57.8852  -28.6076  -19.3512  -1.36395      -6.21622  -0.713756  -12.3264 
 58.4532  -29.9214  -24.5618  -9.67027      -6.64368   2.43899    -0.808132
 59.2061  -26.3579  -22.372   -8.9025       -5.28982   9.99648    -3.69252
 58.3069  -26.2992  -22.4711  -7.03852  …   -1.8353    8.53192   -12.6489 
 57.833   -27.7267  -22.4424  -7.45244     -14.0228   -1.39907    -8.61476
 59.19    -27.391   -22.6091  -7.12913      -2.06292   5.07066    -4.71334

julia> x3[2]
1198×256 LinearAlgebra.Adjoint{Float64,Array{Float64,2}}:
 0.162677    0.0505044   0.403355    …  0.613062    2.09574   1.03563 
 0.00996013  0.181732    0.11426        1.91755     2.17216   0.0282589
 0.0527713   0.0277758   0.123074       1.05397     4.79923   8.81025 
 0.0022218   0.00951892  0.10104        0.00977598  0.711681  0.0921455
 0.00208415  0.02824     0.00133851     0.0368594   0.371424  0.0517954
 0.0975392   0.0233548   0.0104162   …  5.84292     2.52921   0.864855
 0.0538147   0.051267    0.0300786      3.32095     1.40499   0.741293
 0.0806999   0.0680545   0.240274       0.536386    0.85953   1.09784 
 0.0567066   0.205926    0.109412       1.25816     0.580536  0.482968
 0.0519538   0.0756904   0.0088313      0.128896    0.230359  2.02786 
 ⋮                                   ⋱                        ⋮       
 0.00746013  0.118017    0.10202        3.46549     3.55648   0.321447
 0.0124312   0.0686797   0.0165666   …  0.0788692   0.770993  1.11052 
 0.0204843   0.00594839  0.0861691      6.58314     2.27032   0.737309
 0.0340289   0.151567    0.157603       4.62076     3.11919   0.694483
 0.00277104  0.239264    0.00892413     0.198986    1.37883   1.16463 
 0.00334233  0.00204725  0.0662016      6.38848     7.1443    1.65139 
 0.190099    0.0681049   0.0661751   …  1.91103     1.89093   1.40953 
 0.416534    0.00517839  0.0144417      1.35891     0.542284  0.413724
 0.198318    0.261997    0.130956       0.00975552  1.61453   3.16222 

julia> x3[3]
Dict{String,Any} with 16 entries:
  "wintime"    => 0.025
  "dither"     => false
  "nbands"     => 20
  "sr"         => 16000.0
  "lifterexp"  => -22
  "minfreq"    => 0.0
  "steptime"   => 0.01
  "maxfreq"    => 8000.0
  "bwidth"     => 1.0
  "usecmp"     => false
  "modelorder" => 0
  "fbtype"     => :htkmel
  "numcep"     => 13
  "preemph"    => 0.97
  "sumpower"   => false
  "dcttype"    => 3

Sieht gut aus, nein, sieht super³ aus!!!
Damit kann ich weiterkomen.

....................................................................................
Kurze, diesmal wirklich längere Pause
.......................................................................................................


using DataFrames
using Statistics
using WAV
using MFCC

train = readtable("/home/heide/python-wave-analysis/train.csv")


Features = []

function features_train()
    for i in 1:length(train[1])
        ID = train[1][i]
        Label = train[2][i]
        println("ID = ", ID, " Label: ", Label)
        Wavepath = string("/home/heide/python-wave-analysis/Train/",ID,".wav")
        # println(Wavepath)
        s,fs = wavread(Wavepath)
        if length(s) > 0
            x = s[:,1]
            mfcc_40 = mfcc(x,numcep=40)
            Feature = mean(mfcc_40[1],dims=1)
            push!(Features,[Feature,Label])
        end
    end
end

features_train()

Features


using JLD

save("/home/heide/python-wave-analysis/mfcc_train.jld","Features",Features)
Fittschas = load("/home/heide/python-wave-analysis/mfcc_train.jld")
Fiiidshaas = load("/home/heide/python-wave-analysis/mfcc_train.jld","Features")


using ScikitLearn

@sk_import preprocessing: LabelEncoder
labelencoder = LabelEncoder()

# categories = [2 3 4 5 6 12 13]
categories = []
for i in 1:222 push!(categories,Fiiidshaas[i][2]) end
categories = reshape(categories, length(categories), 1)
categories = rotr90(categories)


trainy = Fiiidshaas
for col in categories
    println(col)
    # trainy[col] = fit_transform!(labelencoder, trainy[col])
end

Output-Ausschnibbelchen


Any[[48.89174563993598 -12.468320953416203 … -15.315635257377657 -30.149265181461388], "children_playing"]
 Any[[27.246439429543436 -2.157660227022324 … -4.977422415148745 -5.217372138480881], "engine_idling"]    
 Any[[46.307125812937294 1.2312828965682379 … -77.8670944840281 2.9773274766281768], "children_playing"]  
 Any[[17.654358986623063 8.827567800965875 … -20.29742597626014 21.345671444696066], "engine_idling"]     
 Any[[13.031349892537957 16.366879350413488 … -39.15013659259602 39.57624988739062], "dog_bark"]          
 Any[[19.48381909419921 16.155030487841977 … -22.966191145562306 39.06398463853128], "siren"]             
 Any[[-26.535017862757183 -9.067298520068862 … 1.831011361115425 -21.925356957234683], "gun_shot"]        
 Any[[37.89084694988638 -14.132776777363183 … -15.479106659741054 -34.17403485225276], "air_conditioner"] 
 Any[[50.6156021966603 -10.933100302649404 … -21.875927187306722 -26.436995126419156], "engine_idling"]   

julia> for col in categories
               println(col)
               # trainy[col] = fit_transform!(labelencoder, trainy[col])
       end
car_horn
siren
children_playing
street_music
dog_bark
dog_bark
drilling
air_conditioner
jackhammer
drilling
children_playing
dog_bark
street_music
car_horn
air_conditioner
dog_bark
jackhammer
air_conditioner
jackhammer
siren
street_music
car_horn
street_music
jackhammer
jackhammer
street_music
dog_bark
air_conditioner
gun_shot
street_music
siren
street_music
drilling
children_playing
children_playing
dog_bark
drilling
children_playing
car_horn
children_playing
gun_shot
engine_idling
siren
jackhammer
street_music
street_music
jackhammer
children_playing
dog_bark
jackhammer
drilling
drilling
drilling
jackhammer



Ich erklär's morgen (vielleicht).


Noch ein paar Links:

A Complete Tutorial to Learn Data Science with Julia from Scratch Models - ScikitLearn.jl GitHub - JuliaIO/JLD.jl: Saving and loading julia variables while preserving native types How to save an NxNxN array (or Matrix) into a file in Julia (or Python)? - Stack Overflow Julia Language - Initialize an Empty Array | julia-lang Tutorial Arrays · The Julia Language Julia ASTs · The Julia Language Learn Julia in Y Minutes

Und ein ganz besonderer:

m00-www.pdf



Und noch eine für alle:

Ameisen: Eine für alle | ZEIT ONLINE  

Kommentare

Beliebte Posts aus diesem Blog

·

Es brennt.

Bye, bye Nord Stream 2!