음성 데이터 전처리 | [Dmqa Open Seminar] Analysis Of Sound Data 15229 명이 이 답변을 좋아했습니다

당신은 주제를 찾고 있습니까 “음성 데이터 전처리 – [DMQA Open Seminar] Analysis of Sound Data“? 다음 카테고리의 웹사이트 you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: you.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 ‍김성범[ 소장 / 인공지능공학연구소 ] 이(가) 작성한 기사에는 조회수 3,111회 및 좋아요 69개 개의 좋아요가 있습니다.

음성 데이터 전처리 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [DMQA Open Seminar] Analysis of Sound Data – 음성 데이터 전처리 주제에 대한 세부정보를 참조하세요

최근 딥러닝 기술이 발전됨에 따라 음성인식(speech recognition), 오디오 분류(audio classification), 오디오 캡셔닝(audio captioning) 등 음성/오디오 분석 연구에서의 딥러닝 적용 사례가 늘어나고 있다. 음성/오디오 분석을 위한 연구에서는 소리 데이터를 사용한다. 소리 데이터는 이미지, 영상, 텍스트 데이터와는 다른 전처리, 변환 및 특징 추출 등의 과정을 거치며, 소리 데이터의 특성을 잘 반영할 수 있는 다양한 딥러닝 구조가 연구되어 왔다. 이번 세미나에서는 소리 데이터를 위한 전처리 및 특징 추출 방법, 데이터 증강 기법(data augmentation)의 원리를 설명하고, 소리 데이터 분석에 적합한 딥러닝 모델에 대해 소개하고자 한다.
참고문헌
1. Oord, A. V. D., Dieleman, S., Zen, H., Simonyan, K., Vinyals, O., Graves, A., … \u0026 Kavukcuoglu, K. (2016). Wavenet: A generative model for raw audio. arXiv preprint arXiv:1609.03499.
2. Mehri, S., Kumar, K., Gulrajani, I., Kumar, R., Jain, S., Sotelo, J., … \u0026 Bengio, Y. (2016). SampleRNN: An unconditional end-to-end neural audio generation model. arXiv preprint arXiv:1612.07837.
3. Suh, S., Park, S., Jeong, Y., \u0026 Lee, T. (2020). Designing acoustic scene classification models with CNN variants. DCASE2020 Challenge, Tech. Rep

음성 데이터 전처리 주제에 대한 자세한 내용은 여기를 참조하세요.

논문 읽고 음성인식 구현하자 – 1.데이터 전처리 – velog

오늘 포스트에선 음성 데이터 전처리를 하는 법에 관해 알아보도록 하겠습니다. 이론적 배경은 짤막하게 설명할 예정이니, 이론적 설명이 필요하다면 …

+ 여기에 자세히 보기

Source: velog.io

Date Published: 10/2/2021

View: 7435

음성 데이터 전처리 기법에 따른 뉴로모픽 아키텍처 기반 음성 …

음성 데이터 전처리 기법에 따른 뉴로모픽 아키텍처 기반 음성 인식 모델의 성능 분석 Performance Analysis of Speech Recognition Model based on Neuromorphic …

+ 여기에 자세히 보기

Source: www.kci.go.kr

Date Published: 6/2/2022

View: 8540

[논문]음성 인식을 위한 전처리 방법에 관한 연구 – ScienceON

그러므로 음성 인식 연구에서 잡음을 제거하고 인식과 관계없는 음성을 제거하는 전처리 기술은 반드시 필요하다. 음성인식 전처리 과정에는 주로 인식하고자하는 음성 …

+ 여기에 표시

Source: scienceon.kisti.re.kr

Date Published: 11/18/2022

View: 2603

딥 러닝 음성 인식에 필요한 훈련 데이터를 직접 만들어보자

또, 교사 데이터(teacher data)에는 음성만 있는 파형이 필요합니다. 이 데이터들을 이용해 신경 회로망은 잡음이 섞여 있는 음성 파형에서 음성만 추출 …

+ 자세한 내용은 여기를 클릭하십시오

Source: engineering.linecorp.com

Date Published: 7/19/2022

View: 1919

Introduction to Analysis for Sound data

데이터 전처리 및 특징 추출 기법. • 소리 데이터에 적합한 … 텍스트를 음성으로 변환하는 Text-to-Speech(TTS) 수행하기에 적합한 딥러닝 모델.

+ 자세한 내용은 여기를 클릭하십시오

Source: dmqm.korea.ac.kr

Date Published: 10/14/2022

View: 1250

Speech Signal Processing – 음성 신호 전처리

또한, 참조 신호로 1, 2 채널 PCM 데이터 파일을 사용해서 다양한 기기에 SSP 엔진을 적용할 수 있습니다. 음성 인식 전처리 과정에 적합한 알고리즘 탑재 …

+ 자세한 내용은 여기를 클릭하십시오

Source: thinq.developer.lge.com

Date Published: 3/3/2021

View: 4975

AI 보안 음성인식 – 모두를 위한 열린강좌 KOCW

컴퓨팅기술과 데이터의 증가로 음성인식은 자연어 처리를 포함한 사람과 기계간의 … 음성 데이터 전처리 실습을 통해 음성인식 학습 데이터를 단계별로 적용해 볼 수 …

+ 여기에 더 보기

Source: www.kocw.net

Date Published: 1/9/2022

View: 3996

2D-CNN 기반 우울증 감지를 위한 음성데이터 전처리

2D-CNN 기반 우울증 감지를 위한 음성데이터 전처리. 박준희*, 문남미**. *호서대학교 컴퓨터공학과. **호서대학교 컴퓨터공학부 [email protected], [email protected].

+ 여기를 클릭

Source: www.koreascience.or.kr

Date Published: 4/18/2021

View: 4456

주제와 관련된 이미지 음성 데이터 전처리

주제와 관련된 더 많은 사진을 참조하십시오 [DMQA Open Seminar] Analysis of Sound Data. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[DMQA Open Seminar] Analysis of Sound Data
[DMQA Open Seminar] Analysis of Sound Data

주제에 대한 기사 평가 음성 데이터 전처리

  • Author: ‍김성범[ 소장 / 인공지능공학연구소 ]
  • Views: 조회수 3,111회
  • Likes: 좋아요 69개
  • Date Published: 2021. 1. 7.
  • Video Url link: https://www.youtube.com/watch?v=Z_6tAxb89sw

논문 읽고 음성인식 구현하자 – 1.데이터 전처리

개요

얼핏 보면 간단해보이는 딥러닝 모델을 구현하는 것도 어려운 이유는 바로 데이터 전처리 때문입니다. 데이터를 모델이 읽을 수 있는 형태로 만들어주는 것은 물론, 모델이 잘 학습할 수 있는 형태로 만들어주는 것을 데이터 전처리라고 합니다. 데이터 전처리에는 여러가지가 있을 수 있는데요, 단순히 모델이 음성과 라벨을 읽을 수 있는 형태로 만들어주는 것에서부터 모델이 더 잘 학습할 수 있도록(일반화가 잘 되도록) 데이터를 손질해주는 것, 그리고 I/O 부하를 줄여 모델의 학습속도를 더욱 빠르게 하는 것을 모두 데이터 전처리라고 합니다.

오늘 포스트에선 음성 데이터 전처리를 하는 법에 관해 알아보도록 하겠습니다. 이론적 배경은 짤막하게 설명할 예정이니, 이론적 설명이 필요하다면 첨부한 링크를 참고하시기 바랍니다. 대부분의 코드는 파이토치 기반으로 작성되어있으나, TFRecord와 같은 텐서플로우 Specific 기능의 경우 텐서플로우 코드 기반으로 설명한 뒤, 파이토치에서 적용하는 법을 설명하도록 하겠습니다. 또한 이번 구현 포스팅에서 별표(★)가 되어있는 부분은 이번 포스팅에서 가장 중요한 부분이니, 읽으실 때 참고하시기 바랍니다.

작동하는 코드는 다음 링크에서 확인하실 수 있습니다. [Google Colab에서 코드 보기]

Table of contents

음성 데이터 텐서화하기

Mel-Spectrogram이란?

