Path: blob/master/site/ko/tutorials/audio/simple_audio.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
간단한 오디오 인식: 키워드 인식
이 튜토리얼에서는 WAV 형식의 오디오 파일을 사전 처리하고 10개의 다른 단어를 인식하기 위한 기본적인 자동 음성 인식(ASR) 모델을 구축하고 훈련하는 방법을 보여줍니다. "down", "go", "left", "no", "right", "stop", "up" 및 "yes"와 같은 명령의 짧은(1초 이하) 오디오 클립이 포함된 음성 명령 데이터세트(Warden, 2018)의 일부를 사용할 것입니다.
실제 음성 및 오디오 인식 시스템은 복잡합니다. 그러나 MNIST 데이터세트를 사용한 이미지 분류와 마찬가지로 이 튜토리얼은 관련된 기술에 대한 기본적인 이해를 제공합니다.
설치하기
필요한 모듈과 종속성을 가져옵니다. tf.keras.utils.audio_dataset_from_directory
(TensorFlow 2.10에 도입됨)를 사용하여 .wav
파일의 디렉터리에서 오디오 분류 데이터세트를 생성할 수 있습니다. 이 튜토리얼에서는 시각화를 위해 seaborn도 필요합니다.
미니 음성 명령 데이터세트 가져오기
데이터 로드 시간을 절약하기 위해 더 작은 버전의 음성 명령 데이터세트로 작업할 것입니다. 원본 데이터세트는 35개의 다른 단어를 말하는 사람들의 음성이 WAV(Waveform) 오디오 파일 형식으로 담겨 있는 105,000개 이상의 오디오 파일로 구성됩니다. 이 데이터는 Google에서 수집했으며 CC BY의 허가를 얻어 배포했습니다.
tf.keras.utils.get_file
을 사용하여 작은 음성 명령 데이터세트가 포함된 mini_speech_commands.zip
파일을 다운로드하고 압축을 풉니다.
데이터세트의 오디오 클립은 각 음성 명령에 해당하는 8개의 폴더(no
, yes
, down
, go
, left
, up
, right
및 stop
)에 저장됩니다.
이러한 방식으로 디렉터리를 나누면 keras.utils.audio_dataset_from_directory
를 사용하여 데이터를 쉽게 로드할 수 있습니다.
오디오 클립은 16kHz에서 1초 이하입니다. output_sequence_length=16000
은 짧은 클립을 정확히 1초로 채우고 긴 클립은 잘라 쉽게 일괄 처리할 수 있습니다.
이제 데이터세트에 오디오 클립과 정수 레이블의 배치가 포함됩니다. 오디오 클립의 형상은 (batch, samples, channels)
입니다.
이 데이터세트에는 단일 채널 오디오만 포함되어 있으므로 tf.squeeze
함수를 사용하여 추가 축을 삭제합니다.
utils.audio_dataset_from_directory
함수는 최대 두 개의 분할만 반환합니다. 테스트세트를 유효성 검증 세트와 별도로 유지하는 것이 좋습니다. 이상적으로는 별도의 디렉터리에 보관하지만 이 경우 Dataset.shard
를 사용하여 유효성 검사 세트를 두 부분으로 나눌 수 있습니다. 어떤 샤드든지 반복하면 모든 데이터가 로드되고 일부만 유지됩니다.
몇 가지 오디오 파형을 플롯해 보겠습니다.
파형을 스펙트로그램으로 변환하기
데이터세트의 파형은 시간 영역에서 표시됩니다. 다음으로, 시간-영역 신호의 파형을 시간-주파수-영역 신호로 변환합니다. 이를 위해 STFT(short-time Fourier transform)를 계산하여 시간에 따른 주파수 변화를 보여주고 2D 이미지로 나타낼 수 있는 스펙트로그램으로 파형을 변환합니다. 스펙트로그램 이미지를 신경망에 공급하여 모델을 훈련시킵니다.
퓨리에 변환(tf.signal.fft
)은 신호를 성분 주파수로 변환하지만 모든 시간 정보는 손실됩니다. 이에 비해 STFT(tf.signal.stft
)는 신호를 시간 창으로 분할하고 각 창에서 퓨리에 변환을 실행하여 일부 시간 정보를 보존하고 표준 콘볼루션을 실행할 수 있는 2D 텐서를 반환합니다.
파형을 스펙트로그램으로 변환하기 위한 유틸리티 함수를 생성합니다.
파형은 길이가 같아야 스펙트로그램으로 변환할 때 결과가 비슷한 차원을 갖게 됩니다. 이를 위해 1초보다 짧은 오디오 클립을 단순히 0으로 채울 수 있습니다(
tf.zeros
사용).tf.signal.stft
를 호출할 때 생성된 스펙트로그램 "이미지"가 거의 정사각형이 되도록frame_length
및frame_step
매개변수를 선택합니다. STFT 매개변수 선택에 대한 자세한 내용은 오디오 신호 처리 및 STFT에 대한 이 Coursera 비디오를 참조하세요.STFT는 크기와 위상을 나타내는 복소수 배열을 생성합니다. 그러나 이 튜토리얼에서는
tf.abs
의 출력에tf.signal.stft
를 적용하여 유도할 수 있는 크기만 사용합니다.
다음으로, 데이터 탐색을 시작합니다. 한 예의 텐서화된 파형과 해당 스펙트로그램의 형상을 출력하고 원본 오디오를 재생합니다.
이제 스펙트로그램을 표시하는 함수를 정의합니다.
시간에 따른 예제의 파형과 해당 스펙트로그램(시간에 따른 주파수)을 플롯합니다.
이제 오디오 데이터세트에서 스펙트로그램 데이터세트를 생성합니다.
데이터세트의 다양한 예에 대한 스펙트로그램을 살펴봅니다.
모델 빌드 및 훈련하기
모델을 훈련하는 동안 읽기 지연 시간을 줄이기 위해 Dataset.cache
및 Dataset.prefetch
작업을 추가합니다.
이 모델의 경우, 오디오 파일을 스펙트로그램 이미지로 변환했으므로 간단한 콘볼루션 신경망(CNN)을 사용합니다.
tf.keras.Sequential
모델은 다음과 같은 Keras 전처리 레이어를 사용합니다.
tf.keras.layers.Resizing
: 모델이 더 빨리 학습할 수 있도록 입력을 다운샘플링합니다.tf.keras.layers.Normalization
: 평균과 표준 편차를 기반으로 이미지의 각 픽셀을 정규화합니다.
Normalization
레이어의 경우, 집계 통계(즉, 평균 및 표준 편차)를 계산하기 위해 먼저 훈련 데이터에 대해 해당 adapt
메서드를 호출해야 합니다.
Adam 옵티마이저와 교차 엔트로피 손실을 사용하여 Keras 모델을 구성합니다.
데모 목적으로 10번의 epoch에 걸쳐 모델을 훈련합니다.
훈련 및 유효성 검증 손실 곡선을 플롯하여 훈련 중에 모델이 어떻게 개선되었는지 확인하겠습니다.
모델 성능 평가하기
테스트세트에서 모델을 실행하고 모델의 성능을 확인합니다.
혼동 행렬 표시하기
혼동 행렬을 사용하여 모델이 테스트세트의 각 명령을 얼마나 잘 분류했는지 확인합니다.
오디오 파일에 대한 추론 실행하기
마지막으로, "no"라고 말하는 사람의 입력 오디오 파일을 사용하여 모델의 예측 출력을 확인합니다. 모델의 성능은 어느 정도인가요?
출력에서 알 수 있듯이 모델은 오디오 명령을 "no"로 인식해야 합니다.
전처리로 모델 내보내기
추론을 위해 데이터를 모델에 전달하기 전에 이러한 전처리 단계를 적용해야 하는 경우 모델을 사용하기가 쉽지 않습니다. 따라서 전체 버전을 빌드하세요.
"내보내기" 모델을 테스트 실행합니다.
모델을 저장하고 다시 로드하면 다시 로드된 모델이 동일한 출력을 제공합니다.
다음 단계
이 튜토리얼에서는 TensorFlow 및 Python과 함께 콘볼루션 신경망을 사용하여 간단한 오디오 분류/자동 음성 인식을 수행하는 방법을 보여주었습니다. 자세히 알아보려면 다음 리소스를 살펴보세요.
YAMNet을 사용한 사운드 분류 튜토리얼 - 오디오 분류를 위해 전이 학습을 사용하는 방법을 보여줍니다.
Kaggle의 TensorFlow 음성 인식 챌린지에 기초한 노트북
TensorFlow.js - 전이 학습 코드랩을 사용한 오디오 인식 - 오디오 분류를 위한 대화형 웹 앱을 직접 구축하는 방법을 알려줍니다.
음악 정보 검색을 위한 딥 러닝 튜토리얼(Choi 등, 2017) - arXiv에서 제공
TensorFlow에서 오디오 데이터 준비 및 확장을 위한 추가 지원 제공 - 자체 오디오 기반 프로젝트를 쉽게 진행할 수 있습니다.
음악 및 오디오 분석을 위해 librosa 라이브러리 사용을 고려합니다.