ch0nny_log

[빅데이터분석] R _ 44. 데이터 시각화 9 (소리데이터) 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 44. 데이터 시각화 9 (소리데이터)

chonny 2024. 7. 4. 16:34
소리데이터 분석 활용분야

1. 건강 의료
- 심장소리 폐 소리 등을 분석해 질환 진단하는데 사용

2. 보안 감시
- 보안 시스템 (침입 소리 등)

3. 음성 및 음악 처리
- 사용자 취향분석, 맞춤형 음악제공
소리 -> 전처리 -> 신경망
이미지
텍스트
문사

 

문제 1. 노래를 데이터화 하여 그래프를 만드시오. 
install.packages('tuneR')
library(tuneR)

# 데이터 업로드
setwd('c:\\data')
audio<-readWave('sohot.wav')

# 노래 플레이
play(audio)

# 노래 데이터 출력
head(audio@left,1000)

# 중간 데이터가져오기
audio_length<- length(audio@left)

a<- audio_length/2 -500
b<-audio_length/2 +499

m_data <-audio@left[a:b]

c<-head(m_data,100)

# 시각화하기
plot(c)​

문제2. 정상적인 심장박동 소리와 질환이 있는 심장 박동 소리를 각각 시각화 하시오 !
# 데이터 업로드  
setwd("c:\\data")

audio1 <- readWave("normal.wav")
audio2 <- readWave("ps.wav")
audio3 <- readWave("mr.wav")
audio4 <- readWave("ar.wav")

# 소리 들어보기
play(audio1)
play(audio2)
play(audio3)
play(audio4)


# 시각화화
graphics.off()  # 그래프 지우지우기
par(mfrow=c(2,2), new=T) # 2행 2열로 그래프 그리기
par(mar=c(1,1,1,1)) # 여백의 길이를 지정정

plot(audio1)
plot(audio2)
plot(audio3)
plot(audio4)

설명: 그래프만 봐도 정상 심장소리와 질병 심장소리가 구분이 됩니다. 
이런 심장 소리 데이터를 기계학습 시키면 수십년 경력의 의료진도 놓칠수 있는
부분을 찾아내는 코드를 만들어낼 수 가 있는겁니다. 

문제3. 소리 데이터를 전처리하는 방법
이미지 ---> cv2.imread ----> 숫자 -------------> 머신러닝 알고리즘
소리 ---> librosa -----> 숫자 -------------> 머신러닝 알고리즘
소리를 단순히 숫자로 변환만 하면되는게 아니라 다음의 작업을 해줘야합니다.



아래 그림 설명: 햇빛을 프리즘에 통과시키면 일곱 색깔 무지개로 나누어지는 것 처럼 소리도 푸리에의 변환을 통해서 주파수 순으로 펼쳐놓을 수 있음 (이른 스펙트럼) 

문법 4. 소리를 주파수 스펙트럼 프리즘에 넣어서 주파수 스펙트럼 만들기
소리 --> 숫자(소리증폭) --> 주파수 스팩트럼 프리즘 --> 주파수 스팩트럼

1. mp3 -> wav로 변환
2. wav 파일을 크기를 작게 잘라냄
3. wav를 주파수 스펙트럼으로 변환
4. 변환한 숫자를 기계학습 시키기 <--하이퍼 파라미터를 조정해서 정확도를 높임

#실습1. mp3 파일을 wav 로 변환하기
공유폴더 \\192.168.19.14

install.packages("tuneR")
install.packages("av")

library(tuneR)
library(av)

# 파일 경로 설정
mp3_file <- "c:\\data\\afterlike.mp3"
wav_file <- "c:\\data\\afterlike.wav"

# MP3 파일을 WAV 파일로 변환
av_audio_convert(mp3_file, wav_file)

# 변환된 파일을 확인
if (file.exists(wav_file)) {
  cat("변환이 성공적으로 완료되었습니다:", wav_file, "\n")
} else {
  cat("변환에 실패했습니다.\n")
}​

 

 #실습1.  mp3 파일을 wav 로 변환하기

공유폴더 \\192.168.19.14

install.packages("tuneR")
install.packages("av")

library(tuneR)
library(av)

# 파일 경로 설정
mp3_file <- "c:\\data\\afterlike.mp3"
wav_file <- "c:\\data\\afterlike.wav"

