개요

 

일반적으로 Audio source separation을 위한 모델은 spectrogram 기반 프로세싱을 많이 하고, phase 정보를 무시하고, magnitude 정보만을 가지고 처리한다.

 

이로 인한 한계가 있고, 최근 이를 해결하기 위한 방법으로 spectrogram-based processing이 아닌, Time-domain waveform 기반으로 하는 모델들이 나오고 있다.

 

그 중 대표적인 모델인 WAVE-U-NET 에 대해서 내 마음대로 간단하게 리뷰 해보고자 한다.

 

 

Wave-U-Net 아키텍처

 

우리의 목표는 주어진 Mixture waveform 을 2개의 Source waveform으로 나누는 것이다.

 

Fig 1은 Wave-U-Net 아키텍처의 다이어그램이다. 먼저 크게 2가지 부분으로 구성되어 있다. 이 두 부분은 Fig 상에서 왼쪽(노란색), 오른쪽(초록색) 부분인데, 나는 각각 이 큰 덩어리를 encoder/decoder라고 명명하고 설명하겠다.

 

 

 

[Fig 1] Wave-U-Net 아키텍처 다이어그램

 

 

 

먼저 인코더 부분은 여러 downsampling block의 연속으로 구성되어 있다. 각각의 downsampling block들은 또 2가지 모듈로 구성되어 있는데, 그것은 1D Conv 모듈/ Downsampling 모듈이다. 여기서는 1D-Conv를 통해서, Time domain에서 많은 High-level features map을 추출해 내고,  downsampling을 하며 시간 단계에 대해 특정한 패턴을 따르며 time sample들을 무시하여 Time resolution을 절반으로 줄인다.

 

다음으로, 디코더 부분을 살펴보면, upsampling block의 연속으로 구성되어 있다. upsampling block은 이전과 비슷하게 1D Transposed Conv와 Upsampling 모듈로 구성이 되어 있다. 이 때, Conv와 여러가지 Linear interpolation등의 여러가지 보간 방법을 사용한다.

 

그리고 추가로, 중요한 부분은, Upsampling 경로의 각 Layer는 skip-connection을 통해 downsampling 경로의 해당 Layer에 연결된다.

 

 

다시 한번 설명하면, 

 

Downsampling  블록을 사용하여 Time domain에서 많은 High-level features을 추출해 낸다. 이러한 기능은 Upsampling (US) 블록을 사용하여 이전에 계산 된 Local의 High-resolution features과 결합되어 예측에 사용되는 Multi-Scale 기능을 제공한다. Network에는 L개의 레벨이 있으며 각 연속 레벨은 이전 레벨의 절반 시간 분해능으로 작동한다.

 

이를 위해 제일 먼저 1D-Convolution를  Time domain waveform에 대해 적용한다. 논문에서는 downsampling/upsampling을 위해 각각 24 hidden conv layers with 15 filter size / 12 hidden conv layer with 5 filter size 를 사용했다. 또한 Optimization을 위해서 batchnorm 을 적용하고, activation fucntion으로는 LeakyRelu, 마지막 layer에는 tanh를 사용한다. 

 

Decimation 단계에서는 시간 단계에 대해 특정한 패턴을 따르며 feature(time sample)들을 무시하여 Time resolution을 절반으로 줄인다.

 

Upsampling 단계에서는 시간 방향으로 2 배씩 업 샘플링을 수행하기 위해 Linear Interpolation을 사용한다. 이 때, aliasing 이 생기는데, 이것을 해결하기 위한 다른 방법들을 논문의 뒤에서 추가 설명/제안 한다.

 

Concat (x)는 현재의 High-level feature들과 더 많은 local feature들을 연결(skip-connection)한다. 

 

 

Avoiding aliasing artifacts due to upsampling

 

개인적으로 wave-u-net에서 알고리즘에서 가장 중요한 부분은 upsampling 시, 발생하는 alising 문제를 어떻게 해결하는 방법에 관한 것이다.

 

feature map을 upsampling하기 위해 일반적으로 transposed convolutions with strides 을 사용한다. 이는 aliasing 같은 artifact를 발생시킨다.

 

k의 필터 크기와 1이상의 stride인 Transposed convolutions은 각 원래 값 사이에 x-1만큼 0으로 채워진 feature maps에 적용된 convolutions으로 볼 수 있다. 이는 subsequent low-pass filtering 없이 0으로 interleaving하면, 최종 출력에서도 high-frequency noise가 발생한다.

 

해결방법 I : Linear Interpolation

 

그래서 upsampling을 위해 transposed strided convolutions 대신, linear interpolation을 수행하여 feature space에서 시간적 연속성을 보장 한 다음 normal 컨벌루션을 수행했다고 한다.

 

해결방법 II :  Learned upsampling

 
추가 성능 개선을 위해서 wave-u-net 원 논문에서는 다른 방법도 제시한다.

upsampling을 위해 Linear interpolation은 아주 간단한 해결 방법이기에 성능이 제한될 수 있다.

 

왜냐하면 네트워크의 feature maps들에 사용 되는 feature spaces은 feature spaces의 두 지점 사이의 linear interpolation이 그 자체로 유용한 지점이되도록 학습되지 않았기 때문이다. 만약에 upsampling 되는 feature가 학습 가능하다면 upsampling으로 인한 성능을 더욱 향상시킬 수 있을 것이다.

 

이를 위해 논문에서는 학습 된 upsampling Layer을 제안한다. n 개의 time steps를 갖는 주어진 F × n feature map에 대해, 우리는 매개 변수 W 및 Sigmoid 함수 σ를 사용하여 이웃 한 feature pair f_t, f_t + 1 에 대해 interpolated feature f_t + 0.5 를 계산한다. 수식은 다음과 같다:

 

 

 

이것은 패딩되지 않은 크기가 2 인 F filters를 사용하는 1D convolution으로 구현 될 수 있다.

 

학습 된 interpolation layer는 0.5 이외의 가중치를 가진 featuresconvex한 조합을 허용하므로, 간단한 linear interpolation의 일반화로 볼 수 있다.

 

Prediction with proper input context and resampling

 

 

[Fig 2] a) 일반적인 wav-unet 모델, b) 제안하는 sampling 적용 모델

 

 

a) 경계에 아티팩트를 생성하기 전에 균등하게 입력 된 수의 입력이 포함 된 공통 모델이다 (Common model with an even number of inputs which are zero-padded before convolving, creating artifacts at the borders.). Decimation 후, stride 2를 사용하여 transposed convolution은 여기에서 upsampling by zero-padding intermediate and border values, 다음에 일반 Conv가 발생하여, 출력에서 high-frequency artifacts를 발생시킬 수 있다.

 

b) 섹션 3.2.2의 upsampling을 위한 적절한 input context와 linear interpolation을 가진 모델은 zero-padding을 사용하지 않는다. features의 수는 불균일하게 유지되므로 upsampling에는 extrapolating 값 (red arrow)이 불필요하다. 출력은 더 작지만 artifacts는 예방할 수 있다.

 

 

이전 작업에서, 입력 및 feature mapsconvolving하기 전에 0으로 채워지므로, [Fig 2a]와 같이 결과 feature mapdimension가 변경되지 않는다.

 

