La capacidad de importar datos de audio en R se debe gracias al paquete tuneR. Este paquete importa archivos de audio en formato .mp3 y .wav a R creando un tipo de objeto nuevo llamado ‘wave’ (tiene sentido!)
Podemos instalar y cargar el paquete tuneR así:
# instalar
install.packages("tuneR")
library(tuneR)
Instalemos también NatureSounds para usar los datos de ejemplo que vienen ahí:
# instalar
install.packages("NatureSounds")
# cargar
library(NatureSounds)
Y usemos una carpeta temporal como el directorio de trabajo:
# carpeta temporal
setwd(tempdir())
# abrir
open_wd( )
Ahora podemos cargar los datos de ejemplo y guardarlos como archivos de sonido:
## cargar datos de audio
data(list = "Phae.long1")
# guardarlos en carpeta temporal como archivo wav
writeWave(Phae.long1, "Phae.long1.wav")
Ya estamos listos para ver como se cargan los archivos de sonido y como se representan en R.
Primero necesitamos cargar el archivo de audio al ambiente de R usando readWave()
:
# cargar archivo audio
w1 <- readWave("Phae.long1.wav")
Estos objectos poseen su propia clase en R, la clase “wave”:
# clase de objeto
class(w1)
## [1] "Wave"
## attr(,"package")
## [1] "tuneR"
Y son objetos de tipo S4, los cuales son similares a listas pero utilizan ‘@’ para acceder a cada posición (slot):
# ver objeto
w1
##
## Wave Object
## Number of Samples: 56251
## Duration (seconds): 2.5
## Samplingrate (Hertz): 22500
## Channels (Mono/Stereo): Mono
## PCM (integer format): TRUE
## Bit (8/16/24/32/64): 16
# tipo de objeto
mode(w1)
## [1] "S4"
Los objetos S4 tienen una estructura similar a las listas pero utilizan ‘@’ para acceder a cada posición (slot):
# structura
str(w1)
## Formal class 'Wave' [package "tuneR"] with 6 slots
## ..@ left : int [1:56251] 162 -869 833 626 103 -2 43 19 47 227 ...
## ..@ right : num(0)
## ..@ stereo : logi FALSE
## ..@ samp.rate: int 22500
## ..@ bit : int 16
## ..@ pcm : logi TRUE
# extraer una posicion
[email protected]
## [1] 22500
Las muestras vienen en la posición ‘@left’:
# muestras
w1@left[1:40]
## [1] 162 -869 833 626 103 -2 43 19 47 227 -4 205 564 171
## [15] 457 838 -216 60 76 -623 -213 168 -746 -248 175 -512 -58 651
## [29] -85 -213 586 40 -407 371 -51 -587 -92 94 -527 40
El número de muestras esta dado por la duración y la tasa de muestreo:
# duracion
length(w1@left) / [email protected]
## [1] 2.500044
Estos objectos pueden ser fácilmente manipulados en R. tuneR tiene varias funciones para modificarlos:
# extraer 2 s
w1.2 <- extractWave(w1, from = 0, to = 2, xunit = "time")
# unir
w3 <- bind(w1, w1.2)
# normalizar
normalize(w1)
##
## Wave Object
## Number of Samples: 56251
## Duration (seconds): 2.5
## Samplingrate (Hertz): 22500
## Channels (Mono/Stereo): Mono
## PCM (integer format): TRUE
## Bit (8/16/24/32/64): 32
# oscilograma
plot(w1)
Medir cosas simples:
# periodograma para medir frecuencia fundamental
wSpecObject <- periodogram(w1, normalize = TRUE, width = 1024, overlap = 512)
# calcular frecuencia fundamental
FF(wSpecObject)
## [1] NA NA NA 114.70683 NA 227.01949
## [7] 137.00051 137.86471 NA NA NA NA
## [13] NA 187.19365 294.48975 2408.80713 229.36435 2786.17067
## [19] 446.80559 758.44294 3612.49079 3635.45849 3619.75659 232.39164
## [25] 229.21966 23.02419 188.49161 238.41666 NA 226.11259
## [31] 223.73402 210.48917 192.51539 124.85004 120.74181 182.44653
## [37] 167.51893 161.73768 161.97746 228.51667 225.71541 234.89596
## [43] 230.34990 214.84530 184.23515 NA NA NA
## [49] NA 171.41320 2272.35886 72.93671 2258.53938 72.71426
## [55] 229.00102 226.52617 3567.11504 3572.06289 1171.83313 206.46557
## [61] 203.73791 210.99839 225.13847 211.29509 239.89147 235.49413
## [67] NA NA 185.53020 202.64203 187.34410 179.13505
## [73] NA NA NA NA NA 230.82064
## [79] 103.40212 188.36591 185.23463 390.42053 211.18526 228.41530
## [85] 205.75252 202.61783 189.57392 194.17173 160.61250 138.71380
## [91] 206.69834 183.29385 212.17984 231.62543 299.87079 2410.43579
## [97] 73.24793 97.00559 346.75207 453.60952 304.80393 343.16508
## [103] 213.38550 205.80072 231.45403 142.71360 116.26216 213.67459
## [109] 230.39217
..y otras cosas como guardar, cambiar la tasa de muestreo, archivos de sonido y simular sonidos (entre otras):
# juntar 2 canales
w4 <- Wave(w1@left, w1@left, samp.rate = [email protected], bit = 16)
stereo(w4)
## [1] TRUE
# sub muestrear
downsample(w1, samp.rate = 11025)
##
## Wave Object
## Number of Samples: 27563
## Duration (seconds): 2.5
## Samplingrate (Hertz): 11025
## Channels (Mono/Stereo): Mono
## PCM (integer format): TRUE
## Bit (8/16/24/32/64): 16
# simular sonido
Wobj <- sine(440, duration = 441000, samp.rate = 44100)
# guardar archivos de audio
writeWave(w1, "w1.wav", extensible = FALSE)
# ver archivos wav en directorio de trabajo
list.files(pattern = ".wav$")
## [1] "Phae.long1.wav" "w1.wav"
# leer mp3
#readMP3()
Podemos ver la descripción del paquete tuneR de esta forma:
?tuneR
Y el nombre de todas las funciones de tuneR así:
ls(getNamespace("tuneR"), all.names=FALSE)
## [1] "audspec" "bark2hz"
## [3] "bind" "C_do_read_mp3"
## [5] "C_pulsewav" "channel"
## [7] "deltas" "dolpc"
## [9] "downsample" "equalWave"
## [11] "extractWave" "FF"
## [13] "FFpure" "fft2barkmx"
## [15] "fft2melmx" "getMidiNotes"
## [17] "getWavPlayer" "hz2bark"
## [19] "hz2mel" "image"
## [21] "lifter" "lilyinput"
## [23] "lpc2cep" "MCnames"
## [25] "mel2hz" "melfcc"
## [27] "melodyplot" "MFCC"
## [29] "mono" "nchannel"
## [31] "noise" "normalize"
## [33] "noSilence" "noteFromFF"
## [35] "notenames" "panorama"
## [37] "periodogram" "play"
## [39] "plot" "plot.Wave.channel"
## [41] "postaud" "postWaveform"
## [43] "powspec" "prepComb"
## [45] "preWaveform" "pulse"
## [47] "quantize" "quantMerge"
## [49] "quantplot" "readMidi"
## [51] "readMP3" "readMTrkEvent"
## [53] "readVarLength" "readWave"
## [55] "sawtooth" "setWavPlayer"
## [57] "silence" "sine"
## [59] "smoother" "spec2cep"
## [61] "square" "stereo"
## [63] "summary" "TK95"
## [65] "updateWave" "Wave"
## [67] "WaveMC" "write_4byte_unsigned_int"
## [69] "write_longvector" "writeWave"