# Tutorial for SLMTK2.0
###### tags: `slmtkbook` `SLMTK2.0`
---
## 0. CUDA installation
1) Cleaning remaining files
```
sudo rm /etc/apt/sources.list.d/cuda*
sudo apt remove --autoremove nvidia-cuda-toolkit
sudo apt remove --autoremove nvidia-*
```
2)
3) Open the terminal (Ctrl+Alt+T) and execute the following command. It will give you the details of your graphic card and available drivers:
## 1. Environment Setup
1. 在 slmtk 的根目錄下執行 `source ./env.sh` ,這樣就可以讓 SLMTK2.0 建立 script 的程式知道 SLMTK 的程式的根目錄絕對路徑。
2. 在 `slmtk/egs/SLMTK2.0` 目錄下執行```make script-global```,建立所有語者都要用的 shell script
3. 在 `slmtk/egs/SLMTK2.0` 目錄下執行 ```make release-si```,此步驟是將所有語者共用的 TTS 模組,比如 text analysis 打包複製到 slmtk/egs/SLMTK2.0/release/ntpu-tts-SLMTK2.0 下面,同時也會建立一些共用的資料夾。
4. 在 `slmtk/egs/SLMTK2.0/release/ntpu-tts-SLMTK2.0` 目錄下,執行 `sudo make ta`,此步驟將建置所有語者共用的 text anlysis 模組。
5. 在 `slmtk/egs/SLMTK2.0/release/ntpu-tts-SLMTK2.0` 目錄下,執行 `make nn`,此步驟將安裝所有語者共用的 NNSS python library。
6. 在 `slmtk/egs/SLMTK2.0` 目錄下執行 ```make worksite-ntpu-nn-dm-am```,此步驟將NN-based speech synthesis (NNSS) 的 package (ntpu-nn-dm-am) 拷貝到 worksite/ntpu-nn-dm-am 之下。
## 2. TTS Training For Each Speaker
1. 在 `slmtk/egs/SLMTK2.0` 目錄下執行```sh slmtk2.0-create-worksite_for_user.sh uid gender```,建立 uid 語者的工地,並且告知 SLMTK 該位語者的性別,方便強健地抽取 F0。
2. 將某語者的語音以及文字檔放在如以下的資料夾,在 `slmtk/egs/SLMTK2.0` 目錄下執行 ```sh slmtk2.0-copy-user-corpus.sh uid /home/cychiang/CYC/```,這樣子就會把語料的音檔 copy 到`worksite/${spk_id}/wav`,文字檔 copy 至 `worksite/${spk_id}/text`。
```
/home/cychiang/CYC
├── text
│ ├── CYC-CEmix-Adp-0001-1.txt
│ ├── CYC-CEmix-Adp-0001-2.txt
│ ├── CYC-CEmix-Adp-0001-3.txt
│ ├── CYC-CEmix-Adp-0001-4.txt
│ ├── CYC-CEmix-Adp-0002-1.txt
│ ├── CYC-CEmix-Adp-0002-2.txt
│ ├── CYC-CEmix-Adp-0002-3.txt
│ ├── CYC-CEmix-Adp-0002-4.txt
│ ├── CYC-CEmix-Adp-0003-1.txt
│ ├── CYC-CEmix-Adp-0003-2.txt
│ ├── CYC-CEmix-Adp-0003-3.txt
│ ├── CYC-CEmix-Adp-0004-1.txt
│ ├── CYC-CEmix-Adp-0004-2.txt
│ ├── CYC-CEmix-Adp-0005-1.txt
│ ├── CYC-CEmix-Adp-0005-2.txt
│ ├── CYC-CEmix-Adp-0005-3.txt
│ ├── CYC-CEmix-Adp-0005-4.txt
│ ├── CYC-CEmix-Adp-0006-1.txt
│ ├── CYC-CEmix-Adp-0006-2.txt
│ ├── CYC-CEmix-Adp-0007-1.txt
│ ├── CYC-CEmix-Adp-0007-2.txt
│ ├── CYC-CEmix-Adp-0007-3.txt
│ ├── CYC-CEmix-Adp-0007-4.txt
│ ├── CYC-CEmix-Adp-0007-5.txt
│ └── CYC-CEmix-Adp-0008-1.txt
└── wav
├── CYC-CEmix-Adp-0001-1.wav
├── CYC-CEmix-Adp-0001-2.wav
├── CYC-CEmix-Adp-0001-3.wav
├── CYC-CEmix-Adp-0001-4.wav
├── CYC-CEmix-Adp-0002-1.wav
├── CYC-CEmix-Adp-0002-2.wav
├── CYC-CEmix-Adp-0002-3.wav
├── CYC-CEmix-Adp-0002-4.wav
├── CYC-CEmix-Adp-0003-1.wav
├── CYC-CEmix-Adp-0003-2.wav
├── CYC-CEmix-Adp-0003-3.wav
├── CYC-CEmix-Adp-0004-1.wav
├── CYC-CEmix-Adp-0004-2.wav
├── CYC-CEmix-Adp-0005-1.wav
├── CYC-CEmix-Adp-0005-2.wav
├── CYC-CEmix-Adp-0005-3.wav
├── CYC-CEmix-Adp-0005-4.wav
├── CYC-CEmix-Adp-0006-1.wav
├── CYC-CEmix-Adp-0006-2.wav
├── CYC-CEmix-Adp-0007-1.wav
├── CYC-CEmix-Adp-0007-2.wav
├── CYC-CEmix-Adp-0007-3.wav
├── CYC-CEmix-Adp-0007-4.wav
├── CYC-CEmix-Adp-0007-5.wav
└── CYC-CEmix-Adp-0008-1.wav
-
```
3. 在 `slmtk/egs/SLMTK2.0` 目錄下,執行 `sh slmtk2.0-train-user-tts.sh uid`,開始訓練語音合成模型。
4. 在 `slmtk/egs/SLMTK2.0` 目錄下,可以執行 `sh slmtk2.0-query_user_model_training_progress.sh uid` 來確定 uid 的 TTS 模型正在訓練中?
5. 在 `slmtk/egs/SLMTK2.0` 目錄下,可以執行 `sh slmtk2.0-is-user-tts-available.sh uid` 來確定 uid 的 TTS 是否可以用了?
~~4. 在 `slmtk/egs/SLMTK2.0/release/ntpu-tts-SLMTK2.0/` 資料夾之下執行:`make sd ${spk_id}` 建置 `${spk_id}` 的 prosody generation 模型以及`${spk_id}` 的 HTS speech synthesis 模型。~~
5. 在 `slmtk/egs/SLMTK2.0/release/ntpu-tts-SLMTK2.0/` 資料夾之下,可執行以下指令來進行TTS: `sh tts.sh 777 0.21 您好,我是江振宇,很高興認識大家! output.wav`
## 3. API References
### 3.1. 測是某一個 uid 的 TTS 是否存在
在 `slmtk/egs/SLMTK2.0/release/ntpu-tts-SLMTK2.0/` 資料夾之下執行:
```
sh slmtk2.0-is-user-tts-available.sh 437
```
以上指令就是在測試 uid=437 的 TTS 是否存在?
如果 TTS 存在,則會有以下輸出:
```
{"uid":"437", "is_tts_available":true}
```
但如果 TTS 不存在,則會有以下輸出:
```
{"uid":"437", "is_tts_available":false}
```