spectrogram은 waveform을 frame으로 나누어 time domain에서 frequency domain으로 축변환시킨 다음, 이를 수평으로 쌓아 얻은 그래프를 뜻합니다. 이때, 축변환은 신호를 더로 다른 주파수의 합으로 표현하는 식으로 이루어집니다.

음성은 보통 어떤 물체의 진동을 통해 발생하는 아날로그 데이터입니다. 이를 디지털로 표현하기 위해서는 샘플링과 양자화를 통해 벡터(혹은 텐서)로 바꾸어야 합니다. 그런데, 이렇게 디지털로 바꾼 오디오 신호는 차원이 어마어마하게 크고, 한 신호당 다른 여러 주파수가 결합되어 있는 형태입니다. 때문에 raw audio에서는 머신러닝을 통해 feature를 뽑아내기 어렵습니다. 때문에 우리는 푸리에 변환을 이용하여 waveform을 spectrogram으로 변환시킵니다. 이와 같이 음성신호를 spectrogram으로 변환하면 매우 복잡한 오디오 신호가 각각의 주파수에서 해석이 가능해집니다.

그런데, 사람이 음성신호를 인식할 때는 주파수에 따라 선형적으로 인식하는 것이 아닌, mel-scale로 인식합니다. 이는 frequency = f라고 할 때, Mel(f) = 2595 log(1+f/700) 라는 식을 통해 변환이 가능합니다. 이렇게 waveform을 mel scale로 변환한 뒤 spectrogram으로 변환한 것을 Mel-Spectrogram이라고 합니다.

Spectrogram에 대한 더 자세한 설명 [링크 1]

푸리에 변환이란? [링크]

파일을 읽고 Mel-Spectrogram으로 만들기

푸리에 변환은 1882년에 이미 등장한 이론이니만큼, scipy, numpy와 같은 기본적인 패키지에서도 지원합니다. 해당 모듈을 파이썬으로 구현하는 것은 비효율적이기 때문에, 이번에는 librosa와 scipy를 통해 mel-spectrogram을 구현해보도록 하겠습니다. 푸리에 변환을 바닥부터 구현하는 방법은 추후 C++ 관련 포스팅에서 진행하도록 하겠습니다.

먼저, librosa를 통해 오디오를 불러오고, mel-scale을 적용합니다.

import librosa import librosa . filters as F audio , sample_rate = librosa . load ( ‘audio.wav’ ) mel_audio = F . mel ( sample_rate , n_fft = 2048 )

그러면 다음과 같은 Mel Filterbank가 만들어집니다.

>> > import matplotlib . pyplot as plt >> > fig , ax = plt . subplots ( ) >> > img = librosa . display . specshow ( melfb , x_axis = ‘linear’ , ax = ax ) >> > ax . set ( ylabel = ‘Mel filter’ , title = ‘Mel filter bank’ ) >> > fig . colorbar ( img , ax = ax )

이를 Spectrogram으로 변환해주면 됩니다.

import scipy . signal as signal import numpy as np nperseg = 256 noverlap = nperseg // 8 freqs , times , spec = signal . spectrogram ( mel_audio , fs = sample_rate , window = ‘hann’ , nperseg = nperseg , noverlap = noverlap , detrend = False ) spec = np . log ( spec . T . astype ( np . float32 )

그러면 다음과 같은 형태로 변환됩니다. 하단 이미지는 Mel-Spectrogram에 normalize를 한 것으로, 실제로는 (-1, n_mels, time) 형태의 텐서로 구성됩니다.

완성된 형태의 코드는 다음과 같습니다.

def get_mel_spectrogram ( audio_path : str ) – > np . array : audio , sample_rate = librosa . load ( audio_path ) mel_audio = F . mel ( sample_rate , n_fft = 2048 ) nperseg = 256 noverlap = nperseg // 8 freqs , times , spec = signal . spectrogram ( mel_audio , fs = sample_rate , window = ‘hann’ , nperseg = nperseg , noverlap = noverlap , detrend = False ) return freqs , times , np . log ( spec . T . astype ( np . float32 ) )

물론 이를 한번에 변환해주는 코드도 존재합니다. librosa에서도 해당 코드가 존재하긴 하지만, 여기선 음성 분석이 아닌 음성인식 모델을 만드는 것을 목적으로 하는데다가, librosa는 torchaudio에 비해 속도가 느리기 때문에 torchaudio를 사용하도록 하겠습니다.

import torch import torchaudio from torchaudio . transforms import MelSpectrogram from typing import Tuple def get_mel_spectrogram ( audio_path : str ) – > Tuple [ torch . tensor , int ] : waveform , sample_rate = torchaudio . load ( audio_path ) get_specs = MelSpectrogram ( sample_rate = sample_rate , f_max = 16000 ) mel_spec = get_specs ( waveform ) return mel_spec , sample_rate

다음과 같이 간단하게 스펙트로그램을 구현할 수 있습니다. 이를 통해 만들어진 Spectrogram의 모양은 […, frequency, time]으로 구성되어 있습니다. 예를 들어, 위 코드에서 colab의 샘플 데이터로 만든 Mel-Spectrogram의 모양은

Spectrogram을 MFCCs로 만들기

MFCCs는 Mel-spectrum에 역 푸리에 연산을 통해 실시한 행렬(혹은 텐서)를 말합니다. Mel-Spectrum은 주변 몇 헤르츠 내의 영역대를 한데 모아 보는 방식이기 때문에 feature 내의 변수들이 서로 상관관계를 가집니다. 이는 변수간 독립을 가정하고 만드는 몇몇 모델에서는 성능을 크게 약화시킵니다. 때문에 feature 내 변수간의 독립을 가정하고 만드는 모델은 MFCCs를 만들어서 input으로 넣어주게 됩니다.

그러나 MFCC는 log mel-spectrogram에 비해 버리는 정보가 지나치게 많습니다. 따라서 Conformer등 최신 모델은 MFCCs를 사용하지 않는 경우가 많습니다. 성능 향상을 위해서는 논문에서 어떤 input을 넣는지 잘 살펴봐야겠습니다.

mel-spectrum은 앞서 filter banks를 만들 때 구했으니, 여기에 역이산 코사인 변환을 적용하고 2~13번째 열벡터만 뽑아오면 됩니다. 코드는 다음과 같습니다.

from scipy . fftpack import dct mfcc = dct ( mel_audio , type = 2 ) [ ; 1 , : 13 ]

이렇게 하면 아래와 같은 MFCCs를 뽑아올 수 있습니다.

물론 실제 데이터셋 적용시에는 더 간단한 방법을 사용합니다. Torchaudio의 MFCCs를 사용하면 raw audio에서 바로 MFCC를 추출할 수 있습니다.

torchaudio . transforms . MFCC ( 16000 , log_mels = True )

데이터 증강을 통해 모델을 더 강력하게

SpecAugment

SpecAugment에 대한 더 자세한 설명은 논문을 참고해주시기 바랍니다. [논문 링크]

Data Augmentation의 목적은 여러개가 있습니다. 데이터를 노이즈에 강하게 한다거나, 다른 input에 다 강건하게 한다거나, 아니면 둘 다거나 말입니다. 물론 augmentation이 언제나 좋은 것은 아닌데요, 어설픈 augmentation은 학습에 악영향을 미칠 수도 있습니다. 때문에 검증된 데이터 증강 기법을 사용하는 것이 중요합니다.

최근 SOTA 모델에서 흔하게 볼 수 있는 데이터 증강 기법은 바로 SpecAugment입니다. SpecAugment는 2019년에 제안된 음성 데이터 증강 기법인데, Time Wraping, Frequency Masking, Time Masking이 그것입니다. 간단히 말해 Time wraping은 임의의 점부터 재생 속도를 더 빠르게, 혹은 느리게 하는 것이고, Frequcney maksing은 특정 주파수의 음성 데이터를, Time masking은 특정 시간대의 음성 데이터를 마스킹하는 것입니다.

이 증강기법은 Listen, Attend and Spell을 사용한 모델을 통해 SOTA를 달성했고, 이후 SOTA 모델에는 꾸준히 SpecAugment가 도입되었습니다. 그러면 SpecAugment를 직접 구현해보도록 합시다.

