<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yoon-hyewon.log</title>
        <link>https://velog.io/</link>
        <description>음성인식 연구개발자 (Speech Recognition Researcher)</description>
        <lastBuildDate>Wed, 02 Nov 2022 01:35:50 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yoon-hyewon.log</title>
            <url>https://velog.velcdn.com/images/yoon-hyewon/profile/c553a3e6-54af-47dd-916c-682ac5119aa9/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yoon-hyewon.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yoon-hyewon" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Kaldi ASR 4) 음향모델 학습]]></title>
            <link>https://velog.io/@yoon-hyewon/Kaldi-ASR-3-%EC%9D%8C%ED%96%A5%EB%AA%A8%EB%8D%B8-%ED%95%99%EC%8A%B5</link>
            <guid>https://velog.io/@yoon-hyewon/Kaldi-ASR-3-%EC%9D%8C%ED%96%A5%EB%AA%A8%EB%8D%B8-%ED%95%99%EC%8A%B5</guid>
            <pubDate>Wed, 02 Nov 2022 01:35:50 GMT</pubDate>
            <description><![CDATA[<h4 id="4--monophone-training">4.  Monophone Training</h4>
<p>이전에 준비한 오디오와 텍스트 파일을 이용해서 각 개별 음소에 대한 확률값을 학습하는 과정이다. monophone 학습 과정은 다음과 같고, 이와 관련된 파일들이 exp/mono0a(폴더)와 data/$x/split1 에 저장된다.</p>
<ol>
<li>오디오와 텍스트 정보를 가지고 음소 세트로 변환</li>
<li>소리와 음소를 동일한 간격으로 잘라서 그 구간이 이 음소가 발생한 구간일 것이라고 정의</li>
<li>다양한 소리를 학습함으로써 그 간격을 학습하면서 음소에 적합한 구간만 지정하도록 변화<blockquote>
<ol>
<li>train_mono.sh
① exp/mono0a (폴더) = final.mdl 이라는 모델 생성
② exp/mono0a/ali.1.gz = 학습한 음향 모델을 통해 학습 데이터의 음소 구간을 의미있게 잘라주는 작업을 align(정렬)이라고 하고, 모든 학습 데이터에 대한 align 정보를 담고 있는 파일</li>
</ol>
</blockquote>
</li>
</ol>
<pre><code># Mono training 실행 코드
steps/train_mono.sh --nj 1 --cmd &quot;$train_cmd&quot; \
  --totgauss 400 \
  data/train_yesno data/lang exp/mono0a</code></pre><h4 id="5-graph-compilation">5. Graph compilation</h4>
<p>Kaldi는 음성인식에 사용할 최종 모델은 fst형태로 변환하여 사용하므로 지금까지 생성한 모델들을 최종적으로 결합해주는 과정을 거쳐야한다.
이러한 과정은 mkgraph.sh를 통해 진행된다.
총 4가지 모델이 필요하며 이 모델들을 다 결합하면, HCLG.fst가 완성된다. HCLG 심볼의 의미는 다음과 같다. (참고 : <a href="https://kaldi-asr.org/doc/graph.html">https://kaldi-asr.org/doc/graph.html</a>)</p>
<pre><code>H = HMM 정의
C = Context-dependent, 컨텍스트 종속성
L = Lexicon, 사전
G = Grammar, 문법</code></pre><p>HCLG를 자세히 살펴보면,</p>
<ul>
<li>H.fst = 각 음소들의 확률 정보를 담고 있으며, 최종 학습이 끝난 final.mdl를 H.fst로 변환</li>
<li>C.fst = 종속 음소에서 Context 독립 음소로의 변환을 나타내는 동적으로 생성된 fst 객체</li>
<li>L.fst = 각 단어의 발음 정보를 담은 모델로 단어에 대한 발음 음소열로 구성되어 있음</li>
<li>G.fst = 각 단어들의 확률 정보(ngram)을 담은 lm.arpa를 G.fst로 변환</li>
</ul>
<pre><code># Graph compilation 실행 코드
utils/mkgraph.sh data/lang_test_tg exp/mono0a exp/mono0a/graph_tgpr</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Kaldi ASR 3) 음향모델 준비]]></title>
            <link>https://velog.io/@yoon-hyewon/%EC%9D%8C%EC%84%B1%EC%9D%B8%EC%8B%9D%EA%B8%B0-3-%EC%9D%8C%ED%96%A5-%EB%AA%A8%EB%8D%B8</link>
            <guid>https://velog.io/@yoon-hyewon/%EC%9D%8C%EC%84%B1%EC%9D%B8%EC%8B%9D%EA%B8%B0-3-%EC%9D%8C%ED%96%A5-%EB%AA%A8%EB%8D%B8</guid>
            <pubDate>Thu, 27 Oct 2022 08:06:01 GMT</pubDate>
            <description><![CDATA[<h4 id="2-feature-extraction">2. Feature extraction</h4>
<p>이 부분에서는 음향 모델을 학습하기위하여 MFCC를 사용하여 음향 특징을 추출하고, 정규화를 진행하는 단계라고 볼 수 있다.
여기서, Mel-Frequency Cepstral Coefficient(MFCC)은 음성 데이터를 특징 벡터화 해주는 알고리즘이다. </p>
<blockquote>
<ol>
<li>make_mfcc.sh
 ① mfcc (폴더) = 음성 데이터의 특징 벡터화
  ② exp(=experiment 폴더) = mfcc를 사용하여 특징을 추출하는 과정에서의 log</li>
</ol>
</blockquote>
<p>① mfcc (폴더) 
mfcc를 사용하여 특징을 추출하기 위해서는 2가지 기능이 필요하며, 이 기능을 ark 파일과 scp 파일을 사용하여 수행한다.</p>
<ol>
<li>wav 파일을 읽기 위한 rspecifier</li>
<li>features를 쓰기 위한 wspecifier</li>
</ol>
<p>＊.ark 파일 : 토큰은 공백이 없는 문자열로 정의되고, kaldi에 정의된 일부 object를 아카이브 형식으로 보관하기 위해 사용되며, 다음과 같이 저장된다고 한다.</p>
<pre><code>token1 [something]token2 [something]token3 [something] ...
(참고 : https://kaldi-asr.org/doc/io.html)</code></pre><p>＊.scp 파일 : 데이터에 액세스할 수 있도록 주소를 저장</p>
<pre><code># scp 파일 형식
[화자 ID or 데이터명][ark 경로][:객체 시작주소]</code></pre><p>mfcc 폴더를 살펴보면, raw 파일들과 cmvn 파일들이 src, ark 파일 형식으로 저장된 것을 볼 수 있다. 
cmvn_＊ (=Cepstral Mean and Variance Normalization) = 음성 인식을 위한 정규화 기술로서 동일한 세그먼트 통계를 갖도록 하는 것</p>
<pre><code># raw_mfcc_*_.scp 파일 형식
[데이터명][ark 경로][:객체 시작주소]
# 실제 OUTPUT
0_1_1_1_1_1_1_1 /{경로}/kaldi/egs/yesno/s5/mfcc/raw_mfcc_test_yesno.1.ark:16

# cmvn_*.scp 파일 형식
[화자ID][ark 경로][:객체 시작주소]
# 실제 OUTPUT
global /{경로}/kaldi/egs/yesno/s5/mfcc/cmvn_test_yesno.ark:7</code></pre><p>run.sh 코드 실행 &amp; 결과 코드</p>
<pre><code># Feature extraction 실행 코드 
for x in train_yesno test_yesno; do
 steps/make_mfcc.sh --nj 1 data/$x exp/make_mfcc/$x mfcc
 steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x mfcc
 utils/fix_data_dir.sh data/$x
done</code></pre><pre><code># Feature extraction 실행 결과 코드 (필요한 부분 빼고, 생략하였음)
## train
utils/validate_data_dir.sh: Successfully validated data-directory data/train_yesno
steps/make_mfcc.sh: [info]: no segments file exists: assuming 
wav.scp indexed by utterance.
steps/make_mfcc.sh: Succeeded creating MFCC features for train_yesno
Succeeded creating CMVN stats for train_yesno

## validation &amp; test
utils/validate_data_dir.sh: Successfully validated data-directory data/test_yesno
steps/make_mfcc.sh: Succeeded creating MFCC features for test_yesno
Succeeded creating CMVN stats for test_yesno</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Kaldi ASR 2) Tutorial]]></title>
            <link>https://velog.io/@yoon-hyewon/Kaldi-ASR-2-Tutorial</link>
            <guid>https://velog.io/@yoon-hyewon/Kaldi-ASR-2-Tutorial</guid>
            <pubDate>Thu, 27 Oct 2022 07:16:53 GMT</pubDate>
            <description><![CDATA[<p>Kaldi 설치는 아래 링크 참고▼
<a href="https://velog.io/@yoon-hyewon/%EC%9D%8C%EC%84%B1%EC%9D%B8%EC%8B%9D%EA%B8%B0-kaldi-%EC%84%A4%EC%B9%98%EB%B0%A9%EB%B2%95">Kaldi ASR 1) 설치 방법</a></p>
<p>Kaldi는 크게 4가지 구조로 이루어져있다.</p>
<ol>
<li>Kaldi 연산용 외부 라이브러리 (tools)</li>
<li>음성인식 수행에 필요한 Kaldi C++라이브러리 (src)</li>
<li>Kaldi C++ 실행용 파일</li>
<li>recipe용 bash/python shell, 전처리용 perl 등</li>
</ol>
<p>kaldi 샘플을 통해 동작 과정을 알아보자.</p>
<p>각 데이터셋마다 다운로드 받으려면 용량이 너무 크고 시간이 오래걸리기 때문에 kaldi가 가지고있는 샘플을 활용한다.</p>
<p>모든 샘플은 kaldi/egs 폴더에서 확인할 수 있으며, yesno 샘플의 처음 파일 구조는 다음과 같다. </p>
<pre><code>├── conf
├── input
├── local
├── steps -&gt; ../../wsj/s5/steps
└── utils -&gt; ../../wsj/s5/utils</code></pre><p>만약, yesno파일을 처음부터 돌리면서 변화하는 과정을 확인하고싶다면, yesno파일을 지우고, <a href="https://drive.google.com/file/d/1xhakVNydan5FhU_v8CJbUkIpoDJyWpUS/view?usp=sharing">해당 파일</a>을 다운 받은 후, 아래의 명령어를 참고하여 steps와 utils를 wsj로 향하는 심볼링 링크를 만들어주면 된다. 만약 에러가 뜬다면, 권한을 확인해보자. (명령어 : chmod -R 777 yesno/)</p>
<pre><code>ln -s ../../wsj/s5/steps steps
ln -s ../../wsj/s5/utils utils</code></pre><p>&nbsp;</p>
<h3 id="yesno-샘플로-분석한-kaldi">yesno 샘플로 분석한 kaldi</h3>
<p>run.sh을 살펴보면, 크게 다음과 같은 순서로 동작한다.</p>
<blockquote>
<p><strong>1. Data Preparation
2. Feature extraction
3. Mono training
4. Graph compilation
5. Decoding</strong></p>
</blockquote>
<p>세부적으로 알아보자.</p>
<h4 id="1-data-preparation">1. Data Preparation</h4>
<p>Data preparation은 음향 모델 학습에 필요한 데이터를 준비하고, 언어모델을 생성하는 단계이다. 각 쉘을 통과할 때마다 생성되는 파일을 아래에 정리하였다. 여기서, &quot;데이터명&quot;은 확장자를 제외한 파일명이고, &quot;파일명&quot;은 확장자를 포함한 이름으로 정의한다. </p>
<blockquote>
<ol>
<li>prepare_data.sh
 ① waves_yesno = wav 데이터셋 다운로드
 ② wav.scp = [wav 데이터명] [wav 파일 절대 경로]
 ③ text = [wav 파일명] [발화 문장]
 ④ utt2spk = [wav 데이터명][화자 ID (지정하지 않으면, global)]
 ⑤ spk2utt = [화자 ID][wav 데이터명][wav 데이터명][wav 데이터명]</li>
<li>prepare_dict.sh
 ① nonsilence_phones = [학습에 사용될 유음 종류의 음소]
 ② silence_phones = [학습에 사용될 묵음 종류의 음소]
 ③ opitional_silence = [학습에 사용될 묵음 종류의 음소]
 ④ lexicon = [단어][단어의 음소]
 ⑤ lexiconp = 한 단어가 발화될 수 있는 음소들의 확률값(0~1)
 [단어][확률값][단어의 음소]</li>
<li>prepare_lang.sh
 ① L.fst = lexicon을 fst의 형태로 만든 결과물
(monophone 시퀀스를 단어에 매핑)
 ② L_diasambig.fst = 동음이의어에 대한 표식
 ③ oov.txt / oov.int = out of vocabulary / 숫자로 표현
 ④ phones (폴더) = 학습에 사용할 음소 파일들
 (＊.txt=음소 기호, ＊.int=기호를 숫자로 정의,＊.csl=colon-separated list, 콜론을 이용하여 기호 숫자를 정의)
 ⑤ phones (txt) = 학습에 사용하는 모든 음소에 대한 정보
 ⑥ words = 각 단어와 그 단어를 연결해주는 숫자
 ⑦ topo = 이해 못했음</li>
<li>prepare_lm.sh
 ① lm_tg.arpa = srilm 툴을 사용하여 학습한 언어모델</li>
</ol>
</blockquote>
<pre><code># Data Preparation 실행 코드
local/prepare_data.sh waves_yesno
local/prepare_dict.sh
utils/prepare_lang.sh --position-dependent-phones false data/local/dict &quot;&lt;SIL&gt;&quot; data/local/lang data/lang
local/prepare_lm.sh</code></pre><pre><code>(kaldi-venv) [hyyun@STT_node2 s5]$ ./run.sh 
# Data Preparation 실행 결과 코드
... (생략 : wav 데이터 다운로드 &amp; 파일 정상 체크)
Preparing language models for test
arpa2fst --disambig-symbol=#0 --read-symbol-table=data/lang_test_tg/words.txt input/task.arpabo data/lang_test_tg/G.fst 
LOG (arpa2fst[5.5.1056~2-f6f4c]:Read():arpa-file-parser.cc:94) Reading \data\ section.
LOG (arpa2fst[5.5.1056~2-f6f4c]:Read():arpa-file-parser.cc:149) Reading \1-grams: section.
LOG (arpa2fst[5.5.1056~2-f6f4c]:RemoveRedundantStates():arpa-lm-compiler.cc:359) Reduced num-states from 1 to 1
fstisstochastic data/lang_test_tg/G.fst 
1.20397 1.20397
Succeeded in formatting data.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Kaldi ASR 1) 설치 방법]]></title>
            <link>https://velog.io/@yoon-hyewon/%EC%9D%8C%EC%84%B1%EC%9D%B8%EC%8B%9D%EA%B8%B0-kaldi-%EC%84%A4%EC%B9%98%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@yoon-hyewon/%EC%9D%8C%EC%84%B1%EC%9D%B8%EC%8B%9D%EA%B8%B0-kaldi-%EC%84%A4%EC%B9%98%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Fri, 21 Oct 2022 06:44:32 GMT</pubDate>
            <description><![CDATA[<p>리눅스 centos7 환경 기준 설명입니다.</p>
<h3 id="1-git-다운로드">1. git 다운로드</h3>
<pre><code>git clone https://github.com/kaldi-asr/kaldi.git 파일명 --origin upstream</code></pre><h3 id="2-kaldi-설치">2. Kaldi 설치</h3>
<p>kaldi 설치 시, tool(kaldi가 사용하는 외부패키지)과 src(kaldi의 core source)를 설치해야한다.
kaldi 설치에 앞서, 가상 환경을 실행한다.</p>
<pre><code>virtualenv kaldi-venv(가상환경명) --python=python3
. kaldi-venv/bin/activate</code></pre><h4 id="1-tool-외부-패키지">1) tool (외부 패키지)</h4>
<pre><code>cd /kaldi/tools</code></pre><ol>
<li><p>gcc 설치 ( version 7 이상 필요)</p>
<pre><code>sudo yum -y install devtoolset-7</code></pre><p>설치되어 있다면, 아래 명령어로 세션이 살아있는동안 gcc version 7</p>
<pre><code>scl enable devtoolset-7 bash</code></pre></li>
<li><p>tool 설치</p>
<pre><code>make -j 64</code></pre></li>
<li><p>srilm(언어모델 생성 툴) 설치</p>
<pre><code>./extras/install_srilm.sh &lt;name&gt; &lt;organization&gt; &lt;email&gt;</code></pre></li>
<li><p>파이썬 라이브러리 설치</p>
<pre><code>pip install scipy
pip install six</code></pre></li>
<li><p>g2p 설치</p>
</li>
</ol>
<p><em>local 환경이 아닌 가상 환경에 설치시, &quot;/extras/install_sequitur.sh&quot;을 vi로 열어 (pwd)로 되어있는 부분을 VIRTUAL_ENV로 수정하고 진행</em></p>
<pre><code>./extras/install_sequitur.sh</code></pre><h4 id="2-src-core-source">2) src (core source)</h4>
<pre><code>cd /kaldi/src</code></pre><ol>
<li><p>configure
configure란? 소스 코드로부터 컴파일하기 직전에 사용자 컴퓨터의 라이브러리의 존재 여부를 확인하고 연결하는 작업</p>
<pre><code>./configure --mathlib=MKL --use-cuda=yes --cudatk-dir=/usr/local/cuda-10.2</code></pre><p><em>여기서, 사용하는 cuda version 확인하고, 위와 같이 명령어로 cuda version 지정해주기 or 코드 수정하기. 예시는 10.2 version</em></p>
<p><em>코드 수정하는 방법) line 258 
기존 코드: &quot;for base in /usr/local/share/cuda /usr/local/cuda; do&quot; 
수정 코드: &quot;for base in /usr/local/cuda-10.2; do</em></p>
<p>kaldi.mk 폴더가 생기면, 성공했다는 의미이다.</p>
</li>
<li><p>최적화
작업을 수행하는 것이 예민하지 않게끔 수정하는 작업이다.
kaldi.mk 편집기를 열고, 아래와 같이 수정한다.</p>
<h6 id="기존-코드">기존 코드</h6>
<pre><code>CXXFLAGS = -std=c++14 -I.. -isystem $(OPENFSTINC) -O1 \
      -Wall -Wno-sign-compare -Wno-unused-local-typedefs \
      -Wno-deprecated-declarations -Winit-self \
      -DKALDI_DOUBLEPRECISION=$(DOUBLE_PRECISION) \
      -DHAVE_EXECINFO_H=1 -DHAVE_CXXABI_H -DHAVE_MKL $(MKL_CXXFLAGS) \
      -m64 -msse -msse2 -pthread -g</code></pre><h6 id="수정-코드">수정 코드</h6>