그래서 입력 및 출력 dimensions이 동일하므로 네트워크 구현이 간단해진다. 이러한 방식으로 Zero-padding 오디오 또는 spectrogram 입력은 시작과 끝에서 무음을 사용하여 입력을 효과적으로 확장한다.

 

그러나, 전체 오디오 신호의 임의의 위치로부터 취해지면, boundary에서의 정보는 인공적으로된다. 즉, 이 excerpt에 대한 시간적 맥락은 전체 오디오 신호에 주어 지지만 무시되고 silent 로 가정된다.

 

적절한 context 정보가 없으면 네트워크는 sequence의 시작과 끝 근처에서 출력 값을 예측하기가 어렵다.

 

결과적으로, 전체 오디오 신호에 대한 예측을 얻기 위해 테스트 시간에 출력을 겹치지 않는 segment로 연결하면 정확한 context 정보없이 인접 출력이 생성 될 때 인접 출력이 일치하지 않을 수 있으므로 세그먼트 경계에서 audible artifacts를 생성 할 수 있다.

 

이것의 해결책으로, 논문에서는 padding 없이 convolutions을 사용하고, 대신 출력 예측의 크기보다 큰 mixture input을 제공하여 convolutions이 적절한 audio context에서 계산되어 출력 되도록 한다 [Fig 2b 참조].

 

이렇게하면 feature map size가 줄어들기 때문에, 네트워크의 가능한 출력 크기를 제한하여 feature maps이 다음 convolution에 대해 항상 충분히 클 수 있다.


또한, feature mapsresampling 할 때, [Fig 2a] 와 같이, transposed strided convolution에 대한 feature dimensions는 정확히 절반으로 또는 두 배가된다. 

 

그러나 이것은 반드시 경계에서 적어도 하나의 값을 삽입하는 것이고, 이 역시도 아티팩트를 생성한다.

 

대신, 우리는 알려진 이웃 값들 사이에서만 interpolate하고 첫 번째와 마지막 항목을 유지하여 [Fig 2b]에 표시된 것처럼 n에서 2n-1 항목을 생성하거나 그 반대로 생성합니다. 

 

decimation 후 중간 값을 복구하기 위해, 경계 값을 동일하게 유지하면서, feature mapdimensionality가 홀수인지 확인한다.

 

 

 

References

 

[1] WAVE-U-NET: A MULTI-SCALE NEURAL NETWORK FOR END-TO-END AUDIO SOURCE SEPARATION, https://arxiv.org/abs/1806.03185

 

K. Han et al, "Deep Neural Network Based Spectral Feature Mapping for Robust Speech Recognition," Interspeech 2015. [1]

-일반적으로 사용되는 DNN, LSTM, CNN을 이용한 spectral feature mapping 논문들은 성능 측정 measure로 PESQ, SDR, STOI 등을 제시, but 최종 ASR을 위한 WER measure 측면에서 성능 향상을 원함-> DL 구조 output 을 일반적인 filterbank or MFCC 로 사용함.

- CHiME-2 noisy living room reverberant & noisy 로 테스트

 

 

 

K. Wang et al, "Investigating Generative Adversarial Networks based Speech Dereverberation for Robust Speech Recognition," Interspeech 2018. [2]

- GAN의 Generator을 반향 제거를 위한 enhancer로 사용.

- 위의 논문의 결과대로 G의 output 은 MFCC 를 사용함

- GAN training을 위해 LSGAN, CGAN 등을 시도

- 샤오미 논문으로, 데이터는 연구용이 아닌 실제 서비스를 위한 많은 데이터 사용.

- ASR 을 위한 데이터 따로 존재. 클린으로만 ASR AM training, Multi-condition Training (MCT)- noisy로도 ASR AM training 따로 실험.

 

 

 

 

 

 

사진 설명을 입력하세요.


 

[1] K. Han et al, "Deep Neural Network Based Spectral Feature Mapping for Robust Speech Recognition," Interspeech 2015.

[2] K. Wang et al, "Investigating Generative Adversarial Networks based Speech Dereverberation for Robust Speech Recognition," Interspeech 2018. 

 

 

 

General challenges in incorporating microphones

 

제품에 들어가는 엔지니어링 마이크는 일반적으로 마이크와 그 어플리케이션에 내재된 문제로 복잡하다.

 

대부분의 마이크에 내재된 한 가지 문제는, 낮은 신호 대 잡음 비율(SNR)이다.

우리는 보통 오디오 전자장치로 90dB 이상의 SNR을 예상하지만, 일반적인 마이크는 60dB의 범위에서 SNR을 가진다.

 

이 문제를 복잡하게 만드는 것은 마이크가 종종 큰 dynamic range를 커버해야 한다는 것이다. 마이크에 30dB SPL만큼 조용한 소리가 들어갈 수도 있고, 1초 후에 2cm 거리에서 110dB SPL로 소리치는 인간의 목소리 또는 가까운 거리에서 130dB만큼 크게 울리는 드럼을 다룰 수 있다. 이 높은 dynamic range는 가장 큰 peak를 수용하지만, 과도한 소음을 발생시키지 않는 gain level을 달성하는 것이 어려울 수도 있다. 대부분의 마이크로폰에 필요한 high-level preamp 회로도 과도한 소음을 발생시킬 수 있다.

 

 

음원과 관련된 마이크의 위치는 스피커폰이나 디지털 카메라와 같은 어플리케이션에서는 예측할 수 없으며, 소스는 1cm 또는 100m까지 떨어져 있을 수 있다. 환경은 때때로 예측할 수 없다; 그것은 40dB SPL의 조용한 방일 수도 있고 100dB SPL의 붐비는 클럽일 수도 있다. 종종, 같은 브랜드와 모델이 수많은 어플리케이션에 걸쳐 지정될 수도 있다. 따라서 이러한 모든 조건과 그 이상을 수용해야 한다.

 

마이크를 위한 어플리케이션의 대부분은 휴대용 장치에 있으며, 이것은 추가적인 문제를 야기한다. 포터블 제품은 소형인 경향이 있으며, 폼 팩터가 설계자의 마이크로 배치 옵션을 제한하기 때문에 성능이 저하되는 경우가 많다. 이 제품들은 대부분 배터리로 구동되며, 한 자릿수 전압 공급만 수중에 있고 종종 몇 시간만 작동한다.

 

 

Specific challenges in incorporating microphones

 

위에서 언급한 일반적인 과제 외에도, 많은 특정 마이크 설계와 애플리케이션은 오디오 엔지니어에게도 도전 과제를 제시한다. 여기에는 다음이 포함된다.

 

- DC offset: 많은 마이크, 특히 MEMS와 콘덴서 유형은, 출력 시 정상 상태 DC 전압을 발생시키며, 이는 다운스트림 구성 요소에 손상을 줄 수 있기 때문에 제거해야 한다.

 

 

 

 

- Non-flat frequency response: 많은 마이크로폰은 높은 주파수 및/또는 낮은 주파수에서 상당한 롤오프 또는 부스트를 나타내며, 인클로저에 장착된 마이크는 큰 비선형성을 발생시키는 경향이 있으며, 그 중 다수는 미드레인지에 있으므로 쉽게 들을 수 있다.

 

 

 

