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.


Objetos ‘wave’

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

TuneR

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"