<pre><code>CXXFLAGS = -std=c++14 -I.. -isystem $(OPENFSTINC) \
      -Wall -Wno-sign-compare -Wno-unused-local-typedefs \
      -Wno-deprecated-declarations -Winit-self \
      -DKALDI_DOUBLEPRECISION=$(DOUBLE_PRECISION) \
      -DHAVE_EXECINFO_H=1 -DHAVE_CXXABI_H -DHAVE_MKL $(MKL_CXXFLAGS) \
      -m64 -msse -msse2 -pthread -O2 -fpermissive</code></pre></li>
<li><p>Make</p>
<pre><code>make depend -j 60 #종속성 체크
make -j 60 #병렬적으로 작업 실행</code></pre></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Doc2vec 코드 분석 2]]></title>
            <link>https://velog.io/@yoon-hyewon/Doc2vec-%EC%BD%94%EB%93%9C-%EB%B6%84%EC%84%9D2</link>
            <guid>https://velog.io/@yoon-hyewon/Doc2vec-%EC%BD%94%EB%93%9C-%EB%B6%84%EC%84%9D2</guid>
            <pubDate>Thu, 20 Oct 2022 07:46:46 GMT</pubDate>
            <description><![CDATA[<p><strong>Python 구현 부분</strong>
_do_train_job() 함수에서 훈련 방법 3가지 중에서 설정해둔 훈련 방법으로 훈련 진행
<img src="https://velog.velcdn.com/images/yoon-hyewon/post/009d0494-b55d-4e4a-aeaf-473bfe38d7b9/image.png" alt=""></p>
<p><strong>Cython 구현 부분</strong>
doc2vec_inner.pyx 파일 中 PV-DM(Sum or Average) 훈련 함수 train_document_dm() 구현 Part.</p>
<p>1) 객체 가져오기 및 초기 설정
<img src="https://velog.velcdn.com/images/yoon-hyewon/post/eebde08b-427f-4610-b83c-fc988feb4fd9/image.png" alt="">
2) Dm 모델 구현 과정
<img src="https://velog.velcdn.com/images/yoon-hyewon/post/e4405290-fc73-4d49-8ee1-d37d68551f23/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Doc2vec 코드 분석 1]]></title>
            <link>https://velog.io/@yoon-hyewon/Doc2vec-%EC%BD%94%EB%93%9C-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@yoon-hyewon/Doc2vec-%EC%BD%94%EB%93%9C-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Thu, 20 Oct 2022 07:38:25 GMT</pubDate>
            <description><![CDATA[<p>● 모델 코드
model = g.Doc2Vec(docs, vectorsize=vectorsize, window_size=window_size, min_count=min_count, sample=sampling_threshold, workers=worker_count, hs=0, dm=dm, negative=negative_size, dm_concat=0)</p>
<p>● 학습 과정 코드</p>
<ol>
<li>Doc2Vec 클래스 init에서 super()를 통해 Word2Vec 클래스 호출</li>
<li>Word2Vec 클래스 init에서 코퍼스 정상 체크 함수, _check_corpus_sanity(), 단어 사전 생성 함수 build_vocab(), 훈련 함수 train() 실행</li>
<li>Word2vec 클래스의 train() 내에 싱글 에포크 훈련 함수 _train_epoch() 실행</li>
<li>Word2vec 클래스의 _train_epoch() 내에 여러 개의 배치에 대하여 반복 수행 함수 _worker_loop() 실행</li>
<li>Word2vec 클래스의 _worker_loop() 내에 하나의 배치에 대한 훈련 함수_do_train_job() 실행</li>
<li>Doc2vec 클래스에서 _do_train_job() 함수를 오버라이딩 </li>
<li>_do_train_job() 함수에서 dbow, pvdm (sum or average), pvdm (concat) 중에 설정해둔 훈련 방법으로 훈련 진행 (doc2vec_inner.cpp, doc2vec_iner.pyx, doc2vec_inner.pxd를 통한 내부 함수 실행)</li>
</ol>
<p>*cpp = 함수 구현, pyx = 파이썬 문법을 기반으로 C/C++ 루틴 호출을 위한 cython언어(cython to c/c++), pxd = c/c++ 헤더와 동일한 cython 스크립트
<img src="https://velog.velcdn.com/images/yoon-hyewon/post/c91896c4-c495-4fdf-92ed-266236199cc4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yoon-hyewon/post/27db27aa-6542-4ee1-81ca-a041ebda7d4e/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>