- Output mismatch with multiple mics: 제조 분산으로 인해 마이크는 샘플 간 출력 전압에 상당한 차이를 보일 수 있다. 단일 마이크를 사용할 경우, 이것은 완제품의 성능 차이를 야기할 수 있다. 출력 불일치는 또한 소음/풍력 취소 및 다중 마이크에 의존하는 방향성 음향 수신과 같은 기술의 유효성을 감소시킨다.

 

- Environmental noise: 마이크로폰은 소음 환경에서 작동해야 하는 경우가 많으며, 원하는 소음에 미치는 영향이 최소화된 환경 소음을 제거해야 하는 경우가 많다.

 

- Essing and popping: 근거리 음성 애플리케이션은 downstream circuit에서 왜곡을 일으킬 수 있는 sebilant and plosive sounds (문자 B, D, G, K, P, T)의 높은 공기 속도를 처리할 수 있는 능력을 필요로 한다.

 

- Wind Noise: 대부분의 모바일 애플리케이션에서, 공기는 종종 마이크 바람이나 움직임 때문에 마이크를 가로질러 흐른다. 이것은 원하는 소리를 가릴 수 있는 저주파수 럼은 물론 중, 고주파수 노이즈를 발생시킨다.

 

- Interference from nearby speakers: 마이크로폰은 종종 스피커 시스템과 근접하거나 스피커 시스템과 연계하여 작동해야 하는데,이들의 소리는마이크로폰으로 새어나와 방해나 피드백을 만들어 낼 수 있다.

 

 

Solutions to problems encountered with microphones

 

위에서 인용한 각각의 문제는 신호 처리를 통해 해결할 수 있다. 대부분의 경우, 각각은 고유의 특정한 해결책을 필요로 한다.

 

DC offset

DC 오프셋은 오디오 범위에 영향을 미치지 않을 정도로 낮은 주파수로 설정된 고역 통과 필터를 사용하여 차단할 수 있다. 일반적으로 필터는 2차 순서(12dB/octave) 또는 steeper가 되며, 일반적으로 -3dB point가 10Hz 전후가 된다. 필터는 용도에 맞게 조정되어야 한다. deep bass response 이 문제가 아닐 경우 더 higher frequencies and gentler slopes 를 사용할 수 있다. 일부 base response을 희생하면서 마이크 핸들링 소음과 저주파수 rumble을 reject하기 위해 필터는 오디오 대역의 주파수(일반적으로 80Hz)로 설정할 수도 있다.

 

Non-flat frequency response

마이크 또는 마이크 인클로저에 내재된 주파수 응답 비선형성은 필터를 사용하여 제거할 수 있다. 저역 통과 및/또는 고역 통과 필터는 상승 또는 하강 베이스 또는 트레블 응답을 교정할 수 있다. 밴드패스 및 밴드 제거 필터는 인클로저의 음반사 및/또는 공명 때문에 발생하는 반응 피크 및 딥을 교정할 수 있다.

 

필터는 또한 많은 다른 목적에도 도움이 된다. 예를 들어, 음성 수신 및 인지도를 높이기 위해 미드레인지 부스트 필터(일반적으로 약 2kHz 중심 밴드패스 필터)를 사용하는 경우가 많다. 필터는 또한 주관적인 음질을 최적화하도록 조정될 수 있다.

 

또한 특정 가수의 특성에 맞는 베이스 축소 또는 트레블 응답과 같은 선택 가능한 사운드 모드를 만들 수 있다. 재생산 체인을 알면 필터는 소형 스피커를 사용할 때 베이스 응답을 줄이는 등 재생 장치의 기능에 맞게 마이크 응답을 최적화하도록 조정할 수 있다.

 

 

Output Level Mismatch

제조상의 불일치로 인한 마이크 출력 수준의 불일치는 신호 처리를 통해 보정 또는 자동 게인 제어의 두 가지 방법으로 해결할 수 있다.

 

공장 교정은 마이크를 포함하는 완제품에 가장 적합하다. 테스트 톤을 재생하고, 각 마이크의 출력을 측정하고, 해당 마이크에 대한 적절한 이득을 계산한 다음, 해당 마이크가 설치된 제품의 펌웨어에 해당 게인 설정을 로드하는 것을 포함한다. 현장 교정은 종종 별도로 구매하는 여러 대의 마이크를 사용하는 음향 보강 및 홈 씨어터 애플리케이션에 적합하다. 마이크를 함께 놓고, 테스트 톤을 재생하고, 각 마이크의 출력이 처리되어 모두 일치한다.

 

자동 게인 제어는 각 마이크에서 나오는 신호 레벨을 모니터링하고 모든 마이크가 원하는 평균 또는 피크 레벨을 생성하도록 게인을 조정한다. 특히 멀티채널 사운드 레코딩과 같이 수신할 소리의 환경 및/또는 특성을 알 수 없는 애플리케이션에 적합하다.

 

다이나믹 레인지 관리 앞에서 설명한 것처럼 마이크와 그에 수반되는 전자제품이 전체 다이나믹 레인지를 포착하기 어려운 상황이 많다. 게인이 너무 높게 설정되면 예상치 못한 큰 소리가 왜곡을 일으킬 수 있다. 게인을 너무 낮게 설정하면 마이크에 연결된 아날로그-디지털 변환기(ADC)는 최대 비트 수를 사용할 수 없으므로 필요 이상으로 많은 노이즈를 발생시킨다.

 

 

 

동적 범위 관리를 위한 한 가지 해결책은 이전 섹션에서 설명한 자동 게인 제어다. 마이크로폰의 레벨은 모니터링되고 자동으로 조정되어 소음이 최소화될 수 있을 정도로 레벨이 높지만 0dBFS를 초과해서는 안 되며 따라서 클리핑이 발생하지 않는다.

 

관련 솔루션은 압축기/한계기로, 고정 신호 처리를 사용하여 음질과 녹음 품질을 최적화한다. 리미터에서 미리 결정된 임계값을 초과하는 신호는 레벨에서 감소되어 임계값을 초과하지 않거나, 임계값을 한 번 초과하면 상승 속도가 특정 비율로 감소하는데, 이는 보통 조절이 가능하다. 압축기는 약한 신호의 수준을 높이는 기능과 리미터와 결합한다. 이 조합은 ADC 과부하 위험성이 훨씬 적은 동적 범위를 가진 신호를 발생시킨다.

 

압축기/제한기를 사용하여 마이크가 집는 소리의 품질을 최적화할 수도 있으며, 예를 들어, 소음이 심한 환경에서 음성을 듣고 이해하는 데 도움이 되는 평균 신호 레벨을 생성할 수 있다. 마이크 신호 운하를 압축하면 자체 압축기/제한기 처리가 없는 소형 스피커와 같이 다운스트림 구성 요소에 대한 응력을 줄이고 출력을 최대화할 수 있다.

모든 압축기/제한기는 필터를 추가함으로써 주파수에 따라 달라질 수 있다. 예를 들어, 큰 베이스 소음을 제어해야 하지만 미드레인지 및 트레블 소리가 제어되지 않는 경우, 저역 통과 필터를 압축기/제한기보다 먼저 사용할 수 있으며, 압축기/제한기 출력은 고역 통과 필터링 및 비압축 신호와 재결합된다.

 