# MP3 파일을 WAV 파일로 변환
av_audio_convert(mp3_file, wav_file)

# 변환된 파일을 확인
if (file.exists(wav_file)) {
  cat("변환이 성공적으로 완료되었습니다:", wav_file, "\n")
} else {
  cat("변환에 실패했습니다.\n")
}
#실습2. wav 파일을 크기를 작게 잘라냄
# 1. 앞부분만 잘라내기
# 필요한 패키지 설치 및 로드
install.packages("tuneR")

library(tuneR)

# 음성 파일을 읽어옴
file_path <- "afterlike.wav"
sample_wave <- readWave(file_path)

# 음성 신호와 샘플링 속도 추출
audio_samples <- sample_wave@left
sample_rate <- sample_wave@samp.rate

# 1분(60초)에 해당하는 샘플 수 계산
duration_sec <- 60  # 1분 = 60초
num_samples <- duration_sec * sample_rate

# 앞부분 1분의 음원만 잘라내기
if (num_samples > length(audio_samples)) {
  stop("The file is shorter than 1 minute.")
}
trimmed_samples <- audio_samples[1:num_samples]

# 새로운 Wave 객체 생성
trimmed_wave <- Wave(left = trimmed_samples, samp.rate = sample_rate, bit = sample_wave@bit)

# 새로운 파일로 저장
writeWave(trimmed_wave, "afterlike_trimmed.wav")

# 결과 확인
cat("The first 1 minute of the audio has been trimmed and saved as 'afterlike_trimmed.wav'\n")​
#실습3. 주파수 스펙트럼으로 시각화 하기

# 필요한 패키지 설치 및 로드
install.packages("tuneR")
install.packages("seewave")

library(tuneR)
library(seewave)

# 음성 파일을 읽어옴
sample_wave <- readWave("afterlike_trimmed.wav")

# 음성 신호와 샘플링 속도 추출
audio_samples <- sample_wave@left
sample_rate <- sample_wave@samp.rate

# 주파수 스펙트럼 계산 및 시각화
par(mfrow = c(1, 1))  # 그래프를 1x1 배치로 설정
spectro(audio_samples, fastdisp=TRUE, f = sample_rate, ovlp = 50, collevels = seq(-40, 0, 1))

audio_samples <-- 분석할 소리
fastdisp=TRUE  <--- 빠른 디스플레이 모드를 사용. 그래프를 더 빠르게 랜더링하겠다.
f = sample_rate  <--- 샘플링 주파수를 설정합니다. 
ovlp = 50   <--- 오버랩을 50%겹치게해서 스펙트럼의 시간 해상도를 높이게 해줍니다.
collevels = seq(-40, 0, 1)  <--- 색상 지정하기 -40 db  ~ 0 db 까지 1db 간격으로 색상
                                       레벨을 지정하겠다. 

그래프 설명:   

1. 가로축 : 시간 0 ~ 60초
2. 세로축 : 주파수 ( 0 khz ~ 20khz)
3. 색상 :  신호의 진폭입니다. 오른쪽에 있는게 색상눈금입니다.
            빨간색이 가장 높은 진폭, 파란색이 가장 낮은 진폭, 중간 색상이 중간 진폭​

** audio_samples → 분석할 소리 / fastdisp=TRUE → 빠른 디스플레이 모드를 사용. 그래프를 더 빠르게 랜더링 하겠다는 뜻. / f = sample_rate → 샘플링 주파수 설정 / ovlp = 50 → 오버랩을 50% 겹치게 해서 스펙트럼의 시간 해상도를 높이게 해줌. / collevels = seq(-40, 0, 1) → 색상 지정하는 것. - 40db ~ 0db 까지 1db 간격으로 색상 레벨을 지정하겠다는 뜻임.

** 가로축 → 시간 0~60초 / 세로축 → 주파수(0 khz ~ 20 khz) / 색상 → 신호의 진폭. 오른쪽에 있는 것이 색상 눈금이고 빨간색이 가장 높은 진폭, 파란색이 가장 낮은 진폭임.

 

문제140. 클래식 음악을 주파수 스팩트럼으로 그리시오 ! 이름을 그냥 쉽게 morning.mp3 로 변경합니다.
#1. mp3 ---> wav
#2. 1분만 잘라냅니다.
#3. 주파수 스팩트럼을 그립니다.

