Lycoris53
commited on
Commit
•
03204e8
0
Parent(s):
Duplicate from Lycoris53/VITS-TTS-Japanese-Only-Amitaro
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +1 -0
- .gitignore +3 -0
- ConvertBitrate.ipynb +165 -0
- ConvertBitrate.py +77 -0
- LICENSE +201 -0
- OUTPUT_MODEL/D_Amitaro.pth +3 -0
- OUTPUT_MODEL/G_Amitaro.pth +3 -0
- OUTPUT_MODEL/config.json +56 -0
- ParseAmitaroHTML.py +68 -0
- README.md +13 -0
- Test_Inference.ipynb +129 -0
- VC_inference.py +146 -0
- amitaro_jp_base.json +56 -0
- app.py +66 -0
- attentions.py +303 -0
- cmd_inference.py +106 -0
- commons.py +164 -0
- configs/amitaro_jp_base.json +56 -0
- custom_character_voice/amitaro/amitaro_0.wav +0 -0
- custom_character_voice/amitaro/amitaro_1.wav +0 -0
- custom_character_voice/amitaro/amitaro_10.wav +0 -0
- custom_character_voice/amitaro/amitaro_11.wav +0 -0
- custom_character_voice/amitaro/amitaro_12.wav +0 -0
- custom_character_voice/amitaro/amitaro_13.wav +0 -0
- custom_character_voice/amitaro/amitaro_14.wav +0 -0
- custom_character_voice/amitaro/amitaro_15.wav +0 -0
- custom_character_voice/amitaro/amitaro_16.wav +0 -0
- custom_character_voice/amitaro/amitaro_17.wav +0 -0
- custom_character_voice/amitaro/amitaro_18.wav +0 -0
- custom_character_voice/amitaro/amitaro_19.wav +0 -0
- custom_character_voice/amitaro/amitaro_2.wav +0 -0
- custom_character_voice/amitaro/amitaro_20.wav +0 -0
- custom_character_voice/amitaro/amitaro_21.wav +0 -0
- custom_character_voice/amitaro/amitaro_22.wav +0 -0
- custom_character_voice/amitaro/amitaro_23.wav +0 -0
- custom_character_voice/amitaro/amitaro_24.wav +4 -0
- custom_character_voice/amitaro/amitaro_25.wav +0 -0
- custom_character_voice/amitaro/amitaro_26.wav +0 -0
- custom_character_voice/amitaro/amitaro_27.wav +0 -0
- custom_character_voice/amitaro/amitaro_28.wav +0 -0
- custom_character_voice/amitaro/amitaro_29.wav +0 -0
- custom_character_voice/amitaro/amitaro_3.wav +0 -0
- custom_character_voice/amitaro/amitaro_30.wav +0 -0
- custom_character_voice/amitaro/amitaro_31.wav +0 -0
- custom_character_voice/amitaro/amitaro_32.wav +0 -0
- custom_character_voice/amitaro/amitaro_33.wav +0 -0
- custom_character_voice/amitaro/amitaro_34.wav +0 -0
- custom_character_voice/amitaro/amitaro_35.wav +0 -0
- custom_character_voice/amitaro/amitaro_36.wav +0 -0
- custom_character_voice/amitaro/amitaro_37.wav +0 -0
.gitattributes
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
.ipynb_checkpoints/
|
2 |
+
__pycache__/
|
3 |
+
pretrained_models/
|
ConvertBitrate.ipynb
ADDED
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 4,
|
6 |
+
"id": "8775d691",
|
7 |
+
"metadata": {},
|
8 |
+
"outputs": [],
|
9 |
+
"source": [
|
10 |
+
"import librosa\n",
|
11 |
+
"import os\n",
|
12 |
+
"import soundfile\n",
|
13 |
+
"from tqdm import tqdm, tqdm_notebook"
|
14 |
+
]
|
15 |
+
},
|
16 |
+
{
|
17 |
+
"cell_type": "code",
|
18 |
+
"execution_count": 5,
|
19 |
+
"id": "bcd1f6dc",
|
20 |
+
"metadata": {},
|
21 |
+
"outputs": [
|
22 |
+
{
|
23 |
+
"name": "stderr",
|
24 |
+
"output_type": "stream",
|
25 |
+
"text": [
|
26 |
+
" 26%|█████████████████████████████████████████████▊ | 2606/10000 [01:01<02:54, 42.35it/s]"
|
27 |
+
]
|
28 |
+
},
|
29 |
+
{
|
30 |
+
"name": "stdout",
|
31 |
+
"output_type": "stream",
|
32 |
+
"text": [
|
33 |
+
"Total audio file written : 2606\n"
|
34 |
+
]
|
35 |
+
},
|
36 |
+
{
|
37 |
+
"name": "stderr",
|
38 |
+
"output_type": "stream",
|
39 |
+
"text": [
|
40 |
+
"\n"
|
41 |
+
]
|
42 |
+
}
|
43 |
+
],
|
44 |
+
"source": [
|
45 |
+
"base_dir = \"../data/amitaro\"\n",
|
46 |
+
"output_dir = \"../data/amitaro_22050hz\"\n",
|
47 |
+
"all_dir = [f for f in os.listdir(base_dir) if not os.path.isfile(os.path.join(base_dir, f))]\n",
|
48 |
+
"\n",
|
49 |
+
"file_list = []\n",
|
50 |
+
"\n",
|
51 |
+
"skip_dir = [\"301_dousa\",\n",
|
52 |
+
" \"801_eng_suuji\",\n",
|
53 |
+
" \"801_eng_jikan\",\n",
|
54 |
+
" \"803_eng_others\",\n",
|
55 |
+
" \"912_alphabet\",\n",
|
56 |
+
" \"912_alphabet2\",\n",
|
57 |
+
" \"913_web\",\n",
|
58 |
+
" \"sample\"]\n",
|
59 |
+
"\n",
|
60 |
+
"total_file_write = 0\n",
|
61 |
+
"\n",
|
62 |
+
"def recursive_til_audio_file_found(path):\n",
|
63 |
+
" listed_dir = [f for f in os.listdir(path)]\n",
|
64 |
+
" if len(listed_dir) == 0:\n",
|
65 |
+
" return\n",
|
66 |
+
" test_path_first = os.path.join(path, listed_dir[0])\n",
|
67 |
+
" \n",
|
68 |
+
" # continue through the directory if not a file\n",
|
69 |
+
" if not os.path.isfile(test_path_first):\n",
|
70 |
+
" for next_dir in listed_dir:\n",
|
71 |
+
" next_path = os.path.join(path, next_dir)\n",
|
72 |
+
" # skip any directory specify in skip_dir\n",
|
73 |
+
" for skip in skip_dir:\n",
|
74 |
+
" if next_path.find(skip) != -1:\n",
|
75 |
+
" break\n",
|
76 |
+
" else:\n",
|
77 |
+
" recursive_til_audio_file_found(next_path)\n",
|
78 |
+
" return\n",
|
79 |
+
"\n",
|
80 |
+
" #for new_dir in tqdm_notebook(listed_dir, desc=f\"Processing : {path}\"):\n",
|
81 |
+
" for new_dir in listed_dir:\n",
|
82 |
+
" new_path = os.path.join(path, new_dir)\n",
|
83 |
+
" \n",
|
84 |
+
" #if it is file, convert the audio to 16k and write to output directory\n",
|
85 |
+
"# output_path_base = path.replace(base_dir, output_dir)\n",
|
86 |
+
"# if not os.path.exists(output_path_base):\n",
|
87 |
+
"# os.makedirs(output_path_base, exist_ok=True)\n",
|
88 |
+
"\n",
|
89 |
+
" # not an audio file\n",
|
90 |
+
" if new_path.find(\".wav\") == -1 and new_path.find(\".mp3\") == -1:\n",
|
91 |
+
" continue\n",
|
92 |
+
"\n",
|
93 |
+
" global total_file_write\n",
|
94 |
+
"# audio, rate = librosa.load(new_path, sr=16000)\n",
|
95 |
+
" audio, rate = librosa.load(new_path, sr=22050)\n",
|
96 |
+
"# output_path = os.path.join(output_path_base, new_dir)\n",
|
97 |
+
" output_path = os.path.join(output_dir, new_dir)\n",
|
98 |
+
"# output_path = os.path.join(output_dir, \"sakuramiko_\" + str(total_file_write) + \".wav\")\n",
|
99 |
+
"# output_path = os.path.join(output_dir, new_dir[0:-4] + \".wav\")\n",
|
100 |
+
" soundfile.write(output_path, audio, rate, format='wav', subtype=\"PCM_16\")\n",
|
101 |
+
" file_list.append(new_dir)\n",
|
102 |
+
" \n",
|
103 |
+
" total_file_write += 1\n",
|
104 |
+
" pbar.update(1)\n",
|
105 |
+
" #print(f\"\\rWrite file{output_path}\", end=\"\")\n",
|
106 |
+
" \n",
|
107 |
+
"with tqdm(total=10000) as pbar:\n",
|
108 |
+
" recursive_til_audio_file_found(base_dir)\n",
|
109 |
+
"print(f\"Total audio file written : {total_file_write}\")"
|
110 |
+
]
|
111 |
+
},
|
112 |
+
{
|
113 |
+
"cell_type": "code",
|
114 |
+
"execution_count": 7,
|
115 |
+
"id": "7efe2fec",
|
116 |
+
"metadata": {},
|
117 |
+
"outputs": [],
|
118 |
+
"source": [
|
119 |
+
"import os\n",
|
120 |
+
"base_dir = \"../data/amitaro_22050hz\"\n",
|
121 |
+
"output_dir = \"./custom_character_voice/amitaro\"\n",
|
122 |
+
"listed_dir = [f for f in os.listdir(base_dir)]\n",
|
123 |
+
"for i, val in enumerate(listed_dir):\n",
|
124 |
+
" os.rename(os.path.join(base_dir, val), os.path.join(output_dir, f\"amitaro_{i}.wav\"))"
|
125 |
+
]
|
126 |
+
},
|
127 |
+
{
|
128 |
+
"cell_type": "code",
|
129 |
+
"execution_count": null,
|
130 |
+
"id": "34c1fd46",
|
131 |
+
"metadata": {},
|
132 |
+
"outputs": [],
|
133 |
+
"source": [
|
134 |
+
"import json\n",
|
135 |
+
"out_json = {}\n",
|
136 |
+
"for val in file_list:\n",
|
137 |
+
" out_json[val] = {\"path\":val, \"kana\":\"\"}\n",
|
138 |
+
" \n",
|
139 |
+
"with open(\"./amitaro.json\", \"w\") as outfile:\n",
|
140 |
+
" outfile.write(json.dumps(out_json))"
|
141 |
+
]
|
142 |
+
}
|
143 |
+
],
|
144 |
+
"metadata": {
|
145 |
+
"kernelspec": {
|
146 |
+
"display_name": "Python 3 (ipykernel)",
|
147 |
+
"language": "python",
|
148 |
+
"name": "python3"
|
149 |
+
},
|
150 |
+
"language_info": {
|
151 |
+
"codemirror_mode": {
|
152 |
+
"name": "ipython",
|
153 |
+
"version": 3
|
154 |
+
},
|
155 |
+
"file_extension": ".py",
|
156 |
+
"mimetype": "text/x-python",
|
157 |
+
"name": "python",
|
158 |
+
"nbconvert_exporter": "python",
|
159 |
+
"pygments_lexer": "ipython3",
|
160 |
+
"version": "3.10.9"
|
161 |
+
}
|
162 |
+
},
|
163 |
+
"nbformat": 4,
|
164 |
+
"nbformat_minor": 5
|
165 |
+
}
|
ConvertBitrate.py
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import librosa
|
2 |
+
import os
|
3 |
+
import soundfile
|
4 |
+
from tqdm import tqdm, tqdm_notebook
|
5 |
+
|
6 |
+
base_dir = "./data_sakuramiko_senbetsu"
|
7 |
+
output_dir = "./plachta/VITS-fast-fine-tuning/custom_character_voice/sakuramiko"
|
8 |
+
all_dir = [f for f in os.listdir(base_dir) if not os.path.isfile(os.path.join(base_dir, f))]
|
9 |
+
|
10 |
+
file_list = []
|
11 |
+
|
12 |
+
skip_dir = ["301_dousa",
|
13 |
+
"801_eng_suuji",
|
14 |
+
"801_eng_jikan",
|
15 |
+
"803_eng_others",
|
16 |
+
"912_alphabet",
|
17 |
+
"912_alphabet2",
|
18 |
+
"913_web",
|
19 |
+
"sample"]
|
20 |
+
|
21 |
+
total_file_write = 0
|
22 |
+
|
23 |
+
def recursive_til_audio_file_found(path):
|
24 |
+
listed_dir = [f for f in os.listdir(path)]
|
25 |
+
if len(listed_dir) == 0:
|
26 |
+
return
|
27 |
+
test_path_first = os.path.join(path, listed_dir[0])
|
28 |
+
|
29 |
+
# continue through the directory if not a file
|
30 |
+
if not os.path.isfile(test_path_first):
|
31 |
+
for next_dir in listed_dir:
|
32 |
+
next_path = os.path.join(path, next_dir)
|
33 |
+
# skip any directory specify in skip_dir
|
34 |
+
for skip in skip_dir:
|
35 |
+
if next_path.find(skip) != -1:
|
36 |
+
break
|
37 |
+
else:
|
38 |
+
recursive_til_audio_file_found(next_path)
|
39 |
+
return
|
40 |
+
|
41 |
+
#for new_dir in tqdm_notebook(listed_dir, desc=f"Processing : {path}"):
|
42 |
+
for new_dir in listed_dir:
|
43 |
+
new_path = os.path.join(path, new_dir)
|
44 |
+
|
45 |
+
#if it is file, convert the audio to 16k and write to output directory
|
46 |
+
# output_path_base = path.replace(base_dir, output_dir)
|
47 |
+
# if not os.path.exists(output_path_base):
|
48 |
+
# os.makedirs(output_path_base, exist_ok=True)
|
49 |
+
|
50 |
+
# not an audio file
|
51 |
+
if new_path.find(".wav") == -1 and new_path.find(".mp3") == -1:
|
52 |
+
continue
|
53 |
+
|
54 |
+
global total_file_write
|
55 |
+
# audio, rate = librosa.load(new_path, sr=16000)
|
56 |
+
audio, rate = librosa.load(new_path, sr=22050)
|
57 |
+
# output_path = os.path.join(output_path_base, new_dir)
|
58 |
+
output_path = os.path.join(output_dir, "sakuramiko_" + str(total_file_write) + ".wav")
|
59 |
+
# output_path = os.path.join(output_dir, new_dir[0:-4] + ".wav")
|
60 |
+
soundfile.write(output_path, audio, rate, format='wav', subtype="PCM_16")
|
61 |
+
file_list.append(new_dir)
|
62 |
+
|
63 |
+
total_file_write += 1
|
64 |
+
pbar.update(1)
|
65 |
+
#print(f"\rWrite file{output_path}", end="")
|
66 |
+
|
67 |
+
with tqdm(total=24778) as pbar:
|
68 |
+
recursive_til_audio_file_found(base_dir)
|
69 |
+
print(f"Total audio file written : {total_file_write}")
|
70 |
+
|
71 |
+
import json
|
72 |
+
out_json = {}
|
73 |
+
for val in file_list:
|
74 |
+
out_json[val] = {"path":val, "kana":""}
|
75 |
+
|
76 |
+
with open("./amitaro.json", "w") as outfile:
|
77 |
+
outfile.write(json.dumps(out_json))
|
LICENSE
ADDED
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Apache License
|
2 |
+
Version 2.0, January 2004
|
3 |
+
http://www.apache.org/licenses/
|
4 |
+
|
5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
6 |
+
|
7 |
+
1. Definitions.
|
8 |
+
|
9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
11 |
+
|
12 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
13 |
+
the copyright owner that is granting the License.
|
14 |
+
|
15 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
16 |
+
other entities that control, are controlled by, or are under common
|
17 |
+
control with that entity. For the purposes of this definition,
|
18 |
+
"control" means (i) the power, direct or indirect, to cause the
|
19 |
+
direction or management of such entity, whether by contract or
|
20 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
21 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
22 |
+
|
23 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
24 |
+
exercising permissions granted by this License.
|
25 |
+
|
26 |
+
"Source" form shall mean the preferred form for making modifications,
|
27 |
+
including but not limited to software source code, documentation
|
28 |
+
source, and configuration files.
|
29 |
+
|
30 |
+
"Object" form shall mean any form resulting from mechanical
|
31 |
+
transformation or translation of a Source form, including but
|
32 |
+
not limited to compiled object code, generated documentation,
|
33 |
+
and conversions to other media types.
|
34 |
+
|
35 |
+
"Work" shall mean the work of authorship, whether in Source or
|
36 |
+
Object form, made available under the License, as indicated by a
|
37 |
+
copyright notice that is included in or attached to the work
|
38 |
+
(an example is provided in the Appendix below).
|
39 |
+
|
40 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
41 |
+
form, that is based on (or derived from) the Work and for which the
|
42 |
+
editorial revisions, annotations, elaborations, or other modifications
|
43 |
+
represent, as a whole, an original work of authorship. For the purposes
|
44 |
+
of this License, Derivative Works shall not include works that remain
|
45 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
46 |
+
the Work and Derivative Works thereof.
|
47 |
+
|
48 |
+
"Contribution" shall mean any work of authorship, including
|
49 |
+
the original version of the Work and any modifications or additions
|
50 |
+
to that Work or Derivative Works thereof, that is intentionally
|
51 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
52 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
53 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
54 |
+
means any form of electronic, verbal, or written communication sent
|
55 |
+
to the Licensor or its representatives, including but not limited to
|
56 |
+
communication on electronic mailing lists, source code control systems,
|
57 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
58 |
+
Licensor for the purpose of discussing and improving the Work, but
|
59 |
+
excluding communication that is conspicuously marked or otherwise
|
60 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
61 |
+
|
62 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
63 |
+
on behalf of whom a Contribution has been received by Licensor and
|
64 |
+
subsequently incorporated within the Work.
|
65 |
+
|
66 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
67 |
+
this License, each Contributor hereby grants to You a perpetual,
|
68 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
69 |
+
copyright license to reproduce, prepare Derivative Works of,
|
70 |
+
publicly display, publicly perform, sublicense, and distribute the
|
71 |
+
Work and such Derivative Works in Source or Object form.
|
72 |
+
|
73 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
74 |
+
this License, each Contributor hereby grants to You a perpetual,
|
75 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
76 |
+
(except as stated in this section) patent license to make, have made,
|
77 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
78 |
+
where such license applies only to those patent claims licensable
|
79 |
+
by such Contributor that are necessarily infringed by their
|
80 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
81 |
+
with the Work to which such Contribution(s) was submitted. If You
|
82 |
+
institute patent litigation against any entity (including a
|
83 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
84 |
+
or a Contribution incorporated within the Work constitutes direct
|
85 |
+
or contributory patent infringement, then any patent licenses
|
86 |
+
granted to You under this License for that Work shall terminate
|
87 |
+
as of the date such litigation is filed.
|
88 |
+
|
89 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
90 |
+
Work or Derivative Works thereof in any medium, with or without
|
91 |
+
modifications, and in Source or Object form, provided that You
|
92 |
+
meet the following conditions:
|
93 |
+
|
94 |
+
(a) You must give any other recipients of the Work or
|
95 |
+
Derivative Works a copy of this License; and
|
96 |
+
|
97 |
+
(b) You must cause any modified files to carry prominent notices
|
98 |
+
stating that You changed the files; and
|
99 |
+
|
100 |
+
(c) You must retain, in the Source form of any Derivative Works
|
101 |
+
that You distribute, all copyright, patent, trademark, and
|
102 |
+
attribution notices from the Source form of the Work,
|
103 |
+
excluding those notices that do not pertain to any part of
|
104 |
+
the Derivative Works; and
|
105 |
+
|
106 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
107 |
+
distribution, then any Derivative Works that You distribute must
|
108 |
+
include a readable copy of the attribution notices contained
|
109 |
+
within such NOTICE file, excluding those notices that do not
|
110 |
+
pertain to any part of the Derivative Works, in at least one
|
111 |
+
of the following places: within a NOTICE text file distributed
|
112 |
+
as part of the Derivative Works; within the Source form or
|
113 |
+
documentation, if provided along with the Derivative Works; or,
|
114 |
+
within a display generated by the Derivative Works, if and
|
115 |
+
wherever such third-party notices normally appear. The contents
|
116 |
+
of the NOTICE file are for informational purposes only and
|
117 |
+
do not modify the License. You may add Your own attribution
|
118 |
+
notices within Derivative Works that You distribute, alongside
|
119 |
+
or as an addendum to the NOTICE text from the Work, provided
|
120 |
+
that such additional attribution notices cannot be construed
|
121 |
+
as modifying the License.
|
122 |
+
|
123 |
+
You may add Your own copyright statement to Your modifications and
|
124 |
+
may provide additional or different license terms and conditions
|
125 |
+
for use, reproduction, or distribution of Your modifications, or
|
126 |
+
for any such Derivative Works as a whole, provided Your use,
|
127 |
+
reproduction, and distribution of the Work otherwise complies with
|
128 |
+
the conditions stated in this License.
|
129 |
+
|
130 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
131 |
+
any Contribution intentionally submitted for inclusion in the Work
|
132 |
+
by You to the Licensor shall be under the terms and conditions of
|
133 |
+
this License, without any additional terms or conditions.
|
134 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
135 |
+
the terms of any separate license agreement you may have executed
|
136 |
+
with Licensor regarding such Contributions.
|
137 |
+
|
138 |
+
6. Trademarks. This License does not grant permission to use the trade
|
139 |
+
names, trademarks, service marks, or product names of the Licensor,
|
140 |
+
except as required for reasonable and customary use in describing the
|
141 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
142 |
+
|
143 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
144 |
+
agreed to in writing, Licensor provides the Work (and each
|
145 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
146 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
147 |
+
implied, including, without limitation, any warranties or conditions
|
148 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
149 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
150 |
+
appropriateness of using or redistributing the Work and assume any
|
151 |
+
risks associated with Your exercise of permissions under this License.
|
152 |
+
|
153 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
154 |
+
whether in tort (including negligence), contract, or otherwise,
|
155 |
+
unless required by applicable law (such as deliberate and grossly
|
156 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
157 |
+
liable to You for damages, including any direct, indirect, special,
|
158 |
+
incidental, or consequential damages of any character arising as a
|
159 |
+
result of this License or out of the use or inability to use the
|
160 |
+
Work (including but not limited to damages for loss of goodwill,
|
161 |
+
work stoppage, computer failure or malfunction, or any and all
|
162 |
+
other commercial damages or losses), even if such Contributor
|
163 |
+
has been advised of the possibility of such damages.
|
164 |
+
|
165 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
166 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
167 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
168 |
+
or other liability obligations and/or rights consistent with this
|
169 |
+
License. However, in accepting such obligations, You may act only
|
170 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
171 |
+
of any other Contributor, and only if You agree to indemnify,
|
172 |
+
defend, and hold each Contributor harmless for any liability
|
173 |
+
incurred by, or claims asserted against, such Contributor by reason
|
174 |
+
of your accepting any such warranty or additional liability.
|
175 |
+
|
176 |
+
END OF TERMS AND CONDITIONS
|
177 |
+
|
178 |
+
APPENDIX: How to apply the Apache License to your work.
|
179 |
+
|
180 |
+
To apply the Apache License to your work, attach the following
|
181 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
182 |
+
replaced with your own identifying information. (Don't include
|
183 |
+
the brackets!) The text should be enclosed in the appropriate
|
184 |
+
comment syntax for the file format. We also recommend that a
|
185 |
+
file or class name and description of purpose be included on the
|
186 |
+
same "printed page" as the copyright notice for easier
|
187 |
+
identification within third-party archives.
|
188 |
+
|
189 |
+
Copyright [yyyy] [name of copyright owner]
|
190 |
+
|
191 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
192 |
+
you may not use this file except in compliance with the License.
|
193 |
+
You may obtain a copy of the License at
|
194 |
+
|
195 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
196 |
+
|
197 |
+
Unless required by applicable law or agreed to in writing, software
|
198 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
199 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
200 |
+
See the License for the specific language governing permissions and
|
201 |
+
limitations under the License.
|
OUTPUT_MODEL/D_Amitaro.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:4610d88f7ce89c54e7bbee6fe1a60b9c98ade40dc8ec052624d0fcac67d6676c
|
3 |
+
size 187027092
|
OUTPUT_MODEL/G_Amitaro.pth
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:7644eed4b2c8afd8102ba6ec231a81d620d3a9bd5b659c1481552a3b2d4fdbc9
|
3 |
+
size 158888169
|
OUTPUT_MODEL/config.json
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"train": {
|
3 |
+
"log_interval": 200,
|
4 |
+
"eval_interval": 1000,
|
5 |
+
"seed": 1234,
|
6 |
+
"epochs": 10000,
|
7 |
+
"learning_rate": 2e-4,
|
8 |
+
"betas": [0.8, 0.99],
|
9 |
+
"eps": 1e-9,
|
10 |
+
"batch_size": 1,
|
11 |
+
"fp16_run": true,
|
12 |
+
"lr_decay": 0.999875,
|
13 |
+
"segment_size": 8192,
|
14 |
+
"init_lr_ratio": 1,
|
15 |
+
"warmup_epochs": 0,
|
16 |
+
"c_mel": 45,
|
17 |
+
"c_kl": 1.0
|
18 |
+
},
|
19 |
+
"data": {
|
20 |
+
"training_files":"./final_annotation_train.txt",
|
21 |
+
"validation_files":"./final_annotation_val.txt",
|
22 |
+
"text_cleaners":["japanese_cleaners"],
|
23 |
+
"max_wav_value": 32768.0,
|
24 |
+
"sampling_rate": 22050,
|
25 |
+
"filter_length": 1024,
|
26 |
+
"hop_length": 256,
|
27 |
+
"win_length": 1024,
|
28 |
+
"n_mel_channels": 80,
|
29 |
+
"mel_fmin": 0.0,
|
30 |
+
"mel_fmax": null,
|
31 |
+
"add_blank": true,
|
32 |
+
"n_speakers": 1,
|
33 |
+
"cleaned_text": true
|
34 |
+
},
|
35 |
+
"model": {
|
36 |
+
"inter_channels": 192,
|
37 |
+
"hidden_channels": 192,
|
38 |
+
"filter_channels": 768,
|
39 |
+
"n_heads": 2,
|
40 |
+
"n_layers": 6,
|
41 |
+
"kernel_size": 3,
|
42 |
+
"p_dropout": 0.1,
|
43 |
+
"resblock": "1",
|
44 |
+
"resblock_kernel_sizes": [3,7,11],
|
45 |
+
"resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]],
|
46 |
+
"upsample_rates": [8,8,2,2],
|
47 |
+
"upsample_initial_channel": 512,
|
48 |
+
"upsample_kernel_sizes": [16,16,4,4],
|
49 |
+
"n_layers_q": 3,
|
50 |
+
"use_spectral_norm": false,
|
51 |
+
"gin_channels": 256
|
52 |
+
},
|
53 |
+
"speakers": {"amitaro":0
|
54 |
+
},
|
55 |
+
"symbols": ["_", ",", ".", "!", "?", "-", "A", "E", "I", "N", "O", "Q", "U", "a", "b", "d", "e", "f", "g", "h", "i", "j", "k", "m", "n", "o", "p", "r", "s", "t", "u", "v", "w", "y", "z", "\u0283", "\u02a7", "\u2193", "\u2191", " "]
|
56 |
+
}
|
ParseAmitaroHTML.py
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
pip --cert /etc/pki/ca-trust/source/anchors/tri-ace-CA-2015.cer install --trusted-host pypi.org --trusted-host files.pythonhosted.org beautifulsoup4
|
2 |
+
|
3 |
+
from bs4 import BeautifulSoup
|
4 |
+
|
5 |
+
f = open("./amitaro.htm", "r")
|
6 |
+
txt = f.read()
|
7 |
+
soup = BeautifulSoup(txt)
|
8 |
+
print(soup.prettify())
|
9 |
+
|
10 |
+
import json
|
11 |
+
f = open('amitaro.json')
|
12 |
+
file_list = json.load(f)
|
13 |
+
|
14 |
+
td = soup.find_all('td')
|
15 |
+
for i, val in enumerate(td):
|
16 |
+
if len(val.contents) == 0:
|
17 |
+
continue
|
18 |
+
key = val.contents[0]
|
19 |
+
if key in file_list:
|
20 |
+
#print(td[i-1].contents[0])
|
21 |
+
if len(td[i-1].contents) > 0:
|
22 |
+
#print(td[i-1].contents[0])
|
23 |
+
temp = BeautifulSoup(str(td[i-1].contents[0]))
|
24 |
+
a = temp.find_all('a')
|
25 |
+
print(a[0].contents[0])
|
26 |
+
file_list[key]["kana"] = str(a[0].contents[0])
|
27 |
+
|
28 |
+
with open("./amitaro_with_kana.json", "w") as outfile:
|
29 |
+
outfile.write(json.dumps(file_list, indent=4,ensure_ascii=False))
|
30 |
+
|
31 |
+
for key, val in file_list.items():
|
32 |
+
val["path"] = "./data_amitaro22k/" + val["path"]
|
33 |
+
|
34 |
+
with open("./amitaro_with_kana.json", "w") as outfile:
|
35 |
+
outfile.write(json.dumps(file_list, indent=4,ensure_ascii=False))
|
36 |
+
|
37 |
+
file = []
|
38 |
+
for key, val in file_list.items():
|
39 |
+
if len(val['kana']) == 0:
|
40 |
+
continue
|
41 |
+
if val['kana'].find("(") != -1:
|
42 |
+
continue
|
43 |
+
file.append(f"{val['path']}|10|{val['kana']}")
|
44 |
+
|
45 |
+
amitaro_train = []
|
46 |
+
amitaro_val = []
|
47 |
+
for val in file:
|
48 |
+
amitaro_train.append(val)
|
49 |
+
|
50 |
+
import random
|
51 |
+
|
52 |
+
rands = []
|
53 |
+
while len(rands) < len(file)/10:
|
54 |
+
rand_num = random.randint(0, len(file)-1)
|
55 |
+
if rand_num in rands:
|
56 |
+
continue
|
57 |
+
amitaro_val.append(file[rand_num])
|
58 |
+
rands.append(rand_num)
|
59 |
+
|
60 |
+
f = open("amitaro_train.txt", "w")
|
61 |
+
for val in amitaro_train:
|
62 |
+
f.write(f"{val}\n")
|
63 |
+
f.close()
|
64 |
+
|
65 |
+
f = open("amitaro_val.txt", "w")
|
66 |
+
for val in amitaro_val:
|
67 |
+
f.write(f"{val}\n")
|
68 |
+
f.close()
|
README.md
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: VITS-TTS-Japanese-Only-Amitaro
|
3 |
+
emoji: 🚀
|
4 |
+
colorFrom: blue
|
5 |
+
colorTo: pink
|
6 |
+
sdk: gradio
|
7 |
+
sdk_version: 3.27.0
|
8 |
+
app_file: app.py
|
9 |
+
pinned: false
|
10 |
+
python_version: '3.10'
|
11 |
+
license: apache-2.0
|
12 |
+
duplicated_from: Lycoris53/VITS-TTS-Japanese-Only-Amitaro
|
13 |
+
---
|
Test_Inference.ipynb
ADDED
@@ -0,0 +1,129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 2,
|
6 |
+
"id": "5dde1b9d",
|
7 |
+
"metadata": {},
|
8 |
+
"outputs": [],
|
9 |
+
"source": [
|
10 |
+
"from pathlib import Path\n",
|
11 |
+
"import utils\n",
|
12 |
+
"from models import SynthesizerTrn\n",
|
13 |
+
"import torch\n",
|
14 |
+
"from torch import no_grad, LongTensor\n",
|
15 |
+
"import librosa\n",
|
16 |
+
"from text import text_to_sequence, _clean_text\n",
|
17 |
+
"import commons\n",
|
18 |
+
"import scipy.io.wavfile as wavf\n",
|
19 |
+
"import os\n",
|
20 |
+
"\n",
|
21 |
+
"import IPython.display as ipd"
|
22 |
+
]
|
23 |
+
},
|
24 |
+
{
|
25 |
+
"cell_type": "code",
|
26 |
+
"execution_count": 11,
|
27 |
+
"id": "f4bc040a",
|
28 |
+
"metadata": {},
|
29 |
+
"outputs": [
|
30 |
+
{
|
31 |
+
"name": "stdout",
|
32 |
+
"output_type": "stream",
|
33 |
+
"text": [
|
34 |
+
"INFO:root:Loaded checkpoint './OUTPUT_MODEL/G_latest.pth' (iteration 601)\n",
|
35 |
+
"o↑hayoogozaima↓sU.\n",
|
36 |
+
" length:18\n",
|
37 |
+
" length:18\n"
|
38 |
+
]
|
39 |
+
},
|
40 |
+
{
|
41 |
+
"data": {
|
42 |
+
"text/html": [
|
43 |
+
"\n",
|
44 |
+
" <audio controls=\"controls\" >\n",
|
45 |
+
" <source src=\"data:audio/wav;base64,UklGRiSoAABXQVZFZm10IBAAAAABAAEAIlYAAESsAAACABAAZGF0YQCoAAABAAAAAQACAAEAAgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP///v/+////AQAAAAMAAAAEAAUACAAFAAgABwAHAAgABwAHAAgABwAFAAUABgAFAAMAAgADAAEAAAADAAMAAwAEAAEABAAAAAIAAwD+/wAAAQAEAAAABAAGAAMABQAHAAYABgALAAcABAAGAAkACgAIAAUACgAIAAQACQAGAAIAAwAEAAYACAAHAAIAAwAFAAUAAwAEAAUABAAFAAQABAAFAAQAAwACAAEAAwACAAUAAgD//wMAAAABAAIABgAJAAcABgABAAMAAgAAAAIAAQAEAAIAAAAAAAMABAAAAAAAAgAEAAMAAwADAAAAAgACAAUABQACAAAAAQAEAP7/BQAGAAEAAQAAAAUAAwACAAYACAAGAAcACAAHAAUABAAIAAUAAwAEAAQAAwAGAAYAAQAGAAMAAgAGAAUABQAHAAMABQACAAAABAAHAAkABwAFAAkACwAFAAcABgAIAAUAAwAFAAMABAAFAAUABAADAAMABAADAAIAAQAAAAAAAAAAAAMAAQD+////AAAAAP////8AAAIA/f/8///////9//3/AAAAAAAA/P///wAAAAADAP////8CAAAA//8BAAAAAgADAAUABAABAAAA//8DAAMAAAD9/wAABgABAAIABAACAAAAAAADAAQAAwABAAIAAwACAAIAAQACAP//AQD//wAAAwD//wMA/////wAAAgAEAAEAAQAAAAMA/v8AAAEAAAACAAQABQABAAUABwADAAQABwAGAAcABwAEAAUABAACAAMABQACAAEABQADAAYABAAGAAQAAwAEAAAAAgACAAEAAAACAAAA//8CAAIAAQAAAAQABAAAAAIAAQABAAMAAwADAAAAAwAEAAEAAQABAAIAAAAAAAEAAAD+//7/AgAGAAUA/////wEABQAEAAAA/v8AAAMAAgAFAAIAAQABAAAAAAAAAAUAAgACAAMAAwADAAIAAQAAAAQAAAADAAEAAgAGAAQAAwADAAUABAADAAMABAAAAAYABQAEAAIABgACAAAAAQAAAAIA/v8AAAMAAgADAAEAAgACAAEABgADAAIABQADAAIAAAACAAQAAAACAAUABAAEAAMABQAHAAQABAAIAAYABgAEAAUACQAJAAUACQAEAAUACQAEAAcABwAIAAUABAAFAAMABQAHAAYACQAJAAgACAAIAAkACQAGAAUACAAGAAcABQAHAAkABgAEAAgABQADAAcAAwAEAAUAAwABAAEABAAEAAUABAAJAAoABQAFAAQAAQAAAAMAAAAEAAgACAAGAAIAAQAAAAQABwAHAAAAAQAFAAIAAwAEAAEAAQD//wAAAAADAAEAAAAEAAQABgAEAAIAAAAAAP3//v8DAPz////8//7/AAAAAAEA//////3/AQAAAP7/AAAAAAAAAAADAAMABAAGAAAA//8CAAMAAQABAAUAAQABAAMAAQAAAAIA//8GAAEA//8BAP7//f/8////+f/4//v//v/6//z/AAAAAAAAAgACAAMAAwADAAQAAAACAAAAAgABAAEAAAD//wEAAAD+/wAAAAD//wEAAgABAAIAAwADAAEAAAAFAAoACAAFAAMAAgAJAAcABQAHAAIABQAFAAgABwAKAAYAAwADAAQAAQADAAUAAwAFAAEABQAFAAcACAAFAAcACAAJAAYAAgADAAUABAAFAAUABQADAAIAAwADAAYABgAEAAgAAwAIAAkABwAHAAMABQADAAQAAAAAAAMAAQAAAAAA//8DAAYABAALAAcABwAIAAgABgAGAAMABgAFAAIABgD+/wEAAAAAAAIAAwAEAAIAAwABAAIABAABAP//BgAHAAUABAAEAAAAAAADAAQAAgD///7/+//9//7//v////3///////3/AAD//wAAAgADAAMABQAFAAIAAQABAAIAAAAAAP////////z/+v/9/////f/+/////f/7//n/+v/8//z//v8AAAYAAQAAAAQAAgAAAAAAAgACAAAAAQADAAcACAAFAAMABAADAAUABQACAAcABgAEAAcACAAHAAQACAAGAAoADAAIAAoACQALAAcABwAJAAkABAAHAAUABQAJAAcAAwACAAIAAgAEAAQA/f/+//3//f8DAAIABgAHAAMAAwAJAAIABgAEAAYACgAIAAwABAAJAAoADAALAAgAAQABAAIAAAACAAEAAwADAAUABAAEAAQAAQAEAP///P8BAP7/AgAAAAAAAQACAP7/9P/5//n//v/+//7///8FAAwACAAIAAsADgALAAoACQAFAAkABAADAAMAAQACAAIAAAAAAAUABgAHAP///P///wAA//8CAAMAAgACAAQABQACAAMAAgABAAIABQAFAAcABQAGAAwACwALAAwACQANAA8ADwAQABEAEQASABYAEQAPABMAFAAOAAsAEAAPAAsACAALAAwACAAOABIADgALAAoAEAARABEADwAGAAUACgAGAAEA/P/9//3/+v/4//b/9f/2//T/9//9//7//f///wAAAQACAAQABgAGAAcABgAFAAQABgAFAAcAAQAAAAIABQAEAAMABQAHAAsACwAOAA4AFgAQABYAFwAZABQADwARAA0ADwAHAAkABQAHAAQAAgABAAEA/v8BAPz/+//8//j/+f/z//P/8f/q/+r/5//k/+X/4v/k/+f/5f/i/+T/4f/p/+b/6v/q/+j/7f/v//H/8P/1//L/8//x/+7/8f/y//H/9f/1//3/+v8AAAAABQAFAAgABgAFAAMAAwADAAQABAADAAIAAgACAAIAAgAEAAUABQADAAQABAAFAAUABgAFAAUABAAFAAUABAACAAQABQAFAAMAAwAEAAQAAgADAAUABQACAAIABAAEAAIAAgAEAAYABAADAAIAAwACAAMAAgADAAIAAwADAAMAAwADAAMAAwACAAMAAgACAAIAAgACAAIAAgADAAIAAgACAAIAAwADAAMABQAFAAYABgAIAAYACAAIAAoACQALAAsACwALAAwACgALABAADgAJAAgABwAQABEAFwAaABYAKQBjAJMA5QAnAZYBDQK3AsEDXgMsAn3/df29/Lz7C/sV+rP6f/y5/uD/1gDTAgQDbwOmAt8B7gGcAAUAnv+3AAkBRgCq/y3/2P9x/9/+xf4F/8z/aAAPAdgBrwIhAxIDPQMZA5ECMwGy/2n+RP2E/JP70vqD+j36r/kT+bn3j/b89Rj2pvf6+L/60P20AYIG4AibCCQJNgoRCmsGTgMDBFEEIATRA6cDagQhBJMCtQCv/z3+ffv2+Hj4zfl3+p76Mfxo/4sB3wIBBO0EBAbkBoEHaAf6BhgG2QTMA1UDpAJ9AUEA0f5f/cz7Fvoe+Lf2C/Zx9Rj16fTc9Nf0pPZm+Vn7NfwS/qsEnQo2DQoNfAz6DZcNkApgBpID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GwD5//v/BAAHAP7/DgACAAcAAgD//wUADgAAAAwABAD5//7/+/8AAPf/AwADAAgAAAAQAPb/EwD8//f/FgD3/xEA8f8EAPv/8/8GAOn//v/z//j/9f/w//j/+v8BAAIABwAPAPj/CAAIAAkACQAIAAsAAgANAPz/AADz//7/8/8GAP//+f8BAAEA/v8BAPD/4v/9//f/7P/c/wMA7f/v//r/+//t/wMA/P/1/xMA+P8GAP//8v8HAPr/7//1//v/+v/0//v/7P/+/+7/CADy//7/AgD+/wEA/f8UAPf/CQD3/wAAAAACAAAAEAAFAAwACQAHAAkAAAAYAAgAEQAYABAADgAaAAoADgAgAAgAHAAeAAUAGgADABoAGAAdACgAGgAgABwAGQAVAB8ADAAmABgAGgAiACIAKAAYABcADQASAP//CQAJAAAAAwAGAAMABwABAAEACQAEAA0A+P8LAAYAAwAHAAAABgD4//3/7//n/+z/8f/q/+//7v/u/+3/6P/1//H/9f/6/wAAAAAAAAAABwABAAAABAAKAAsADAAPAAoABAAHAP3/AwAHAAoADgAGAAYACQANAAsADwAHAAsABgALAP//CAAIAP3/CQACAAsACgAKAA8ADwAIAA4ADQAMAA4ACAAMAAgAAAD8//z/+//9/wQA+/8AAPr/+P////v//v8BAAAA///9//X/+P8AAAIAAQADAAcACwD+/wQAAAD+//7//P8BAP7/AgAAAP7//f/7//r//f/1//f/9v/0//P/9f/5//3//P/y//X/9//2//f/+//7//7/+P/7//7/AgAFAAYACgALAA0ABwALAAoABwAOAA0ACQAOAAoACQAJAAoADQAOABMADAAKAAUAAwAHAAUAAAD7/wAABwAAAAQAAgD//////v8AAAAAAgABAAAAAgAFAAgABgAFAAcABgAHAAcACAAFAAUAAQABAAUAAwAEAAAAAwAAAAEA//8AAAQAAQADAAMACQAGAAcABgACAAMAAgAEAAEABAACAAAAAgAAAP//AAD6//r/AgD8/wAAAAAAAPz/+v8AAPv//////////f////7/+v/9//v/+//7//7/AAD8//7//v///wAAAAAAAP3//v///wAAAAD//wAA//8BAAAA/P/+////AwACAAQAAgADAAYACAAGAAMAAgAEAAkABgAIAAgABgAFAAIAAwACAAUAAgACAAUABQAEAAYAAwACAAYAAAAGAAUABgAIAAcABQAEAAYABQADAAEAAwAAAAUAAgACAAEABQACAP//AAD//wAA/v///wEAAgADAAAAAAABAAAABQACAAAABAACAAMAAQACAAUAAQABAAQAAgADAAEAAgAFAAMAAQAEAAIAAQAAAAAAAgACAAEAAwAAAAEAAwAAAAUABQACAAMAAQADAAMABAAFAAIABAAFAAQAAwADAAIABAADAAAAAwAAAAEAAAABAAMAAgABAAEAAQAAAAAAAAABAAEAAAABAAEAAgAAAAIAAQACAAMAAAAAAAEAAAD//wIAAQABAAEAAwAEAAIAAQAAAAMABAADAAAAAAACAAEAAQABAAAAAAAAAAEAAAABAAAAAAAAAAAAAQABAAEAAAABAAAAAAABAP//AAD//wAAAAAAAAAA//8AAAAAAQAAAAAAAAD/////AAAAAAEAAQADAAEAAgAAAAMAAAABAAEAAwAAAAIA//8CAAAAAAADAAAAAAADAAEAAwACAAMABAACAAMAAgAAAAIABAADAAIAAQADAAMAAwADAAMAAwACAAIAAgACAAIAAgADAAMAAgACAAIAAwADAAMAAgACAAMAAwADAAMAAgADAAQABAACAAEAAwAEAAMAAgACAAIAAgABAAEAAgABAAIAAQACAAIAAgABAAIAAgACAAEAAgABAAIAAQACAAEAAgABAAEAAQACAAEAAgABAAEAAQABAAEAAgABAAEAAQABAAEAAgABAAEAAQACAAEAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAQACAAEAAQABAAIAAQACAAEAAQABAAIAAgACAAEAAgABAAIAAQACAAEAAQABAAIAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAgABAAEAAQABAAEAAQADAAMAAAA=\" type=\"audio/wav\" />\n",
|
46 |
+
" Your browser does not support the audio element.\n",
|
47 |
+
" </audio>\n",
|
48 |
+
" "
|
49 |
+
],
|
50 |
+
"text/plain": [
|
51 |
+
"<IPython.lib.display.Audio object>"
|
52 |
+
]
|
53 |
+
},
|
54 |
+
"metadata": {},
|
55 |
+
"output_type": "display_data"
|
56 |
+
}
|
57 |
+
],
|
58 |
+
"source": [
|
59 |
+
"model_path = \"./OUTPUT_MODEL/G_latest.pth\"\n",
|
60 |
+
"config_path = \"./OUTPUT_MODEL/config.json\"\n",
|
61 |
+
"\n",
|
62 |
+
"length = 1.0\n",
|
63 |
+
"device = \"cuda:0\" if torch.cuda.is_available() else \"cpu\"\n",
|
64 |
+
"\n",
|
65 |
+
"def get_text(text, hps, is_symbol):\n",
|
66 |
+
" text_norm = text_to_sequence(text, hps.symbols, [] if is_symbol else hps.data.text_cleaners)\n",
|
67 |
+
" if hps.data.add_blank:\n",
|
68 |
+
" text_norm = commons.intersperse(text_norm, 0)\n",
|
69 |
+
" text_norm = LongTensor(text_norm)\n",
|
70 |
+
" return text_norm\n",
|
71 |
+
"\n",
|
72 |
+
"hps = utils.get_hparams_from_file(config_path)\n",
|
73 |
+
"net_g = SynthesizerTrn(\n",
|
74 |
+
" len(hps.symbols),\n",
|
75 |
+
" hps.data.filter_length // 2 + 1,\n",
|
76 |
+
" hps.train.segment_size // hps.data.hop_length,\n",
|
77 |
+
" n_speakers=hps.data.n_speakers,\n",
|
78 |
+
" **hps.model).to(device)\n",
|
79 |
+
"_ = net_g.eval()\n",
|
80 |
+
"_ = utils.load_checkpoint(model_path, net_g, None)\n",
|
81 |
+
"\n",
|
82 |
+
"speaker_ids = hps.speakers\n",
|
83 |
+
"\n",
|
84 |
+
"text = \"おはようございます。\"\n",
|
85 |
+
"#text = \"[JA]\" + text + \"[JA]\"\n",
|
86 |
+
"speaker_id = 0\n",
|
87 |
+
"stn_tst = get_text(text, hps, False)\n",
|
88 |
+
"with no_grad():\n",
|
89 |
+
" x_tst = stn_tst.unsqueeze(0).to(device)\n",
|
90 |
+
" x_tst_lengths = LongTensor([stn_tst.size(0)]).to(device)\n",
|
91 |
+
" sid = LongTensor([speaker_id]).to(device)\n",
|
92 |
+
" audio = net_g.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=.667, noise_scale_w=0.6,\n",
|
93 |
+
" length_scale=1.0 / length)[0][0, 0].data.cpu().float().numpy()\n",
|
94 |
+
"del stn_tst, x_tst, x_tst_lengths, sid\n",
|
95 |
+
"\n",
|
96 |
+
"ipd.display(ipd.Audio(audio, rate=hps.data.sampling_rate, normalize=False))"
|
97 |
+
]
|
98 |
+
},
|
99 |
+
{
|
100 |
+
"cell_type": "code",
|
101 |
+
"execution_count": null,
|
102 |
+
"id": "032cc92d",
|
103 |
+
"metadata": {},
|
104 |
+
"outputs": [],
|
105 |
+
"source": []
|
106 |
+
}
|
107 |
+
],
|
108 |
+
"metadata": {
|
109 |
+
"kernelspec": {
|
110 |
+
"display_name": "Python 3 (ipykernel)",
|
111 |
+
"language": "python",
|
112 |
+
"name": "python3"
|
113 |
+
},
|
114 |
+
"language_info": {
|
115 |
+
"codemirror_mode": {
|
116 |
+
"name": "ipython",
|
117 |
+
"version": 3
|
118 |
+
},
|
119 |
+
"file_extension": ".py",
|
120 |
+
"mimetype": "text/x-python",
|
121 |
+
"name": "python",
|
122 |
+
"nbconvert_exporter": "python",
|
123 |
+
"pygments_lexer": "ipython3",
|
124 |
+
"version": "3.10.9"
|
125 |
+
}
|
126 |
+
},
|
127 |
+
"nbformat": 4,
|
128 |
+
"nbformat_minor": 5
|
129 |
+
}
|
VC_inference.py
ADDED
@@ -0,0 +1,146 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import numpy as np
|
3 |
+
import torch
|
4 |
+
from torch import no_grad, LongTensor
|
5 |
+
import argparse
|
6 |
+
import commons
|
7 |
+
from mel_processing import spectrogram_torch
|
8 |
+
import utils
|
9 |
+
from models import SynthesizerTrn
|
10 |
+
import gradio as gr
|
11 |
+
import librosa
|
12 |
+
import webbrowser
|
13 |
+
|
14 |
+
from text import text_to_sequence, _clean_text
|
15 |
+
device = "cuda:0" if torch.cuda.is_available() else "cpu"
|
16 |
+
import logging
|
17 |
+
logging.getLogger("PIL").setLevel(logging.WARNING)
|
18 |
+
logging.getLogger("urllib3").setLevel(logging.WARNING)
|
19 |
+
logging.getLogger("markdown_it").setLevel(logging.WARNING)
|
20 |
+
logging.getLogger("httpx").setLevel(logging.WARNING)
|
21 |
+
logging.getLogger("asyncio").setLevel(logging.WARNING)
|
22 |
+
|
23 |
+
language_marks = {
|
24 |
+
"Japanese": "",
|
25 |
+
"日本語": "[JA]",
|
26 |
+
"简体中文": "[ZH]",
|
27 |
+
"English": "[EN]",
|
28 |
+
"Mix": "",
|
29 |
+
}
|
30 |
+
lang = ['日本語', '简体中文', 'English', 'Mix']
|
31 |
+
def get_text(text, hps, is_symbol):
|
32 |
+
text_norm = text_to_sequence(text, hps.symbols, [] if is_symbol else hps.data.text_cleaners)
|
33 |
+
if hps.data.add_blank:
|
34 |
+
text_norm = commons.intersperse(text_norm, 0)
|
35 |
+
text_norm = LongTensor(text_norm)
|
36 |
+
return text_norm
|
37 |
+
|
38 |
+
def create_tts_fn(model, hps, speaker_ids):
|
39 |
+
def tts_fn(text, speaker, language, speed):
|
40 |
+
if language is not None:
|
41 |
+
text = language_marks[language] + text + language_marks[language]
|
42 |
+
speaker_id = speaker_ids[speaker]
|
43 |
+
stn_tst = get_text(text, hps, False)
|
44 |
+
with no_grad():
|
45 |
+
x_tst = stn_tst.unsqueeze(0).to(device)
|
46 |
+
x_tst_lengths = LongTensor([stn_tst.size(0)]).to(device)
|
47 |
+
sid = LongTensor([speaker_id]).to(device)
|
48 |
+
audio = model.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=.667, noise_scale_w=0.8,
|
49 |
+
length_scale=1.0 / speed)[0][0, 0].data.cpu().float().numpy()
|
50 |
+
del stn_tst, x_tst, x_tst_lengths, sid
|
51 |
+
return "Success", (hps.data.sampling_rate, audio)
|
52 |
+
|
53 |
+
return tts_fn
|
54 |
+
|
55 |
+
def create_vc_fn(model, hps, speaker_ids):
|
56 |
+
def vc_fn(original_speaker, target_speaker, record_audio, upload_audio):
|
57 |
+
input_audio = record_audio if record_audio is not None else upload_audio
|
58 |
+
if input_audio is None:
|
59 |
+
return "You need to record or upload an audio", None
|
60 |
+
sampling_rate, audio = input_audio
|
61 |
+
original_speaker_id = speaker_ids[original_speaker]
|
62 |
+
target_speaker_id = speaker_ids[target_speaker]
|
63 |
+
|
64 |
+
audio = (audio / np.iinfo(audio.dtype).max).astype(np.float32)
|
65 |
+
if len(audio.shape) > 1:
|
66 |
+
audio = librosa.to_mono(audio.transpose(1, 0))
|
67 |
+
if sampling_rate != hps.data.sampling_rate:
|
68 |
+
audio = librosa.resample(audio, orig_sr=sampling_rate, target_sr=hps.data.sampling_rate)
|
69 |
+
with no_grad():
|
70 |
+
y = torch.FloatTensor(audio)
|
71 |
+
y = y / max(-y.min(), y.max()) / 0.99
|
72 |
+
y = y.to(device)
|
73 |
+
y = y.unsqueeze(0)
|
74 |
+
spec = spectrogram_torch(y, hps.data.filter_length,
|
75 |
+
hps.data.sampling_rate, hps.data.hop_length, hps.data.win_length,
|
76 |
+
center=False).to(device)
|
77 |
+
spec_lengths = LongTensor([spec.size(-1)]).to(device)
|
78 |
+
sid_src = LongTensor([original_speaker_id]).to(device)
|
79 |
+
sid_tgt = LongTensor([target_speaker_id]).to(device)
|
80 |
+
audio = model.voice_conversion(spec, spec_lengths, sid_src=sid_src, sid_tgt=sid_tgt)[0][
|
81 |
+
0, 0].data.cpu().float().numpy()
|
82 |
+
del y, spec, spec_lengths, sid_src, sid_tgt
|
83 |
+
return "Success", (hps.data.sampling_rate, audio)
|
84 |
+
|
85 |
+
return vc_fn
|
86 |
+
if __name__ == "__main__":
|
87 |
+
parser = argparse.ArgumentParser()
|
88 |
+
parser.add_argument("--model_dir", default="./G_latest.pth", help="directory to your fine-tuned model")
|
89 |
+
parser.add_argument("--config_dir", default="./finetune_speaker.json", help="directory to your model config file")
|
90 |
+
parser.add_argument("--share", default=False, help="make link public (used in colab)")
|
91 |
+
|
92 |
+
args = parser.parse_args()
|
93 |
+
hps = utils.get_hparams_from_file(args.config_dir)
|
94 |
+
|
95 |
+
|
96 |
+
net_g = SynthesizerTrn(
|
97 |
+
len(hps.symbols),
|
98 |
+
hps.data.filter_length // 2 + 1,
|
99 |
+
hps.train.segment_size // hps.data.hop_length,
|
100 |
+
n_speakers=hps.data.n_speakers,
|
101 |
+
**hps.model).to(device)
|
102 |
+
_ = net_g.eval()
|
103 |
+
|
104 |
+
_ = utils.load_checkpoint(args.model_dir, net_g, None)
|
105 |
+
speaker_ids = hps.speakers
|
106 |
+
speakers = list(hps.speakers.keys())
|
107 |
+
tts_fn = create_tts_fn(net_g, hps, speaker_ids)
|
108 |
+
vc_fn = create_vc_fn(net_g, hps, speaker_ids)
|
109 |
+
app = gr.Blocks()
|
110 |
+
with app:
|
111 |
+
with gr.Tab("Text-to-Speech"):
|
112 |
+
with gr.Row():
|
113 |
+
with gr.Column():
|
114 |
+
textbox = gr.TextArea(label="Text",
|
115 |
+
placeholder="Type your sentence here",
|
116 |
+
value="こんにちわ。", elem_id=f"tts-input")
|
117 |
+
# select character
|
118 |
+
char_dropdown = gr.Dropdown(choices=speakers, value=speakers[0], label='character')
|
119 |
+
language_dropdown = gr.Dropdown(choices=lang, value=lang[0], label='language')
|
120 |
+
duration_slider = gr.Slider(minimum=0.1, maximum=5, value=1, step=0.1,
|
121 |
+
label='速度 Speed')
|
122 |
+
with gr.Column():
|
123 |
+
text_output = gr.Textbox(label="Message")
|
124 |
+
audio_output = gr.Audio(label="Output Audio", elem_id="tts-audio")
|
125 |
+
btn = gr.Button("Generate!")
|
126 |
+
btn.click(tts_fn,
|
127 |
+
inputs=[textbox, char_dropdown, language_dropdown, duration_slider,],
|
128 |
+
outputs=[text_output, audio_output])
|
129 |
+
with gr.Tab("Voice Conversion"):
|
130 |
+
gr.Markdown("""
|
131 |
+
录制或上传声音,并选择要转换的音色。
|
132 |
+
""")
|
133 |
+
with gr.Column():
|
134 |
+
record_audio = gr.Audio(label="record your voice", source="microphone")
|
135 |
+
upload_audio = gr.Audio(label="or upload audio here", source="upload")
|
136 |
+
source_speaker = gr.Dropdown(choices=speakers, value=speakers[0], label="source speaker")
|
137 |
+
target_speaker = gr.Dropdown(choices=speakers, value=speakers[0], label="target speaker")
|
138 |
+
with gr.Column():
|
139 |
+
message_box = gr.Textbox(label="Message")
|
140 |
+
converted_audio = gr.Audio(label='converted audio')
|
141 |
+
btn = gr.Button("Convert!")
|
142 |
+
btn.click(vc_fn, inputs=[source_speaker, target_speaker, record_audio, upload_audio],
|
143 |
+
outputs=[message_box, converted_audio])
|
144 |
+
webbrowser.open("http://127.0.0.1:7860")
|
145 |
+
app.launch(share=args.share)
|
146 |
+
|
amitaro_jp_base.json
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"train": {
|
3 |
+
"log_interval": 200,
|
4 |
+
"eval_interval": 1000,
|
5 |
+
"seed": 1234,
|
6 |
+
"epochs": 10000,
|
7 |
+
"learning_rate": 2e-4,
|
8 |
+
"betas": [0.8, 0.99],
|
9 |
+
"eps": 1e-9,
|
10 |
+
"batch_size": 8,
|
11 |
+
"fp16_run": true,
|
12 |
+
"lr_decay": 0.999875,
|
13 |
+
"segment_size": 8192,
|
14 |
+
"init_lr_ratio": 1,
|
15 |
+
"warmup_epochs": 0,
|
16 |
+
"c_mel": 45,
|
17 |
+
"c_kl": 1.0
|
18 |
+
},
|
19 |
+
"data": {
|
20 |
+
"training_files":"./final_annotation_train.txt",
|
21 |
+
"validation_files":"./final_annotation_val.txt",
|
22 |
+
"text_cleaners":["japanese_cleaners"],
|
23 |
+
"max_wav_value": 32768.0,
|
24 |
+
"sampling_rate": 22050,
|
25 |
+
"filter_length": 1024,
|
26 |
+
"hop_length": 256,
|
27 |
+
"win_length": 1024,
|
28 |
+
"n_mel_channels": 80,
|
29 |
+
"mel_fmin": 0.0,
|
30 |
+
"mel_fmax": null,
|
31 |
+
"add_blank": true,
|
32 |
+
"n_speakers": 1,
|
33 |
+
"cleaned_text": true
|
34 |
+
},
|
35 |
+
"model": {
|
36 |
+
"inter_channels": 192,
|
37 |
+
"hidden_channels": 192,
|
38 |
+
"filter_channels": 768,
|
39 |
+
"n_heads": 2,
|
40 |
+
"n_layers": 6,
|
41 |
+
"kernel_size": 3,
|
42 |
+
"p_dropout": 0.1,
|
43 |
+
"resblock": "1",
|
44 |
+
"resblock_kernel_sizes": [3,7,11],
|
45 |
+
"resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]],
|
46 |
+
"upsample_rates": [8,8,2,2],
|
47 |
+
"upsample_initial_channel": 512,
|
48 |
+
"upsample_kernel_sizes": [16,16,4,4],
|
49 |
+
"n_layers_q": 3,
|
50 |
+
"use_spectral_norm": false,
|
51 |
+
"gin_channels": 256
|
52 |
+
},
|
53 |
+
"speakers": {"amitaro":0
|
54 |
+
},
|
55 |
+
"symbols": ["_", ",", ".", "!", "?", "-", "A", "E", "I", "N", "O", "Q", "U", "a", "b", "d", "e", "f", "g", "h", "i", "j", "k", "m", "n", "o", "p", "r", "s", "t", "u", "v", "w", "y", "z", "\u0283", "\u02a7", "\u2193", "\u2191", " "]
|
56 |
+
}
|
app.py
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import utils
|
2 |
+
from models import SynthesizerTrn
|
3 |
+
import torch
|
4 |
+
from torch import no_grad, LongTensor
|
5 |
+
from text import text_to_sequence
|
6 |
+
import gradio as gr
|
7 |
+
import commons
|
8 |
+
|
9 |
+
model_path = "./OUTPUT_MODEL/G_Amitaro.pth"
|
10 |
+
config_path = "./OUTPUT_MODEL/config.json"
|
11 |
+
|
12 |
+
length = 1.0
|
13 |
+
device = "cuda:0" if torch.cuda.is_available() else "cpu"
|
14 |
+
|
15 |
+
def get_text(text, hps, is_symbol):
|
16 |
+
text_norm = text_to_sequence(text, hps.symbols, [] if is_symbol else hps.data.text_cleaners)
|
17 |
+
if hps.data.add_blank:
|
18 |
+
text_norm = commons.intersperse(text_norm, 0)
|
19 |
+
text_norm = LongTensor(text_norm)
|
20 |
+
return text_norm
|
21 |
+
|
22 |
+
def get_vits_array(text):
|
23 |
+
hps = utils.get_hparams_from_file(config_path)
|
24 |
+
net_g = SynthesizerTrn(
|
25 |
+
len(hps.symbols),
|
26 |
+
hps.data.filter_length // 2 + 1,
|
27 |
+
hps.train.segment_size // hps.data.hop_length,
|
28 |
+
n_speakers=hps.data.n_speakers,
|
29 |
+
**hps.model).to(device)
|
30 |
+
_ = net_g.eval()
|
31 |
+
_ = utils.load_checkpoint(model_path, net_g, None)
|
32 |
+
|
33 |
+
speaker_ids = hps.speakers
|
34 |
+
|
35 |
+
#text = "[JA]" + text + "[JA]"
|
36 |
+
speaker_id = 0
|
37 |
+
stn_tst = get_text(text, hps, False)
|
38 |
+
with no_grad():
|
39 |
+
x_tst = stn_tst.unsqueeze(0).to(device)
|
40 |
+
x_tst_lengths = LongTensor([stn_tst.size(0)]).to(device)
|
41 |
+
sid = LongTensor([speaker_id]).to(device)
|
42 |
+
audio = net_g.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=.667, noise_scale_w=0.6,
|
43 |
+
length_scale=1.0 / length)[0][0, 0].data.cpu().float().numpy()
|
44 |
+
del stn_tst, x_tst, x_tst_lengths, sid
|
45 |
+
|
46 |
+
return (hps.data.sampling_rate, audio)
|
47 |
+
|
48 |
+
app = gr.Blocks()
|
49 |
+
with app:
|
50 |
+
gr.Markdown("# VITS-TTS-Japanese-Only-Amitaro\n\n"
|
51 |
+
"Sample usage of Finetune model [Lycoris53/Vits-Japanese-Only-Amitaro](https://huggingface.co/Lycoris53/Vits-Japanese-Only-Amitaro) \n"
|
52 |
+
"Base finetuning code is from [Plachtaa/VITS-fast-fine-tuning](https://github.com/Plachtaa/VITS-fast-fine-tuning)"
|
53 |
+
)
|
54 |
+
with gr.Row():
|
55 |
+
with gr.Column():
|
56 |
+
textbox = gr.TextArea(label="Text",
|
57 |
+
placeholder="Type your sentence here (Maximum 150 words)",
|
58 |
+
value="おはようございます。")
|
59 |
+
with gr.Column():
|
60 |
+
audio_output = gr.Audio(label="Output Audio")
|
61 |
+
btn = gr.Button("Generate Voice!")
|
62 |
+
btn.click(get_vits_array,
|
63 |
+
inputs=[textbox],
|
64 |
+
outputs=[audio_output])
|
65 |
+
|
66 |
+
app.queue(concurrency_count=3).launch()
|
attentions.py
ADDED
@@ -0,0 +1,303 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import copy
|
2 |
+
import math
|
3 |
+
import numpy as np
|
4 |
+
import torch
|
5 |
+
from torch import nn
|
6 |
+
from torch.nn import functional as F
|
7 |
+
|
8 |
+
import commons
|
9 |
+
import modules
|
10 |
+
from modules import LayerNorm
|
11 |
+
|
12 |
+
|
13 |
+
class Encoder(nn.Module):
|
14 |
+
def __init__(self, hidden_channels, filter_channels, n_heads, n_layers, kernel_size=1, p_dropout=0., window_size=4, **kwargs):
|
15 |
+
super().__init__()
|
16 |
+
self.hidden_channels = hidden_channels
|
17 |
+
self.filter_channels = filter_channels
|
18 |
+
self.n_heads = n_heads
|
19 |
+
self.n_layers = n_layers
|
20 |
+
self.kernel_size = kernel_size
|
21 |
+
self.p_dropout = p_dropout
|
22 |
+
self.window_size = window_size
|
23 |
+
|
24 |
+
self.drop = nn.Dropout(p_dropout)
|
25 |
+
self.attn_layers = nn.ModuleList()
|
26 |
+
self.norm_layers_1 = nn.ModuleList()
|
27 |
+
self.ffn_layers = nn.ModuleList()
|
28 |
+
self.norm_layers_2 = nn.ModuleList()
|
29 |
+
for i in range(self.n_layers):
|
30 |
+
self.attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout, window_size=window_size))
|
31 |
+
self.norm_layers_1.append(LayerNorm(hidden_channels))
|
32 |
+
self.ffn_layers.append(FFN(hidden_channels, hidden_channels, filter_channels, kernel_size, p_dropout=p_dropout))
|
33 |
+
self.norm_layers_2.append(LayerNorm(hidden_channels))
|
34 |
+
|
35 |
+
def forward(self, x, x_mask):
|
36 |
+
attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1)
|
37 |
+
x = x * x_mask
|
38 |
+
for i in range(self.n_layers):
|
39 |
+
y = self.attn_layers[i](x, x, attn_mask)
|
40 |
+
y = self.drop(y)
|
41 |
+
x = self.norm_layers_1[i](x + y)
|
42 |
+
|
43 |
+
y = self.ffn_layers[i](x, x_mask)
|
44 |
+
y = self.drop(y)
|
45 |
+
x = self.norm_layers_2[i](x + y)
|
46 |
+
x = x * x_mask
|
47 |
+
return x
|
48 |
+
|
49 |
+
|
50 |
+
class Decoder(nn.Module):
|
51 |
+
def __init__(self, hidden_channels, filter_channels, n_heads, n_layers, kernel_size=1, p_dropout=0., proximal_bias=False, proximal_init=True, **kwargs):
|
52 |
+
super().__init__()
|
53 |
+
self.hidden_channels = hidden_channels
|
54 |
+
self.filter_channels = filter_channels
|
55 |
+
self.n_heads = n_heads
|
56 |
+
self.n_layers = n_layers
|
57 |
+
self.kernel_size = kernel_size
|
58 |
+
self.p_dropout = p_dropout
|
59 |
+
self.proximal_bias = proximal_bias
|
60 |
+
self.proximal_init = proximal_init
|
61 |
+
|
62 |
+
self.drop = nn.Dropout(p_dropout)
|
63 |
+
self.self_attn_layers = nn.ModuleList()
|
64 |
+
self.norm_layers_0 = nn.ModuleList()
|
65 |
+
self.encdec_attn_layers = nn.ModuleList()
|
66 |
+
self.norm_layers_1 = nn.ModuleList()
|
67 |
+
self.ffn_layers = nn.ModuleList()
|
68 |
+
self.norm_layers_2 = nn.ModuleList()
|
69 |
+
for i in range(self.n_layers):
|
70 |
+
self.self_attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout, proximal_bias=proximal_bias, proximal_init=proximal_init))
|
71 |
+
self.norm_layers_0.append(LayerNorm(hidden_channels))
|
72 |
+
self.encdec_attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout))
|
73 |
+
self.norm_layers_1.append(LayerNorm(hidden_channels))
|
74 |
+
self.ffn_layers.append(FFN(hidden_channels, hidden_channels, filter_channels, kernel_size, p_dropout=p_dropout, causal=True))
|
75 |
+
self.norm_layers_2.append(LayerNorm(hidden_channels))
|
76 |
+
|
77 |
+
def forward(self, x, x_mask, h, h_mask):
|
78 |
+
"""
|
79 |
+
x: decoder input
|
80 |
+
h: encoder output
|
81 |
+
"""
|
82 |
+
self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to(device=x.device, dtype=x.dtype)
|
83 |
+
encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1)
|
84 |
+
x = x * x_mask
|
85 |
+
for i in range(self.n_layers):
|
86 |
+
y = self.self_attn_layers[i](x, x, self_attn_mask)
|
87 |
+
y = self.drop(y)
|
88 |
+
x = self.norm_layers_0[i](x + y)
|
89 |
+
|
90 |
+
y = self.encdec_attn_layers[i](x, h, encdec_attn_mask)
|
91 |
+
y = self.drop(y)
|
92 |
+
x = self.norm_layers_1[i](x + y)
|
93 |
+
|
94 |
+
y = self.ffn_layers[i](x, x_mask)
|
95 |
+
y = self.drop(y)
|
96 |
+
x = self.norm_layers_2[i](x + y)
|
97 |
+
x = x * x_mask
|
98 |
+
return x
|
99 |
+
|
100 |
+
|
101 |
+
class MultiHeadAttention(nn.Module):
|
102 |
+
def __init__(self, channels, out_channels, n_heads, p_dropout=0., window_size=None, heads_share=True, block_length=None, proximal_bias=False, proximal_init=False):
|
103 |
+
super().__init__()
|
104 |
+
assert channels % n_heads == 0
|
105 |
+
|
106 |
+
self.channels = channels
|
107 |
+
self.out_channels = out_channels
|
108 |
+
self.n_heads = n_heads
|
109 |
+
self.p_dropout = p_dropout
|
110 |
+
self.window_size = window_size
|
111 |
+
self.heads_share = heads_share
|
112 |
+
self.block_length = block_length
|
113 |
+
self.proximal_bias = proximal_bias
|
114 |
+
self.proximal_init = proximal_init
|
115 |
+
self.attn = None
|
116 |
+
|
117 |
+
self.k_channels = channels // n_heads
|
118 |
+
self.conv_q = nn.Conv1d(channels, channels, 1)
|
119 |
+
self.conv_k = nn.Conv1d(channels, channels, 1)
|
120 |
+
self.conv_v = nn.Conv1d(channels, channels, 1)
|
121 |
+
self.conv_o = nn.Conv1d(channels, out_channels, 1)
|
122 |
+
self.drop = nn.Dropout(p_dropout)
|
123 |
+
|
124 |
+
if window_size is not None:
|
125 |
+
n_heads_rel = 1 if heads_share else n_heads
|
126 |
+
rel_stddev = self.k_channels**-0.5
|
127 |
+
self.emb_rel_k = nn.Parameter(torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) * rel_stddev)
|
128 |
+
self.emb_rel_v = nn.Parameter(torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) * rel_stddev)
|
129 |
+
|
130 |
+
nn.init.xavier_uniform_(self.conv_q.weight)
|
131 |
+
nn.init.xavier_uniform_(self.conv_k.weight)
|
132 |
+
nn.init.xavier_uniform_(self.conv_v.weight)
|
133 |
+
if proximal_init:
|
134 |
+
with torch.no_grad():
|
135 |
+
self.conv_k.weight.copy_(self.conv_q.weight)
|
136 |
+
self.conv_k.bias.copy_(self.conv_q.bias)
|
137 |
+
|
138 |
+
def forward(self, x, c, attn_mask=None):
|
139 |
+
q = self.conv_q(x)
|
140 |
+
k = self.conv_k(c)
|
141 |
+
v = self.conv_v(c)
|
142 |
+
|
143 |
+
x, self.attn = self.attention(q, k, v, mask=attn_mask)
|
144 |
+
|
145 |
+
x = self.conv_o(x)
|
146 |
+
return x
|
147 |
+
|
148 |
+
def attention(self, query, key, value, mask=None):
|
149 |
+
# reshape [b, d, t] -> [b, n_h, t, d_k]
|
150 |
+
b, d, t_s, t_t = (*key.size(), query.size(2))
|
151 |
+
query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3)
|
152 |
+
key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3)
|
153 |
+
value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3)
|
154 |
+
|
155 |
+
scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1))
|
156 |
+
if self.window_size is not None:
|
157 |
+
assert t_s == t_t, "Relative attention is only available for self-attention."
|
158 |
+
key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s)
|
159 |
+
rel_logits = self._matmul_with_relative_keys(query /math.sqrt(self.k_channels), key_relative_embeddings)
|
160 |
+
scores_local = self._relative_position_to_absolute_position(rel_logits)
|
161 |
+
scores = scores + scores_local
|
162 |
+
if self.proximal_bias:
|
163 |
+
assert t_s == t_t, "Proximal bias is only available for self-attention."
|
164 |
+
scores = scores + self._attention_bias_proximal(t_s).to(device=scores.device, dtype=scores.dtype)
|
165 |
+
if mask is not None:
|
166 |
+
scores = scores.masked_fill(mask == 0, -1e4)
|
167 |
+
if self.block_length is not None:
|
168 |
+
assert t_s == t_t, "Local attention is only available for self-attention."
|
169 |
+
block_mask = torch.ones_like(scores).triu(-self.block_length).tril(self.block_length)
|
170 |
+
scores = scores.masked_fill(block_mask == 0, -1e4)
|
171 |
+
p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s]
|
172 |
+
p_attn = self.drop(p_attn)
|
173 |
+
output = torch.matmul(p_attn, value)
|
174 |
+
if self.window_size is not None:
|
175 |
+
relative_weights = self._absolute_position_to_relative_position(p_attn)
|
176 |
+
value_relative_embeddings = self._get_relative_embeddings(self.emb_rel_v, t_s)
|
177 |
+
output = output + self._matmul_with_relative_values(relative_weights, value_relative_embeddings)
|
178 |
+
output = output.transpose(2, 3).contiguous().view(b, d, t_t) # [b, n_h, t_t, d_k] -> [b, d, t_t]
|
179 |
+
return output, p_attn
|
180 |
+
|
181 |
+
def _matmul_with_relative_values(self, x, y):
|
182 |
+
"""
|
183 |
+
x: [b, h, l, m]
|
184 |
+
y: [h or 1, m, d]
|
185 |
+
ret: [b, h, l, d]
|
186 |
+
"""
|
187 |
+
ret = torch.matmul(x, y.unsqueeze(0))
|
188 |
+
return ret
|
189 |
+
|
190 |
+
def _matmul_with_relative_keys(self, x, y):
|
191 |
+
"""
|
192 |
+
x: [b, h, l, d]
|
193 |
+
y: [h or 1, m, d]
|
194 |
+
ret: [b, h, l, m]
|
195 |
+
"""
|
196 |
+
ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1))
|
197 |
+
return ret
|
198 |
+
|
199 |
+
def _get_relative_embeddings(self, relative_embeddings, length):
|
200 |
+
max_relative_position = 2 * self.window_size + 1
|
201 |
+
# Pad first before slice to avoid using cond ops.
|
202 |
+
pad_length = max(length - (self.window_size + 1), 0)
|
203 |
+
slice_start_position = max((self.window_size + 1) - length, 0)
|
204 |
+
slice_end_position = slice_start_position + 2 * length - 1
|
205 |
+
if pad_length > 0:
|
206 |
+
padded_relative_embeddings = F.pad(
|
207 |
+
relative_embeddings,
|
208 |
+
commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]))
|
209 |
+
else:
|
210 |
+
padded_relative_embeddings = relative_embeddings
|
211 |
+
used_relative_embeddings = padded_relative_embeddings[:,slice_start_position:slice_end_position]
|
212 |
+
return used_relative_embeddings
|
213 |
+
|
214 |
+
def _relative_position_to_absolute_position(self, x):
|
215 |
+
"""
|
216 |
+
x: [b, h, l, 2*l-1]
|
217 |
+
ret: [b, h, l, l]
|
218 |
+
"""
|
219 |
+
batch, heads, length, _ = x.size()
|
220 |
+
# Concat columns of pad to shift from relative to absolute indexing.
|
221 |
+
x = F.pad(x, commons.convert_pad_shape([[0,0],[0,0],[0,0],[0,1]]))
|
222 |
+
|
223 |
+
# Concat extra elements so to add up to shape (len+1, 2*len-1).
|
224 |
+
x_flat = x.view([batch, heads, length * 2 * length])
|
225 |
+
x_flat = F.pad(x_flat, commons.convert_pad_shape([[0,0],[0,0],[0,length-1]]))
|
226 |
+
|
227 |
+
# Reshape and slice out the padded elements.
|
228 |
+
x_final = x_flat.view([batch, heads, length+1, 2*length-1])[:, :, :length, length-1:]
|
229 |
+
return x_final
|
230 |
+
|
231 |
+
def _absolute_position_to_relative_position(self, x):
|
232 |
+
"""
|
233 |
+
x: [b, h, l, l]
|
234 |
+
ret: [b, h, l, 2*l-1]
|
235 |
+
"""
|
236 |
+
batch, heads, length, _ = x.size()
|
237 |
+
# padd along column
|
238 |
+
x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length-1]]))
|
239 |
+
x_flat = x.view([batch, heads, length**2 + length*(length -1)])
|
240 |
+
# add 0's in the beginning that will skew the elements after reshape
|
241 |
+
x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]]))
|
242 |
+
x_final = x_flat.view([batch, heads, length, 2*length])[:,:,:,1:]
|
243 |
+
return x_final
|
244 |
+
|
245 |
+
def _attention_bias_proximal(self, length):
|
246 |
+
"""Bias for self-attention to encourage attention to close positions.
|
247 |
+
Args:
|
248 |
+
length: an integer scalar.
|
249 |
+
Returns:
|
250 |
+
a Tensor with shape [1, 1, length, length]
|
251 |
+
"""
|
252 |
+
r = torch.arange(length, dtype=torch.float32)
|
253 |
+
diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1)
|
254 |
+
return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0)
|
255 |
+
|
256 |
+
|
257 |
+
class FFN(nn.Module):
|
258 |
+
def __init__(self, in_channels, out_channels, filter_channels, kernel_size, p_dropout=0., activation=None, causal=False):
|
259 |
+
super().__init__()
|
260 |
+
self.in_channels = in_channels
|
261 |
+
self.out_channels = out_channels
|
262 |
+
self.filter_channels = filter_channels
|
263 |
+
self.kernel_size = kernel_size
|
264 |
+
self.p_dropout = p_dropout
|
265 |
+
self.activation = activation
|
266 |
+
self.causal = causal
|
267 |
+
|
268 |
+
if causal:
|
269 |
+
self.padding = self._causal_padding
|
270 |
+
else:
|
271 |
+
self.padding = self._same_padding
|
272 |
+
|
273 |
+
self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size)
|
274 |
+
self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size)
|
275 |
+
self.drop = nn.Dropout(p_dropout)
|
276 |
+
|
277 |
+
def forward(self, x, x_mask):
|
278 |
+
x = self.conv_1(self.padding(x * x_mask))
|
279 |
+
if self.activation == "gelu":
|
280 |
+
x = x * torch.sigmoid(1.702 * x)
|
281 |
+
else:
|
282 |
+
x = torch.relu(x)
|
283 |
+
x = self.drop(x)
|
284 |
+
x = self.conv_2(self.padding(x * x_mask))
|
285 |
+
return x * x_mask
|
286 |
+
|
287 |
+
def _causal_padding(self, x):
|
288 |
+
if self.kernel_size == 1:
|
289 |
+
return x
|
290 |
+
pad_l = self.kernel_size - 1
|
291 |
+
pad_r = 0
|
292 |
+
padding = [[0, 0], [0, 0], [pad_l, pad_r]]
|
293 |
+
x = F.pad(x, commons.convert_pad_shape(padding))
|
294 |
+
return x
|
295 |
+
|
296 |
+
def _same_padding(self, x):
|
297 |
+
if self.kernel_size == 1:
|
298 |
+
return x
|
299 |
+
pad_l = (self.kernel_size - 1) // 2
|
300 |
+
pad_r = self.kernel_size // 2
|
301 |
+
padding = [[0, 0], [0, 0], [pad_l, pad_r]]
|
302 |
+
x = F.pad(x, commons.convert_pad_shape(padding))
|
303 |
+
return x
|
cmd_inference.py
ADDED
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""该模块用于生成VITS文件
|
2 |
+
使用方法
|
3 |
+
|
4 |
+
python cmd_inference.py -m 模型路径 -c 配置文件路径 -o 输出文件路径 -l 输入的语言 -t 输入文本 -s 合成目标说话人名称
|
5 |
+
|
6 |
+
可选参数
|
7 |
+
-ns 感情变化程度
|
8 |
+
-nsw 音素发音长度
|
9 |
+
-ls 整体语速
|
10 |
+
-on 输出文件的名称
|
11 |
+
|
12 |
+
"""
|
13 |
+
|
14 |
+
from pathlib import Path
|
15 |
+
import utils
|
16 |
+
from models import SynthesizerTrn
|
17 |
+
import torch
|
18 |
+
from torch import no_grad, LongTensor
|
19 |
+
import librosa
|
20 |
+
from text import text_to_sequence, _clean_text
|
21 |
+
import commons
|
22 |
+
import scipy.io.wavfile as wavf
|
23 |
+
import os
|
24 |
+
|
25 |
+
device = "cuda:0" if torch.cuda.is_available() else "cpu"
|
26 |
+
|
27 |
+
language_marks = {
|
28 |
+
"Japanese": "",
|
29 |
+
"日本語": "[JA]",
|
30 |
+
"简体中文": "[ZH]",
|
31 |
+
"English": "[EN]",
|
32 |
+
"Mix": "",
|
33 |
+
}
|
34 |
+
|
35 |
+
|
36 |
+
def get_text(text, hps, is_symbol):
|
37 |
+
text_norm = text_to_sequence(text, hps.symbols, [] if is_symbol else hps.data.text_cleaners)
|
38 |
+
if hps.data.add_blank:
|
39 |
+
text_norm = commons.intersperse(text_norm, 0)
|
40 |
+
text_norm = LongTensor(text_norm)
|
41 |
+
return text_norm
|
42 |
+
|
43 |
+
|
44 |
+
|
45 |
+
if __name__ == "__main__":
|
46 |
+
import argparse
|
47 |
+
|
48 |
+
parser = argparse.ArgumentParser(description='vits inference')
|
49 |
+
#必须参数
|
50 |
+
parser.add_argument('-m', '--model_path', type=str, default="logs/44k/G_0.pth", help='模型路径')
|
51 |
+
parser.add_argument('-c', '--config_path', type=str, default="configs/config.json", help='配置文件路径')
|
52 |
+
parser.add_argument('-o', '--output_path', type=str, default="output/vits", help='输出文件路径')
|
53 |
+
parser.add_argument('-l', '--language', type=str, default="日本語", help='输入的语言')
|
54 |
+
parser.add_argument('-t', '--text', type=str, help='输入文本')
|
55 |
+
parser.add_argument('-s', '--spk', type=str, help='合成目标说话人名称')
|
56 |
+
#可选参数
|
57 |
+
parser.add_argument('-on', '--output_name', type=str, default="output", help='输出文件的名称')
|
58 |
+
parser.add_argument('-ns', '--noise_scale', type=float,default= .667,help='感情变化程度')
|
59 |
+
parser.add_argument('-nsw', '--noise_scale_w', type=float,default=0.6, help='音素发音长度')
|
60 |
+
parser.add_argument('-ls', '--length_scale', type=float,default=1, help='整体语速')
|
61 |
+
|
62 |
+
args = parser.parse_args()
|
63 |
+
|
64 |
+
model_path = args.model_path
|
65 |
+
config_path = args.config_path
|
66 |
+
output_dir = Path(args.output_path)
|
67 |
+
output_dir.mkdir(parents=True, exist_ok=True)
|
68 |
+
|
69 |
+
language = args.language
|
70 |
+
text = args.text
|
71 |
+
spk = args.spk
|
72 |
+
noise_scale = args.noise_scale
|
73 |
+
noise_scale_w = args.noise_scale_w
|
74 |
+
length = args.length_scale
|
75 |
+
output_name = args.output_name
|
76 |
+
|
77 |
+
hps = utils.get_hparams_from_file(config_path)
|
78 |
+
net_g = SynthesizerTrn(
|
79 |
+
len(hps.symbols),
|
80 |
+
hps.data.filter_length // 2 + 1,
|
81 |
+
hps.train.segment_size // hps.data.hop_length,
|
82 |
+
n_speakers=hps.data.n_speakers,
|
83 |
+
**hps.model).to(device)
|
84 |
+
_ = net_g.eval()
|
85 |
+
_ = utils.load_checkpoint(model_path, net_g, None)
|
86 |
+
|
87 |
+
speaker_ids = hps.speakers
|
88 |
+
|
89 |
+
|
90 |
+
if language is not None:
|
91 |
+
text = language_marks[language] + text + language_marks[language]
|
92 |
+
speaker_id = speaker_ids[spk]
|
93 |
+
stn_tst = get_text(text, hps, False)
|
94 |
+
with no_grad():
|
95 |
+
x_tst = stn_tst.unsqueeze(0).to(device)
|
96 |
+
x_tst_lengths = LongTensor([stn_tst.size(0)]).to(device)
|
97 |
+
sid = LongTensor([speaker_id]).to(device)
|
98 |
+
audio = net_g.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=noise_scale, noise_scale_w=noise_scale_w,
|
99 |
+
length_scale=1.0 / length)[0][0, 0].data.cpu().float().numpy()
|
100 |
+
del stn_tst, x_tst, x_tst_lengths, sid
|
101 |
+
|
102 |
+
wavf.write(str(output_dir)+"/"+output_name+".wav",hps.data.sampling_rate,audio)
|
103 |
+
|
104 |
+
|
105 |
+
|
106 |
+
|
commons.py
ADDED
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import math
|
2 |
+
import numpy as np
|
3 |
+
import torch
|
4 |
+
from torch import nn
|
5 |
+
from torch.nn import functional as F
|
6 |
+
|
7 |
+
|
8 |
+
def init_weights(m, mean=0.0, std=0.01):
|
9 |
+
classname = m.__class__.__name__
|
10 |
+
if classname.find("Conv") != -1:
|
11 |
+
m.weight.data.normal_(mean, std)
|
12 |
+
|
13 |
+
|
14 |
+
def get_padding(kernel_size, dilation=1):
|
15 |
+
return int((kernel_size*dilation - dilation)/2)
|
16 |
+
|
17 |
+
|
18 |
+
def convert_pad_shape(pad_shape):
|
19 |
+
l = pad_shape[::-1]
|
20 |
+
pad_shape = [item for sublist in l for item in sublist]
|
21 |
+
return pad_shape
|
22 |
+
|
23 |
+
|
24 |
+
def intersperse(lst, item):
|
25 |
+
result = [item] * (len(lst) * 2 + 1)
|
26 |
+
result[1::2] = lst
|
27 |
+
return result
|
28 |
+
|
29 |
+
|
30 |
+
def kl_divergence(m_p, logs_p, m_q, logs_q):
|
31 |
+
"""KL(P||Q)"""
|
32 |
+
kl = (logs_q - logs_p) - 0.5
|
33 |
+
kl += 0.5 * (torch.exp(2. * logs_p) + ((m_p - m_q)**2)) * torch.exp(-2. * logs_q)
|
34 |
+
return kl
|
35 |
+
|
36 |
+
|
37 |
+
def rand_gumbel(shape):
|
38 |
+
"""Sample from the Gumbel distribution, protect from overflows."""
|
39 |
+
uniform_samples = torch.rand(shape) * 0.99998 + 0.00001
|
40 |
+
return -torch.log(-torch.log(uniform_samples))
|
41 |
+
|
42 |
+
|
43 |
+
def rand_gumbel_like(x):
|
44 |
+
g = rand_gumbel(x.size()).to(dtype=x.dtype, device=x.device)
|
45 |
+
return g
|
46 |
+
|
47 |
+
|
48 |
+
def slice_segments(x, ids_str, segment_size=4):
|
49 |
+
ret = torch.zeros_like(x[:, :, :segment_size])
|
50 |
+
for i in range(x.size(0)):
|
51 |
+
idx_str = ids_str[i]
|
52 |
+
idx_end = idx_str + segment_size
|
53 |
+
try:
|
54 |
+
ret[i] = x[i, :, idx_str:idx_end]
|
55 |
+
except RuntimeError:
|
56 |
+
print("?")
|
57 |
+
return ret
|
58 |
+
|
59 |
+
|
60 |
+
def rand_slice_segments(x, x_lengths=None, segment_size=4):
|
61 |
+
b, d, t = x.size()
|
62 |
+
if x_lengths is None:
|
63 |
+
x_lengths = t
|
64 |
+
ids_str_max = x_lengths - segment_size + 1
|
65 |
+
ids_str = (torch.rand([b]).to(device=x.device) * ids_str_max).to(dtype=torch.long)
|
66 |
+
ret = slice_segments(x, ids_str, segment_size)
|
67 |
+
return ret, ids_str
|
68 |
+
|
69 |
+
|
70 |
+
def get_timing_signal_1d(
|
71 |
+
length, channels, min_timescale=1.0, max_timescale=1.0e4):
|
72 |
+
position = torch.arange(length, dtype=torch.float)
|
73 |
+
num_timescales = channels // 2
|
74 |
+
log_timescale_increment = (
|
75 |
+
math.log(float(max_timescale) / float(min_timescale)) /
|
76 |
+
(num_timescales - 1))
|
77 |
+
inv_timescales = min_timescale * torch.exp(
|
78 |
+
torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment)
|
79 |
+
scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1)
|
80 |
+
signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0)
|
81 |
+
signal = F.pad(signal, [0, 0, 0, channels % 2])
|
82 |
+
signal = signal.view(1, channels, length)
|
83 |
+
return signal
|
84 |
+
|
85 |
+
|
86 |
+
def add_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4):
|
87 |
+
b, channels, length = x.size()
|
88 |
+
signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale)
|
89 |
+
return x + signal.to(dtype=x.dtype, device=x.device)
|
90 |
+
|
91 |
+
|
92 |
+
def cat_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4, axis=1):
|
93 |
+
b, channels, length = x.size()
|
94 |
+
signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale)
|
95 |
+
return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis)
|
96 |
+
|
97 |
+
|
98 |
+
def subsequent_mask(length):
|
99 |
+
mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0)
|
100 |
+
return mask
|
101 |
+
|
102 |
+
|
103 |
+
@torch.jit.script
|
104 |
+
def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels):
|
105 |
+
n_channels_int = n_channels[0]
|
106 |
+
in_act = input_a + input_b
|
107 |
+
t_act = torch.tanh(in_act[:, :n_channels_int, :])
|
108 |
+
s_act = torch.sigmoid(in_act[:, n_channels_int:, :])
|
109 |
+
acts = t_act * s_act
|
110 |
+
return acts
|
111 |
+
|
112 |
+
|
113 |
+
def convert_pad_shape(pad_shape):
|
114 |
+
l = pad_shape[::-1]
|
115 |
+
pad_shape = [item for sublist in l for item in sublist]
|
116 |
+
return pad_shape
|
117 |
+
|
118 |
+
|
119 |
+
def shift_1d(x):
|
120 |
+
x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1]
|
121 |
+
return x
|
122 |
+
|
123 |
+
|
124 |
+
def sequence_mask(length, max_length=None):
|
125 |
+
if max_length is None:
|
126 |
+
max_length = length.max()
|
127 |
+
x = torch.arange(max_length, dtype=length.dtype, device=length.device)
|
128 |
+
return x.unsqueeze(0) < length.unsqueeze(1)
|
129 |
+
|
130 |
+
|
131 |
+
def generate_path(duration, mask):
|
132 |
+
"""
|
133 |
+
duration: [b, 1, t_x]
|
134 |
+
mask: [b, 1, t_y, t_x]
|
135 |
+
"""
|
136 |
+
device = duration.device
|
137 |
+
|
138 |
+
b, _, t_y, t_x = mask.shape
|
139 |
+
cum_duration = torch.cumsum(duration, -1)
|
140 |
+
|
141 |
+
cum_duration_flat = cum_duration.view(b * t_x)
|
142 |
+
path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype)
|
143 |
+
path = path.view(b, t_x, t_y)
|
144 |
+
path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1]
|
145 |
+
path = path.unsqueeze(1).transpose(2,3) * mask
|
146 |
+
return path
|
147 |
+
|
148 |
+
|
149 |
+
def clip_grad_value_(parameters, clip_value, norm_type=2):
|
150 |
+
if isinstance(parameters, torch.Tensor):
|
151 |
+
parameters = [parameters]
|
152 |
+
parameters = list(filter(lambda p: p.grad is not None, parameters))
|
153 |
+
norm_type = float(norm_type)
|
154 |
+
if clip_value is not None:
|
155 |
+
clip_value = float(clip_value)
|
156 |
+
|
157 |
+
total_norm = 0
|
158 |
+
for p in parameters:
|
159 |
+
param_norm = p.grad.data.norm(norm_type)
|
160 |
+
total_norm += param_norm.item() ** norm_type
|
161 |
+
if clip_value is not None:
|
162 |
+
p.grad.data.clamp_(min=-clip_value, max=clip_value)
|
163 |
+
total_norm = total_norm ** (1. / norm_type)
|
164 |
+
return total_norm
|
configs/amitaro_jp_base.json
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"train": {
|
3 |
+
"log_interval": 200,
|
4 |
+
"eval_interval": 1000,
|
5 |
+
"seed": 1234,
|
6 |
+
"epochs": 10000,
|
7 |
+
"learning_rate": 2e-4,
|
8 |
+
"betas": [0.8, 0.99],
|
9 |
+
"eps": 1e-9,
|
10 |
+
"batch_size": 1,
|
11 |
+
"fp16_run": true,
|
12 |
+
"lr_decay": 0.999875,
|
13 |
+
"segment_size": 8192,
|
14 |
+
"init_lr_ratio": 1,
|
15 |
+
"warmup_epochs": 0,
|
16 |
+
"c_mel": 45,
|
17 |
+
"c_kl": 1.0
|
18 |
+
},
|
19 |
+
"data": {
|
20 |
+
"training_files":"./final_annotation_train.txt",
|
21 |
+
"validation_files":"./final_annotation_val.txt",
|
22 |
+
"text_cleaners":["japanese_cleaners"],
|
23 |
+
"max_wav_value": 32768.0,
|
24 |
+
"sampling_rate": 22050,
|
25 |
+
"filter_length": 1024,
|
26 |
+
"hop_length": 256,
|
27 |
+
"win_length": 1024,
|
28 |
+
"n_mel_channels": 80,
|
29 |
+
"mel_fmin": 0.0,
|
30 |
+
"mel_fmax": null,
|
31 |
+
"add_blank": true,
|
32 |
+
"n_speakers": 1,
|
33 |
+
"cleaned_text": true
|
34 |
+
},
|
35 |
+
"model": {
|
36 |
+
"inter_channels": 192,
|
37 |
+
"hidden_channels": 192,
|
38 |
+
"filter_channels": 768,
|
39 |
+
"n_heads": 2,
|
40 |
+
"n_layers": 6,
|
41 |
+
"kernel_size": 3,
|
42 |
+
"p_dropout": 0.1,
|
43 |
+
"resblock": "1",
|
44 |
+
"resblock_kernel_sizes": [3,7,11],
|
45 |
+
"resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]],
|
46 |
+
"upsample_rates": [8,8,2,2],
|
47 |
+
"upsample_initial_channel": 512,
|
48 |
+
"upsample_kernel_sizes": [16,16,4,4],
|
49 |
+
"n_layers_q": 3,
|
50 |
+
"use_spectral_norm": false,
|
51 |
+
"gin_channels": 256
|
52 |
+
},
|
53 |
+
"speakers": {"amitaro":0
|
54 |
+
},
|
55 |
+
"symbols": ["_", ",", ".", "!", "?", "-", "A", "E", "I", "N", "O", "Q", "U", "a", "b", "d", "e", "f", "g", "h", "i", "j", "k", "m", "n", "o", "p", "r", "s", "t", "u", "v", "w", "y", "z", "\u0283", "\u02a7", "\u2193", "\u2191", " "]
|
56 |
+
}
|
custom_character_voice/amitaro/amitaro_0.wav
ADDED
Binary file (145 kB). View file
|
|
custom_character_voice/amitaro/amitaro_1.wav
ADDED
Binary file (174 kB). View file
|
|
custom_character_voice/amitaro/amitaro_10.wav
ADDED
Binary file (82.4 kB). View file
|
|
custom_character_voice/amitaro/amitaro_11.wav
ADDED
Binary file (307 kB). View file
|
|
custom_character_voice/amitaro/amitaro_12.wav
ADDED
Binary file (175 kB). View file
|
|
custom_character_voice/amitaro/amitaro_13.wav
ADDED
Binary file (131 kB). View file
|
|
custom_character_voice/amitaro/amitaro_14.wav
ADDED
Binary file (26.6 kB). View file
|
|
custom_character_voice/amitaro/amitaro_15.wav
ADDED
Binary file (209 kB). View file
|
|
custom_character_voice/amitaro/amitaro_16.wav
ADDED
Binary file (81.7 kB). View file
|
|
custom_character_voice/amitaro/amitaro_17.wav
ADDED
Binary file (244 kB). View file
|
|
custom_character_voice/amitaro/amitaro_18.wav
ADDED
Binary file (137 kB). View file
|
|
custom_character_voice/amitaro/amitaro_19.wav
ADDED
Binary file (187 kB). View file
|
|
custom_character_voice/amitaro/amitaro_2.wav
ADDED
Binary file (78.3 kB). View file
|
|
custom_character_voice/amitaro/amitaro_20.wav
ADDED
Binary file (191 kB). View file
|
|
custom_character_voice/amitaro/amitaro_21.wav
ADDED
Binary file (107 kB). View file
|
|
custom_character_voice/amitaro/amitaro_22.wav
ADDED
Binary file (117 kB). View file
|
|
custom_character_voice/amitaro/amitaro_23.wav
ADDED
Binary file (229 kB). View file
|
|
custom_character_voice/amitaro/amitaro_24.wav
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[ViewState]
|
2 |
+
Mode=
|
3 |
+
Vid=
|
4 |
+
FolderType=Generic
|
custom_character_voice/amitaro/amitaro_25.wav
ADDED
Binary file (101 kB). View file
|
|
custom_character_voice/amitaro/amitaro_26.wav
ADDED
Binary file (83 kB). View file
|
|
custom_character_voice/amitaro/amitaro_27.wav
ADDED
Binary file (91.8 kB). View file
|
|
custom_character_voice/amitaro/amitaro_28.wav
ADDED
Binary file (96.6 kB). View file
|
|
custom_character_voice/amitaro/amitaro_29.wav
ADDED
Binary file (88.6 kB). View file
|
|
custom_character_voice/amitaro/amitaro_3.wav
ADDED
Binary file (105 kB). View file
|
|
custom_character_voice/amitaro/amitaro_30.wav
ADDED
Binary file (97.8 kB). View file
|
|
custom_character_voice/amitaro/amitaro_31.wav
ADDED
Binary file (103 kB). View file
|
|
custom_character_voice/amitaro/amitaro_32.wav
ADDED
Binary file (81.7 kB). View file
|
|
custom_character_voice/amitaro/amitaro_33.wav
ADDED
Binary file (69.7 kB). View file
|
|
custom_character_voice/amitaro/amitaro_34.wav
ADDED
Binary file (83.1 kB). View file
|
|
custom_character_voice/amitaro/amitaro_35.wav
ADDED
Binary file (67.9 kB). View file
|
|
custom_character_voice/amitaro/amitaro_36.wav
ADDED
Binary file (47.1 kB). View file
|
|
custom_character_voice/amitaro/amitaro_37.wav
ADDED
Binary file (72.6 kB). View file
|
|