From 7153610ed510b3974186a14289ee96d2d8a6cca4 Mon Sep 17 00:00:00 2001 From: PasoStudio73 Date: Tue, 8 Oct 2024 23:40:25 +0200 Subject: [PATCH] fixes --- src/analysis.jl | 12 ++-- src/interface.jl | 2 + src/rules.jl | 2 +- test/debug_experiment.jl | 132 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 test/debug_experiment.jl diff --git a/src/analysis.jl b/src/analysis.jl index e8b0876..3eaf7b9 100644 --- a/src/analysis.jl +++ b/src/analysis.jl @@ -84,7 +84,6 @@ function propositional_analisys( X_propos = DataFrame([name => Float64[] for name in [match(r_select, v)[1] for v in p_variable_names]]) push!(X_propos, vcat([vcat([map(func, Array(row)) for func in metaconditions]...) for row in eachrow(X)])...) - println(rng) X_train, y_train, X_test, y_test = partitioning(X_propos, y; train_ratio=train_ratio, rng=rng) @info("Propositional analysis: train model...") @@ -203,10 +202,13 @@ function modal_analisys( error("Unknown set of features: $features.") end - learned_dt_tree = begin - model = ModalDecisionTree(; relations = :IA7, features = metaconditions) - mach = machine(model, X_train, y_train) |> fit! - end + # learned_dt_tree = begin + # model = ModalDecisionTree(; relations = :IA7, features = metaconditions) + # mach = machine(model, X_train, y_train) |> fit! + # end + + model = ModalDecisionTree(; relations = :IA7, features = metaconditions) + mach = machine(model, X_train, y_train) |> fit! _, mtree = report(mach).sprinkle(X_test, y_test) # ModalDecisionTrees.translate(mtree) diff --git a/src/interface.jl b/src/interface.jl index 145bf04..034ec53 100644 --- a/src/interface.jl +++ b/src/interface.jl @@ -32,6 +32,8 @@ function get_df_from_rawaudio(; ) end, ) + isfile(wav_path) || throw(ArgumentError("wav_path '$wav_path' does not exist.")) + df = collect_audio_from_folder(wav_path; audioparams=audioparams, fragmented=fragmented, frag_func=frag_func) labels = isnothing(csv_file) ? collect_classes(df, classes_dict; classes_func=classes_func) : diff --git a/src/rules.jl b/src/rules.jl index f86c988..d42c9c9 100644 --- a/src/rules.jl +++ b/src/rules.jl @@ -18,7 +18,7 @@ r_p_ant = [ r"^\e\[\d+m▣ ", ] r_m_ant = [r"^SyntaxBranch:\s*", r"\e\[(?:1m|0m)", r"^SoleLogics.SyntaxBranch: *"] -r_var = r"\[V(\d+)\]" +# r_var = r"\[V(\d+)\]" format_float(x) = replace(x, r"(\d+\.\d+)" => s -> @sprintf("%.3f", parse(Float64, s))) diff --git a/test/debug_experiment.jl b/test/debug_experiment.jl new file mode 100644 index 0000000..1298940 --- /dev/null +++ b/test/debug_experiment.jl @@ -0,0 +1,132 @@ +using DataFrames, JLD2 +using SoleAudio, Random +# using Plots + +# -------------------------------------------------------------------------- # +# experiment specific parameters # +# -------------------------------------------------------------------------- # +wav_path = "/home/paso/Documents/Aclai/Datasets/emotion_recognition/Ravdess/audio_speech_actors_01-24" +# wav_path = "/home/paso/datasets/emotion_recognition/Ravdess/audio_speech_actors_01-24" + +classes = :emo2bins +# classes = :emo3bins +# classes = :emo8bins + +if classes == :emo2bins + classes_dict = Dict{String,String}( + "01" => "positive", + "02" => "positive", + "03" => "positive", + "04" => "negative", + "05" => "negative", + "06" => "negative", + "07" => "negative", + "08" => "positive" + ) +elseif classes == :emo3bins + classes_dict = Dict{String,String}( + "01" => "neutral", + "02" => "neutral", + "03" => "positive", + "05" => "negative", + "07" => "negative", + ) +elseif classes == :emo8bins + classes_dict = Dict{String,String}( + "01" => "neutral", + "02" => "calm", + "03" => "happy", + "04" => "sad", + "05" => "angry", + "06" => "fearful", + "07" => "disgust", + "08" => "surprised" + ) +end + +jld2_file = string("ravdess_", classes) + +# classes will be taken from audio filename, no csv available +classes_func(row) = match(r"^(?:[^-]*-){2}([^-]*)", row.filename)[1] + +# -------------------------------------------------------------------------- # +# global parameters # +# -------------------------------------------------------------------------- # +featset = (:mel, :mfcc, :f0, :spectrals) + +# audioparams = let sr = 8000 +# ( +# sr = sr, +# norm = true, +# speech_detect = true, +# sdetect_thresholds=(0,0), +# sdetect_spread_threshold=0.02, +# nfft = 256, +# mel_scale = :semitones, # :mel_htk, :mel_slaney, :erb, :bark, :semitones, :tuned_semitones +# mel_nbands = 26, +# mfcc_ncoeffs = 13, +# mel_freqrange = (100, round(Int, sr / 2)), +# ) +# end + +audioparams = let sr = 8000 + ( + sr = sr, + norm = true, + speech_detect = true, + sdetect_thresholds=(0,0), + sdetect_spread_threshold=0.02, + nfft = 256, + mel_scale = :erb, # :mel_htk, :mel_slaney, :erb, :bark, :semitones, :tuned_semitones + mel_nbands = 26, + mfcc_ncoeffs = 13, + mel_freqrange = (100, round(Int, sr / 2)), + ) +end + +min_length = 18000 +min_samples = 10 + +features = :catch9 +# features = :minmax +# features = :custom + +# modal analysis +nwindows = 20 +relative_overlap = 0.05 + +# partitioning +# train_ratio = 0.8 +# train_seed = 1 +train_ratio = 0.7 +train_seed = 9 +rng = Random.MersenneTwister(train_seed) +Random.seed!(train_seed) + +# -------------------------------------------------------------------------- # +# main # +# -------------------------------------------------------------------------- # +df = get_df_from_rawaudio( + wav_path=wav_path, + classes_dict=classes_dict, + classes_func=classes_func, + audioparams=audioparams, +) + +irules = get_interesting_rules( + df; + featset=featset, + audioparams=audioparams, + min_length=min_length, + min_samples=min_samples, + features=features, + nwindows=nwindows, + relative_overlap=relative_overlap, + train_ratio=train_ratio, + rng=rng, +) + +println(irules) + +jldsave(jld2_file * ".jld2", true; irules) +@info "Done."