torchaudio에서는 SpecAugment를 손쉽게 사용할 수 있도록 하는 클래스가 여럿 구현되어 있습니다. 하지만 여기서는 SpecAugment를 pytorch 내의 함수를 통해 구현한 뒤, torchaudio에서 더 간단하게 구현하는 방법을 사용해보도록 하겠습니다. 구현 코드는 실제 사용할 수 있는 모듈의 레포지토리에서 가져왔음을 먼저 밝힙니다. 링크

먼저 각 컴포넌트를 구현해주도록 하겠습니다. SpecAugment는 Time Wraping, Frequency Masking, Time Masking이라는 세가지 Augmentation 기법을 사용합니다. 따라서 Time Wraping, Frequecny Masking, Time Masking 이 세가지를 먼저 구현해야 합니다.

Time Warping

Time Wraping부터 구현해보도록 합시다. Time Wraping은 논문에서 tensorflow의 sparse_image_warp 함수를 통해 구현되었다고 하는데요, T라는 time step을 가지고 있는 log spectrogram이 있다고 가정했을 때, 논문에서는 이를 시간 축이 수평 방향이고 주파수 축(frequency axis)이 수직 방향인 일종의 그래프로 봅니다.

여기에서 spectrogram의 정 중앙을 통과하는 수평선에 임의의 점을 찍는데요, 해당 점은 사용자가 지정하는 계수인 W에서 (T-W) 사이에서 정해집니다. Augmentation이 최대 W 내에서 행해지기 때문입니다. 아무튼 Augmentation이 행해지는 해당 점을 기준으로 왼쪽, 혹은 오른쪽으로 W만큼 오디오 정보를 이동시키는 것이 바로 Time Warping입니다. 여기에서 이동범위(앞으로 w라 하겠습니다)는 0에서 임의의 점 W 사이의 균등분포 내에서 정했다고 합니다.

Time warping이 어떻게 작동하는지 알게 되었으니, 이제 구현해보도록 하겠습니다. 위에서 말씀드렸듯, mel-spectrogram의 .shape를 찍어보면 […, frequency, time] 형태로 나옵니다. 예를 들어, 위에서 만든 코드를 통해 만든 샘플 스펙트로그램의 shape는 [2, 128, 2683]입니다. 다시 말해, 여기서 시간은 2683에 해당합니다. 임의의 지점 W는 스펙트로그램의 정 중앙을 통과하는 수평선 위에 찍혀야 하기 때문에 주파수 정보와 시간 정보를 모두 가져옵시다.

time , freq = mel_spectorgram [ 1 ] , mel_spectrogram [ 2 ]

정보를 가져왔으면 이제 다음은 spectrogram의 주파수 축에서 가운데 지점을 찾아야 합니다. 그 후, Spectrogram의 정 중앙을 지나는 수평선을 찾아야 합니다. 해당 정보는 다음과 같이 구할 수 있습니다.

y_axis = freq // 2 horizontal_line_at_center = mel_spectrogram [ 0 ] [ y ]

그렇다면 이제는 W와 T-W 내에서 랜덤하게 Augmentation을 할 점을 구해봅시다. random.randrange를 통해 구현합니다. 이후, 얼마만큼 Augmentation을 할지 정합니다. 왼쪽, 오른쪽으로 데이터를 이동하는 것이기 때문에 양수 W와 음수 -W 사이에서 value를 가지도록 지정하도록 합시다.

point_to_warp = horizontal_line_at_ctr [ random . randrange ( W , spec_len – W ) ] dist_to_warp = random . randrange ( – W , W )

이렇게 되면 준비는 모두 끝났습니다. 이제 sparese_image_warp 함수를 만들 차례입니다. 아쉽게도 파이토치에는 sparse image warp가 구현되어있지 않기 때문에, 이는 직접 구현해야 합니다. sparese image warp는 image warping의 일종인데요, 먼저 image warping을 구현하는 함수를 구현해보도록 합시다

image warping을 수식으로 나타내자면 다음과 같습니다. 이미지 I I I가 있고, 이미지 I I I 내의 x, y 좌표를 I ( x , y ) I(x, y) I(x,y)라고 할 때, x방향의 위치변환함수 U x ( x , y ) Ux(x, y) Ux(x,y)와 y방향의 위치변환함수 U y ( x , y ) Uy(x, y) Uy(x,y)를 적용하여 I ( U x ( x , y ) , U y ( x , y ) ) I(Ux(x, y), Uy(x, y)) I(Ux(x,y),Uy(x,y))로 만들어주는 것이 바로 warping입니다. 즉, warping을 구현하기 위해선 Ux와 Uy라는 위치변환함수를 정의해야 합니다.

위치변환함수를 정의하는데에는 여러 방법이 있는데요, SpecAugment에서는 텐서플로우의 sparse image wrap를 사용했습니다. sparse image warp는 텐서플로우 원본 코드 주석에도 나와있듯, sparse control points간의 대응을 이용하여 image warping을 하는 것입니다. 다시 말해 sparse image warp는 control point를 non-linear하게 이동하면서 이미지를 왜곡하는 기법인 것입니다.

원본 소스의 주석을 보면 sprase image warp는 크게 두가지 과정을 통해 진행됩니다. 과정은 다음과 같습니다.

control point들 사이의 변위를 보간하기 위해(즉 두 점을 연결하기 위해) polyharmonic spline을 적용하여 dense flow field로 만들어줍니다. 이렇게 만들어진 dense flow field를 이용하여 이미지를 왜곡합니다. 텐서플로우에선 dense_image_warp를 이용하여 이미지를 warp 하였습니다.

그렇다면 원본 코드를 보면서 이를 파이토치 코드로 옮겨보도록 합시다. 먼저 원본 코드를 보면 아래와 같은 파라미터들이 있습니다.

image : TensorLike , source_control_point_locations : TensorLike , dest_control_point_locations : TensorLike , interpolation_order : int = 2 , regularization_weight : FloatTensorLike = 0.0 , num_boundary_points : int = 0 , name : str = “sparse_image_warp” ,

여기에서 우리가 신경써야 할 파라미터는 source_control_point_location과 dest_control_point_location, num_boundary_points 정도입니다. source_control_point_location 은 SpecAug를 어디에서 시작할 것인지에 대한 것이고, dest_control_point_location 는 어디부터 어디까지 SpecAug를 할 것인지 지정하는 것입니다. 따라서 그냥 point_to_warp + dist_to_warp 로 지정하는 파라미터라고 보시면 됩니다.

먼저 spectrogram의 정보를 받아온 뒤, 보간법 검증에 사용할 dense location을 생성합시다.

x_range와 y_range는 torch.linspace를 통해 0부터 width, height 정보가 width 혹은 height만큼 있는 1차원 텐서로 변환합니다. width가 10일 경우, torch.tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 꼴로 변환되도록 하는 과정입니다. 이를 torch.mashgrid을 통해 torch.tensor([width, height]) 형태의 x_grid, y_grid를 생성합니다. 이를 torch.stack으로 합쳐준 다음, reshape를 통해 (height * width, 2) 형태의 텐서로 만들어줍니다. 이를 통해 보간법 검증에 사용할 dense location 정보를 만들었습니다.

device = torch . device ( ) batch_size , spec_height , spec_width = mel_spectrogram . shape x_range = torch . linspace ( 0 , spec_width – 1 , spec_width , device = device ) y_range = torch . linspace ( 0 , spec_height – 1 , spec_height , device = device ) y_grid , x_grid = torch . meshgrid ( y_range , x_range ) flattend_grid_location = torch . stack ( ( y_grid , x_grid ) ) . reshape ( [ spec_height * spec_width , 2 ] )

이제 보간을 할 차례입니다. sparse_image_warp에서는 스플라인 보간을 사용합니다. 이 부분은 수치해석과 관련된 부분이 많으니, 추후 수치해석편에서 자세히 다루겠습니다. 여기서 필요한 것은 앞서 구한 flattened grid locations과 스펙트로그램, control point를 통해 스플라인 보간 식의 답을 구하고, 이를 적용하는 것입니다. 해당 함수가 유도되는 과정을 보고 싶으신 분들은 다음 문서를 확인하시면 됩니다. [Polyharmonic spline]

실제 적용 코드는 이 곳에서 확인하실 수 있습니다. [Open in Colaboratory]