install.packages("tuneR")
install.packages("av")

library(tuneR)
library(av)

# 파일 경로 설정
mp3_file <- "c:\\data\\morning.mp3"
wav_file <- "c:\\data\\morning.wav"

# MP3 파일을 WAV 파일로 변환
av_audio_convert(mp3_file, wav_file)

# 변환된 파일을 확인
if (file.exists(wav_file)) {
  cat("변환이 성공적으로 완료되었습니다:", wav_file, "\n")
} else {
  cat("변환에 실패했습니다.\n")
}​

#실습2.  wav 파일을 크기를 작게 잘라냄


# 1. 앞부분만 잘라내기

# 필요한 패키지 설치 및 로드
install.packages("tuneR")

library(tuneR)

# 음성 파일을 읽어옴
file_path <- "morning.wav"
sample_wave <- readWave(file_path)

# 음성 신호와 샘플링 속도 추출
audio_samples <- sample_wave@left
sample_rate <- sample_wave@samp.rate

# 1분(60초)에 해당하는 샘플 수 계산
duration_sec <- 60  # 1분 = 60초
num_samples <- duration_sec * sample_rate

# 앞부분 1분의 음원만 잘라내기
if (num_samples > length(audio_samples)) {
  stop("The file is shorter than 1 minute.")
}
trimmed_samples <- audio_samples[1:num_samples]

# 새로운 Wave 객체 생성
trimmed_wave <- Wave(left = trimmed_samples, samp.rate = sample_rate, bit = sample_wave@bit)

# 새로운 파일로 저장
writeWave(trimmed_wave, "morning_trimmed.wav")

# 결과 확인
cat("The first 1 minute of the audio has been trimmed and saved as 'morning_trimmed.wav'\n")

 

 

 

#실습3. 주파수 스펙트럼으로 시각화 하기 

# 필요한 패키지 설치 및 로드
install.packages("tuneR")
install.packages("seewave")

library(tuneR)
library(seewave)

# 음성 파일을 읽어옴
sample_wave <- readWave("morning_trimmed.wav")

# 음성 신호와 샘플링 속도 추출
audio_samples <- sample_wave@left
sample_rate <- sample_wave@samp.rate

# 주파수 스펙트럼 계산 및 시각화
par(mfrow = c(1, 1))  # 그래프를 1x1 배치로 설정
spectro(audio_samples, fastdisp=TRUE, f = sample_rate, ovlp = 50, collevels = seq(-40, 0, 1))

 

 


★ 마지막 문제 . 티라미수 케잌 노래 시각화하기


library(av)
library(tuneR)

library(seewave)



# MP3 파일을 WAV 파일로 변환
mp3_file <- "c:\\data\\tiramisu.mp3"
wav_file <- "c:\\data\\tiramisu.wav"
av_audio_convert(mp3_file, wav_file)
if (file.exists(wav_file)) {
  cat("변환이 성공적으로 완료되었습니다:", wav_file, "\n")
} else {
  cat("변환에 실패했습니다.\n")
}

# 크기를 앞부분만 잘라내기
file_path <- "tiramisu.wav"
sample_wave <- readWave(file_path)
audio_samples <- sample_wave@left
sample_rate <- sample_wave@samp.rate
duration_sec <- 60  # 1분 = 60초
num_samples <- duration_sec * sample_rate
if (num_samples > length(audio_samples)) {
  stop("The file is shorter than 1 minute.")
}
trimmed_samples <- audio_samples[1:num_samples]
trimmed_wave <- Wave(left = trimmed_samples, samp.rate = sample_rate, bit = sample_wave@bit)
writeWave(trimmed_wave, "tiramisu_trimmed.wav")
cat("The first 1 minute of the audio has been trimmed and saved as 'DOfighting_trimmed.wav'\n")

# 주파수 스펙트럼으로 시각화
sample_wave <- readWave("tiramisu_trimmed.wav")
audio_samples <- sample_wave@left
sample_rate <- sample_wave@samp.rate
par(mfrow = c(1, 1))  # 그래프를 1x1 배치로 설정
spectro(audio_samples, fastdisp=TRUE, f = sample_rate, ovlp = 50, collevels = seq(-40, 0, 1))​