Noise / Hiss

소음과 소음은 낮은 SNR과 환경 소음을 발생시키는 경향이 있기 때문에 마이크의 일반적인 문제들이다. 이 소음은 주의를 산만하게 할 수 있다. 듣는 사람에게 귀찮은 이 문제를 완화하거나 제거하기 위해 소음 게이트를 사용할 수 있다. 소음 게이트는 일반적으로 레벨이 일정 수준 이하로 떨어질 때 오디오 신호를 음소거한다. 신호에 중요하거나 청각적인 소리가 없는 경우. 소음 게이트의 문턱값(신호가 음소거되는 아래의 신호 수준)은 불필요한 소리를 차단하거나 음소거 또는 과도한 소음을 허용하지 않도록 조정해야 한다.

 

 

 

 

압축기/제한기와 마찬가지로 소음 게이트는 필터로 신호 체인에 선행함으로써 주파수에 따라 달라질 수 있다. 예를 들어 기계류에서 발생하는 저주파 웅성거림이 소음 게이트를 부적절한 시간에 열어두기에 충분할 경우 저주파 구성요소는 소음 게이트의 수준 감지 입력에서 걸러낼 수 있으므로 게이트의 작동은 고주파 음에만 영향을 받는다.

 

Environmental and wind noise

많은 다른 마이크 신호 처리 기술은 시끄러운 환경 또는 바람 소음에서 원하는 소리를 쉽게 들을 수 있도록 한다. 이러한 기법에는 단순한 필터링부터 노이즈 취소, 고급 멀티 마이크로폰 어레이에 이르기까지 모든 것이 포함된다.

 

필터링은 예상되는 소음 유형을 거부하도록 조정할 수 있다. 예를 들어, 실외 애플리케이션(즉, 작용 캠)을 위한 마이크는 바람과 도로 소음의 저주파 성분을 줄이기 위해 고역 통과를 필터링할 수 있다. 의 범위가

원하는 소리는 상당히 좁다. 예를 들어 대부분 100Hz에서 3kHz까지의 범위인 인간의 음성이나 1kHz를 중심으로 한 대부분의 소닉 에너지를 가진 총성과 같이, 밴드 패스 필터를 사용하여 그 범위를 강조할 수 있다.

 

여러 대의 마이크를 사용하면 소음을 더 효과적으로 취소할 수 있다. 두 개의 마이크(두 번째 마이크로 더 멀리 떨어져 있는 피사체 근처에 위치한 기본 마이크)가 스피커폰에 사용될 때, 두 개의 음량 모두 동일한 음량으로 나타난다.

마이크는 감쇠될 수 있고, 따라서 원하는 소리의 상대적 수준을 증가시킬 수 있다.

 

마이크와 관련된 피사체의 위치가 알려지면, 복수의 마이크를 배열하면 피사체를 환경으로부터 분리하는 데 도움이 되는 방향 픽업 패턴을 생성할 수 있다. 소리는 약간 다른 시간에 배열의 다양한 마이크에 도달한다. 올패스 필터를 사용하여 배열의 특정 마이크에서 위상을 이동시킴으로써 특정 방향에서 도달하는 소리는 증폭되고 다른 방향에서 오는 소리는 감쇠된다.

 

Essing and popping

보컬 어플리케이션에서 Essing과 poping 하는 것은 일반적으로 두 가지 방법을 사용하여 최소화된다. 즉, 플롯과 시빌리언트 사운드가 내는 큰 피크를 줄이는 압축기/제한기와 성가신 주파수에서 출력을 줄이는 필터 또는 필터를 사용한다. 약 100Hz의 고역 통과 필터는 음성 품질에 큰 영향을 미치지 않고 "팝스"의 베이스 성분을 플롯 사운드로 줄일 수 있다. 2에서 밴드 제거 필터

3kHz 범위를 사용해 형성을 줄일 수 있다. 이 두 필터 모두 음질을 크게 줄이지 않고 효과를 극대화하도록 조정해야 한다.

 

Interference from speakers

확성기 앞에서 마이크를 사용해야 하는 경우, 스피커에서 나오는 소리의 픽업은 확성기 공급 신호가 알려진 경우(예: P.A. 시스템 또는 Bluetooth 스피커) 상당히 감소할 수 있다. 스피커에 공급되는 신호는 위상 역전된 다음 마이크에서 나오는 신호와 적절한 수준에서 결합되어 음향 에코 취소 기능을 만든다. 그런 다음 스피커에서 나오는 소리는 감쇠되거나 취소되므로 원하는 소리를 마이크가 집어드는 데 방해가 되지 않는다.

 

Difficulties in implementing microphone processing

최적의 성능을 위해 마이크를 사용하는 대부분의 어플리케이션은 위의 기법의 조합을 필요로 한다. 오디오 엔지니어에게 이러한 조합은 구현하기 어려울 수 있다.

 

아날로그 회로를 사용하여 여러 개의 마이크로 신호 처리 단계를 만드는 것은 대개 비현실적이다. 왜냐하면 아날로그 프로세싱의 여러 단계가 과도한 소음을 발생시키는 경향이 있기 때문이다. 회로의 개발과 튜닝은 너무 많은 시간이 소요되며, 결과 제품은 너무 비쌀 수 있기 때문이다.

 

디지털 신호 처리(DSP)는 이러한 문제를 해결할 수 있지만, 위에서 설명한 많은 기능들은 DSP 칩을 위한 주식 프로그래밍 인터페이스에서 사용할 수 없는 정교한 알고리즘을 필요로 하며, 구현하기 위해서는 상당한 DSP 코딩 스킬이 필요하다. 또한 이러한 처리 기법을 실행하는 데 필요한 정교한 알고리즘은 강력한 DSP 칩을 필요로 하며, 가급적 32비트 처리 능력을 갖추고 있어야 한다.

 

이러한 알고리즘을 실행하는 DSP 칩은 대부분의 경우 배터리 또는 에너지 효율적인 전원 공급 장치에서 저전압으로 작동할 수 있어야 한다. 일부 애플리케이션은 보안 및 건강 모니터링 장비, TV와 Amazon Echo 스마트 Bluetooth 스피커와 같은 자동차 및 가전 제품에 사용되는 음성 명령 시스템 등 DSP를 항상 실행해야 한다. 이러한 애플리케이션에서 제품의 핵심 오디오 프로세싱 구성 요소는 항상 켜져 있어야만 제품을 최대 전원으로 끌어올 수 있는 사용자의 트리거 단어를 감지하고 명령을 실행할 수 있다. 에너지 효율에 대한 우려 때문에, 전력 소비량을 매우 낮은 수준으로 유지하는 것이 바람직하다. 종종 단지 몇 밀리와트에 지나지 않는다.

 

 

마이크를 사용하는 제품의 설계와 튜닝은 DSP 프로그래밍에 사용되는 것과 상당히 다른 기술을 필요로 한다. 소수의 DSP 엔지니어만이 오디오 제품을 설계하고 성능을 최적화할 수 있는 엔지니어링 지식과 경험을 보유하고 있다. 그러나 DSP 코딩 기술을 보유한 오디오 엔지니어는 거의 없다.

 


 

[1] https://dspconcepts.com/sites/default/files/digital_microphone_processing_paper.pdf

 

FST와 ASR에 대한 내용은 "Speech Recognition with Weighted Finite-State Transducers" by Mohri, Pereira and Riley (in Springer Handbook on SpeechProcessing and Speech Communication, 2008) 을 참조. 이곳에 Kaldi가 사용하는 일반적인 접근 방식이 설명되어 있지만, 구체적으로 disambiguation symbols를 처리하는 방법과 weight-pushing을 처리하는 방법과 관련하여 일부 세부 사항이 다르다.

 

Overview of graph creation

 

디코딩 그래프 생성을위한 전반적인 overview는 그래프 HCLG = H o C o L o G를 구성하는 것이다. 각각의 심볼의 의미는 다음과 같다.

 

G는 grammar 또는 language model을 인코딩하는 acceptor (즉, 입력 및 출력 기호가 동일함)
L은 lexicon 입니다. output symbols 는 단어이고 input symbols 는 phones
C는 context-dependent 을 나타냄 : 
	출력 심볼은 phones 이고 
    입력 심볼은 context-dependent phones , 
    즉 N phones 의 windows 를 나타내고; 발음 문맥 창을 참조.
H는 HMM 정의를 포함한다. 
	출력 기호는 상황에 따른 phones 를 나타내며 
    입력 기호는 전이 ID이며 pdf-id 및 기타 정보를 인코딩한다 
    (TransitionModel에서 사용되는 정수 식별자 참조).

 

 

 

세부적인 내용은 밑에서 계속해서 설명한다. 출력을 결정하고 최소화하기 위해 HCLG를 결정하려면 disambiguation symbol를 삽입해야한다.

 

또한 HCLG가 가능한 한 stochastic 이길 원하고, 이것은 기존 레시피에선 "weight-pushing" 동작으로 수행된다. stochacity를 보장하기위한 Kaldi의 접근 방식은 다르며, no graph creation step "takes away" stochasticity보장한다. 자세한 내용은 이곳에서 확인 (Preserving stochasticity and testing it)

 

한 줄로 요약하면, 다음과 같을 것이다.

 

HCLG = asl(min(rds(det(H' o min(det(C o min(det(L o G))))))))

where asl=="add-self-loops",
      rds=="remove-disambiguation-symbols", 
      H' == H without the self-loops

 

 

 

weight-pushing 는 레시피의 일부가 아니다. 대신 우리는 G가 stochastic이라면 graph creation sate 가 확률적 결과를 막지 않도록하는 것을 목표로한다. 물론, G는 backoff 기능이있는 Arpa 언어 모델이 FST로 표현되는 방식 때문에, 일반적으로 상당히 stochastic이지 않지만, 적어도 우리의 접근 방식은 non-stochasticity "stays put" 를 유지하고 시작했을 때보다 더 나빠지지 않도록한다. 접근 방식은 weight-pushing 작업이 실패하거나 상황을 악화시키는 위험을 피한다.

 

 

Disambiguation symbols

 

Disambiguation symbols lexicon에서,phonemene sequences의 끝에 삽입되는 기호 #1, #2, #3 같은 것들이다.

1) phonemene sequences가 lexicon에서 다른 phonemene sequences의 prefix (접두어) 이거나

2) 둘 이상의 단어로 나타나는 경우, 뒤에 이 기호 중 하나를 추가해야한다.

-> 이 Disambiguation symbols은 the product (L o G)가 determinizable위해 필요하다.

 

3) LM model G의 backoff arcs 에 symbol #0 를 놓는다. 이를 통해 determinizable알고리즘이 epsilons을 제거하기 때문에 epsilons을 제거한 후 G를 결정할 수 있다(determinizable).

4) 우리는 utterance의 시작 부분에서 symbols을 출력하기 전에 context FST (C)의 왼쪽에 나타나는 epsilons대신에 symbol #1을 놓는다. empty phonetic representation이 있는 단어 (예 : 문장 기호 <s> 및 </ s>의 시작과 끝)가 있을 때 발생하는, 다소 작은 문제를 해결하는 데 필요하다.

 

 

다음은 Graph compilation의 중간 단계 (예 : LG, CLG, HCLG)가 결정 가능(determinizable)하다는 것을 공식적으로 증명하는 방법에 대한 overview이다. 이는 레시피가 절대 실패하지 않도록하는 데 중요하다.

 

일반적인 설정은 다음과 같다.

1) G를 결정할 수 있어야 한다. 그렇기 때문에 #0 기호가 필요하다 (G는 실제로 결정적이므로 결정 가능하다). 2) 그런 다음 L을 결정 가능한 G에 대해 L o G를 결정할 수 있도록 한다. [G 대신 오른쪽에 L o G가있는 C도 마찬가지입니다.] 여전히 이론에 대한 많은 세부 사항이 있지만, L이 다음과 같은 두 가지 property을 갖는 것으로 충분하다고 생각한다.

 

1) 

은 작동해야만 한다

- equivalently: any input-sequence on L must induce a unique output-sequence

- equivalently: for any linear acceptor A, A o L is a linear transducer or empty.

2) L has the twins property, i.e. there are no two states reachable with the same input-symbol sequence, that each have a cycle with the same input sequence but different weight or output sequence.

 

C Transducer 에도 동일하게 적용된다. 우리는 스크립트와 프로그램이 현재 생성하는 변환기는 이러한 property를 가지고 있다.

 


The ContextFst Object

 

ContextFst 객체 (C)는 context-dependent phones 에서 context-independent phones로의 transducer를 나타내는 동적으로 생성 된 FST object 이다. 이 object의 목적은 context 에서 가능한 모든 phones를 열거 해야하는 것을 피하기 위한 것이다. context 에서 가능한 모든 phones를 열거 해야하는 것은 Context width (N) 또는 phones의 개수가 클 때 어려울 수 있다.

 

생성자 ContextFst::ContextFst는 context-width (N)과 central-position (P)를 필요하다(triphone 시스템에 각각 N=3과 P=1). (추가설명:Phonetic context windows)

 

또한 모든 phones을 본 후 FST에서 N-P-1을 출력하는 특수 기호 인 "subsequential symbol"(위에서 '$'라고 함)의 integer ID가 필요하다 (이로 인해 context FST is output-deterministic이 보장됨). 이 외에도 integer id's of the phones및 disambiguation symbol 목록이 필요하다.

 

ContextFst의 출력 측 vocabulary set of phones및 disambiguation symbols와 subsequential symbol로 구성된다.

 

입력측의 vocabulary는 동적으로 생성되며 (사용되지 않는 epsilon제외) phones in context, disambiguation symbols 그리고 "전통적인 레시피"에서 "#에서 엡실론을 대신하는 #-1로 쓰는 특수 기호(다른 disambiguation symbol로 취급(예 : 엡실론 제거 등 선호하는 의미에서 결정성을 보장하는 데 필요함) 에 해당한다. The vocabulary on the input side is dynamically generated and (apart from epsilon, which is not used), corresponds to phones in context, disambiguation symbols, and a special symbol that we write as #-1 that takes the place of epsilon in the "traditional recipe", but which we treat as any other disambiguation symbol (it is necessary to ensure determinizability in the sense we prefer, i.e. with epsilon removal).

 

 

전통적인 레시피에서와 같이 subsequential symbol'$'는 입력측에 해당하는 것이 없다. 입력측에서 disambiguation symbols에 대응하는 symbol id's는, 대응하는 심볼에 대한 출력측에서 사용되는 integer 식별자와 반드시 동일하지는 않다.

 

ContextFst 객체에는 std :: vector <std :: vector <int32> 유형의 객체에 대한 참조를 반환하는 함수 ILabelInfo()가 있으며, 이를 통해 사용자는 입력 측에서 각 심볼의 "의미"를 계산할 수 있다. 이 객체의 올바른 해석은 The ilabel_info object에 자세히 설명되어 있다.

 

 

ContextFst와 관련된 composition알고리즘에 사용하기위한 ContextMatcher라는 특수한 "Matcher" object가있다 (Matcher는 OpenFst의 composition알고리즘이 arc lookup에 사용하는 것이다. ContextMatcher는 필요한 것보다 더 많은 상태의 할당을 피함으로써 ContextFst 객체의 사용을 보다 효율적으로 만든다 (문제는 normal matcher를 사용하면 state에서 arc를 원할 때마다 대상을 할당해야한다는 것이다) 해당 상태에서 다른 모든 아크의 상태).

 

composition에 대한 left hand argument가 ContxtFst 유형 인 경우 FST 컴포지션을 수행하는 관련 함수 ComposeContextFst ()가 있고, Matcher를 사용한다. ComposeContext () 함수도 있는데, 이 함수는 비슷하지만 ContextFst 객체 자체를 만든다.


Avoiding weight pushing

 

weight-pushing는 각 상태의 arc 확률이 적절한 의미로 "sum to one(합계)"되는 것을 보장하는 FST operation이다. Kaldi는 전통적인 레시피와는 약간 다른 방식으로 weight-pushing 문제를 다룬다. log semiring(반올림)에서weight-pushing는 검색 속도를 높이는 데 도움이 될 수 있다. 그러나 경우에 따라 weight-pushing는 나쁜 영향을 줄 수 있다. 문제는 FST로 표현 될 때 통계 언어모델이 일반적으로 ""add up to more than one (하나 이상으로 합산)"하기 때문에 일부 단어는 직접적으로 backoff arcs를 통해 두 번 계산되기 때문이다.

 

우리는 절대로 pushing weights하지 않기로 했고, 대신 다른 방식으로 처리한다. 첫째, Definition: 우리는 weight가 1에 해당하는 "stochastic"FST를 호출하고 reader는 "log semiring"에 대해 이야기하고 있다고 가정 한다. "sum to one"를 의미하며 "take the max" 이 아니다.

 

그래프 생성의 각 단계는 이전 단계가 stochastic이라면 다음 단계가 stochastic이라는 특성을 갖는다. 즉, G가 stochastic이라면 LG는 stochastic이다. LG가 stochastic이라면 det(LG)는 stochastic이다. det(LG)가 stochastic이면 min(det(LG))은 stochastic등이다. 이것은 각각의 개별 작업이 적절한 의미에서 "preserve stochasticity"해야한다는 것을 의미한다. 예를 들어, 예를 들어 weight-push 알고리즘을 시도해 볼 수 있으며 원래 G fst가 둘 이상으로 합산되어 실패한 것으로 판단되면 실패를 내뱉는다.

 

우리는 더 강력한 의미로 stochasticity을 유지하려고 한다. 즉, G에 대해 모든 states에 대한 최소값과 최대값을 먼저 측정한다 (arc probabilities plus final-prob). 이것이 우리의 프로그램 "fstisstochastic"이 수행하는 일이다. G가 stochastic이라면,이 두 숫자는 모두 1이 된다 (실제로 로그 공간에서 작동하기 때문에 실제로 프로그램에서 0을 보게 될 것이다. 이것이 "log semiring" 이다). 우리는 다음과 같은 의미에서 확률을 유지하려고 한다.이 최소값과 최대 값은 "get worse" 않는다. 즉, 그들은 결코 1에서 더 멀어지지 않는다. 실제로 이것은 "local" 방식으로 확률을 유지하는 알고리즘이있을 때 자연스럽게 일어난다. stochasticity을 보존하기 위해 필요한 다음과 같은 다양한 알고리즘이 있다.

 

더보기

Minimization
Determinization
Epsilon removal

Composition (with particular FSTs on the left) There are also one or two minor algorithms that need to preserve stochasticity, like adding a subsequential-symbol loop. Minimization naturally preserves stochasticity, as long as we don't do any weight pushing as part of it (we use our program "fstminimizeencoded" which does minimization without weight pushing). Determinization preserves stochasticity as long as we do it in the same semiring that we want to preserve stochasticity in (this means the log semiring; this is why we use our program fstdeterminizestar with the option –determinize-in-log=true). Regarding epsilon removal: firstly, we have our own version of epsilon removal "RemoveEpsLocal()" (fstrmepslocal), which doesn't guarantee to remove all epsilons but does guarantee to never "blow up". This algorithm is unusual among FST algorithms in that, to to what we need it to do and preserve stochasticity, it needs to "keep track of" two semirings at the same time. That is, if it is to preserve equivalence in the tropical semiring and stochasticity in the log semiring, which is what we need in practice, it actually has to "know about" both semirings simultaneously. This seems to be an edge case where the "semiring" concept somewhat breaks down. Composition on the left with the lexicon L, the context FST C and the H tranducer (which encodes the HMM structure) all have to preserve stochasticity. Let's discuss this the abstract: we ask, when composing A o B, what are sufficient properties that A must have so that A o B will be stochastic whenever B is stochastic? We believe these properties are:

- For any symbol sequence that can appear on the input of B, the inverse of A must accept that sequence (i.e. it must be possible for A to output that sequence), and:

- For any such symbol sequence (say, S), if we compose A with an unweighted linear FST with S on its input, the result will be stochastic.

 

These properties are true of C, L and H, at least if everything is properly normalized (i.e. if the lexicon weights sum to one for any given word, and if the HMMs in H are properly normalized and we don't use a probability scale). However, in practice in our graph creation recipes we use a probability scale on the transition probabilities in the HMMs (similar to the acoustic scale). This means that the very last stages of graph creation typically don't preserve stochasticity. Also, if we are using a statistical language model, G will typically not be stochastic in the first place. What we do in this case is we measure at the start how much it "deviates from stochasticity" (using the program fstisstochastic), and during subsequent graph creation stages (except for the very last one) we verify that the non-stochasticity does not "get worse" than it was at the beginning.

 


[1] https://kaldi-asr.org/doc/graph.html

 

여기에서는 Kaldi 툴킷에서 FF 알고리즘에 대해 설명합니다. OpenFst의 것과 다르거나 다른 알고리즘입니다 (많은 알고리즘에 OpenFst 코드 자체를 사용합니다).

 

이러한 알고리즘은 디렉토리 fstext/에 있으며 해당 명령 행 프로그램은 존재하는 경우 fstbin/에 있습니다. 이 코드는 OpenFst 라이브러리를 사용합니다. 여기서는 현재 Kaldi 레시피에 실제로 사용되는 알고리즘에 대해서만 설명합니다.

 

Determinization

OpenFst의 알고리즘과 다른 결정 알고리즘을 사용합니다. 우리는 이것을 DeterminizeStar(); 해당 명령 행 프로그램의 이름은 fstdeterminizestar입니다. 우리의 결정 알고리즘은 실제로 결정과 함께 엡실론 제거를 수행한다는 점에서 OpenFst의 알고리즘보다 표준 FST 결정 알고리즘에 더 가깝습니다. 따라서 많은 다른 FST 알고리즘과 마찬가지로 엡실론을 "실제 심볼"로 간주하지 않습니다.

 

우리의 결정 알고리즘은 초기 결정 출력의 전이에 하나 이상의 출력 심볼이있을 때 발생하는 일을 처리하는 다른 방법을 가지고 있습니다. OpenFst 결정 알고리즘은 하나 이상의 (인코딩 된) 출력 심볼이없는 아크를 보장하기 위해 등가를 유지하면서 출력 심볼 (가중으로 인코딩 된) 주위를 이동하는 FactorWeights라는 함수를 사용합니다. 입력에 엡실론 기호가있는 새로운 상태를 도입하지는 않습니다. 그러나 FactorWeights 알고리즘은 DeterminizeStar의 출력에 대해 실패 할 수 있습니다. 사이클의 상태보다 출력이 더 많은 사이클이있을 수 있기 때문입니다 (엡실론 제거를 수행하지 않기 때문에 일반 결정 알고리즘의 출력에는 불가능 함). 대신, 둘 이상의 출력 심볼이있는 링크가 발생할 때마다 모든 출력 심볼을 수용 할 수있는 충분한 수의 중간 상태로 체인을 만듭니다. 무게와 입력 기호는이 체인의 첫 번째 링크에 있습니다. DeterminizeStar 알고리즘의 출력은 OpenFst가 사용하는 정의, 즉 엡실론을 일반 기호로 취급하는 정의에 따라 결정적입니다. 출력에는 입력 측에 엡실론이 있으며, 이는 결정론의 일반적인 정의에 위배되지만 링크에서 하나 이상의 출력 심볼을 허용하는 인코딩 메커니즘으로 간주되며 어떤 경우에도 매우 구체적으로 발생합니다. 상황 (엡실론 아크는 항상 상태에서 유일한 아크)입니다.

 

또 다른 차이점은 우리의 프로그램 fstdeterminizestar는 입력 FST에 출력 심볼이 가중치로 인코딩되도록 요구하지 않는다는 것입니다.

 

Debugging determinization

프로세스 디버깅에 오랜 시간이 걸리면 종료 여부를 말하기가 어렵 기 때문에 일반적으로 디버깅 결정은 매우 어렵습니다. fstdeterminizestar 프로그램에는 "kill -SIGUSR1 \ <its processid \>"신호를 보내면 결정을 디버깅하는 데 유용한 일부 정보가 중지되고 인쇄됩니다.

 

Determinization in the log semiring

DeterminizeInLog () 함수를 제공하여 결정하기 전에 일반 (열대) 반올림에서 Fst를 로그 반올림으로 캐스팅 한 다음 다시 변환합니다. 이것은 확률론을 보존하기 때문에 알고리즘에서 사용되는 결정의 형태입니다 (확률론 보존 및 테스트 참조).

 

Removing epsilons

우리는 FST를 절대로 날려 버리지 않을 것이라고 보장되는 RemoveEpsLocal ()이라는 엡실론 제거 알고리즘을 제공하지만 반면에 모든 엡실론을 제거하는 것은 아닙니다. 기본적으로 그래프를 크게 만들지 않고도 쉽게 제거 할 수있는 엡실론을 제거합니다. 어려운 문제이므로 여기에 최적 성이 보장되지 않습니다. RemoveEpsLocal () 함수는 OpenFst의 RemoveEps () 함수와 약간 다른 동작을합니다. 하나는 입력 epsilon과 하나는 출력 epsilon 인 경우 두 개의 호를 결합하기 때문입니다. RemoveEpsLocal () 함수는 FST 동등성을 유지합니다.

 

로그 세미 링의 확률을 유지하면서 열대성 반올림의 동등성을 유지하는 RemoveEpsLocalSpecial () 함수도 있습니다 (확률성에 대한 자세한 내용은 다음 섹션 참조). 우리는 두 개의 반고리를 동시에 고려해야하기 때문에 반 반복 형식주의의 유용성이 약간 저하되는 경우 인 것으로 보인다.

 

Preserving stochasticity and testing it

우리는 확률 적 FST를 FST로 정의하는데, 여기서 FST의 반고리에서 주어진 상태 (및 최종 가중치)에서 나온 호의 가중치의 합은 (반고리에서) 1과 같습니다. 이 개념은 로그 세미 링에서 가장 유용하고 자연 스럽습니다. 본질적으로 확률 론적 FST는 주어진 호에서 가중치의 합이 1 인 것입니다 (예를 들어, 적절히 정규화 된 HMM은 확률 론적 FST에 해당합니다).

 

IsStochasticFst () 함수는 확률을 테스트합니다. 선택적으로 FST가 확률 적으로 실패한 정도를 사용자에게 알리기 위해 최소 및 최대 무게를 출력 할 수 있습니다. 이것의 명령 행 버전은 fstisstochastic입니다. 우리는 확률 론적 입력을 고려하여 확률 론적 출력을 생성한다는 의미에서 확률론을 보존하기 위해 사용하는 대부분의 FST 알고리즘을 목표로합니다. 비 확률 입력의 경우 가중치의 최소 및 최대 범위가 더 커지지 않는 것을 목표로합니다. 기본적으로 isstochasticfst 프로그램은 로그 반올림으로 캐스트 한 후 확률을 테스트합니다. 이것이 가장 유용한 경우입니다 (옵션 –test-in-log = false를 제공하여이를 중지 할 수 있음).

 

확률 성을 유지하기 위해 우리가 구성하는 FST에는 특정 속성이 있어야합니다. 이는 L, C 및 H에 적용되어야합니다. 예를 들어 L을 고려하십시오. G를 통과하는 경로에 해당하는 모든 선형 FST에 대해이 FST F를 호출하면 제품 L o F는 확률 적이어야합니다. 이것은 기본적으로 L이 발음 확률을 올바르게 표준화했음을 의미합니다. 공식적으로 요구되는 실제 재산은 이것보다 약간 강할 수 있습니다 (이것은 확률이 "적시"에 나타나도록하는 것과 관련이 있습니다). 실제로 그래프 작성의 각 단계마다 isstochasticfst 프로그램을 실행하여 확률을 확인합니다.

 

Minimization

OpenFst에서 제공하는 최소화 알고리즘을 사용하지만 결정적이지 않은 FST에 최소화를 적용 할 수 있도록 OpenFst를 컴파일하기 전에 패치를 적용합니다. 그 이유는 최소화하기 전에 명확성 기호를 제거 할 수 있기 때문에 더 최적입니다 (최소화로 더 많은 상태를 결합 할 수 있음). 패치는 데이터 구조 관련 문제를 해결합니다. 기본적으로 OpenFst의 최소화 알고리즘은 비 결정적 FST에 적용 할 수 있습니다. 입력 심볼의 일부로 가중치 및 출력 심볼을 인코딩 한 후 FST를 최소화하는 fstminimizeencoded라는 명령 줄 프로그램을 제공하므로 FST가 수락자가됩니다. 이것은 fstminimize 프로그램이 수행하는 것과 동일합니다. 우리가 확률론을 보장하는 방식은 무게 추를 피하기 때문에 바람직합니다.

 

Composition

대부분의 경우 OpenFst 자체의 컴포지션 알고리즘을 사용하지만 TableCompose () 함수와 해당 명령 줄 프로그램 fsttablecompose를 사용합니다. 이는 특정 경우에보다 효율적인 컴포지션 알고리즘입니다. OpenFst의 "Matcher"개념을 사용합니다. Matcher는 특정 입력 또는 출력 기호가있는 호를 찾기 위해 상태에서 호를 조회하는 컴포지션 중에 사용되는 일종의 도우미 클래스입니다. OpenFst가 사용하는 일반적인 매처는 SortedMatcher입니다.이 레이블은 관련 레이블에서 정렬되는 호에 의존하며 이진 검색을 수행합니다. TableMatcher는 레이블로 인덱스 된 테이블을 작성하는 것이 효율적인 경우를 감지하고이 상태에서는 2 진 검색의 오버 헤드를 피합니다. 이것은 매우 높은 정도의 어휘집으로 구성 할 때 속도가 빨라집니다.

 

Adding and removing disambiguation symbols

FST 레시피 (다른 트랜스 듀서 기반 레시피와 마찬가지로)는 명확성 기호를 사용합니다. 일반적인 레시피에서는 어휘집 FST (L)의 입력 측에 추가되어 결정 가능합니다. 또한 명확성 기호를 G 및 C에 추가합니다 (음성 기호 참조). 컴포지션을 수행하고 오른쪽의 FST에 입력에 명확성 기호가있을 때마다 이론적으로 왼쪽 FST의 각 상태에 각 명확성 기호에 대한 자체 루프를 추가합니다. 입력 및 출력. 왼쪽과 오른쪽의 명확성 기호에 대한 실제 정수 기호 ID는 동일하지 않을 수 있습니다. 예를 들어 G에는 특수 기호 # 0이 있습니다 (epsilon은 일반적으로 사용됨). 이것에 대한 symbol-id는 일반적으로 가장 높은 번호의 단어에 1을 더한 것입니다. 그러나이 기호를 L을 통해 전달하려면 L의 입력 기호 테이블 (주로 전화를 포함)에 # 0을 나타내는 기호가 필요합니다. 우리는 가변 FST와 레이블의 두 벡터를 취하는 AddSelfLoops () 함수를 가지고 있습니다 (라벨은 심볼의 정수 ID입니다). 벡터는 크기가 동일하며 명확성 기호에 대한 해당 입력 및 출력 레이블을 나타냅니다. 이 기능은 각각의 최종 상태와 그 밖의 하나 이상의 아크에 엡실론이 아닌 출력 기호가있는 각 상태에 자체 루프를 추가합니다.

 

명령 행에서 fstrmsymbols 프로그램으로 액세스 할 수있는 DeleteISymbols () 함수를 사용하여 명확성 기호를 제거합니다.

 


[1] https://kaldi-asr.org/doc/fst_algo.html

  • 음성인식기 음향 모델 중 뛰어난 성능을 내고 있는 FSMN 에 대한 논문들을 리뷰해 보았다. 
  • 신호처리 이론 중 IIR filter는 High order FIR filter로 근사가 가능하다.
  • RNN 계통에서 recurrent layer는 개념적으로 first order IIR filter와 유사하다고 볼 수 있다.
  • 핵심 아이디어는 recurrent layer를 대신할 수 있는 High order FIR filter와 같은 DNN 구조를 제시한다는 것
  • feedforward neural network (FNN)에서 Memory block을 둬서 현재 프레임의 앞뒤의 long context information을 인코딩 해서 그 정보를 사용하여 현재의 FNN을 update 해 나간다.
  • RNN 계통보다 모델이 light하고, 학습 시 안정적이다.
  • scalar FSMN, vector FSMN, compact (vector) FSMN, Deep-FSMN 

 

 


 

[1] https://arxiv.org/abs/1803.05030

 

기본적으로 SVDF Layer의 계산은 Time step t마다, DNN의 각 node 마다, rank-1 SVDF Layer를 통과시켜서, a_t의 output을 내는 것이다.

 

Feature (F(=feature dim(LMFB 40dim))) 의 context window(T=(r+1+l)를 포함하는 연속적인 input vector를 준비한다. 그리고 N nodes의 SVDF Layer에 대해 NxT 1-D convolutions of the feature filter (β) 를 수행하고, (input feature frames에 대해, N filter들 각각을 sliding), size T의 Time filter (α) 를 이용하여 N node 개의 output vectors 각각을 filtering 한다.

 

구체적으로, 각 노드들 m 마다, 인풋인 X_t 이 feature filter (β (m)) 를 통과하고, 결과 scalar 값은, 미리 계산된 이전 T-1 만큼의 inference steps 의 값들과 concatenation된다. 그 후, 이전 state 들의 정보를 활용하기 위해 time filter (α (m)) 가 적용된다.

 

다음은 정리해둔 PPT파일이다.

https://docs.google.com/presentation/d/1k4vDh-q-dM_QMd8sivK_15KOXxllusByKWOVW12A4Q8/edit#slide=id.p

 

1) VTLP based data augmentation

- vocal tract length perturbation (VTLP) [3], has shown gains on the TIMIT phoneme recognition task. VTLP was further extended to large vocabulary continuous speech recognition (LVCSR) in [4]. In [3] the VTLP warping factors for each utterance is randomly chosen from a range (e.g. [0.9, 1.1]). Using these sampled warping factors, improvement was reported on TIMIT phoneme recognition task. In [4], VTLP was used in large vocabulary continuous speech recognition (LVCSR) tasks, and an observation was made that selecting VTLP warping factors from a limited set of perturbation factors, was better.

 

2) Tempo perturbation based data augmentaion

- Speech rate perturbation, where the speech rate of the audio was modified by randomly selected factor, was investigated in [6]. In speech rate modification, the tempo of the signal is modified while ensuring that the pitch and spectral evelope of the signal does not change. The WSOLA [16] based implementation in the tempo command of the SoX tool was used to achieve this perturbation.

 

3) Speed perturbation based data augmentation

- To modify the speed of a signal we just resample the signal. The speed function of Sox was used for this. Two additional copies of the original training data were created by modifying the speed to 90% and 110% of the original rate.

 

4) SpecAugment

 

**In order to implement speed perturbation, we resample the signal using the speed function of the Sox audio manipulation tool; SoX, audio manipulation tool, (accessed March 25, 2015). [Online]. Available: http://sox.sourceforge.net/

 


 

[1] T. Ko, V. Peddinti, D. Povey, and S. Khudanpur, “Audio augmentation for speech recognition.” in INTERSPEECH, 2015, pp. 3586–3589.

 

 

+ Recent posts