voice
vignette# CRAN (stable)
install.packages('voice', dep = TRUE)
# Github (development)
::install_github('filipezabala/voice') devtools
<- list.files(system.file('extdata', package = 'wrassp'),
wavFiles <- glob2rx('*.wav'), full.names = TRUE) pattern
<- voice::extract_features(wavFiles)
M
M#> # A tibble: 2,389 × 61
#> slice…¹ slice…² wav_p…³ f0 f1 f2 f3 f4 f5 f6 f7 f8
#> <int> <int> <chr> <dbl> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 1 1 /usr/l… NA NA 1863 NA 3087 4218 5233 6144 6643
#> 2 2 2 /usr/l… NA NA 1863 NA 3179 4172 5259 6712 NA
#> 3 3 3 /usr/l… NA NA 1933 3055 3731 4663 5658 6775 NA
#> 4 4 4 /usr/l… NA NA 1777 2791 3712 4690 5657 6602 7771
#> 5 5 5 /usr/l… NA NA 1710 2690 3536 4677 5653 6526 NA
#> 6 6 6 /usr/l… NA NA 1794 2673 3560 4402 5119 6499 NA
#> 7 7 7 /usr/l… NA NA 1873 2665 3640 4346 5164 6516 NA
#> 8 8 8 /usr/l… NA NA 1932 2684 3550 4304 5190 6518 NA
#> 9 9 9 /usr/l… NA 148 1960 2648 3248 3640 5214 6498 7668
#> 10 10 10 /usr/l… NA 202 1965 2650 3284 3664 5210 6497 7716
#> # … with 2,379 more rows, 49 more variables: mfcc1 <dbl>, mfcc2 <dbl>,
#> # mfcc3 <dbl>, mfcc4 <dbl>, mfcc5 <dbl>, mfcc6 <dbl>, mfcc7 <dbl>,
#> # mfcc8 <dbl>, mfcc9 <dbl>, mfcc10 <dbl>, mfcc11 <dbl>, mfcc12 <dbl>,
#> # df2 <dbl>, df3 <dbl>, df4 <dbl>, df5 <dbl>, df6 <dbl>, df7 <dbl>,
#> # df8 <dbl>, pf1 <dbl>, pf2 <dbl>, pf3 <dbl>, pf4 <dbl>, pf5 <dbl>,
#> # pf6 <dbl>, pf7 <dbl>, pf8 <dbl>, rf1 <dbl>, rf2 <dbl>, rf3 <dbl>,
#> # rf4 <dbl>, rf5 <dbl>, rf6 <dbl>, rf7 <dbl>, rf8 <dbl>, rcf2 <dbl>, …
<- dplyr::tibble(subject_id = c(1,1,1,2,2,2,3,3,3), wav_path = wavFiles)
E
E#> # A tibble: 9 × 2
#> subject_id wav_path
#> <dbl> <chr>
#> 1 1 /usr/local/lib/R/site-library/wrassp/extdata/lbo001.wav
#> 2 1 /usr/local/lib/R/site-library/wrassp/extdata/lbo002.wav
#> 3 1 /usr/local/lib/R/site-library/wrassp/extdata/lbo003.wav
#> 4 2 /usr/local/lib/R/site-library/wrassp/extdata/lbo004.wav
#> 5 2 /usr/local/lib/R/site-library/wrassp/extdata/lbo005.wav
#> 6 2 /usr/local/lib/R/site-library/wrassp/extdata/lbo006.wav
#> 7 3 /usr/local/lib/R/site-library/wrassp/extdata/lbo007.wav
#> 8 3 /usr/local/lib/R/site-library/wrassp/extdata/lbo008.wav
#> 9 3 /usr/local/lib/R/site-library/wrassp/extdata/lbo009.wav
::tag(E)
voice#> # A tibble: 9 × 7
#> wav_path f0_ta…¹ f0_ta…² f0_ta…³ f0_ta…⁴ f0_ta…⁵ f0_ta…⁶
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 /usr/local/lib/R/site-library… 85.4 17.6 0.206 76.1 29.4 7.53
#> 2 /usr/local/lib/R/site-library… 85.4 15.6 0.183 80.1 27.8 14.4
#> 3 /usr/local/lib/R/site-library… 84.6 13.0 0.154 78.8 23.9 14.0
#> 4 /usr/local/lib/R/site-library… 84.8 14.5 0.171 79.1 28.1 11.9
#> 5 /usr/local/lib/R/site-library… 86.0 14.7 0.170 78.7 30.0 11.0
#> 6 /usr/local/lib/R/site-library… 82.9 15.6 0.188 74.8 23.8 4.78
#> 7 /usr/local/lib/R/site-library… 78.2 16.2 0.207 73.5 13.4 6.82
#> 8 /usr/local/lib/R/site-library… 84.5 14.5 0.172 78.1 17.8 8.95
#> 9 /usr/local/lib/R/site-library… 81.0 12.2 0.151 75.9 23.1 9.14
#> # … with abbreviated variable names ¹f0_tag_mean, ²f0_tag_sd, ³f0_tag_vc,
#> # ⁴f0_tag_median, ⁵f0_tag_iqr, ⁶f0_tag_mad
::tag(E, groupBy = 'subject_id')
voice#> # A tibble: 3 × 7
#> subject_id f0_tag_mean f0_tag_sd f0_tag_vc f0_tag_median f0_tag_iqr f0_tag_mad
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 85.1 15.3 0.180 78.3 26.8 11.9
#> 2 2 84.6 14.9 0.176 76.4 28.3 7.97
#> 3 3 81.0 14.6 0.180 75.6 21.6 8.68
<- 'https://github.com/filipezabala/voiceAudios/blob/main/mp3/doremi.mp3?raw=true'
url0 download.file(url0, paste0(tempdir(), '/doremi.mp3'), mode = 'wb')
::embed_audio(url0) embedr
<- paste0('cd ', tempdir(), ';',
cmd ' for i in *.[Mm][Pp]3; do ffmpeg -i "$i" -ac 1 "./${i%.*}.wav"; done')
system(cmd)
<- voice::extract_features(tempdir(), features = 'f0')
M summary(M)
#> slice_seq slice_seq_file wav_path f0
#> Min. : 1.0 Min. : 1.0 Length:1179 Min. :120.2
#> 1st Qu.: 295.5 1st Qu.: 295.5 Class :character 1st Qu.:149.4
#> Median : 590.0 Median : 590.0 Mode :character Median :206.0
#> Mean : 590.0 Mean : 590.0 Mean :208.9
#> 3rd Qu.: 884.5 3rd Qu.: 884.5 3rd Qu.:259.5
#> Max. :1179.0 Max. :1179.0 Max. :352.3
#> NA's :223
# Plot
plot(M$f0)
legend(-60, 170, 'Do (C3)' , bty = 'n')
legend(80, 190 , 'Re (D3)' , bty = 'n')
legend(220, 290, 'Mi (E4)' , bty = 'n')
legend(350, 210, 'Fa (F3)' , bty = 'n')
legend(480, 250, 'Sol (G3)', bty = 'n')
legend(600, 270, 'La (A3)' , bty = 'n')
legend(720, 310, 'Si (B3)' , bty = 'n')
legend(910, 320, 'Do (C4)' , bty = 'n')
<- median(M$f0[1:150], na.rm = TRUE))
(C3 #> [1] 129.7059
::notes(C3)
voice#> [1] C3
#> 108 Levels: C0 < C#0 < D0 < D#0 < E0 < F0 < F#0 < G0 < G#0 < A0 < A#0 < ... < B8
<- median(M$f0[190:280], na.rm = TRUE))
(D3 #> [1] 143.2753
::notes(D3)
voice#> [1] D3
#> 108 Levels: C0 < C#0 < D0 < D#0 < E0 < F0 < F#0 < G0 < G#0 < A0 < A#0 < ... < B8
<- median(M$f0[310:380], na.rm = TRUE))
(E4 #> [1] 320.6903
::notes(E4)
voice#> [1] E4
#> 108 Levels: C0 < C#0 < D0 < D#0 < E0 < F0 < F#0 < G0 < G#0 < A0 < A#0 < ... < B8
<- median(M$f0[420:500], na.rm = TRUE))
(F3 #> [1] 170.1356
::notes(F3)
voice#> [1] F3
#> 108 Levels: C0 < C#0 < D0 < D#0 < E0 < F0 < F#0 < G0 < G#0 < A0 < A#0 < ... < B8
<- median(M$f0[590:630], na.rm = TRUE))
(G3 #> [1] 195.0839
::notes(G3)
voice#> [1] G3
#> 108 Levels: C0 < C#0 < D0 < D#0 < E0 < F0 < F#0 < G0 < G#0 < A0 < A#0 < ... < B8
<- median(M$f0[700:770], na.rm = TRUE))
(A3 #> [1] 220.4526
::notes(A3)
voice#> [1] A3
#> 108 Levels: C0 < C#0 < D0 < D#0 < E0 < F0 < F#0 < G0 < G#0 < A0 < A#0 < ... < B8
<- median(M$f0[820:900], na.rm = TRUE))
(B3 #> [1] 249.4395
::notes(B3)
voice#> [1] B3
#> 108 Levels: C0 < C#0 < D0 < D#0 < E0 < F0 < F#0 < G0 < G#0 < A0 < A#0 < ... < B8
<- median(M$f0[950:1100], na.rm = TRUE))
(C4 #> [1] 261.6508
::notes(C4)
voice#> [1] C4
#> 108 Levels: C0 < C#0 < D0 < D#0 < E0 < F0 < F#0 < G0 < G#0 < A0 < A#0 < ... < B8
# gather
<- voice::notes(c(C3,D3,E4,F3,G3,A3,B3,C4,C4))
f0_spn
# duration
<- voice::duration(f0_spn))
(dur #> note dur_line dur_ms dur_prop
#> 1 C3 1 5 0.1111111
#> 2 D3 1 5 0.1111111
#> 3 E4 1 5 0.1111111
#> 4 F3 1 5 0.1111111
#> 5 G3 1 5 0.1111111
#> 6 A3 1 5 0.1111111
#> 7 B3 1 5 0.1111111
#> 8 C4 2 10 0.2222222
# gm by Renfei Mao
<- gm::Music()
m <- m +
m ::Meter(4, 4) +
gm::Line(pitches = as.list(as.character(dur$note)),
gmdurations = as.list(dur$dur_line)) +
::Tempo(100)
gm::show(m, to = c('score', 'audio')) gm