해당 링크의 코드를 사용하면, 다음과 같은 time warping을 사용할 수 있게 됩니다. image warping을 제외한 모든 코드는 이미 완성했으니, 다음과 같이 time warp를 정의하도록 합시다.

def time_warp ( spec , W = 50 ) : num_rows = spec . shape [ 2 ] spec_len = spec . shape [ 1 ] device = spec . device pt = ( num_rows – 2 * W ) * torch . rand ( [ 1 ] , dtype = torch . float ) + W src_ctr_pt_freq = torch . arange ( 0 , spec_len // 2 ) src_ctr_pt_time = torch . ones_like ( src_ctr_pt_freq ) * pt src_ctr_pts = torch . stack ( ( src_ctr_pt_freq , src_ctr_pt_time ) , dim = – 1 ) src_ctr_pts = src_ctr_pts . float ( ) . to ( device ) w = 2 * W * torch . rand ( [ 1 ] , dtype = torch . float ) – W dest_ctr_pt_freq = src_ctr_pt_freq dest_ctr_pt_time = src_ctr_pt_time + w dest_ctr_pts = torch . stack ( ( dest_ctr_pt_freq , dest_ctr_pt_time ) , dim = – 1 ) dest_ctr_pts = dest_ctr_pts . float ( ) . to ( device ) source_control_point_locations = torch . unsqueeze ( src_ctr_pts , 0 ) dest_control_point_locations = torch . unsqueeze ( dest_ctr_pts , 0 ) warped_spectro , dense_flows = sparse_image_warp ( spec , source_control_point_locations , dest_control_point_locations ) return warped_spectro . squeeze ( 3 )

이렇게 되면 time warping 구현은 끝났습니다.

Frequency Masking and Time Masking

다음으로 Frequcney masking을 구현해보도록 하겠습니다. 사실 Frequency masking과 time masking은 이 논문의 핵심 아이디어입니다. 하지만 time warping과 달리 frequency masking과 time masking은 상대적으로 구현하기 쉽습니다. 단순히 랜덤한 시간대 혹은 주파수 대역만 0으로 채워주면 되기 때문입니다.

spec = torchaudio . load ( audio_path ) F = random . randint ( 1 , 16000 ) num_masks = 3 replace_with_zero = False

필요한 파라미터를 모두 지정합니다. F는 임의의 정수로, 0부터 해당 주파수 대역까지가 masking의 잠재적 대상이 됩니다. replace_with_zero의 경우 해당 padding을 0으로 할지의 여부입니다. false인 경우 해당 spectrogram의 평균값으로 마스킹하고, True인 경우 0으로 마스킹합니다.

cloned = spec . clone ( ) num_mel_channels = cloned . shape [ 1 ] for i in range ( 0 , num_masks ) : f = random . randrange ( 0 , F ) f_zero = random . randrange ( 0 , num_mel_channels – f ) if ( f_zero == f_zero + f ) : spec = cloned mask_end = random . randrange ( f_zero , f_zero + f ) if ( replace_with_zero ) : cloned [ 0 ] [ f_zero : mask_end ] = 0 else : cloned [ 0 ] [ f_zero : mask_end ] = cloned . mean ( )

spectrogram을 복사한 뒤, 반복문을 통해 num_mask만큼 frequency masking을 시작합니다. 여기서 f와 f_zero라는 두개의 임의의 숫자를 정하는데요, f는 지정된 Frequency 내에서 augmentation의 시작점과 끝점을 잡는데에 필요한 기준점입니다. 이렇게 기준점을 정하면, mel channel의 개수에서 기준점 f를 빼줍니다. 이렇게 되면 mel channel 내에서 augmentation의 시작점이 정해지게 됩니다.

물론, f_zero와 f_zero + f가 같아지는 상황도 발생할 수 있습니다. 때문에 이와 같은 상황이 발생하면 augmentation을 pass하는 코드도 만들어줍니다.

그 뒤, 마스킹 코드를 삽입합니다. mask end 지점은 시작점 f_zero와 f_zero + 기준점 f 사이에서 정합니다. 기준점이 정해지면 masking을 진행합니다. 이렇게 되면 augmentation이 완료됩니다.

완성된 코드는 다음과 같습니다.

def freq_mask ( spec , F = 30 , num_masks = 1 , replace_with_zero = False ) : cloned = spec . clone ( ) num_mel_channels = cloned . shape [ 1 ] for i in range ( 0 , num_masks ) : f = random . randrange ( 0 , F ) f_zero = random . randrange ( 0 , num_mel_channels – f ) if ( f_zero == f_zero + f ) : return cloned mask_end = random . randrange ( f_zero , f_zero + f ) if ( replace_with_zero ) : cloned [ 0 ] [ f_zero : mask_end ] = 0 else : cloned [ 0 ] [ f_zero : mask_end ] = cloned . mean ( ) return cloned

마지막으로 Time Masking을 구현해보도록 하겠습니다. Time masking은 위의 코드에서 mel channel의 개수가 아닌 스펙트로그램의 길이를 기준으로 삼기만 하면 됩니다.

def time_mask ( spec , T = 40 , num_masks = 1 , replace_with_zero = False ) : cloned = spec . clone ( ) len_spectro = cloned . shape [ 2 ] for i in range ( 0 , num_masks ) : t = random . randrange ( 0 , T ) t_zero = random . randrange ( 0 , len_spectro – t ) if ( t_zero == t_zero + t ) : return cloned mask_end = random . randrange ( t_zero , t_zero + t ) if ( replace_with_zero ) : cloned [ 0 ] [ : , t_zero : mask_end ] = 0 else : cloned [ 0 ] [ : , t_zero : mask_end ] = cloned . mean ( ) return cloned

이렇게 SpecAugmentation을 구현하였습니다. 이를 통해 음성인식률의 향상을 기대할 수 있습니다.

SpecAugmentation 파트가 너무 길어져 데이터로더 작성과 TFRecord 작성법은 다음 편에서 다루도록 하겠습니다. 도움이 되셨다면 좋겠습니다. 혹시 설명 중 보충할 것이 있거나 사실이 아닌 부분이 있다면 댓글로 알려주세요. 최대한 빠른 시일 내에 수정하도록 하겠습니다. 감사합니다.

음성 데이터 전처리 기법에 따른 뉴로모픽 아키텍처 기반 음성 인식 모델의 성능 분석

뉴로모픽 아키텍처에서 동작하는 SNN (Spiking Neural Network) 은 인간의 신경망을 모방하여 만들어졌다. 뉴로모픽 아키텍처 기반의 뉴로모픽 컴퓨팅은 GPU를 이용한 딥러닝 기법보다 상대적으로 낮은 전력을 요구한다. 이와같은 이유로 뉴로모픽 아키텍처를 이용하여 다양한 인공지능 모델을 지원하고자 하는 연구가 활발히 일어나고 있다. 본논문에서는 음성 데이터 전처리 기법에 따른 뉴로모픽 아키텍처 기반의 음성 인식 모델의 성능 분석을 진행하였다. 실험결과 푸리에 변환 기반 음성 데이터 전처리시 최대 84% 정도의 인식 정확도 성능을 보임을 확인하였다. 따라서 뉴로모픽 아키텍처 기반의 음성 인식 서비스가 효과적으로 활용될 수 있음을 확인하였다.

SNN (Spiking Neural Network) operating in neuromorphic architecture was created by mimicking human neural networks. Neuromorphic computing based on neuromorphic architecture requires relatively lower power than typical deep learning techniques based on GPUs. For this reason, research to support various artificial intelligence models using neuromorphic architecture is actively taking place. This paper conducted a performance analysis of the speech recognition model based on neuromorphic architecture according to the speech data preprocessing technique. As a result of the experiment, it showed up to 84% of speech recognition accuracy performance when preprocessing speech data using the Fourier transform. Therefore, it was confirmed that the speech recognition service based on the neuromorphic architecture can be effectively utilized.

[논문]음성 인식을 위한 전처리 방법에 관한 연구

초록

음성은 인간이 사용하는 보편적이고 편리한 의사전달 수단이다. 음성에 의해 표현되는 말은 사람과 사람 사이에 의사소통을 가능하게 할 뿐 아니라 음성을 이용하여 기계나 장치에 명령을 내리는데 사용 될 수도 있다. 최근에는 음성을 이용한 인식 시스템이 보안 시스템에 활용되거나 제어 인터페이스로도 각광 받고 있으며 관련된 많은 연구가 진행되고 있다.

음성 인식에서 특정 환경에 따른 인식률의 변화가 심한 것은 큰 문제점으로 지적된다. 주위 잡음이 심하지 않은 조용한 환경에서의 인식률은 높은 편이지만 여러 사람이 동시에 말을 하고 주…

음성은 인간이 사용하는 보편적이고 편리한 의사전달 수단이다. 음성에 의해 표현되는 말은 사람과 사람 사이에 의사소통을 가능하게 할 뿐 아니라 음성을 이용하여 기계나 장치에 명령을 내리는데 사용 될 수도 있다. 최근에는 음성을 이용한 인식 시스템이 보안 시스템에 활용되거나 제어 인터페이스로도 각광 받고 있으며 관련된 많은 연구가 진행되고 있다.

음성 인식에서 특정 환경에 따른 인식률의 변화가 심한 것은 큰 문제점으로 지적된다. 주위 잡음이 심하지 않은 조용한 환경에서의 인식률은 높은 편이지만 여러 사람이 동시에 말을 하고 주변 소음이나 잡음이 섞이는 경우 인식률은 현저하게 감소한다. 그러므로 음성 인식 연구에서 잡음을 제거하고 인식과 관계없는 음성을 제거하는 전처리 기술은 반드시 필요하다.

음성인식 전처리 과정에는 주로 인식하고자하는 음성과 이외의 다른 음성을 분리 할 수 있는 BSS(Blind Source Separation) 기술이 사용된다. BSS는 소스로부터 신호가 전달되는 과정에 대한 사전 정보 없이 센서로 입력된 신호만을 이용하여 본래 각각의 독립 신호로 분리하는 기술이다.

BSS는 신호가 전달되는 환경에 따라 3가지 case로 분류가 가능하다. 그 중 신호가 소스에서 센서로 전달될 때 걸리는 시간 지연이 없다고 가정하는 Instantaneous case에 관한 연구가 많이 진행되어왔다. 하지만 실제 환경을 표현하기에는 한계가 있으며 실제 환경을 더 잘 표현하기 위해서는 신호가 전달될 때 간섭과 반향을 고려하는 Echoic case가 더욱 적합하다. 실제 환경에서 신호는 전달 시 다중 경로를 통해 센서로 입력되며, 경로에 따라 신호가 센서로 도달 하는데 시간 지연이 발생한다. Echoic case 모델은 센서에 입력되는 신호를 convolutive mixture로 표현하여 이런 시간 지연을 고려하였다. BSS 알고리즘에서 Instantaneous case의 대표적인 알고리즘으로 많이 쓰이는 FastICA도 빠른 계산 속도를 장점으로 갖지만 실제 환경을 정확히 반영하지 못하는 문제점이 있었다. 최근 이런 한계를 극복하기 위해 Echoic case로 확장시킨 convolutive ICA에 관한 연구가 발표되었다.

신호에 잡음이 섞이는 문제는 웨이블렛 변환(wavelet transform)을 이용한 denoising과 잡음 감소 필터(noise reduction filter)를 사용함으로써 해결할 수 있다. 웨이블렛 변환은 모 웨이블렛(mother wavelet)을 시간 축으로 이동하거나 크기의 확대, 축소를 함으로써 생성된 기저 함수들의 집합을 이용하여 표현된다. 웨이블렛 변환을 이용하면 고역 부분과 저역 부분으로 단계적으로 신호를 분해함으로써 주파수 특징을 알 수가 있다. 이때 신호의 잡음이 주로 고역 부분에 분포한다는 점에 근거하여 고역 부분을 제거하거나 감쇠시키는 방법으로써 신호의 잡음 감소시킬 수 있다. 한편, 잡음 감소 필터는 잡음의 분포와 종류에 맞게 선택해야 한다. 칼만 필터(Kalman filter)는 잡음 신호의 분포가 가우시안 분포일 때 탁월한 노이즈 감소 효과를 나타내는 필터이다. 칼만 필터는 예측(prediction)과 측정을 통한 보정(correction by measurement)을 반복함으로써 잡음 신호의 분산을 점차 줄이며 이로써 잡음을 감소시키는 효과를 나타낸다. 본 논문에서 제안하는 음성인식 전처리 방법은 웨이블렛 변환을 이용한 고역 잡음을 감소시킨 후 convolutive ICA를 이용한 신호 분리를 한다. 이후에 잡음 감소 필터로써 칼만 필터를 이용함으로써 음성 분리 및 잡음 감소가 확실히 이루어지도록 한다.

제안한 전처리 과정의 성능을 확인하기 위해 음성 인식 시스템의 대표적인 어플리케이션 중 하나인 홈오토메이션 환경에 적용하여 실험을 진행하였다. 홈오토메이션 환경에서 발생할 수 있는 6가지 소리들을 녹음하였으며, 7인의 화자가 말하는 각 22개의 명령어를 녹음하여 음성 혼합 모델을 통해 혼합 하였다. 음성 혼합 모델로서 사용된 모델은 2×2 혼합 행렬을 이용하여 혼합하는 모델인 Instantaneous mix 모델과 사람의 청각기관을 모델링한 HRTF(Head Related Transfer Function) 모델, 그리고 방을 시뮬레이션 하여 소스와 센서간의 전달관계를 함수로써 구현한 Synthetic Room Recording Simulation 모델이다. 혼합된 신호를 여러 가지 처리 과정을 이용하여 신호 분리 및 잡음을 감소시키는 실험을 하였다.

실험의 성능 평가는 잡음 측정에 많이 사용되는 SNR(Signal to Noise Ratio, 신호 대 잡음비)을 사용하였으며, 본 논문에서 제안한 전처리 과정 및 여러 가지 처리 과정의 SNR 값을 비교하여 잡음이 개선된 정도를 확인하였다.

딥 러닝 음성 인식에 필요한 훈련 데이터를 직접 만들어보자

음성 처리 분야에서의 딥 러닝

음원 분리에 적용된 딥 러닝

딥 러닝에 필요한 훈련 데이터 제작

Signal-to-Noise ratio란

Signal-to-Noise ratio 계산 방법

signal

noise

먼저, 아래 그림처럼 음성의 진폭값이 마이너스 수치로 나올 수도 있으니 진폭값을 제곱합니다. 제곱한 값을 더한 뒤 그 값의 평균을 구합니다. 마지막으로 평균한 값의 제곱근을 계산하면 소리의 세기를 구할 수 있습니다.

Python으로 임의 Signal-to-Noise ratio의 음성 파형 제작

준비

실행 환경 준비

Python3.x 버전

MacOS

음성 파일 포맷 확인

.wav

양자화 bit수는 16bit

음성용 파일과 잡음용 파일의 샘플링 레이트(sampling rate)를 통일

사용할 데이터 세트 준비

실행

wav 파일 로딩하기

wave

import argparse import array import math import numpy as np import random import wave def get_args(): parser = argparse.ArgumentParser() parser.add_argument(‘–clean_file’, type=str, required=True) parser.add_argument(‘–noise_file’, type=str, required=True) parser.add_argument(‘–output_clean_file’, type=str, default=”) parser.add_argument(‘–output_noise_file’, type=str, default=”) parser.add_argument(‘–output_noisy_file’, type=str, default=”, required=True) parser.add_argument(‘–snr’, type=float, default=”, required=True) args = parser.parse_args() return args if __name__ == ‘__main__’: args = get_args() clean_file = args.clean_file noise_file = args.noise_file snr = args.snr clean_wav = wave.open(clean_file, “r”) noise_wav = wave.open(noise_file, “r”)

음성만 있는 파일의 절대 경로– clean_file

잡음만 있는 파일의 절대 경로– noise_file

처리 완료된 음성만 있는 파일의 절대 경로(옵션)– output_clean_file

처리 완료된 잡음만 있는 파일의 절대 경로(옵션)– output_noise_file

임의 SN비의 음성 파일의 절대 경로– output_noisy_file

합성하려는 SN비의 크기– snr

python3 create_noisy_minumum_code.py –clean_file ~/Desktop/test_source/arctic_b0001.wav –noise_file ~/Desktop/test_noise/0ch01.wav –output_clean_file ~/Desktop/clean.wav –output_noise_file ~/Desktop/noise.wav –output_noisy_file ~/Desktop/noisy.wav –snr 0

음성 파형의 진폭값 취득하기

def cal_amp(wf): buffer = wf.readframes(wf.getnframes()) amptitude = (np.frombuffer(buffer, dtype=”int16″)).astype(np.float64) return amptitude if __name__ == ‘__main__’: (중략) clean_amp = cal_amp(clean_wav) noise_amp = cal_amp(noise_wav)

wf.readframes(n)

wf.getnframes()

wf.readframes(wf.getnframes())

(np.frombuffer(buffer, dtype=”int16″)).astype(np.float64)

np.float64

진폭값의 평균 제곱근(Root Mean Square, RMS) 구하기

def cal_rms(amp): return np.sqrt(np.mean(np.square(amp), axis=-1)) if __name__ == ‘__main__’: (중략) start = random.randint(0, len(noise_amp)-len(clean_amp)) clean_rms = cal_rms(clean_amp) split_noise_amp = noise_amp[start: start + len(clean_amp)] noise_rms = cal_rms(split_noise_amp)

Signal-to-Noise ratio 계산식을 이용해 임의 크기로 파형 합성하기

noise

def cal_adjusted_rms(clean_rms, snr): a = float(snr) / 20 noise_rms = clean_rms / (10**a) return noise_rms if __name__ == ‘__main__’: (중략) adjusted_noise_rms = cal_adjusted_rms(clean_rms, snr) adjusted_noise_amp = split_noise_amp * (adjusted_noise_rms / noise_rms) mixed_amp = (clean_amp + adjusted_noise_amp)

if (mixed_amp.max(axis=0) > 32767): mixed_amp = mixed_amp * (32767/mixed_amp.max(axis=0)) clean_amp = clean_amp * (32767/mixed_amp.max(axis=0)) adjusted_noise_amp = adjusted_noise_amp * (32767/mixed_amp.max(axis=0))

파형을 wav 파일로 저장하기

wave

noisy_wave = wave.Wave_write(args.output_noisy_file) noisy_wave.setparams(clean_wav.getparams()) noisy_wave.writeframes(array.array(‘h’, mixed_amp.astype(np.int16)).tostring() ) noisy_wave.close() clean_wave = wave.Wave_write(args.output_clean_file) clean_wave.setparams(clean_wav.getparams()) clean_wave.writeframes(array.array(‘h’, clean_amp.astype(np.int16)).tostring() ) clean_wave.close() noise_wave = wave.Wave_write(args.output_noise_file) noise_wave.setparams(clean_wav.getparams()) noise_wave.writeframes(array.array(‘h’, adjusted_noise_amp.astype(np.int16)).tostring() ) noise_wave.close()

setparams()

writeframes()

전체 코드

# -*- coding: utf-8 -*- import argparse import array import math import numpy as np import random import wave def get_args(): parser = argparse.ArgumentParser() parser.add_argument(‘–clean_file’, type=str, required=True) parser.add_argument(‘–noise_file’, type=str, required=True) parser.add_argument(‘–output_clean_file’, type=str, default=”) parser.add_argument(‘–output_noise_file’, type=str, default=”) parser.add_argument(‘–output_noisy_file’, type=str, default=”, required=True) parser.add_argument(‘–snr’, type=float, default=”, required=True) args = parser.parse_args() return args def cal_adjusted_rms(clean_rms, snr): a = float(snr) / 20 noise_rms = clean_rms / (10**a) return noise_rms def cal_amp(wf): buffer = wf.readframes(wf.getnframes()) amptitude = (np.frombuffer(buffer, dtype=”int16″)).astype(np.float64) return amptitude def cal_rms(amp): return np.sqrt(np.mean(np.square(amp), axis=-1)) if __name__ == ‘__main__’: args = get_args() clean_file = args.clean_file noise_file = args.noise_file snr = args.snr clean_wav = wave.open(clean_file, “r”) noise_wav = wave.open(noise_file, “r”) clean_amp = cal_amp(clean_wav) noise_amp = cal_amp(noise_wav) start = random.randint(0, len(noise_amp)-len(clean_amp)) clean_rms = cal_rms(clean_amp) split_noise_amp = noise_amp[start: start + len(clean_amp)] noise_rms = cal_rms(split_noise_amp) adjusted_noise_rms = cal_adjusted_rms(clean_rms, snr) adjusted_noise_amp = split_noise_amp * (adjusted_noise_rms / noise_rms) mixed_amp = (clean_amp + adjusted_noise_amp) if (mixed_amp.max(axis=0) > 32767): mixed_amp = mixed_amp * (32767/mixed_amp.max(axis=0)) clean_amp = clean_amp * (32767/mixed_amp.max(axis=0)) adjusted_noise_amp = adjusted_noise_amp * (32767/mixed_amp.max(axis=0)) noisy_wave = wave.Wave_write(args.output_noisy_file) noisy_wave.setparams(clean_wav.getparams()) noisy_wave.writeframes(array.array(‘h’, mixed_amp.astype(np.int16)).tostring() ) noisy_wave.close() clean_wave = wave.Wave_write(args.output_clean_file) clean_wave.setparams(clean_wav.getparams()) clean_wave.writeframes(array.array(‘h’, clean_amp.astype(np.int16)).tostring() ) clean_wave.close() noise_wave = wave.Wave_write(args.output_noise_file) noise_wave.setparams(clean_wav.getparams()) noise_wave.writeframes(array.array(‘h’, adjusted_noise_amp.astype(np.int16)).tostring() ) noise_wave.close()

마치며

안녕하세요, LINE에서 광고 플랫폼 개발을 맡고 있는 1년차 신입사원 Kunihiko Sato입니다.이번 블로그에서는 Python을 사용해서 임의의 Signal-to-Noise ratio(SN비)를 가진 음성 파형을 만드는 방법을 소개하겠습니다. 참고로 이 포스팅의 내용은 Clova 등 LINE의 음성 사업과는 관련이 없습니다.오래 전 딥 러닝이 이미지 처리 분야에서 기술 혁신을 일으켰는데, 음성 처리 분야에서도 비슷한 일이 벌어지고 있습니다. 딥 러닝으로 음석 인식의 정밀도가 크게 향상되면서, Amazon Echo나 Google Home, LINE Clova와 같은 AI 스피커가 개발되어 시장에 보급되었습니다. 또, 컴퓨터로 음성을 생성하는 문자 음성 변환(Text-to-Speech)의 정밀도도 높아져서 실제 사람의 목소리와 분간하기 힘들 정도의 음질이 되었습니다.위에서 언급한 사례 외에도 딥 러닝을 통해 정밀도 측면에서 많은 발전을 이룬 음성 처리 분야들이 있는데요. 그 중 하나가 음원 분리입니다.음원 분리란 여러 개의 음원이 섞여 있는 입력 파형을 개별 음원의 파형으로 분리하는 것을 말합니다. 예를 들어혹은라고 말하는, 음성과 잡음이 섞여 있는 입력 파형을 음성 파형과 잡음 파형으로 각각 분리해내는 것이 음원 분리에 해당됩니다. 또는 피아노, 트럼펫, 기타 소리가 섞여 있는 입력 음원을 3개의 파형으로 분리하는 것도 음원 분리라고 부릅니다. 아래 그림은 음원 분리를 이미지로 나타낸 그림입니다.아래는 딥 러닝을 통해 음원 분리 정밀도가 대폭 향상된 사례들입니다.딥 러닝으로 음원 분리를 구현하려면 학습용 데이터 세트를 준비해야 합니다.이해를 돕기 위해 이 포스팅에서는 음성 파형에서 잡음을 제거하여 음성만 추출하는 ‘음성 강조(잡음 제거)’ 음원 분리에 대해 살펴 보겠습니다. 먼저, 신경 회로망의 학습을 도식화하면 아래와 같습니다.훈련 데이터(training data)에는 음성과 잡음이 섞여 있는 파형이 필요합니다. 또, 교사 데이터(teacher data)에는 음성만 있는 파형이 필요합니다. 이 데이터들을 이용해 신경 회로망은 잡음이 섞여 있는 음성 파형에서 음성만 추출하도록 훈련됩니다.음성만 있는 데이터 세트로는 TIMIT 코퍼스 등을 비롯해 유명한 음성 코퍼스( 말뭉치 )들이 여럿 있지만, 잡음이 포함된 음성 데이터와 음성만 있는 데이터를 쌍으로 갖추고 있는 데이터 세트는 별로 없습니다. 따라서, 이미 나와있는 데이터 세트 를 활용하는 것만으론 부족할 수 있습니다. 만약 개발자가 임의의 SN비를 가진 파형을 합성할 수 있게 되면, ‘음성과 잡음’ 뿐만 아니라 여러 악기 소리가 혼합된 데이터 세트까지 만들 수 있습니다. 그러면 개발 요건에 맞는 데이터 세트를 각각 필요에 따라 만들 수 있게 되니 이번 기회에 직접 만들 수 있는 방법을 익혀두면 좋을 것 같습니다.Signal-to-Noise ratio(SN비, 신호 대비 잡음 비)란 신호의 크기가 잡음의 크기보다 얼마나 큰지 나타내는 비율입니다. 음성 신호에서 SN비의 단위는 dB(데시벨)입니다. 이 포스팅에서는 Signal을 음성, Noise를 그 외의 소리(화이트 노이즈, 환경음 등)로 설명하겠습니다.SN비 수치가 높을수록 음성이 잡음보다 크다는 것을 의미합니다. 예를 들어, 5dB일 때보다 20dB일 때가 음성은 크게, 잡음은 작게 들리는 상태입니다. 0dB은 음성과 잡음의 크기가 동일하다는 의미입니다. 음성보다 잡음이 더 큰 경우에는 -10dB과 같은 마이너스 수치가 나옵니다.’임의의 Signal-to-Noise ratio를 가진 음성 파형을 만든다’는 것은 원하는 dB 비율로 음성과 잡음이 섞여 있는 음성 파형을 만든다는 의미입니다.SN비는 다음 계산식으로 구할 수 있습니다.와 A는 각각 음성과 잡음의 ‘크기’ 혹은 ‘세기’를 나타냅니다. ‘세기’의 정의에는 몇 가지가 있는데, 이 포스팅에서는 진폭값의 평균 제곱근(Root Mean Square, RMS)을 각 소리의 세기로 정의하겠습니다.진폭값의 평균 제곱근은 다음과 같은 순서로 구할 수 있습니다.파형 내의 모든 진폭값을 이용한 평균 제곱근 값은 파형에 무음 구간이 많거나 특정 구간만 비정상적으로 진폭값이 큰 경우엔 소리의 세기로 사용할 수 없습니다. 이런 경우, 진폭값의 평균 제곱근이 나타내는 값과 사람이 지각하는 소리의 세기간에 차이가 발생하기 때문에, 무음 구간을 제거하거나 짧은 간격으로 SN비를 계산해야 합니다. 여기에서 소개한 방법 외에도 SN비를 구하는 다른 방법이 있을테니 꼭 조사해 보시기 바랍니다.그럼 실제로 음성에 임의 크기의 잡음을 중첩시키는 프로그램을 Python으로 구현해 보겠습니다.먼저 완성된 코드의 링크를 걸어 두겠습니다. https://github.com/Sato-Kunihiko/audio-SNR 위 코드에 따라 생성된 음성 예시는 아래와 같습니다.왼쪽 위부터 차례대로 SN비가 -20, -5, 0, 5, 20dB인 음성 파형입니다. 수치가 커질수록 잡음이 작아지고 음성이 잘 들리게 됩니다.※위 프로그램을 실행해도 동영상 파일은 생성되지 않으며 음성 파일이 생성됩니다. 이 블로그 사양상 포스팅에 음성 파일을 삽입할 수 없어서 YouTube에 업로드한 동영상을 게재했습니다.음성 파일은 반드시 확장자가인 파일을 사용해야 합니다. wav 파일의 포맷은 아래와 같이 설정하기 바랍니다.양자화 bit수는 16bit가 기본값으로 설정되어 있는 경우가 많습니다. 샘플링 레이트는 파일별로 다른 경우가 많으니 유의하시기 바랍니다. (16000Hz나 44100Hz, 48000Hz로 되어 있는 경우가 많습니다.) 샘플링 레이트의 변경은 SoX 등의 음성 편집 소프트웨어를 사용하면 커맨드라인에서도 실행할 수 있습니다.이번 구현에서는 음성만 있는 wav 파일과 잡음만 있는 wav 파일을 사용합니다.음성만 있는 파일은 CMU ARCTIC 코퍼스 를 사용했습니다.잡음만 있는 파일은 DEMAND 를 사용했습니다. DEMAND는 18가지의 환경음이 수록된 데이터 세트입니다.먼저 wav 파일을 읽어들이도록 구현합니다. Python에서 wav 파일을 취급하기 위한 라이브러리는 몇 가지가 있는데, 이번에는라이브러리를 사용합니다.위 Python 코드를 실행할 때는, 아래 인수들이 필요합니다.실제 실행되는 스크립트는 아래와 같습니다. 파일명과 폴더 경로는 각자 환경에 맞는 값으로 바꿔 주세요.wav 파일을 읽어들여 해당 파일의 진폭값을 얻습니다.는 최대 n개의 오디오 프레임을 읽어들여 bytes 객체로 반환합니다.는 오디오 프레임 수를 반환합니다. 즉,함수로 wav 파일의 모든 진폭값을 취득할 수 있습니다.마지막으로 bytes 객체를함수를 사용해에 캐스팅합니다.진폭값의 RMS를 구하기 전에 주의할 점이 있습니다.DEMAND의 잡음 데이터는 한 파일당 길이가 5분이고, CMU 코퍼스의 음성 데이터는 한 파일당 길이가 2~5초입니다. 따라서 잡음 데이터 파형을 음성 데이터 파형 길이로 잘라야 합니다. 그리고 아래 그림처럼 원본 잡음 파일에서 잘라낸 파형과 음성 데이터 파형의 RMS를 각각 계산하여 임의 SN비가 나오도록 중첩합니다.실제 코드에서는 잡음을 자를 위치를 랜덤으로 정해서 음성의 길이만큼 잘라냅니다.위에서 말씀드린 것과 같이, SN비 계산식은 다음과 같습니다.위 계산식을 이용해서 음성에 대해 임의의 SN비가 나오도록 잡음의 RMS를 구합니다. 잡음의 RMS는 위 계산식을 변형한 아래의 계산식으로 구할 수 있습니다.아래 그림과 같이, 위 계산식으로 도출한 RMS(A)와 원본 잡음의 RMS의 비율을 계산하여 그 비율만큼 원본 잡음의 진폭값을 조정합니다. 그 후 조정한 잡음의 진폭과 음성 단독의 진폭을 더합니다.두 진폭을 서로 더한 후에 주의할 점이 있습니다. 각각의 진폭을 더한 진폭값이 wav 파일의 양자화 bit수, 16bit의 최대값(이진수로 32767)을 넘어 버릴 수 있기 때문입니다. 이렇게 되면 최대값을 넘는 파형은 소위 ‘절단 현상(breaking)을 초래합니다. 따라서, 서로 더한 값이 16bit의 최대값을 넘을 경우, 서로 더한 값의 최대가 32767 안에 들어오도록 정규화합니다.마지막으로 파형을 wav 파일로 저장합니다. wav 파일로 저장할 때도라이브러리를 사용합니다.는 wav 파일의 포맷을 지정하는 메서드입니다. 특별한 문제가 없으면 입력에 사용한 음성 파일 포맷을 그대로 사용해도 됩니다.로 진폭값을 지정합니다. String에 캐스팅해야 합니다.마지막으로 전체 코드를 공개합니다. Gihub 에도 올려두었습니다.딥 러닝을 통해 다양한 음성 처리의 정밀도가 향상되었지만, 아직 이 분야는 복잡한 사전 지식이 필요하고 참고할만한 문서도 많지 않다고 느껴집니다. 이 포스팅을 보시고 더 많은 분들이 음성 처리에 관심 갖게 되면 좋겠습니다.포스팅 내용에 오류가 있거나, 다른 의견이 있으시면 Github twitter 로 연락 부탁드립니다.긴 글 읽어주셔서 감사합니다.

AI 보안 음성인식

1. Start Up! AI 보안 음성인식 과정에 대해 전반적으로 파악할 수 있다.

음성인식 이해 AI 음성인식의 개념과 특징을 이해하고, 음성인식의 과정과 구성요소를 파악할 수 있다.

AI 음성인식 트렌드 최근 AI 음성인식의 트렌드를 이해하고, AI 음성인식의 기술 변화를 파악할 수 있다.

AI 음성인식의 산업활용사례 및 정보보호 AI 음성인식이 산업에 활용되고 있는 사례와 정보보호 이슈를 파악할 수 있다.

2. Start Up! 기초통계에 대해 전반적으로 파악할 수 있다.

통계와 확률 통계와 확률의 개념을 이해하고 조건부 확률과 베이즈 정리에 대해 숙지할 수 있다.

확률변수와 확률분포 확률변수의 기본적인 용어와 내용을 이해하고, 다양한 확률분포의 특성을 파악할 수 있다.

추정과 정보이론 추정의 개념을 이해하고 점추정의 다양한 방법 및 정보이론에 대해 파악할 수 있다.

3. Start Up! 음성 신호처리에 대해 전반적으로 파악할 수 있다.

신호와 시스템 신호와 시스템, 신호처리에 대한 개념을 이해하고, 디지털 신호의 생성방법을 파악할 수 있다.

이산 신호와 시스템 이산신호와 이산 시스템의 개념과 유형을 파악하고, 음성 신호처리를 위한 기본 지식 및 용어를 설명할 수 있다

음성 신호처리 음성 신호처리를 위한 시간과 주파수간의 관계를 이해하고, 정현파의 기본적인 개념과 특징을 파악할 수 있다.

4. Start Up! 음성 데이터 전처리에 대해 전반적으로 파악할 수 있다.

음성 데이터 전처리 이해 1 음성 데이터 전처리를 위한 음성신호와 주파수간의 관계를 이해하고, 푸리에 전환의 개념을 파악할 수 있다.

음성 데이터 전처리 이해 2 음성인식 학습 데이터 확보를 위한 스펙트럼, 스펙트로그램, MFCC의 개념을 파악할 수 있다.

음성 데이터 전처리 적용 음성 데이터 전처리 실습을 통해 음성인식 학습 데이터를 단계별로 적용해 볼 수 있다.

5. Start Up! 음향모델에 대해 전반적으로 파악할 수 있다.

음성학의 이해 음성학의 개념과 분류를 알아보고 음운론의 음소(Phoneme), 음절(Syllables), 단어(Words)를 구별할 수 있다.

음향모델 음성신호의 다양성과 음향모델의 특성을 파악하고, Context Dependency와 음향 모델공유에 대한 개념을 이해할 수 있다.

주요 음향모델 주요 음향 모델의 종류와 원리, 하이브리드 모델의 개념을 파악할 수 있다.

6. Start Up! GMM에 대해 전반적으로 파악할 수 있다.

GMM의 이해 GMM의 클러스터링을 이해하고 K-means 알고리즘의 Iteration 프로세스를 파악할 수 있다.

GMM 알고리즘 GMM과 E-M 알고리즘의 기본 구조를 이해하고, EM 알고리즘의 프로세스를 파악할 수 있다.

GMM 적용 음성인식과 GMM의 관계를 이해하고, 간단한 실습을 통해 적용해 볼 수 있다.

7. Start Up! HMM에 대해 전반적으로 파악할 수 있다.

HMM의 이해 음성인식에서의 HMM의 역할과 은닉상태에 대해 이해하고, Hidden Markov Chain에 대해 숙지할 수 있다.

HMM 알고리즘 1 HMM의 구조를 파악하고, HMM의 3가지 핵심 알고리즘 중 Forward Algorithm에 대해 파악할 수 있다.

HMM 알고리즘 2 HMM의 3가지 핵심 알고리즘 중 Viterbi Algorithm과 Forward-Backward Algorithm에 대해 파악할 수 있다.

9. Start Up! DNN에 대한 학습내용을 전반적으로 파악할 수 있다.

딥러닝 개요 1 딥러닝의 동작원리를 파악할 수 있다.

딥러닝 개요 2 딥러닝의 각 알고리즘의 흐름을 파악할 수 있다.

TensorFlow 실습 1 구글 TensorFlow의 실습환경을 파악하여 실습을 위한 환경을 설정할 수 있다.

TensorFlow 실습 2 구글의 TensorFlow를 이용해서 선형회귀와 XOR 문제를 해결하면서 DNN에 대한 이해를 심화할 수 있다.

Keras DNN 응용 1 추상 API를 제공하는 Keras를 이용해서 쉽고 빠르게 딥러닝을 응용할 수 있다.

Keras DNN 응용 2 추상 API를 제공하는 Keras의 회귀 문제 및 분류 문제를 이용해서 쉽고 빠르게 딥러닝을 응용할 수 있다.

10. Start Up! RNN에 대한 학습내용을 전반적으로 파악할 수 있다.

RNN 1 RNN의 동작 원리를 단계적으로 파악할 수 있다.

RNN 2 RNN의 동작 원리를 단계적으로 파악할 수 있다.

LSTM RNN의 핵심 원리를 파악할 수 있다.

텍스트 데이터 다루기 1 RNN을 이용하여 다양한 문제 해결에 응용할 수 있다.

텍스트 데이터 다루기 2 RNN을 이용하여 다양한 문제 해결에 응용할 수 있다.

11. Start Up! Hybrid 모델에 대해 전반적으로 파악할 수 있다.

Hybrid 모델 전통적인 음향모델과 하이브리드 음향 모델의 구조를 이해하고 하이브리드 음향 모델의 Loss 함수를 파악할 수 있다.

Advanced 모델 1 End to End 모델의 개념과 CTC 모델의 동작 방식을 파악할 수 있다.

Advanced 모델 2 Sequence to Sequence 모델의 개념과 LAS 모델의 구조를 파악할 수 있다.

12. Start Up! 언어모델에 대해 전반적으로 파악할 수 있다.

언어모델 언어모델의 역할과 유형을 이해하고 통계적 언어모델과 N-Gram 언어모델의 접근 원리 및 한계점을 파악할 수 있다.

딥러닝 기반 언어모델 피드포워드 신경망 언어모델과 RNN 언어모델의 동작원리를 이해하고 장단점을 파악할 수 있다.

언어모델 적용 언어모델의 주요 요소인 원-핫 인코딩, 워드 임베딩에 대해 파악하고 실습을 통해 RNN 언어모델을 적용해 볼 수 있다

13. Start Up! 음성합성에 대해 전반적으로 파악할 수 있다.

음성합성 이해 음성합성의 기본적인 개념과 구성요소를 파악하고 음성합성의 텍스트 분석, 발음분석, 운율 분석을 할 수 있다.

음성합성 유형 음성합성의 유형과 유형별 특징을 이해하고 연결합성과 파라미터 합성의 장단점을 파악할 수 있다.

딥러닝 기반 음성합성 전통적 음성합성 방식과 딥러닝 기반 음성합성의 차이점을 이해하고 딥러닝 기반 음성합성의 동작 원리 및 최근 동향을 파악할 수 있다.

14. Start Up! 음성언어 이해에 대해 전반적으로 파악할 수 있다.

음성언어 이해 음성언어의 개념과 특징을 이해하고 대화관리를 위해 고려해야 할 문제를 파악할 수 있다.

자연어 처리 자연어 이해의 개념과 주요 구성요소를 이해하고 자연어처리의 단계와 주요 기법을 설명할 수 있다.

키워드에 대한 정보 음성 데이터 전처리

다음은 Bing에서 음성 데이터 전처리 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [DMQA Open Seminar] Analysis of Sound Data

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기
[DMQA #Open #Seminar] #Analysis #of #Sound #Data


YouTube에서 음성 데이터 전처리 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [DMQA Open Seminar] Analysis of Sound Data | 음성 데이터 전처리, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment