딥러닝 기반 음성인식 기초

권유진·2022년 7월 9일
0

음성인식

목록 보기
2/2

Audio Auto Tagging

  • 오디오 신호에서 발생하는 이벤트 종류를 찾는 문제
    • 아기의 웃음 소리나 기타 소리가 동시에 있는 소리는 즉시 인식
    • 전기 톱 소리와 믹서기 소리는 유사해 인식하기 어려움
  • 여러 이벤트를 tagging하는 multi-label classification

Metric

  • IR(Information Retrieval)
    • 실제로 1인 label에 대해 얼만큼 높은 확률로 예측
    • Average Precision
      • precision-recall 그래프의 아래 면적
    • Rank-Average Precision
    • LRAP(Label-Weighted-Label-Ranking-Average-Precision)
      • 라벨이 1인 값에 대해서만 rank precision 계산
      • multi-label ranking 문제에서 자주 사용
      • precision-recall 대신 label ranking 사용
        • 0이상 1이하
        • 상위 라벨의 몇 퍼센트가 실제 라벨인지 측정
      • LRAP(y,f^)=1nsamplesΣi=0nsamples11yi0Σj:yij=1Lijrankijwhere,Lij={k:yij=1,f^ikf^ij}  rankij={k:f^ikf^ij}LRAP(y, \hat f) = \cfrac{1}{n_{samples}} \Sigma^{n_{samples}-1}_{i=0} \cfrac{1}{||y_i||_0}\Sigma_{j:y_{ij}=1} \cfrac{|L_{ij}|}{rank_{ij}}\\ where, L_{ij} = \{k:y_{ij}=1, \hat f_{ik} \ge \hat f_{ij}\} \; rank_{ij} = |\{k:\hat f_{ik} \ge \hat f_{ij} \}|
        • [고양이, 개, 새]
          • 고양이만 있는 이미지는 [1, 0, 0] 으로 표현
          • 해당 이미지를 모델에 입력해 [.9, .2, .3]을 얻음
            • 고양이가 1위이고, 고양이 라벨이 정확하고 이동할 필요가 없으므로 해당 값도 1
            • 1/1 = 1
          • 다른 모델은 해당 이미지를 [.6, .8, .1]로 출력
            • 개, 고양이, 새 순서로 순위 차지
            • 올바른 라벨(고양이)의 순위는 2
            • 그 과정에서 올바른 레이블 있었는지 확인: 1만 있다?
            • 정답 라벨 개수 / 2위 = 1/2 = .5
          • 이미지에 고양이와 새가 있는 경우: [1, 0, 1]
            • 모델 출력: [.8, .2, .9]
            • 고양이: 2개의 올바른 라벨 존재 / 순위 2위 = 2/2 = 1.
            • 새: 1개의 올바른 라벨 존재 / 순위 1위 = 1/1 = 1.
          • 잘못된 라벨 지정 - 이미지에 고양이, 강아지 존재: [1, 1, 0]
            • 모델 출력: [.1, .2, .8]
            • 고양이의 경우, 라벨 2개 / 3위 = 2/3 = 0.66
            • 강아지의 경우, 라벨 1개 / 2위 = 1/2 = 0.5
          • 각 클래스 최종 점수 계산
            • 각 점수 평균
            • 고양이: (1 + .66) / 2 = .83
            • 개: .5 / 1 = .5
            • 새: 1/1 = 1.
          • 해당 모델의 최종 점수 계산
            • 가중 평균 사용
              • 가중치는 각 클래스의 최종 점수
            • (고양이 2마리/라벨 4개) .83 + (개 1마리/라벨 4개) .5 + (새 1마리/라벨 4개) * 1. = .79
              • 모든 점수의 평균을 내는 것과 동일
            • 그러므로 (1 + 1 + .66 + .5)/4 = .79

Procedure

  • wave form \rarr mel spectrogram \rarr modeling-feature extraction(CNN, RNN) \rarr modeling-classifier
  • 오디오마다 sequence 길이가 다르면 data를 여러 개로 쪼갬 (label 복사)

Speech Recognition (STT)

  • 사람이 말하는 음성 언어를 컴퓨터가 해석해 문자 데이터로 전환
  • 평가 지표
    • Levenshtein Distance
      • 두 개의 문자열이 얼마나 유사한지
      • 두 개의 문자열이 같아지기 위해 몇 번의 연산을 수행해야 하는지?
        • 연산: 삽입, 삭제, 대체
  • joint CTC: 한국어 STT 논문
  • ClovaCall: github에 코드 존재

CTC(Connectionist Temporal Classification) Loss

  • speech recognition 손실 함수
  • STT의 데이터셋은 오디오 클립과, 스크립트
    • 어떤 단어의 character가 audio와 alignment가 맞는지 알 수 없다.
      • 2초 동안 조용하다가 hello라고 말하는 것과 바로 hello를 말하는 것 모두 script는 hello로 동일
  • CTC는 둘 사이의 가능한 모든 alignment의 가능성을 합산해 적용
    • input도 output의 가능한 alignment를 모두 뽑아 marginalize한다는 의미
  • 하지만 모든 XXYY가 할당되는 것은 옳지 않다.
    • silence가 존재하는 부분 또한 글자가 할당될 수도 있기 때문
      • ex) 띄어쓰기 등
    • 이를 방지하기 위해 토큰 ϵ\epsilon 사용
      • 알파벳, 음소 단위 구분하는 역할
    • input과 같은 길이로 alignment 진행 후, y로 mapping할 때 ϵ\epsilon 제거
    • alignment 과정에서 하나의 input에서 다음 input으로 진행하면서 output을 동일하게 유지하거나 다음 output으로 assign
      • hello가 output일 경우, 하나의 Input이 h일 때 다음 input은 h 또는 e 할당
      • many-to-one 문제: 여러 개의 input이 h에 할당
      • 만약 input과 연결되지 못한 output의 글자가 있을 경우 해당 경우는 배제
        • hello가 나와야하는데, hllo가 나오면 ctc 계산에서 배제
  • 계산
    • input sequence의 spectrogram으로 시작
    • input은 RNN 계열 layer의 input으로 들어옴
    • ouput 각 글자(h,e,l,o,ϵ\epsilon)의 time step 별 확률 분포 반환
    • time step별 output을 갖고, 다른 시퀀스 간의 확률을 구함
    • alignment에 대해 marginalize를 진행하면, output의 확률 분포 계산 가능
  • p(YX)=ΣAAX,Yt=1Tpt(atX)p(Y|X) = \Sigma_{A \in A_{X,Y}} \prod_{t=1}^T p_t(a_t|X)
    • ΣAAX,Y\Sigma_{A \in A_{X,Y}}: 모든 validation alignment를 marginalize
    • t=1Tpt(atX)\prod_{t=1}^T p_t(a_t|X): step별 alignment 확률 계산
      • XX: input의 step
    • p(YX)p(Y|X): CTC 함수 - 조건부 확률 분포
    • time step별 확률 분포를 얻기 위해, input sequence의 context를 고려하기 위해 RNN 기반 모델 사용해 학습
  • 모델 파라미터 학습
    • θ^=argmaxθi=1Np(z(i)x(i);θ)p(z(i)x(i)=ΣπB1(z)p(πX;θ)\hat \theta = \arg \max_{\theta} \prod^N_{i=1} p(z^{(i)}|x^{(i)};\theta)\\ p(z^{(i)}|x^{(i)}=\Sigma_{\pi \in B^{-1}(z)} p(\pi|X;\theta)
      • 길이가 tt인 sequence의 가능한 경로 집합: π\pi
      • 즉, input이 주어졌을 때 확률이 가장 높은 alignment를 찾자!
  • 손실 함수
    • θ^=argmaxθi=1NΣπB1(z)p(πX;θ)\hat \theta = \arg \max_{\theta} \prod^N_{i=1} \Sigma_{\pi \in B^{-1}(z)}p(\pi|X;\theta)
    • θ^=argmaxθΣi=1NlogΣπB1(z)p(πX;θ)\hat \theta = \arg \max_{\theta} \Sigma_{i=1}^N \log \Sigma_{\pi \in B^{-1}(z)}p(\pi|X;\theta)
      • log\log를 취해주면 \prodΣ\Sigma로 바뀐다.
    • θ^=argminθΣi=1NlogΣπB1(z)p(πX;θ)\hat \theta = \arg \min_{\theta} - \Sigma_{i=1}^N \log \Sigma_{\pi \in B^{-1}(z)}p(\pi|X;\theta)
      • 해당 방법으로 모든 경우의 수를 찾게 되면, 길이가 길어질수록 음소 수가 많아질 수록 경우의 수가 너무 많아지고 연산량이 커진다.
    • h(x)=argmaxlLTp(lx)h(x) = \arg \max_{l \in L^{\le T}} p(l|x)
      • 그렇기 때문에 주어진 data에 대한 alignment의 확률 중 가장 높은 alignment를 사용(Greedy한 방법)
      • 해당 방식은 구현이 편하지만 좋은 방식은 아니다.
    • 그렇기 때문에 다이나믹 프로그래밍으로 딥 서칭을 해라.
  • 다이나믹 프로그래밍
    • 모든 output 음소 사이에 \epsilon 존재
    • output의 시작은 ϵ\epsilon이나 첫 음소가 등장
    • ϵ\epsilon 다음에는 ϵ\epsilon이나 다음 글자 등장
    • 음소 다음에는 자기 자신이나 다음 음소, ϵ\epsilon 등장
    • output 음소에 없는 글자는 등장할 수 없으며, 모든 음소가 등장해야 한다.
    • αt(s)={{αt1(s)+αt1(s1)}ylst,{αt1(s)+αt1(s1)+αt1(s2)}ylst}\alpha_t(s) = \begin{Bmatrix} \{\alpha_{t-1}(s) + \alpha_{t-1}(s-1)\}y_{l'_s}^t,\\ \{\alpha_{t-1}(s) + \alpha_{t-1}(s-1)+\alpha_{t-1}(s-2)\}y_{l'_s}^t \end{Bmatrix}
      • 순환 함수로 설명 가능(recursive)
      • 즉, 마지막 2개의 α\alpha값으로 alignment를 설명할 수 있다.
  • 즉, 모델을 통해 각 sequence 별 확률 분포가 나오면 이를 통해 적절한 alignment를 찾는 것!!!!
    • DeepSpeech2는 input을 encoding해 CTC를 구함
    • Encoder, Decoder을 통해 CTC를 구하는 것은 LSA

LSA

  • Listener: Encoder로 음성 신호를 feature extraction
    • BiLSTM을 pyramical 형식으로 3개를 붙여 사용
      • 이를 pBLSTM라고 부르는데, pBLSTM 1개당 연산 속도를 2배 줄여주기 때문에 사용
      • hij=pBLSTM(hi1j,[h2ij1,h2i+1j1])h_i^j = pBLSTM(h_{i-1}^j, [h_{2i}^{j-1}, h_{2i+1}^{j-1}])
      • 음소 단위, 단어 단위, 문장 단위 모두 포착 가능
  • Attend&Spell: 어텐션 모듈
    • score=fc(tanh(W(query)+V(value)+conv_attn+b))score = fc(\tanh(W(query) + V(value) + conv\_attn + b))
  • 최종적으로 P(yuyu1,,y0,x)P(y_u|y_{u-1}, \dots, y_0, x)를 계산
    • 이전 step까지의 decoding 정보와 input step 정보 받아 계산

참고
https://velog.io/@tobigsvoice1516/2%EC%A3%BC%EC%B0%A8-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EB%B0%98-%EC%9D%8C%EC%84%B1%EC%9D%B8%EC%8B%9D-%EA%B8%B0%EC%B4%88
https://www.youtube.com/watch?v=YiW7aOTZFQQ&list=PL9mhQYIlKEhdrYpsGk8X4qj3tQUuaDhrl

profile
데이터사이언스를 공부하는 권유진입니다.

0개의 댓글