Plana-Archive commited on
Commit
155c32c
·
verified ·
1 Parent(s): 613d577

Migrasi BangDream Bert-VITS2 ke sub-folder

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +74 -0
  2. BanG-Dream/.pre-commit-config.yaml +25 -0
  3. BanG-Dream/LICENSE +661 -0
  4. BanG-Dream/attentions.py +464 -0
  5. BanG-Dream/attentions_onnx.py +378 -0
  6. BanG-Dream/bert_gen.py +81 -0
  7. BanG-Dream/clap_gen.py +64 -0
  8. BanG-Dream/clap_wrapper.py +49 -0
  9. BanG-Dream/commons.py +158 -0
  10. BanG-Dream/compress_model.py +89 -0
  11. BanG-Dream/config.py +248 -0
  12. BanG-Dream/config.yml +177 -0
  13. BanG-Dream/data_utils.py +405 -0
  14. BanG-Dream/default_config.yml +177 -0
  15. BanG-Dream/emo_gen.py +169 -0
  16. BanG-Dream/empty_emo.npy +3 -0
  17. BanG-Dream/export_onnx.py +14 -0
  18. BanG-Dream/filelists/Mygo.list +0 -0
  19. BanG-Dream/filelists/Mygo.list.cleaned +0 -0
  20. BanG-Dream/filelists/Scenarioband4-046.asset +1 -0
  21. BanG-Dream/filelists/Scenarioband6-018.asset +1 -0
  22. BanG-Dream/filelists/esd.list +3 -0
  23. BanG-Dream/filelists/sample.list +3 -0
  24. BanG-Dream/filelists/train.list +0 -0
  25. BanG-Dream/filelists/val.list +8 -0
  26. BanG-Dream/filelists/圣经.txt +37 -0
  27. BanG-Dream/filelists/逆襲のシャア.epub +3 -0
  28. BanG-Dream/filelists/零零年代的想象力.pdf +3 -0
  29. BanG-Dream/image/41JjBPWdHtL._SX342_SY445_.jpg +0 -0
  30. BanG-Dream/image/41JjBPWdHtL.jpg +0 -0
  31. BanG-Dream/image/image.png +3 -0
  32. BanG-Dream/image/あこ.png +3 -0
  33. BanG-Dream/image/こころ.png +3 -0
  34. BanG-Dream/image/そよ.png +3 -0
  35. BanG-Dream/image/たえ.png +3 -0
  36. BanG-Dream/image/つくし.png +3 -0
  37. BanG-Dream/image/つぐみ.png +3 -0
  38. BanG-Dream/image/にゃむ.png +3 -0
  39. BanG-Dream/image/はぐみ.png +3 -0
  40. BanG-Dream/image/ひまり.png +3 -0
  41. BanG-Dream/image/ましろ.png +3 -0
  42. BanG-Dream/image//343/201/276/343/201/231/343/201/215.png +0 -0
  43. BanG-Dream/image/りみ.png +3 -0
  44. BanG-Dream/image/イヴ.png +3 -0
  45. BanG-Dream/image/チュチュ.png +3 -0
  46. BanG-Dream/image/パレオ.png +3 -0
  47. BanG-Dream/image//343/203/236/343/202/271/343/202/255/343/203/263/343/202/260.png +0 -0
  48. BanG-Dream/image/ミッシェル.png +3 -0
  49. BanG-Dream/image/モカ.png +3 -0
  50. BanG-Dream/image/リサ.png +3 -0
.gitattributes CHANGED
@@ -173,3 +173,77 @@ LoveLive-Nijigasaki/image/高咲侑.png filter=lfs diff=lfs merge=lfs -text
173
  LoveLive-Nijigasaki/monotonic_align/build/lib.win-amd64-3.8/monotonic_align/core.cp38-win_amd64.pyd filter=lfs diff=lfs merge=lfs -text
174
  LoveLive-Nijigasaki/monotonic_align/build/temp.win-amd64-3.8/Release/core.obj filter=lfs diff=lfs merge=lfs -text
175
  LoveLive-Nijigasaki/monotonic_align/monotonic_align/core.cp38-win_amd64.pyd filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  LoveLive-Nijigasaki/monotonic_align/build/lib.win-amd64-3.8/monotonic_align/core.cp38-win_amd64.pyd filter=lfs diff=lfs merge=lfs -text
174
  LoveLive-Nijigasaki/monotonic_align/build/temp.win-amd64-3.8/Release/core.obj filter=lfs diff=lfs merge=lfs -text
175
  LoveLive-Nijigasaki/monotonic_align/monotonic_align/core.cp38-win_amd64.pyd filter=lfs diff=lfs merge=lfs -text
176
+ BanG-Dream/filelists/逆襲のシャア.epub filter=lfs diff=lfs merge=lfs -text
177
+ BanG-Dream/filelists/零零年代的想象力.pdf filter=lfs diff=lfs merge=lfs -text
178
+ BanG-Dream/image/image.png filter=lfs diff=lfs merge=lfs -text
179
+ BanG-Dream/image/あこ.png filter=lfs diff=lfs merge=lfs -text
180
+ BanG-Dream/image/こころ.png filter=lfs diff=lfs merge=lfs -text
181
+ BanG-Dream/image/そよ.png filter=lfs diff=lfs merge=lfs -text
182
+ BanG-Dream/image/たえ.png filter=lfs diff=lfs merge=lfs -text
183
+ BanG-Dream/image/つくし.png filter=lfs diff=lfs merge=lfs -text
184
+ BanG-Dream/image/つぐみ.png filter=lfs diff=lfs merge=lfs -text
185
+ BanG-Dream/image/にゃむ.png filter=lfs diff=lfs merge=lfs -text
186
+ BanG-Dream/image/はぐみ.png filter=lfs diff=lfs merge=lfs -text
187
+ BanG-Dream/image/ひまり.png filter=lfs diff=lfs merge=lfs -text
188
+ BanG-Dream/image/ましろ.png filter=lfs diff=lfs merge=lfs -text
189
+ BanG-Dream/image/りみ.png filter=lfs diff=lfs merge=lfs -text
190
+ BanG-Dream/image/イヴ.png filter=lfs diff=lfs merge=lfs -text
191
+ BanG-Dream/image/チュチュ.png filter=lfs diff=lfs merge=lfs -text
192
+ BanG-Dream/image/パレオ.png filter=lfs diff=lfs merge=lfs -text
193
+ BanG-Dream/image/ミッシェル.png filter=lfs diff=lfs merge=lfs -text
194
+ BanG-Dream/image/モカ.png filter=lfs diff=lfs merge=lfs -text
195
+ BanG-Dream/image/リサ.png filter=lfs diff=lfs merge=lfs -text
196
+ BanG-Dream/image/レイヤ.png filter=lfs diff=lfs merge=lfs -text
197
+ BanG-Dream/image/ロック.png filter=lfs diff=lfs merge=lfs -text
198
+ BanG-Dream/image/一愛.png filter=lfs diff=lfs merge=lfs -text
199
+ BanG-Dream/image/七深.png filter=lfs diff=lfs merge=lfs -text
200
+ BanG-Dream/image/光.png filter=lfs diff=lfs merge=lfs -text
201
+ BanG-Dream/image/克洛迪娜.png filter=lfs diff=lfs merge=lfs -text
202
+ BanG-Dream/image/初華.png filter=lfs diff=lfs merge=lfs -text
203
+ BanG-Dream/image/千聖.png filter=lfs diff=lfs merge=lfs -text
204
+ BanG-Dream/image/友希那.png filter=lfs diff=lfs merge=lfs -text
205
+ BanG-Dream/image/司.png filter=lfs diff=lfs merge=lfs -text
206
+ BanG-Dream/image/壘.png filter=lfs diff=lfs merge=lfs -text
207
+ BanG-Dream/image/奈奈.png filter=lfs diff=lfs merge=lfs -text
208
+ BanG-Dream/image/彩.png filter=lfs diff=lfs merge=lfs -text
209
+ BanG-Dream/image/愛音.png filter=lfs diff=lfs merge=lfs -text
210
+ BanG-Dream/image/文.png filter=lfs diff=lfs merge=lfs -text
211
+ BanG-Dream/image/日菜.png filter=lfs diff=lfs merge=lfs -text
212
+ BanG-Dream/image/晶.png filter=lfs diff=lfs merge=lfs -text
213
+ BanG-Dream/image/有咲.png filter=lfs diff=lfs merge=lfs -text
214
+ BanG-Dream/image/未知留.png filter=lfs diff=lfs merge=lfs -text
215
+ BanG-Dream/image/栞.png filter=lfs diff=lfs merge=lfs -text
216
+ BanG-Dream/image/楽奈.png filter=lfs diff=lfs merge=lfs -text
217
+ BanG-Dream/image/沙綾.png filter=lfs diff=lfs merge=lfs -text
218
+ BanG-Dream/image/海鈴.png filter=lfs diff=lfs merge=lfs -text
219
+ BanG-Dream/image/燈.png filter=lfs diff=lfs merge=lfs -text
220
+ BanG-Dream/image/燐子.png filter=lfs diff=lfs merge=lfs -text
221
+ BanG-Dream/image/珠緒.png filter=lfs diff=lfs merge=lfs -text
222
+ BanG-Dream/image/真晝.png filter=lfs diff=lfs merge=lfs -text
223
+ BanG-Dream/image/真矢.png filter=lfs diff=lfs merge=lfs -text
224
+ BanG-Dream/image/睦.png filter=lfs diff=lfs merge=lfs -text
225
+ BanG-Dream/image/祥子.png filter=lfs diff=lfs merge=lfs -text
226
+ BanG-Dream/image/立希.png filter=lfs diff=lfs merge=lfs -text
227
+ BanG-Dream/image/純那.png filter=lfs diff=lfs merge=lfs -text
228
+ BanG-Dream/image/紗夜.png filter=lfs diff=lfs merge=lfs -text
229
+ BanG-Dream/image/美咲.png filter=lfs diff=lfs merge=lfs -text
230
+ BanG-Dream/image/美帆.png filter=lfs diff=lfs merge=lfs -text
231
+ BanG-Dream/image/美空.png filter=lfs diff=lfs merge=lfs -text
232
+ BanG-Dream/image/艾露.png filter=lfs diff=lfs merge=lfs -text
233
+ BanG-Dream/image/艾露露.png filter=lfs diff=lfs merge=lfs -text
234
+ BanG-Dream/image/花音.png filter=lfs diff=lfs merge=lfs -text
235
+ BanG-Dream/image/菈樂菲.png filter=lfs diff=lfs merge=lfs -text
236
+ BanG-Dream/image/華戀.png filter=lfs diff=lfs merge=lfs -text
237
+ BanG-Dream/image/薫.png filter=lfs diff=lfs merge=lfs -text
238
+ BanG-Dream/image/蘭.png filter=lfs diff=lfs merge=lfs -text
239
+ BanG-Dream/image/透子.png filter=lfs diff=lfs merge=lfs -text
240
+ BanG-Dream/image/雙葉.png filter=lfs diff=lfs merge=lfs -text
241
+ BanG-Dream/image/靜羽.png filter=lfs diff=lfs merge=lfs -text
242
+ BanG-Dream/image/香子.png filter=lfs diff=lfs merge=lfs -text
243
+ BanG-Dream/image/香澄.png filter=lfs diff=lfs merge=lfs -text
244
+ BanG-Dream/image/麻弥.png filter=lfs diff=lfs merge=lfs -text
245
+ BanG-Dream/temp.wav filter=lfs diff=lfs merge=lfs -text
246
+ BanG-Dream/爬虫/BangDreamSortPath.txt filter=lfs diff=lfs merge=lfs -text
247
+ BanG-Dream/爬虫/SortPathUrl.txt filter=lfs diff=lfs merge=lfs -text
248
+ BanG-Dream/爬虫/WholeMp3UrlPaths.txt filter=lfs diff=lfs merge=lfs -text
249
+ BanG-Dream/爬虫/chromedriver-win64/chromedriver.exe filter=lfs diff=lfs merge=lfs -text
BanG-Dream/.pre-commit-config.yaml ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v4.5.0
4
+ hooks:
5
+ - id: check-yaml
6
+ - id: end-of-file-fixer
7
+ - id: trailing-whitespace
8
+
9
+ - repo: https://github.com/astral-sh/ruff-pre-commit
10
+ rev: v0.1.7
11
+ hooks:
12
+ - id: ruff
13
+ args: [ --fix ]
14
+
15
+ - repo: https://github.com/psf/black
16
+ rev: 23.11.0
17
+ hooks:
18
+ - id: black
19
+
20
+ - repo: https://github.com/codespell-project/codespell
21
+ rev: v2.2.6
22
+ hooks:
23
+ - id: codespell
24
+ files: ^.*\.(py|md|rst|yml)$
25
+ args: [-L=fro]
BanG-Dream/LICENSE ADDED
@@ -0,0 +1,661 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU AFFERO GENERAL PUBLIC LICENSE
2
+ Version 3, 19 November 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+ Preamble
9
+
10
+ The GNU Affero General Public License is a free, copyleft license for
11
+ software and other kinds of works, specifically designed to ensure
12
+ cooperation with the community in the case of network server software.
13
+
14
+ The licenses for most software and other practical works are designed
15
+ to take away your freedom to share and change the works. By contrast,
16
+ our General Public Licenses are intended to guarantee your freedom to
17
+ share and change all versions of a program--to make sure it remains free
18
+ software for all its users.
19
+
20
+ When we speak of free software, we are referring to freedom, not
21
+ price. Our General Public Licenses are designed to make sure that you
22
+ have the freedom to distribute copies of free software (and charge for
23
+ them if you wish), that you receive source code or can get it if you
24
+ want it, that you can change the software or use pieces of it in new
25
+ free programs, and that you know you can do these things.
26
+
27
+ Developers that use our General Public Licenses protect your rights
28
+ with two steps: (1) assert copyright on the software, and (2) offer
29
+ you this License which gives you legal permission to copy, distribute
30
+ and/or modify the software.
31
+
32
+ A secondary benefit of defending all users' freedom is that
33
+ improvements made in alternate versions of the program, if they
34
+ receive widespread use, become available for other developers to
35
+ incorporate. Many developers of free software are heartened and
36
+ encouraged by the resulting cooperation. However, in the case of
37
+ software used on network servers, this result may fail to come about.
38
+ The GNU General Public License permits making a modified version and
39
+ letting the public access it on a server without ever releasing its
40
+ source code to the public.
41
+
42
+ The GNU Affero General Public License is designed specifically to
43
+ ensure that, in such cases, the modified source code becomes available
44
+ to the community. It requires the operator of a network server to
45
+ provide the source code of the modified version running there to the
46
+ users of that server. Therefore, public use of a modified version, on
47
+ a publicly accessible server, gives the public access to the source
48
+ code of the modified version.
49
+
50
+ An older license, called the Affero General Public License and
51
+ published by Affero, was designed to accomplish similar goals. This is
52
+ a different license, not a version of the Affero GPL, but Affero has
53
+ released a new version of the Affero GPL which permits relicensing under
54
+ this license.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ TERMS AND CONDITIONS
60
+
61
+ 0. Definitions.
62
+
63
+ "This License" refers to version 3 of the GNU Affero General Public License.
64
+
65
+ "Copyright" also means copyright-like laws that apply to other kinds of
66
+ works, such as semiconductor masks.
67
+
68
+ "The Program" refers to any copyrightable work licensed under this
69
+ License. Each licensee is addressed as "you". "Licensees" and
70
+ "recipients" may be individuals or organizations.
71
+
72
+ To "modify" a work means to copy from or adapt all or part of the work
73
+ in a fashion requiring copyright permission, other than the making of an
74
+ exact copy. The resulting work is called a "modified version" of the
75
+ earlier work or a work "based on" the earlier work.
76
+
77
+ A "covered work" means either the unmodified Program or a work based
78
+ on the Program.
79
+
80
+ To "propagate" a work means to do anything with it that, without
81
+ permission, would make you directly or secondarily liable for
82
+ infringement under applicable copyright law, except executing it on a
83
+ computer or modifying a private copy. Propagation includes copying,
84
+ distribution (with or without modification), making available to the
85
+ public, and in some countries other activities as well.
86
+
87
+ To "convey" a work means any kind of propagation that enables other
88
+ parties to make or receive copies. Mere interaction with a user through
89
+ a computer network, with no transfer of a copy, is not conveying.
90
+
91
+ An interactive user interface displays "Appropriate Legal Notices"
92
+ to the extent that it includes a convenient and prominently visible
93
+ feature that (1) displays an appropriate copyright notice, and (2)
94
+ tells the user that there is no warranty for the work (except to the
95
+ extent that warranties are provided), that licensees may convey the
96
+ work under this License, and how to view a copy of this License. If
97
+ the interface presents a list of user commands or options, such as a
98
+ menu, a prominent item in the list meets this criterion.
99
+
100
+ 1. Source Code.
101
+
102
+ The "source code" for a work means the preferred form of the work
103
+ for making modifications to it. "Object code" means any non-source
104
+ form of a work.
105
+
106
+ A "Standard Interface" means an interface that either is an official
107
+ standard defined by a recognized standards body, or, in the case of
108
+ interfaces specified for a particular programming language, one that
109
+ is widely used among developers working in that language.
110
+
111
+ The "System Libraries" of an executable work include anything, other
112
+ than the work as a whole, that (a) is included in the normal form of
113
+ packaging a Major Component, but which is not part of that Major
114
+ Component, and (b) serves only to enable use of the work with that
115
+ Major Component, or to implement a Standard Interface for which an
116
+ implementation is available to the public in source code form. A
117
+ "Major Component", in this context, means a major essential component
118
+ (kernel, window system, and so on) of the specific operating system
119
+ (if any) on which the executable work runs, or a compiler used to
120
+ produce the work, or an object code interpreter used to run it.
121
+
122
+ The "Corresponding Source" for a work in object code form means all
123
+ the source code needed to generate, install, and (for an executable
124
+ work) run the object code and to modify the work, including scripts to
125
+ control those activities. However, it does not include the work's
126
+ System Libraries, or general-purpose tools or generally available free
127
+ programs which are used unmodified in performing those activities but
128
+ which are not part of the work. For example, Corresponding Source
129
+ includes interface definition files associated with source files for
130
+ the work, and the source code for shared libraries and dynamically
131
+ linked subprograms that the work is specifically designed to require,
132
+ such as by intimate data communication or control flow between those
133
+ subprograms and other parts of the work.
134
+
135
+ The Corresponding Source need not include anything that users
136
+ can regenerate automatically from other parts of the Corresponding
137
+ Source.
138
+
139
+ The Corresponding Source for a work in source code form is that
140
+ same work.
141
+
142
+ 2. Basic Permissions.
143
+
144
+ All rights granted under this License are granted for the term of
145
+ copyright on the Program, and are irrevocable provided the stated
146
+ conditions are met. This License explicitly affirms your unlimited
147
+ permission to run the unmodified Program. The output from running a
148
+ covered work is covered by this License only if the output, given its
149
+ content, constitutes a covered work. This License acknowledges your
150
+ rights of fair use or other equivalent, as provided by copyright law.
151
+
152
+ You may make, run and propagate covered works that you do not
153
+ convey, without conditions so long as your license otherwise remains
154
+ in force. You may convey covered works to others for the sole purpose
155
+ of having them make modifications exclusively for you, or provide you
156
+ with facilities for running those works, provided that you comply with
157
+ the terms of this License in conveying all material for which you do
158
+ not control copyright. Those thus making or running the covered works
159
+ for you must do so exclusively on your behalf, under your direction
160
+ and control, on terms that prohibit them from making any copies of
161
+ your copyrighted material outside their relationship with you.
162
+
163
+ Conveying under any other circumstances is permitted solely under
164
+ the conditions stated below. Sublicensing is not allowed; section 10
165
+ makes it unnecessary.
166
+
167
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
168
+
169
+ No covered work shall be deemed part of an effective technological
170
+ measure under any applicable law fulfilling obligations under article
171
+ 11 of the WIPO copyright treaty adopted on 20 December 1996, or
172
+ similar laws prohibiting or restricting circumvention of such
173
+ measures.
174
+
175
+ When you convey a covered work, you waive any legal power to forbid
176
+ circumvention of technological measures to the extent such circumvention
177
+ is effected by exercising rights under this License with respect to
178
+ the covered work, and you disclaim any intention to limit operation or
179
+ modification of the work as a means of enforcing, against the work's
180
+ users, your or third parties' legal rights to forbid circumvention of
181
+ technological measures.
182
+
183
+ 4. Conveying Verbatim Copies.
184
+
185
+ You may convey verbatim copies of the Program's source code as you
186
+ receive it, in any medium, provided that you conspicuously and
187
+ appropriately publish on each copy an appropriate copyright notice;
188
+ keep intact all notices stating that this License and any
189
+ non-permissive terms added in accord with section 7 apply to the code;
190
+ keep intact all notices of the absence of any warranty; and give all
191
+ recipients a copy of this License along with the Program.
192
+
193
+ You may charge any price or no price for each copy that you convey,
194
+ and you may offer support or warranty protection for a fee.
195
+
196
+ 5. Conveying Modified Source Versions.
197
+
198
+ You may convey a work based on the Program, or the modifications to
199
+ produce it from the Program, in the form of source code under the
200
+ terms of section 4, provided that you also meet all of these conditions:
201
+
202
+ a) The work must carry prominent notices stating that you modified
203
+ it, and giving a relevant date.
204
+
205
+ b) The work must carry prominent notices stating that it is
206
+ released under this License and any conditions added under section
207
+ 7. This requirement modifies the requirement in section 4 to
208
+ "keep intact all notices".
209
+
210
+ c) You must license the entire work, as a whole, under this
211
+ License to anyone who comes into possession of a copy. This
212
+ License will therefore apply, along with any applicable section 7
213
+ additional terms, to the whole of the work, and all its parts,
214
+ regardless of how they are packaged. This License gives no
215
+ permission to license the work in any other way, but it does not
216
+ invalidate such permission if you have separately received it.
217
+
218
+ d) If the work has interactive user interfaces, each must display
219
+ Appropriate Legal Notices; however, if the Program has interactive
220
+ interfaces that do not display Appropriate Legal Notices, your
221
+ work need not make them do so.
222
+
223
+ A compilation of a covered work with other separate and independent
224
+ works, which are not by their nature extensions of the covered work,
225
+ and which are not combined with it such as to form a larger program,
226
+ in or on a volume of a storage or distribution medium, is called an
227
+ "aggregate" if the compilation and its resulting copyright are not
228
+ used to limit the access or legal rights of the compilation's users
229
+ beyond what the individual works permit. Inclusion of a covered work
230
+ in an aggregate does not cause this License to apply to the other
231
+ parts of the aggregate.
232
+
233
+ 6. Conveying Non-Source Forms.
234
+
235
+ You may convey a covered work in object code form under the terms
236
+ of sections 4 and 5, provided that you also convey the
237
+ machine-readable Corresponding Source under the terms of this License,
238
+ in one of these ways:
239
+
240
+ a) Convey the object code in, or embodied in, a physical product
241
+ (including a physical distribution medium), accompanied by the
242
+ Corresponding Source fixed on a durable physical medium
243
+ customarily used for software interchange.
244
+
245
+ b) Convey the object code in, or embodied in, a physical product
246
+ (including a physical distribution medium), accompanied by a
247
+ written offer, valid for at least three years and valid for as
248
+ long as you offer spare parts or customer support for that product
249
+ model, to give anyone who possesses the object code either (1) a
250
+ copy of the Corresponding Source for all the software in the
251
+ product that is covered by this License, on a durable physical
252
+ medium customarily used for software interchange, for a price no
253
+ more than your reasonable cost of physically performing this
254
+ conveying of source, or (2) access to copy the
255
+ Corresponding Source from a network server at no charge.
256
+
257
+ c) Convey individual copies of the object code with a copy of the
258
+ written offer to provide the Corresponding Source. This
259
+ alternative is allowed only occasionally and noncommercially, and
260
+ only if you received the object code with such an offer, in accord
261
+ with subsection 6b.
262
+
263
+ d) Convey the object code by offering access from a designated
264
+ place (gratis or for a charge), and offer equivalent access to the
265
+ Corresponding Source in the same way through the same place at no
266
+ further charge. You need not require recipients to copy the
267
+ Corresponding Source along with the object code. If the place to
268
+ copy the object code is a network server, the Corresponding Source
269
+ may be on a different server (operated by you or a third party)
270
+ that supports equivalent copying facilities, provided you maintain
271
+ clear directions next to the object code saying where to find the
272
+ Corresponding Source. Regardless of what server hosts the
273
+ Corresponding Source, you remain obligated to ensure that it is
274
+ available for as long as needed to satisfy these requirements.
275
+
276
+ e) Convey the object code using peer-to-peer transmission, provided
277
+ you inform other peers where the object code and Corresponding
278
+ Source of the work are being offered to the general public at no
279
+ charge under subsection 6d.
280
+
281
+ A separable portion of the object code, whose source code is excluded
282
+ from the Corresponding Source as a System Library, need not be
283
+ included in conveying the object code work.
284
+
285
+ A "User Product" is either (1) a "consumer product", which means any
286
+ tangible personal property which is normally used for personal, family,
287
+ or household purposes, or (2) anything designed or sold for incorporation
288
+ into a dwelling. In determining whether a product is a consumer product,
289
+ doubtful cases shall be resolved in favor of coverage. For a particular
290
+ product received by a particular user, "normally used" refers to a
291
+ typical or common use of that class of product, regardless of the status
292
+ of the particular user or of the way in which the particular user
293
+ actually uses, or expects or is expected to use, the product. A product
294
+ is a consumer product regardless of whether the product has substantial
295
+ commercial, industrial or non-consumer uses, unless such uses represent
296
+ the only significant mode of use of the product.
297
+
298
+ "Installation Information" for a User Product means any methods,
299
+ procedures, authorization keys, or other information required to install
300
+ and execute modified versions of a covered work in that User Product from
301
+ a modified version of its Corresponding Source. The information must
302
+ suffice to ensure that the continued functioning of the modified object
303
+ code is in no case prevented or interfered with solely because
304
+ modification has been made.
305
+
306
+ If you convey an object code work under this section in, or with, or
307
+ specifically for use in, a User Product, and the conveying occurs as
308
+ part of a transaction in which the right of possession and use of the
309
+ User Product is transferred to the recipient in perpetuity or for a
310
+ fixed term (regardless of how the transaction is characterized), the
311
+ Corresponding Source conveyed under this section must be accompanied
312
+ by the Installation Information. But this requirement does not apply
313
+ if neither you nor any third party retains the ability to install
314
+ modified object code on the User Product (for example, the work has
315
+ been installed in ROM).
316
+
317
+ The requirement to provide Installation Information does not include a
318
+ requirement to continue to provide support service, warranty, or updates
319
+ for a work that has been modified or installed by the recipient, or for
320
+ the User Product in which it has been modified or installed. Access to a
321
+ network may be denied when the modification itself materially and
322
+ adversely affects the operation of the network or violates the rules and
323
+ protocols for communication across the network.
324
+
325
+ Corresponding Source conveyed, and Installation Information provided,
326
+ in accord with this section must be in a format that is publicly
327
+ documented (and with an implementation available to the public in
328
+ source code form), and must require no special password or key for
329
+ unpacking, reading or copying.
330
+
331
+ 7. Additional Terms.
332
+
333
+ "Additional permissions" are terms that supplement the terms of this
334
+ License by making exceptions from one or more of its conditions.
335
+ Additional permissions that are applicable to the entire Program shall
336
+ be treated as though they were included in this License, to the extent
337
+ that they are valid under applicable law. If additional permissions
338
+ apply only to part of the Program, that part may be used separately
339
+ under those permissions, but the entire Program remains governed by
340
+ this License without regard to the additional permissions.
341
+
342
+ When you convey a copy of a covered work, you may at your option
343
+ remove any additional permissions from that copy, or from any part of
344
+ it. (Additional permissions may be written to require their own
345
+ removal in certain cases when you modify the work.) You may place
346
+ additional permissions on material, added by you to a covered work,
347
+ for which you have or can give appropriate copyright permission.
348
+
349
+ Notwithstanding any other provision of this License, for material you
350
+ add to a covered work, you may (if authorized by the copyright holders of
351
+ that material) supplement the terms of this License with terms:
352
+
353
+ a) Disclaiming warranty or limiting liability differently from the
354
+ terms of sections 15 and 16 of this License; or
355
+
356
+ b) Requiring preservation of specified reasonable legal notices or
357
+ author attributions in that material or in the Appropriate Legal
358
+ Notices displayed by works containing it; or
359
+
360
+ c) Prohibiting misrepresentation of the origin of that material, or
361
+ requiring that modified versions of such material be marked in
362
+ reasonable ways as different from the original version; or
363
+
364
+ d) Limiting the use for publicity purposes of names of licensors or
365
+ authors of the material; or
366
+
367
+ e) Declining to grant rights under trademark law for use of some
368
+ trade names, trademarks, or service marks; or
369
+
370
+ f) Requiring indemnification of licensors and authors of that
371
+ material by anyone who conveys the material (or modified versions of
372
+ it) with contractual assumptions of liability to the recipient, for
373
+ any liability that these contractual assumptions directly impose on
374
+ those licensors and authors.
375
+
376
+ All other non-permissive additional terms are considered "further
377
+ restrictions" within the meaning of section 10. If the Program as you
378
+ received it, or any part of it, contains a notice stating that it is
379
+ governed by this License along with a term that is a further
380
+ restriction, you may remove that term. If a license document contains
381
+ a further restriction but permits relicensing or conveying under this
382
+ License, you may add to a covered work material governed by the terms
383
+ of that license document, provided that the further restriction does
384
+ not survive such relicensing or conveying.
385
+
386
+ If you add terms to a covered work in accord with this section, you
387
+ must place, in the relevant source files, a statement of the
388
+ additional terms that apply to those files, or a notice indicating
389
+ where to find the applicable terms.
390
+
391
+ Additional terms, permissive or non-permissive, may be stated in the
392
+ form of a separately written license, or stated as exceptions;
393
+ the above requirements apply either way.
394
+
395
+ 8. Termination.
396
+
397
+ You may not propagate or modify a covered work except as expressly
398
+ provided under this License. Any attempt otherwise to propagate or
399
+ modify it is void, and will automatically terminate your rights under
400
+ this License (including any patent licenses granted under the third
401
+ paragraph of section 11).
402
+
403
+ However, if you cease all violation of this License, then your
404
+ license from a particular copyright holder is reinstated (a)
405
+ provisionally, unless and until the copyright holder explicitly and
406
+ finally terminates your license, and (b) permanently, if the copyright
407
+ holder fails to notify you of the violation by some reasonable means
408
+ prior to 60 days after the cessation.
409
+
410
+ Moreover, your license from a particular copyright holder is
411
+ reinstated permanently if the copyright holder notifies you of the
412
+ violation by some reasonable means, this is the first time you have
413
+ received notice of violation of this License (for any work) from that
414
+ copyright holder, and you cure the violation prior to 30 days after
415
+ your receipt of the notice.
416
+
417
+ Termination of your rights under this section does not terminate the
418
+ licenses of parties who have received copies or rights from you under
419
+ this License. If your rights have been terminated and not permanently
420
+ reinstated, you do not qualify to receive new licenses for the same
421
+ material under section 10.
422
+
423
+ 9. Acceptance Not Required for Having Copies.
424
+
425
+ You are not required to accept this License in order to receive or
426
+ run a copy of the Program. Ancillary propagation of a covered work
427
+ occurring solely as a consequence of using peer-to-peer transmission
428
+ to receive a copy likewise does not require acceptance. However,
429
+ nothing other than this License grants you permission to propagate or
430
+ modify any covered work. These actions infringe copyright if you do
431
+ not accept this License. Therefore, by modifying or propagating a
432
+ covered work, you indicate your acceptance of this License to do so.
433
+
434
+ 10. Automatic Licensing of Downstream Recipients.
435
+
436
+ Each time you convey a covered work, the recipient automatically
437
+ receives a license from the original licensors, to run, modify and
438
+ propagate that work, subject to this License. You are not responsible
439
+ for enforcing compliance by third parties with this License.
440
+
441
+ An "entity transaction" is a transaction transferring control of an
442
+ organization, or substantially all assets of one, or subdividing an
443
+ organization, or merging organizations. If propagation of a covered
444
+ work results from an entity transaction, each party to that
445
+ transaction who receives a copy of the work also receives whatever
446
+ licenses to the work the party's predecessor in interest had or could
447
+ give under the previous paragraph, plus a right to possession of the
448
+ Corresponding Source of the work from the predecessor in interest, if
449
+ the predecessor has it or can get it with reasonable efforts.
450
+
451
+ You may not impose any further restrictions on the exercise of the
452
+ rights granted or affirmed under this License. For example, you may
453
+ not impose a license fee, royalty, or other charge for exercise of
454
+ rights granted under this License, and you may not initiate litigation
455
+ (including a cross-claim or counterclaim in a lawsuit) alleging that
456
+ any patent claim is infringed by making, using, selling, offering for
457
+ sale, or importing the Program or any portion of it.
458
+
459
+ 11. Patents.
460
+
461
+ A "contributor" is a copyright holder who authorizes use under this
462
+ License of the Program or a work on which the Program is based. The
463
+ work thus licensed is called the contributor's "contributor version".
464
+
465
+ A contributor's "essential patent claims" are all patent claims
466
+ owned or controlled by the contributor, whether already acquired or
467
+ hereafter acquired, that would be infringed by some manner, permitted
468
+ by this License, of making, using, or selling its contributor version,
469
+ but do not include claims that would be infringed only as a
470
+ consequence of further modification of the contributor version. For
471
+ purposes of this definition, "control" includes the right to grant
472
+ patent sublicenses in a manner consistent with the requirements of
473
+ this License.
474
+
475
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
476
+ patent license under the contributor's essential patent claims, to
477
+ make, use, sell, offer for sale, import and otherwise run, modify and
478
+ propagate the contents of its contributor version.
479
+
480
+ In the following three paragraphs, a "patent license" is any express
481
+ agreement or commitment, however denominated, not to enforce a patent
482
+ (such as an express permission to practice a patent or covenant not to
483
+ sue for patent infringement). To "grant" such a patent license to a
484
+ party means to make such an agreement or commitment not to enforce a
485
+ patent against the party.
486
+
487
+ If you convey a covered work, knowingly relying on a patent license,
488
+ and the Corresponding Source of the work is not available for anyone
489
+ to copy, free of charge and under the terms of this License, through a
490
+ publicly available network server or other readily accessible means,
491
+ then you must either (1) cause the Corresponding Source to be so
492
+ available, or (2) arrange to deprive yourself of the benefit of the
493
+ patent license for this particular work, or (3) arrange, in a manner
494
+ consistent with the requirements of this License, to extend the patent
495
+ license to downstream recipients. "Knowingly relying" means you have
496
+ actual knowledge that, but for the patent license, your conveying the
497
+ covered work in a country, or your recipient's use of the covered work
498
+ in a country, would infringe one or more identifiable patents in that
499
+ country that you have reason to believe are valid.
500
+
501
+ If, pursuant to or in connection with a single transaction or
502
+ arrangement, you convey, or propagate by procuring conveyance of, a
503
+ covered work, and grant a patent license to some of the parties
504
+ receiving the covered work authorizing them to use, propagate, modify
505
+ or convey a specific copy of the covered work, then the patent license
506
+ you grant is automatically extended to all recipients of the covered
507
+ work and works based on it.
508
+
509
+ A patent license is "discriminatory" if it does not include within
510
+ the scope of its coverage, prohibits the exercise of, or is
511
+ conditioned on the non-exercise of one or more of the rights that are
512
+ specifically granted under this License. You may not convey a covered
513
+ work if you are a party to an arrangement with a third party that is
514
+ in the business of distributing software, under which you make payment
515
+ to the third party based on the extent of your activity of conveying
516
+ the work, and under which the third party grants, to any of the
517
+ parties who would receive the covered work from you, a discriminatory
518
+ patent license (a) in connection with copies of the covered work
519
+ conveyed by you (or copies made from those copies), or (b) primarily
520
+ for and in connection with specific products or compilations that
521
+ contain the covered work, unless you entered into that arrangement,
522
+ or that patent license was granted, prior to 28 March 2007.
523
+
524
+ Nothing in this License shall be construed as excluding or limiting
525
+ any implied license or other defenses to infringement that may
526
+ otherwise be available to you under applicable patent law.
527
+
528
+ 12. No Surrender of Others' Freedom.
529
+
530
+ If conditions are imposed on you (whether by court order, agreement or
531
+ otherwise) that contradict the conditions of this License, they do not
532
+ excuse you from the conditions of this License. If you cannot convey a
533
+ covered work so as to satisfy simultaneously your obligations under this
534
+ License and any other pertinent obligations, then as a consequence you may
535
+ not convey it at all. For example, if you agree to terms that obligate you
536
+ to collect a royalty for further conveying from those to whom you convey
537
+ the Program, the only way you could satisfy both those terms and this
538
+ License would be to refrain entirely from conveying the Program.
539
+
540
+ 13. Remote Network Interaction; Use with the GNU General Public License.
541
+
542
+ Notwithstanding any other provision of this License, if you modify the
543
+ Program, your modified version must prominently offer all users
544
+ interacting with it remotely through a computer network (if your version
545
+ supports such interaction) an opportunity to receive the Corresponding
546
+ Source of your version by providing access to the Corresponding Source
547
+ from a network server at no charge, through some standard or customary
548
+ means of facilitating copying of software. This Corresponding Source
549
+ shall include the Corresponding Source for any work covered by version 3
550
+ of the GNU General Public License that is incorporated pursuant to the
551
+ following paragraph.
552
+
553
+ Notwithstanding any other provision of this License, you have
554
+ permission to link or combine any covered work with a work licensed
555
+ under version 3 of the GNU General Public License into a single
556
+ combined work, and to convey the resulting work. The terms of this
557
+ License will continue to apply to the part which is the covered work,
558
+ but the work with which it is combined will remain governed by version
559
+ 3 of the GNU General Public License.
560
+
561
+ 14. Revised Versions of this License.
562
+
563
+ The Free Software Foundation may publish revised and/or new versions of
564
+ the GNU Affero General Public License from time to time. Such new versions
565
+ will be similar in spirit to the present version, but may differ in detail to
566
+ address new problems or concerns.
567
+
568
+ Each version is given a distinguishing version number. If the
569
+ Program specifies that a certain numbered version of the GNU Affero General
570
+ Public License "or any later version" applies to it, you have the
571
+ option of following the terms and conditions either of that numbered
572
+ version or of any later version published by the Free Software
573
+ Foundation. If the Program does not specify a version number of the
574
+ GNU Affero General Public License, you may choose any version ever published
575
+ by the Free Software Foundation.
576
+
577
+ If the Program specifies that a proxy can decide which future
578
+ versions of the GNU Affero General Public License can be used, that proxy's
579
+ public statement of acceptance of a version permanently authorizes you
580
+ to choose that version for the Program.
581
+
582
+ Later license versions may give you additional or different
583
+ permissions. However, no additional obligations are imposed on any
584
+ author or copyright holder as a result of your choosing to follow a
585
+ later version.
586
+
587
+ 15. Disclaimer of Warranty.
588
+
589
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
590
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
591
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
592
+ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
593
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
594
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
595
+ IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
596
+ ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
597
+
598
+ 16. Limitation of Liability.
599
+
600
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
601
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
602
+ THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
603
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
604
+ USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
605
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
606
+ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
607
+ EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
608
+ SUCH DAMAGES.
609
+
610
+ 17. Interpretation of Sections 15 and 16.
611
+
612
+ If the disclaimer of warranty and limitation of liability provided
613
+ above cannot be given local legal effect according to their terms,
614
+ reviewing courts shall apply local law that most closely approximates
615
+ an absolute waiver of all civil liability in connection with the
616
+ Program, unless a warranty or assumption of liability accompanies a
617
+ copy of the Program in return for a fee.
618
+
619
+ END OF TERMS AND CONDITIONS
620
+
621
+ How to Apply These Terms to Your New Programs
622
+
623
+ If you develop a new program, and you want it to be of the greatest
624
+ possible use to the public, the best way to achieve this is to make it
625
+ free software which everyone can redistribute and change under these terms.
626
+
627
+ To do so, attach the following notices to the program. It is safest
628
+ to attach them to the start of each source file to most effectively
629
+ state the exclusion of warranty; and each file should have at least
630
+ the "copyright" line and a pointer to where the full notice is found.
631
+
632
+ <one line to give the program's name and a brief idea of what it does.>
633
+ Copyright (C) <year> <name of author>
634
+
635
+ This program is free software: you can redistribute it and/or modify
636
+ it under the terms of the GNU Affero General Public License as published
637
+ by the Free Software Foundation, either version 3 of the License, or
638
+ (at your option) any later version.
639
+
640
+ This program is distributed in the hope that it will be useful,
641
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
642
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
643
+ GNU Affero General Public License for more details.
644
+
645
+ You should have received a copy of the GNU Affero General Public License
646
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
647
+
648
+ Also add information on how to contact you by electronic and paper mail.
649
+
650
+ If your software can interact with users remotely through a computer
651
+ network, you should also make sure that it provides a way for users to
652
+ get its source. For example, if your program is a web application, its
653
+ interface could display a "Source" link that leads users to an archive
654
+ of the code. There are many ways you could offer source, and different
655
+ solutions will be better for different programs; see section 13 for the
656
+ specific requirements.
657
+
658
+ You should also get your employer (if you work as a programmer) or school,
659
+ if any, to sign a "copyright disclaimer" for the program, if necessary.
660
+ For more information on this, and how to apply and follow the GNU AGPL, see
661
+ <https://www.gnu.org/licenses/>.
BanG-Dream/attentions.py ADDED
@@ -0,0 +1,464 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ import torch
3
+ from torch import nn
4
+ from torch.nn import functional as F
5
+
6
+ import commons
7
+ import logging
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class LayerNorm(nn.Module):
13
+ def __init__(self, channels, eps=1e-5):
14
+ super().__init__()
15
+ self.channels = channels
16
+ self.eps = eps
17
+
18
+ self.gamma = nn.Parameter(torch.ones(channels))
19
+ self.beta = nn.Parameter(torch.zeros(channels))
20
+
21
+ def forward(self, x):
22
+ x = x.transpose(1, -1)
23
+ x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps)
24
+ return x.transpose(1, -1)
25
+
26
+
27
+ @torch.jit.script
28
+ def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels):
29
+ n_channels_int = n_channels[0]
30
+ in_act = input_a + input_b
31
+ t_act = torch.tanh(in_act[:, :n_channels_int, :])
32
+ s_act = torch.sigmoid(in_act[:, n_channels_int:, :])
33
+ acts = t_act * s_act
34
+ return acts
35
+
36
+
37
+ class Encoder(nn.Module):
38
+ def __init__(
39
+ self,
40
+ hidden_channels,
41
+ filter_channels,
42
+ n_heads,
43
+ n_layers,
44
+ kernel_size=1,
45
+ p_dropout=0.0,
46
+ window_size=4,
47
+ isflow=True,
48
+ **kwargs
49
+ ):
50
+ super().__init__()
51
+ self.hidden_channels = hidden_channels
52
+ self.filter_channels = filter_channels
53
+ self.n_heads = n_heads
54
+ self.n_layers = n_layers
55
+ self.kernel_size = kernel_size
56
+ self.p_dropout = p_dropout
57
+ self.window_size = window_size
58
+ # if isflow:
59
+ # cond_layer = torch.nn.Conv1d(256, 2*hidden_channels*n_layers, 1)
60
+ # self.cond_pre = torch.nn.Conv1d(hidden_channels, 2*hidden_channels, 1)
61
+ # self.cond_layer = weight_norm(cond_layer, name='weight')
62
+ # self.gin_channels = 256
63
+ self.cond_layer_idx = self.n_layers
64
+ if "gin_channels" in kwargs:
65
+ self.gin_channels = kwargs["gin_channels"]
66
+ if self.gin_channels != 0:
67
+ self.spk_emb_linear = nn.Linear(self.gin_channels, self.hidden_channels)
68
+ # vits2 says 3rd block, so idx is 2 by default
69
+ self.cond_layer_idx = (
70
+ kwargs["cond_layer_idx"] if "cond_layer_idx" in kwargs else 2
71
+ )
72
+ logging.debug(self.gin_channels, self.cond_layer_idx)
73
+ assert (
74
+ self.cond_layer_idx < self.n_layers
75
+ ), "cond_layer_idx should be less than n_layers"
76
+ self.drop = nn.Dropout(p_dropout)
77
+ self.attn_layers = nn.ModuleList()
78
+ self.norm_layers_1 = nn.ModuleList()
79
+ self.ffn_layers = nn.ModuleList()
80
+ self.norm_layers_2 = nn.ModuleList()
81
+ for i in range(self.n_layers):
82
+ self.attn_layers.append(
83
+ MultiHeadAttention(
84
+ hidden_channels,
85
+ hidden_channels,
86
+ n_heads,
87
+ p_dropout=p_dropout,
88
+ window_size=window_size,
89
+ )
90
+ )
91
+ self.norm_layers_1.append(LayerNorm(hidden_channels))
92
+ self.ffn_layers.append(
93
+ FFN(
94
+ hidden_channels,
95
+ hidden_channels,
96
+ filter_channels,
97
+ kernel_size,
98
+ p_dropout=p_dropout,
99
+ )
100
+ )
101
+ self.norm_layers_2.append(LayerNorm(hidden_channels))
102
+
103
+ def forward(self, x, x_mask, g=None):
104
+ attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1)
105
+ x = x * x_mask
106
+ for i in range(self.n_layers):
107
+ if i == self.cond_layer_idx and g is not None:
108
+ g = self.spk_emb_linear(g.transpose(1, 2))
109
+ g = g.transpose(1, 2)
110
+ x = x + g
111
+ x = x * x_mask
112
+ y = self.attn_layers[i](x, x, attn_mask)
113
+ y = self.drop(y)
114
+ x = self.norm_layers_1[i](x + y)
115
+
116
+ y = self.ffn_layers[i](x, x_mask)
117
+ y = self.drop(y)
118
+ x = self.norm_layers_2[i](x + y)
119
+ x = x * x_mask
120
+ return x
121
+
122
+
123
+ class Decoder(nn.Module):
124
+ def __init__(
125
+ self,
126
+ hidden_channels,
127
+ filter_channels,
128
+ n_heads,
129
+ n_layers,
130
+ kernel_size=1,
131
+ p_dropout=0.0,
132
+ proximal_bias=False,
133
+ proximal_init=True,
134
+ **kwargs
135
+ ):
136
+ super().__init__()
137
+ self.hidden_channels = hidden_channels
138
+ self.filter_channels = filter_channels
139
+ self.n_heads = n_heads
140
+ self.n_layers = n_layers
141
+ self.kernel_size = kernel_size
142
+ self.p_dropout = p_dropout
143
+ self.proximal_bias = proximal_bias
144
+ self.proximal_init = proximal_init
145
+
146
+ self.drop = nn.Dropout(p_dropout)
147
+ self.self_attn_layers = nn.ModuleList()
148
+ self.norm_layers_0 = nn.ModuleList()
149
+ self.encdec_attn_layers = nn.ModuleList()
150
+ self.norm_layers_1 = nn.ModuleList()
151
+ self.ffn_layers = nn.ModuleList()
152
+ self.norm_layers_2 = nn.ModuleList()
153
+ for i in range(self.n_layers):
154
+ self.self_attn_layers.append(
155
+ MultiHeadAttention(
156
+ hidden_channels,
157
+ hidden_channels,
158
+ n_heads,
159
+ p_dropout=p_dropout,
160
+ proximal_bias=proximal_bias,
161
+ proximal_init=proximal_init,
162
+ )
163
+ )
164
+ self.norm_layers_0.append(LayerNorm(hidden_channels))
165
+ self.encdec_attn_layers.append(
166
+ MultiHeadAttention(
167
+ hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout
168
+ )
169
+ )
170
+ self.norm_layers_1.append(LayerNorm(hidden_channels))
171
+ self.ffn_layers.append(
172
+ FFN(
173
+ hidden_channels,
174
+ hidden_channels,
175
+ filter_channels,
176
+ kernel_size,
177
+ p_dropout=p_dropout,
178
+ causal=True,
179
+ )
180
+ )
181
+ self.norm_layers_2.append(LayerNorm(hidden_channels))
182
+
183
+ def forward(self, x, x_mask, h, h_mask):
184
+ """
185
+ x: decoder input
186
+ h: encoder output
187
+ """
188
+ self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to(
189
+ device=x.device, dtype=x.dtype
190
+ )
191
+ encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1)
192
+ x = x * x_mask
193
+ for i in range(self.n_layers):
194
+ y = self.self_attn_layers[i](x, x, self_attn_mask)
195
+ y = self.drop(y)
196
+ x = self.norm_layers_0[i](x + y)
197
+
198
+ y = self.encdec_attn_layers[i](x, h, encdec_attn_mask)
199
+ y = self.drop(y)
200
+ x = self.norm_layers_1[i](x + y)
201
+
202
+ y = self.ffn_layers[i](x, x_mask)
203
+ y = self.drop(y)
204
+ x = self.norm_layers_2[i](x + y)
205
+ x = x * x_mask
206
+ return x
207
+
208
+
209
+ class MultiHeadAttention(nn.Module):
210
+ def __init__(
211
+ self,
212
+ channels,
213
+ out_channels,
214
+ n_heads,
215
+ p_dropout=0.0,
216
+ window_size=None,
217
+ heads_share=True,
218
+ block_length=None,
219
+ proximal_bias=False,
220
+ proximal_init=False,
221
+ ):
222
+ super().__init__()
223
+ assert channels % n_heads == 0
224
+
225
+ self.channels = channels
226
+ self.out_channels = out_channels
227
+ self.n_heads = n_heads
228
+ self.p_dropout = p_dropout
229
+ self.window_size = window_size
230
+ self.heads_share = heads_share
231
+ self.block_length = block_length
232
+ self.proximal_bias = proximal_bias
233
+ self.proximal_init = proximal_init
234
+ self.attn = None
235
+
236
+ self.k_channels = channels // n_heads
237
+ self.conv_q = nn.Conv1d(channels, channels, 1)
238
+ self.conv_k = nn.Conv1d(channels, channels, 1)
239
+ self.conv_v = nn.Conv1d(channels, channels, 1)
240
+ self.conv_o = nn.Conv1d(channels, out_channels, 1)
241
+ self.drop = nn.Dropout(p_dropout)
242
+
243
+ if window_size is not None:
244
+ n_heads_rel = 1 if heads_share else n_heads
245
+ rel_stddev = self.k_channels**-0.5
246
+ self.emb_rel_k = nn.Parameter(
247
+ torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels)
248
+ * rel_stddev
249
+ )
250
+ self.emb_rel_v = nn.Parameter(
251
+ torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels)
252
+ * rel_stddev
253
+ )
254
+
255
+ nn.init.xavier_uniform_(self.conv_q.weight)
256
+ nn.init.xavier_uniform_(self.conv_k.weight)
257
+ nn.init.xavier_uniform_(self.conv_v.weight)
258
+ if proximal_init:
259
+ with torch.no_grad():
260
+ self.conv_k.weight.copy_(self.conv_q.weight)
261
+ self.conv_k.bias.copy_(self.conv_q.bias)
262
+
263
+ def forward(self, x, c, attn_mask=None):
264
+ q = self.conv_q(x)
265
+ k = self.conv_k(c)
266
+ v = self.conv_v(c)
267
+
268
+ x, self.attn = self.attention(q, k, v, mask=attn_mask)
269
+
270
+ x = self.conv_o(x)
271
+ return x
272
+
273
+ def attention(self, query, key, value, mask=None):
274
+ # reshape [b, d, t] -> [b, n_h, t, d_k]
275
+ b, d, t_s, t_t = (*key.size(), query.size(2))
276
+ query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3)
277
+ key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3)
278
+ value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3)
279
+
280
+ scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1))
281
+ if self.window_size is not None:
282
+ assert (
283
+ t_s == t_t
284
+ ), "Relative attention is only available for self-attention."
285
+ key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s)
286
+ rel_logits = self._matmul_with_relative_keys(
287
+ query / math.sqrt(self.k_channels), key_relative_embeddings
288
+ )
289
+ scores_local = self._relative_position_to_absolute_position(rel_logits)
290
+ scores = scores + scores_local
291
+ if self.proximal_bias:
292
+ assert t_s == t_t, "Proximal bias is only available for self-attention."
293
+ scores = scores + self._attention_bias_proximal(t_s).to(
294
+ device=scores.device, dtype=scores.dtype
295
+ )
296
+ if mask is not None:
297
+ scores = scores.masked_fill(mask == 0, -1e4)
298
+ if self.block_length is not None:
299
+ assert (
300
+ t_s == t_t
301
+ ), "Local attention is only available for self-attention."
302
+ block_mask = (
303
+ torch.ones_like(scores)
304
+ .triu(-self.block_length)
305
+ .tril(self.block_length)
306
+ )
307
+ scores = scores.masked_fill(block_mask == 0, -1e4)
308
+ p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s]
309
+ p_attn = self.drop(p_attn)
310
+ output = torch.matmul(p_attn, value)
311
+ if self.window_size is not None:
312
+ relative_weights = self._absolute_position_to_relative_position(p_attn)
313
+ value_relative_embeddings = self._get_relative_embeddings(
314
+ self.emb_rel_v, t_s
315
+ )
316
+ output = output + self._matmul_with_relative_values(
317
+ relative_weights, value_relative_embeddings
318
+ )
319
+ output = (
320
+ output.transpose(2, 3).contiguous().view(b, d, t_t)
321
+ ) # [b, n_h, t_t, d_k] -> [b, d, t_t]
322
+ return output, p_attn
323
+
324
+ def _matmul_with_relative_values(self, x, y):
325
+ """
326
+ x: [b, h, l, m]
327
+ y: [h or 1, m, d]
328
+ ret: [b, h, l, d]
329
+ """
330
+ ret = torch.matmul(x, y.unsqueeze(0))
331
+ return ret
332
+
333
+ def _matmul_with_relative_keys(self, x, y):
334
+ """
335
+ x: [b, h, l, d]
336
+ y: [h or 1, m, d]
337
+ ret: [b, h, l, m]
338
+ """
339
+ ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1))
340
+ return ret
341
+
342
+ def _get_relative_embeddings(self, relative_embeddings, length):
343
+ 2 * self.window_size + 1
344
+ # Pad first before slice to avoid using cond ops.
345
+ pad_length = max(length - (self.window_size + 1), 0)
346
+ slice_start_position = max((self.window_size + 1) - length, 0)
347
+ slice_end_position = slice_start_position + 2 * length - 1
348
+ if pad_length > 0:
349
+ padded_relative_embeddings = F.pad(
350
+ relative_embeddings,
351
+ commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]),
352
+ )
353
+ else:
354
+ padded_relative_embeddings = relative_embeddings
355
+ used_relative_embeddings = padded_relative_embeddings[
356
+ :, slice_start_position:slice_end_position
357
+ ]
358
+ return used_relative_embeddings
359
+
360
+ def _relative_position_to_absolute_position(self, x):
361
+ """
362
+ x: [b, h, l, 2*l-1]
363
+ ret: [b, h, l, l]
364
+ """
365
+ batch, heads, length, _ = x.size()
366
+ # Concat columns of pad to shift from relative to absolute indexing.
367
+ x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, 1]]))
368
+
369
+ # Concat extra elements so to add up to shape (len+1, 2*len-1).
370
+ x_flat = x.view([batch, heads, length * 2 * length])
371
+ x_flat = F.pad(
372
+ x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [0, length - 1]])
373
+ )
374
+
375
+ # Reshape and slice out the padded elements.
376
+ x_final = x_flat.view([batch, heads, length + 1, 2 * length - 1])[
377
+ :, :, :length, length - 1 :
378
+ ]
379
+ return x_final
380
+
381
+ def _absolute_position_to_relative_position(self, x):
382
+ """
383
+ x: [b, h, l, l]
384
+ ret: [b, h, l, 2*l-1]
385
+ """
386
+ batch, heads, length, _ = x.size()
387
+ # pad along column
388
+ x = F.pad(
389
+ x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length - 1]])
390
+ )
391
+ x_flat = x.view([batch, heads, length**2 + length * (length - 1)])
392
+ # add 0's in the beginning that will skew the elements after reshape
393
+ x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]]))
394
+ x_final = x_flat.view([batch, heads, length, 2 * length])[:, :, :, 1:]
395
+ return x_final
396
+
397
+ def _attention_bias_proximal(self, length):
398
+ """Bias for self-attention to encourage attention to close positions.
399
+ Args:
400
+ length: an integer scalar.
401
+ Returns:
402
+ a Tensor with shape [1, 1, length, length]
403
+ """
404
+ r = torch.arange(length, dtype=torch.float32)
405
+ diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1)
406
+ return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0)
407
+
408
+
409
+ class FFN(nn.Module):
410
+ def __init__(
411
+ self,
412
+ in_channels,
413
+ out_channels,
414
+ filter_channels,
415
+ kernel_size,
416
+ p_dropout=0.0,
417
+ activation=None,
418
+ causal=False,
419
+ ):
420
+ super().__init__()
421
+ self.in_channels = in_channels
422
+ self.out_channels = out_channels
423
+ self.filter_channels = filter_channels
424
+ self.kernel_size = kernel_size
425
+ self.p_dropout = p_dropout
426
+ self.activation = activation
427
+ self.causal = causal
428
+
429
+ if causal:
430
+ self.padding = self._causal_padding
431
+ else:
432
+ self.padding = self._same_padding
433
+
434
+ self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size)
435
+ self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size)
436
+ self.drop = nn.Dropout(p_dropout)
437
+
438
+ def forward(self, x, x_mask):
439
+ x = self.conv_1(self.padding(x * x_mask))
440
+ if self.activation == "gelu":
441
+ x = x * torch.sigmoid(1.702 * x)
442
+ else:
443
+ x = torch.relu(x)
444
+ x = self.drop(x)
445
+ x = self.conv_2(self.padding(x * x_mask))
446
+ return x * x_mask
447
+
448
+ def _causal_padding(self, x):
449
+ if self.kernel_size == 1:
450
+ return x
451
+ pad_l = self.kernel_size - 1
452
+ pad_r = 0
453
+ padding = [[0, 0], [0, 0], [pad_l, pad_r]]
454
+ x = F.pad(x, commons.convert_pad_shape(padding))
455
+ return x
456
+
457
+ def _same_padding(self, x):
458
+ if self.kernel_size == 1:
459
+ return x
460
+ pad_l = (self.kernel_size - 1) // 2
461
+ pad_r = self.kernel_size // 2
462
+ padding = [[0, 0], [0, 0], [pad_l, pad_r]]
463
+ x = F.pad(x, commons.convert_pad_shape(padding))
464
+ return x
BanG-Dream/attentions_onnx.py ADDED
@@ -0,0 +1,378 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ import torch
3
+ from torch import nn
4
+ from torch.nn import functional as F
5
+
6
+ import commons
7
+ import logging
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class LayerNorm(nn.Module):
13
+ def __init__(self, channels, eps=1e-5):
14
+ super().__init__()
15
+ self.channels = channels
16
+ self.eps = eps
17
+
18
+ self.gamma = nn.Parameter(torch.ones(channels))
19
+ self.beta = nn.Parameter(torch.zeros(channels))
20
+
21
+ def forward(self, x):
22
+ x = x.transpose(1, -1)
23
+ x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps)
24
+ return x.transpose(1, -1)
25
+
26
+
27
+ @torch.jit.script
28
+ def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels):
29
+ n_channels_int = n_channels[0]
30
+ in_act = input_a + input_b
31
+ t_act = torch.tanh(in_act[:, :n_channels_int, :])
32
+ s_act = torch.sigmoid(in_act[:, n_channels_int:, :])
33
+ acts = t_act * s_act
34
+ return acts
35
+
36
+
37
+ class Encoder(nn.Module):
38
+ def __init__(
39
+ self,
40
+ hidden_channels,
41
+ filter_channels,
42
+ n_heads,
43
+ n_layers,
44
+ kernel_size=1,
45
+ p_dropout=0.0,
46
+ window_size=4,
47
+ isflow=True,
48
+ **kwargs
49
+ ):
50
+ super().__init__()
51
+ self.hidden_channels = hidden_channels
52
+ self.filter_channels = filter_channels
53
+ self.n_heads = n_heads
54
+ self.n_layers = n_layers
55
+ self.kernel_size = kernel_size
56
+ self.p_dropout = p_dropout
57
+ self.window_size = window_size
58
+ # if isflow:
59
+ # cond_layer = torch.nn.Conv1d(256, 2*hidden_channels*n_layers, 1)
60
+ # self.cond_pre = torch.nn.Conv1d(hidden_channels, 2*hidden_channels, 1)
61
+ # self.cond_layer = weight_norm(cond_layer, name='weight')
62
+ # self.gin_channels = 256
63
+ self.cond_layer_idx = self.n_layers
64
+ if "gin_channels" in kwargs:
65
+ self.gin_channels = kwargs["gin_channels"]
66
+ if self.gin_channels != 0:
67
+ self.spk_emb_linear = nn.Linear(self.gin_channels, self.hidden_channels)
68
+ # vits2 says 3rd block, so idx is 2 by default
69
+ self.cond_layer_idx = (
70
+ kwargs["cond_layer_idx"] if "cond_layer_idx" in kwargs else 2
71
+ )
72
+ logging.debug(self.gin_channels, self.cond_layer_idx)
73
+ assert (
74
+ self.cond_layer_idx < self.n_layers
75
+ ), "cond_layer_idx should be less than n_layers"
76
+ self.drop = nn.Dropout(p_dropout)
77
+ self.attn_layers = nn.ModuleList()
78
+ self.norm_layers_1 = nn.ModuleList()
79
+ self.ffn_layers = nn.ModuleList()
80
+ self.norm_layers_2 = nn.ModuleList()
81
+ for i in range(self.n_layers):
82
+ self.attn_layers.append(
83
+ MultiHeadAttention(
84
+ hidden_channels,
85
+ hidden_channels,
86
+ n_heads,
87
+ p_dropout=p_dropout,
88
+ window_size=window_size,
89
+ )
90
+ )
91
+ self.norm_layers_1.append(LayerNorm(hidden_channels))
92
+ self.ffn_layers.append(
93
+ FFN(
94
+ hidden_channels,
95
+ hidden_channels,
96
+ filter_channels,
97
+ kernel_size,
98
+ p_dropout=p_dropout,
99
+ )
100
+ )
101
+ self.norm_layers_2.append(LayerNorm(hidden_channels))
102
+
103
+ def forward(self, x, x_mask, g=None):
104
+ attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1)
105
+ x = x * x_mask
106
+ for i in range(self.n_layers):
107
+ if i == self.cond_layer_idx and g is not None:
108
+ g = self.spk_emb_linear(g.transpose(1, 2))
109
+ g = g.transpose(1, 2)
110
+ x = x + g
111
+ x = x * x_mask
112
+ y = self.attn_layers[i](x, x, attn_mask)
113
+ y = self.drop(y)
114
+ x = self.norm_layers_1[i](x + y)
115
+
116
+ y = self.ffn_layers[i](x, x_mask)
117
+ y = self.drop(y)
118
+ x = self.norm_layers_2[i](x + y)
119
+ x = x * x_mask
120
+ return x
121
+
122
+
123
+ class MultiHeadAttention(nn.Module):
124
+ def __init__(
125
+ self,
126
+ channels,
127
+ out_channels,
128
+ n_heads,
129
+ p_dropout=0.0,
130
+ window_size=None,
131
+ heads_share=True,
132
+ block_length=None,
133
+ proximal_bias=False,
134
+ proximal_init=False,
135
+ ):
136
+ super().__init__()
137
+ assert channels % n_heads == 0
138
+
139
+ self.channels = channels
140
+ self.out_channels = out_channels
141
+ self.n_heads = n_heads
142
+ self.p_dropout = p_dropout
143
+ self.window_size = window_size
144
+ self.heads_share = heads_share
145
+ self.block_length = block_length
146
+ self.proximal_bias = proximal_bias
147
+ self.proximal_init = proximal_init
148
+ self.attn = None
149
+
150
+ self.k_channels = channels // n_heads
151
+ self.conv_q = nn.Conv1d(channels, channels, 1)
152
+ self.conv_k = nn.Conv1d(channels, channels, 1)
153
+ self.conv_v = nn.Conv1d(channels, channels, 1)
154
+ self.conv_o = nn.Conv1d(channels, out_channels, 1)
155
+ self.drop = nn.Dropout(p_dropout)
156
+
157
+ if window_size is not None:
158
+ n_heads_rel = 1 if heads_share else n_heads
159
+ rel_stddev = self.k_channels**-0.5
160
+ self.emb_rel_k = nn.Parameter(
161
+ torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels)
162
+ * rel_stddev
163
+ )
164
+ self.emb_rel_v = nn.Parameter(
165
+ torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels)
166
+ * rel_stddev
167
+ )
168
+
169
+ nn.init.xavier_uniform_(self.conv_q.weight)
170
+ nn.init.xavier_uniform_(self.conv_k.weight)
171
+ nn.init.xavier_uniform_(self.conv_v.weight)
172
+ if proximal_init:
173
+ with torch.no_grad():
174
+ self.conv_k.weight.copy_(self.conv_q.weight)
175
+ self.conv_k.bias.copy_(self.conv_q.bias)
176
+
177
+ def forward(self, x, c, attn_mask=None):
178
+ q = self.conv_q(x)
179
+ k = self.conv_k(c)
180
+ v = self.conv_v(c)
181
+
182
+ x, self.attn = self.attention(q, k, v, mask=attn_mask)
183
+
184
+ x = self.conv_o(x)
185
+ return x
186
+
187
+ def attention(self, query, key, value, mask=None):
188
+ # reshape [b, d, t] -> [b, n_h, t, d_k]
189
+ b, d, t_s, t_t = (*key.size(), query.size(2))
190
+ query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3)
191
+ key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3)
192
+ value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3)
193
+
194
+ scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1))
195
+ if self.window_size is not None:
196
+ assert (
197
+ t_s == t_t
198
+ ), "Relative attention is only available for self-attention."
199
+ key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s)
200
+ rel_logits = self._matmul_with_relative_keys(
201
+ query / math.sqrt(self.k_channels), key_relative_embeddings
202
+ )
203
+ scores_local = self._relative_position_to_absolute_position(rel_logits)
204
+ scores = scores + scores_local
205
+ if self.proximal_bias:
206
+ assert t_s == t_t, "Proximal bias is only available for self-attention."
207
+ scores = scores + self._attention_bias_proximal(t_s).to(
208
+ device=scores.device, dtype=scores.dtype
209
+ )
210
+ if mask is not None:
211
+ scores = scores.masked_fill(mask == 0, -1e4)
212
+ if self.block_length is not None:
213
+ assert (
214
+ t_s == t_t
215
+ ), "Local attention is only available for self-attention."
216
+ block_mask = (
217
+ torch.ones_like(scores)
218
+ .triu(-self.block_length)
219
+ .tril(self.block_length)
220
+ )
221
+ scores = scores.masked_fill(block_mask == 0, -1e4)
222
+ p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s]
223
+ p_attn = self.drop(p_attn)
224
+ output = torch.matmul(p_attn, value)
225
+ if self.window_size is not None:
226
+ relative_weights = self._absolute_position_to_relative_position(p_attn)
227
+ value_relative_embeddings = self._get_relative_embeddings(
228
+ self.emb_rel_v, t_s
229
+ )
230
+ output = output + self._matmul_with_relative_values(
231
+ relative_weights, value_relative_embeddings
232
+ )
233
+ output = (
234
+ output.transpose(2, 3).contiguous().view(b, d, t_t)
235
+ ) # [b, n_h, t_t, d_k] -> [b, d, t_t]
236
+ return output, p_attn
237
+
238
+ def _matmul_with_relative_values(self, x, y):
239
+ """
240
+ x: [b, h, l, m]
241
+ y: [h or 1, m, d]
242
+ ret: [b, h, l, d]
243
+ """
244
+ ret = torch.matmul(x, y.unsqueeze(0))
245
+ return ret
246
+
247
+ def _matmul_with_relative_keys(self, x, y):
248
+ """
249
+ x: [b, h, l, d]
250
+ y: [h or 1, m, d]
251
+ ret: [b, h, l, m]
252
+ """
253
+ ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1))
254
+ return ret
255
+
256
+ def _get_relative_embeddings(self, relative_embeddings, length):
257
+ max_relative_position = 2 * self.window_size + 1
258
+ # Pad first before slice to avoid using cond ops.
259
+ pad_length = max(length - (self.window_size + 1), 0)
260
+ slice_start_position = max((self.window_size + 1) - length, 0)
261
+ slice_end_position = slice_start_position + 2 * length - 1
262
+ if pad_length > 0:
263
+ padded_relative_embeddings = F.pad(
264
+ relative_embeddings,
265
+ commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]),
266
+ )
267
+ else:
268
+ padded_relative_embeddings = relative_embeddings
269
+ used_relative_embeddings = padded_relative_embeddings[
270
+ :, slice_start_position:slice_end_position
271
+ ]
272
+ return used_relative_embeddings
273
+
274
+ def _relative_position_to_absolute_position(self, x):
275
+ """
276
+ x: [b, h, l, 2*l-1]
277
+ ret: [b, h, l, l]
278
+ """
279
+ batch, heads, length, _ = x.size()
280
+ # Concat columns of pad to shift from relative to absolute indexing.
281
+ x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, 1]]))
282
+
283
+ # Concat extra elements so to add up to shape (len+1, 2*len-1).
284
+ x_flat = x.view([batch, heads, length * 2 * length])
285
+ x_flat = F.pad(
286
+ x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [0, length - 1]])
287
+ )
288
+
289
+ # Reshape and slice out the padded elements.
290
+ x_final = x_flat.view([batch, heads, length + 1, 2 * length - 1])[
291
+ :, :, :length, length - 1 :
292
+ ]
293
+ return x_final
294
+
295
+ def _absolute_position_to_relative_position(self, x):
296
+ """
297
+ x: [b, h, l, l]
298
+ ret: [b, h, l, 2*l-1]
299
+ """
300
+ batch, heads, length, _ = x.size()
301
+ # padd along column
302
+ x = F.pad(
303
+ x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length - 1]])
304
+ )
305
+ x_flat = x.view([batch, heads, length**2 + length * (length - 1)])
306
+ # add 0's in the beginning that will skew the elements after reshape
307
+ x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]]))
308
+ x_final = x_flat.view([batch, heads, length, 2 * length])[:, :, :, 1:]
309
+ return x_final
310
+
311
+ def _attention_bias_proximal(self, length):
312
+ """Bias for self-attention to encourage attention to close positions.
313
+ Args:
314
+ length: an integer scalar.
315
+ Returns:
316
+ a Tensor with shape [1, 1, length, length]
317
+ """
318
+ r = torch.arange(length, dtype=torch.float32)
319
+ diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1)
320
+ return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0)
321
+
322
+
323
+ class FFN(nn.Module):
324
+ def __init__(
325
+ self,
326
+ in_channels,
327
+ out_channels,
328
+ filter_channels,
329
+ kernel_size,
330
+ p_dropout=0.0,
331
+ activation=None,
332
+ causal=False,
333
+ ):
334
+ super().__init__()
335
+ self.in_channels = in_channels
336
+ self.out_channels = out_channels
337
+ self.filter_channels = filter_channels
338
+ self.kernel_size = kernel_size
339
+ self.p_dropout = p_dropout
340
+ self.activation = activation
341
+ self.causal = causal
342
+
343
+ if causal:
344
+ self.padding = self._causal_padding
345
+ else:
346
+ self.padding = self._same_padding
347
+
348
+ self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size)
349
+ self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size)
350
+ self.drop = nn.Dropout(p_dropout)
351
+
352
+ def forward(self, x, x_mask):
353
+ x = self.conv_1(self.padding(x * x_mask))
354
+ if self.activation == "gelu":
355
+ x = x * torch.sigmoid(1.702 * x)
356
+ else:
357
+ x = torch.relu(x)
358
+ x = self.drop(x)
359
+ x = self.conv_2(self.padding(x * x_mask))
360
+ return x * x_mask
361
+
362
+ def _causal_padding(self, x):
363
+ if self.kernel_size == 1:
364
+ return x
365
+ pad_l = self.kernel_size - 1
366
+ pad_r = 0
367
+ padding = [[0, 0], [0, 0], [pad_l, pad_r]]
368
+ x = F.pad(x, commons.convert_pad_shape(padding))
369
+ return x
370
+
371
+ def _same_padding(self, x):
372
+ if self.kernel_size == 1:
373
+ return x
374
+ pad_l = (self.kernel_size - 1) // 2
375
+ pad_r = self.kernel_size // 2
376
+ padding = [[0, 0], [0, 0], [pad_l, pad_r]]
377
+ x = F.pad(x, commons.convert_pad_shape(padding))
378
+ return x
BanG-Dream/bert_gen.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from multiprocessing import Pool
3
+ import commons
4
+ import utils
5
+ from tqdm import tqdm
6
+ from text import check_bert_models, cleaned_text_to_sequence, get_bert
7
+ import argparse
8
+ import torch.multiprocessing as mp
9
+ from config import config
10
+
11
+
12
+ def process_line(x):
13
+ line, add_blank = x
14
+ device = config.bert_gen_config.device
15
+ if config.bert_gen_config.use_multi_device:
16
+ rank = mp.current_process()._identity
17
+ rank = rank[0] if len(rank) > 0 else 0
18
+ if torch.cuda.is_available():
19
+ gpu_id = rank % torch.cuda.device_count()
20
+ device = torch.device(f"cuda:{gpu_id}")
21
+ else:
22
+ device = torch.device("cpu")
23
+ wav_path, _, language_str, text, phones, tone, word2ph = line.strip().split("|")
24
+ phone = phones.split(" ")
25
+ tone = [int(i) for i in tone.split(" ")]
26
+ word2ph = [int(i) for i in word2ph.split(" ")]
27
+ word2ph = [i for i in word2ph]
28
+ phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str)
29
+
30
+ if add_blank:
31
+ phone = commons.intersperse(phone, 0)
32
+ tone = commons.intersperse(tone, 0)
33
+ language = commons.intersperse(language, 0)
34
+ for i in range(len(word2ph)):
35
+ word2ph[i] = word2ph[i] * 2
36
+ word2ph[0] += 1
37
+
38
+ bert_path = wav_path.replace(".WAV", ".wav").replace(".wav", ".bert.pt")
39
+
40
+ try:
41
+ bert = torch.load(bert_path)
42
+ assert bert.shape[-1] == len(phone)
43
+ except Exception:
44
+ bert = get_bert(text, word2ph, language_str, device)
45
+ assert bert.shape[-1] == len(phone)
46
+ torch.save(bert, bert_path)
47
+
48
+
49
+ preprocess_text_config = config.preprocess_text_config
50
+
51
+ if __name__ == "__main__":
52
+ parser = argparse.ArgumentParser()
53
+ parser.add_argument(
54
+ "-c", "--config", type=str, default=config.bert_gen_config.config_path
55
+ )
56
+ parser.add_argument(
57
+ "--num_processes", type=int, default=config.bert_gen_config.num_processes
58
+ )
59
+ args, _ = parser.parse_known_args()
60
+ config_path = args.config
61
+ hps = utils.get_hparams_from_file(config_path)
62
+ check_bert_models()
63
+ lines = []
64
+ with open(hps.data.training_files, encoding="utf-8") as f:
65
+ lines.extend(f.readlines())
66
+
67
+ with open(hps.data.validation_files, encoding="utf-8") as f:
68
+ lines.extend(f.readlines())
69
+ add_blank = [hps.data.add_blank] * len(lines)
70
+
71
+ if len(lines) != 0:
72
+ num_processes = args.num_processes
73
+ with Pool(processes=num_processes) as pool:
74
+ for _ in tqdm(
75
+ pool.imap_unordered(process_line, zip(lines, add_blank)),
76
+ total=len(lines),
77
+ ):
78
+ # 这里是缩进的代码块,表示循环体
79
+ pass # 使用pass语句作为占位符
80
+
81
+ print(f"bert生成完毕!, 共有{len(lines)}个bert.pt生成!")
BanG-Dream/clap_gen.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ from multiprocessing import Pool, cpu_count
3
+
4
+ import torch
5
+ import torch.multiprocessing as mp
6
+ from tqdm import tqdm
7
+
8
+ import utils
9
+ from config import config
10
+ from clap_wrapper import get_clap_audio_feature
11
+ import librosa
12
+ import os
13
+
14
+ os.environ["OMP_NUM_THREADS"] = "1"
15
+ os.environ["MKL_NUM_THREADS"] = "1"
16
+
17
+
18
+ def process_line(line):
19
+ device = config.emo_gen_config.device
20
+ if config.emo_gen_config.use_multi_device:
21
+ rank = mp.current_process()._identity
22
+ rank = rank[0] if len(rank) > 0 else 0
23
+ if torch.cuda.is_available():
24
+ gpu_id = rank % torch.cuda.device_count()
25
+ device = torch.device(f"cuda:{gpu_id}")
26
+ else:
27
+ device = torch.device("cpu")
28
+ wav_path, _, language_str, text, phones, tone, word2ph = line.strip().split("|")
29
+
30
+ clap_path = wav_path.replace(".WAV", ".wav").replace(".wav", ".emo.pt")
31
+ if os.path.isfile(clap_path):
32
+ return
33
+
34
+ audio = librosa.load(wav_path, 48000)[0]
35
+ # audio = librosa.resample(audio, 44100, 48000)
36
+
37
+ clap = get_clap_audio_feature(audio, device)
38
+ torch.save(clap, clap_path)
39
+
40
+
41
+ if __name__ == "__main__":
42
+ parser = argparse.ArgumentParser()
43
+ parser.add_argument(
44
+ "-c", "--config", type=str, default=config.emo_gen_config.config_path
45
+ )
46
+ parser.add_argument(
47
+ "--num_processes", type=int, default=config.emo_gen_config.num_processes
48
+ )
49
+ args, _ = parser.parse_known_args()
50
+ config_path = args.config
51
+ hps = utils.get_hparams_from_file(config_path)
52
+ lines = []
53
+ with open(hps.data.training_files, encoding="utf-8") as f:
54
+ lines.extend(f.readlines())
55
+
56
+ with open(hps.data.validation_files, encoding="utf-8") as f:
57
+ lines.extend(f.readlines())
58
+ if len(lines) != 0:
59
+ num_processes = min(args.num_processes, cpu_count())
60
+ with Pool(processes=num_processes) as pool:
61
+ for _ in tqdm(pool.imap_unordered(process_line, lines), total=len(lines)):
62
+ pass
63
+
64
+ print(f"clap生成完毕!, 共有{len(lines)}个emo.pt生成!")
BanG-Dream/clap_wrapper.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+
3
+ import torch
4
+ from transformers import ClapModel, ClapProcessor
5
+
6
+ from config import config
7
+
8
+ models = dict()
9
+ processor = ClapProcessor.from_pretrained("./emotional/clap-htsat-fused")
10
+
11
+
12
+ def get_clap_audio_feature(audio_data, device=config.bert_gen_config.device):
13
+ if (
14
+ sys.platform == "darwin"
15
+ and torch.backends.mps.is_available()
16
+ and device == "cpu"
17
+ ):
18
+ device = "mps"
19
+ if not device:
20
+ device = "cuda"
21
+ if device not in models.keys():
22
+ models[device] = ClapModel.from_pretrained("./emotional/clap-htsat-fused").to(
23
+ device
24
+ )
25
+ with torch.no_grad():
26
+ inputs = processor(
27
+ audios=audio_data, return_tensors="pt", sampling_rate=48000
28
+ ).to(device)
29
+ emb = models[device].get_audio_features(**inputs)
30
+ return emb.T
31
+
32
+
33
+ def get_clap_text_feature(text, device=config.bert_gen_config.device):
34
+ if (
35
+ sys.platform == "darwin"
36
+ and torch.backends.mps.is_available()
37
+ and device == "cpu"
38
+ ):
39
+ device = "mps"
40
+ if not device:
41
+ device = "cuda"
42
+ if device not in models.keys():
43
+ models[device] = ClapModel.from_pretrained("./emotional/clap-htsat-fused").to(
44
+ device
45
+ )
46
+ with torch.no_grad():
47
+ inputs = processor(text=text, return_tensors="pt").to(device)
48
+ emb = models[device].get_text_features(**inputs)
49
+ return emb.T
BanG-Dream/commons.py ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ import torch
3
+ from torch.nn import functional as F
4
+
5
+
6
+ def init_weights(m, mean=0.0, std=0.01):
7
+ classname = m.__class__.__name__
8
+ if classname.find("Conv") != -1:
9
+ m.weight.data.normal_(mean, std)
10
+
11
+
12
+ def get_padding(kernel_size, dilation=1):
13
+ return int((kernel_size * dilation - dilation) / 2)
14
+
15
+
16
+ def convert_pad_shape(pad_shape):
17
+ layer = pad_shape[::-1]
18
+ pad_shape = [item for sublist in layer for item in sublist]
19
+ return pad_shape
20
+
21
+
22
+ def intersperse(lst, item):
23
+ result = [item] * (len(lst) * 2 + 1)
24
+ result[1::2] = lst
25
+ return result
26
+
27
+
28
+ def kl_divergence(m_p, logs_p, m_q, logs_q):
29
+ """KL(P||Q)"""
30
+ kl = (logs_q - logs_p) - 0.5
31
+ kl += (
32
+ 0.5 * (torch.exp(2.0 * logs_p) + ((m_p - m_q) ** 2)) * torch.exp(-2.0 * logs_q)
33
+ )
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
+ gather_indices = ids_str.view(x.size(0), 1, 1).repeat(
50
+ 1, x.size(1), 1
51
+ ) + torch.arange(segment_size, device=x.device)
52
+ return torch.gather(x, 2, gather_indices)
53
+
54
+
55
+ def rand_slice_segments(x, x_lengths=None, segment_size=4):
56
+ b, d, t = x.size()
57
+ if x_lengths is None:
58
+ x_lengths = t
59
+ ids_str_max = torch.clamp(x_lengths - segment_size + 1, min=0)
60
+ ids_str = (torch.rand([b], device=x.device) * ids_str_max).to(dtype=torch.long)
61
+ ret = slice_segments(x, ids_str, segment_size)
62
+ return ret, ids_str
63
+
64
+
65
+ def get_timing_signal_1d(length, channels, min_timescale=1.0, max_timescale=1.0e4):
66
+ position = torch.arange(length, dtype=torch.float)
67
+ num_timescales = channels // 2
68
+ log_timescale_increment = math.log(float(max_timescale) / float(min_timescale)) / (
69
+ num_timescales - 1
70
+ )
71
+ inv_timescales = min_timescale * torch.exp(
72
+ torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment
73
+ )
74
+ scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1)
75
+ signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0)
76
+ signal = F.pad(signal, [0, 0, 0, channels % 2])
77
+ signal = signal.view(1, channels, length)
78
+ return signal
79
+
80
+
81
+ def add_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4):
82
+ b, channels, length = x.size()
83
+ signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale)
84
+ return x + signal.to(dtype=x.dtype, device=x.device)
85
+
86
+
87
+ def cat_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4, axis=1):
88
+ b, channels, length = x.size()
89
+ signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale)
90
+ return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis)
91
+
92
+
93
+ def subsequent_mask(length):
94
+ mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0)
95
+ return mask
96
+
97
+
98
+ @torch.jit.script
99
+ def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels):
100
+ n_channels_int = n_channels[0]
101
+ in_act = input_a + input_b
102
+ t_act = torch.tanh(in_act[:, :n_channels_int, :])
103
+ s_act = torch.sigmoid(in_act[:, n_channels_int:, :])
104
+ acts = t_act * s_act
105
+ return acts
106
+
107
+
108
+ def convert_pad_shape(pad_shape):
109
+ layer = pad_shape[::-1]
110
+ pad_shape = [item for sublist in layer for item in sublist]
111
+ return pad_shape
112
+
113
+
114
+ def shift_1d(x):
115
+ x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1]
116
+ return x
117
+
118
+
119
+ def sequence_mask(length, max_length=None):
120
+ if max_length is None:
121
+ max_length = length.max()
122
+ x = torch.arange(max_length, dtype=length.dtype, device=length.device)
123
+ return x.unsqueeze(0) < length.unsqueeze(1)
124
+
125
+
126
+ def generate_path(duration, mask):
127
+ """
128
+ duration: [b, 1, t_x]
129
+ mask: [b, 1, t_y, t_x]
130
+ """
131
+
132
+ b, _, t_y, t_x = mask.shape
133
+ cum_duration = torch.cumsum(duration, -1)
134
+
135
+ cum_duration_flat = cum_duration.view(b * t_x)
136
+ path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype)
137
+ path = path.view(b, t_x, t_y)
138
+ path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1]
139
+ path = path.unsqueeze(1).transpose(2, 3) * mask
140
+ return path
141
+
142
+
143
+ def clip_grad_value_(parameters, clip_value, norm_type=2):
144
+ if isinstance(parameters, torch.Tensor):
145
+ parameters = [parameters]
146
+ parameters = list(filter(lambda p: p.grad is not None, parameters))
147
+ norm_type = float(norm_type)
148
+ if clip_value is not None:
149
+ clip_value = float(clip_value)
150
+
151
+ total_norm = 0
152
+ for p in parameters:
153
+ param_norm = p.grad.data.norm(norm_type)
154
+ total_norm += param_norm.item() ** norm_type
155
+ if clip_value is not None:
156
+ p.grad.data.clamp_(min=-clip_value, max=clip_value)
157
+ total_norm = total_norm ** (1.0 / norm_type)
158
+ return total_norm
BanG-Dream/compress_model.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from collections import OrderedDict
2
+ from text.symbols import symbols
3
+ import torch
4
+
5
+ from tools.log import logger
6
+ import utils
7
+ from models import SynthesizerTrn
8
+ import os
9
+
10
+
11
+ def copyStateDict(state_dict):
12
+ if list(state_dict.keys())[0].startswith("module"):
13
+ start_idx = 1
14
+ else:
15
+ start_idx = 0
16
+ new_state_dict = OrderedDict()
17
+ for k, v in state_dict.items():
18
+ name = ",".join(k.split(".")[start_idx:])
19
+ new_state_dict[name] = v
20
+ return new_state_dict
21
+
22
+
23
+ def removeOptimizer(config: str, input_model: str, ishalf: bool, output_model: str):
24
+ hps = utils.get_hparams_from_file(config)
25
+
26
+ net_g = SynthesizerTrn(
27
+ len(symbols),
28
+ hps.data.filter_length // 2 + 1,
29
+ hps.train.segment_size // hps.data.hop_length,
30
+ n_speakers=hps.data.n_speakers,
31
+ **hps.model,
32
+ )
33
+
34
+ optim_g = torch.optim.AdamW(
35
+ net_g.parameters(),
36
+ hps.train.learning_rate,
37
+ betas=hps.train.betas,
38
+ eps=hps.train.eps,
39
+ )
40
+
41
+ state_dict_g = torch.load(input_model, map_location="cpu")
42
+ new_dict_g = copyStateDict(state_dict_g)
43
+ keys = []
44
+ for k, v in new_dict_g["model"].items():
45
+ if "enc_q" in k:
46
+ continue # noqa: E701
47
+ keys.append(k)
48
+
49
+ new_dict_g = (
50
+ {k: new_dict_g["model"][k].half() for k in keys}
51
+ if ishalf
52
+ else {k: new_dict_g["model"][k] for k in keys}
53
+ )
54
+
55
+ torch.save(
56
+ {
57
+ "model": new_dict_g,
58
+ "iteration": 0,
59
+ "optimizer": optim_g.state_dict(),
60
+ "learning_rate": 0.0001,
61
+ },
62
+ output_model,
63
+ )
64
+
65
+
66
+ if __name__ == "__main__":
67
+ import argparse
68
+
69
+ parser = argparse.ArgumentParser()
70
+ parser.add_argument("-c", "--config", type=str, default="configs/config.json")
71
+ parser.add_argument("-i", "--input", type=str)
72
+ parser.add_argument("-o", "--output", type=str, default=None)
73
+ parser.add_argument(
74
+ "-hf", "--half", action="store_true", default=False, help="Save as FP16"
75
+ )
76
+
77
+ args = parser.parse_args()
78
+
79
+ output = args.output
80
+
81
+ if output is None:
82
+ import os.path
83
+
84
+ filename, ext = os.path.splitext(args.input)
85
+ half = "_half" if args.half else ""
86
+ output = filename + "_release" + half + ext
87
+
88
+ removeOptimizer(args.config, args.input, args.half, output)
89
+ logger.info(f"压缩模型成功, 输出模型: {os.path.abspath(output)}")
BanG-Dream/config.py ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ @Desc: 全局配置文件读取
3
+ """
4
+ import argparse
5
+ import yaml
6
+ from typing import Dict, List
7
+ import os
8
+ import shutil
9
+ import sys
10
+
11
+
12
+ class Resample_config:
13
+ """重采样配置"""
14
+
15
+ def __init__(self, in_dir: str, out_dir: str, sampling_rate: int = 44100):
16
+ self.sampling_rate: int = sampling_rate # 目标采样率
17
+ self.in_dir: str = in_dir # 待处理音频目录路径
18
+ self.out_dir: str = out_dir # 重采样输出路径
19
+
20
+ @classmethod
21
+ def from_dict(cls, dataset_path: str, data: Dict[str, any]):
22
+ """从字典中生成实例"""
23
+
24
+ # 不检查路径是否有效,此逻辑在resample.py中处理
25
+ data["in_dir"] = os.path.join(dataset_path, data["in_dir"])
26
+ data["out_dir"] = os.path.join(dataset_path, data["out_dir"])
27
+
28
+ return cls(**data)
29
+
30
+
31
+ class Preprocess_text_config:
32
+ """数据预处理配置"""
33
+
34
+ def __init__(
35
+ self,
36
+ transcription_path: str,
37
+ cleaned_path: str,
38
+ train_path: str,
39
+ val_path: str,
40
+ config_path: str,
41
+ val_per_lang: int = 5,
42
+ max_val_total: int = 10000,
43
+ clean: bool = True,
44
+ ):
45
+ self.transcription_path: str = transcription_path # 原始文本文件路径,文本格式应为{wav_path}|{speaker_name}|{language}|{text}。
46
+ self.cleaned_path: str = cleaned_path # 数据清洗后文本路径,可以不填。不填则将在原始文本目录生成
47
+ self.train_path: str = train_path # 训练集路径,可以不填。不填则将在原始文本目录生成
48
+ self.val_path: str = val_path # 验证集路径,可以不填。不填则将在原始文本目录生成
49
+ self.config_path: str = config_path # 配置文件路径
50
+ self.val_per_lang: int = val_per_lang # 每个speaker的验证集条数
51
+ self.max_val_total: int = max_val_total # 验证集最大条数,多于的会被截断并放到训练集中
52
+ self.clean: bool = clean # 是否进行数据清洗
53
+
54
+ @classmethod
55
+ def from_dict(cls, dataset_path: str, data: Dict[str, any]):
56
+ """从字典中生成实例"""
57
+
58
+ data["transcription_path"] = os.path.join(
59
+ dataset_path, data["transcription_path"]
60
+ )
61
+ if data["cleaned_path"] == "" or data["cleaned_path"] is None:
62
+ data["cleaned_path"] = None
63
+ else:
64
+ data["cleaned_path"] = os.path.join(dataset_path, data["cleaned_path"])
65
+ data["train_path"] = os.path.join(dataset_path, data["train_path"])
66
+ data["val_path"] = os.path.join(dataset_path, data["val_path"])
67
+ data["config_path"] = os.path.join(dataset_path, data["config_path"])
68
+
69
+ return cls(**data)
70
+
71
+
72
+ class Bert_gen_config:
73
+ """bert_gen 配置"""
74
+
75
+ def __init__(
76
+ self,
77
+ config_path: str,
78
+ num_processes: int = 2,
79
+ device: str = "cuda",
80
+ use_multi_device: bool = False,
81
+ ):
82
+ self.config_path = config_path
83
+ self.num_processes = num_processes
84
+ self.device = device
85
+ self.use_multi_device = use_multi_device
86
+
87
+ @classmethod
88
+ def from_dict(cls, dataset_path: str, data: Dict[str, any]):
89
+ data["config_path"] = os.path.join(dataset_path, data["config_path"])
90
+
91
+ return cls(**data)
92
+
93
+
94
+ class Emo_gen_config:
95
+ """emo_gen 配置"""
96
+
97
+ def __init__(
98
+ self,
99
+ config_path: str,
100
+ num_processes: int = 2,
101
+ device: str = "cuda",
102
+ use_multi_device: bool = False,
103
+ ):
104
+ self.config_path = config_path
105
+ self.num_processes = num_processes
106
+ self.device = device
107
+ self.use_multi_device = use_multi_device
108
+
109
+ @classmethod
110
+ def from_dict(cls, dataset_path: str, data: Dict[str, any]):
111
+ data["config_path"] = os.path.join(dataset_path, data["config_path"])
112
+
113
+ return cls(**data)
114
+
115
+
116
+ class Train_ms_config:
117
+ """训练配置"""
118
+
119
+ def __init__(
120
+ self,
121
+ config_path: str,
122
+ env: Dict[str, any],
123
+ base: Dict[str, any],
124
+ model: str,
125
+ num_workers: int,
126
+ spec_cache: bool,
127
+ keep_ckpts: int,
128
+ ):
129
+ self.env = env # 需要加载的环境变量
130
+ self.base = base # 底模配置
131
+ self.model = model # 训练模型存储目录,该路径为相对于dataset_path的路径,而非项目根目录
132
+ self.config_path = config_path # 配置文件路径
133
+ self.num_workers = num_workers # worker数量
134
+ self.spec_cache = spec_cache # 是否启用spec缓存
135
+ self.keep_ckpts = keep_ckpts # ckpt数量
136
+
137
+ @classmethod
138
+ def from_dict(cls, dataset_path: str, data: Dict[str, any]):
139
+ # data["model"] = os.path.join(dataset_path, data["model"])
140
+ data["config_path"] = os.path.join(dataset_path, data["config_path"])
141
+
142
+ return cls(**data)
143
+
144
+
145
+ class Webui_config:
146
+ """webui 配置"""
147
+
148
+ def __init__(
149
+ self,
150
+ device: str,
151
+ model: str,
152
+ config_path: str,
153
+ language_identification_library: str,
154
+ port: int = 7860,
155
+ share: bool = False,
156
+ debug: bool = False,
157
+ ):
158
+ self.device: str = device
159
+ self.model: str = model # 端口号
160
+ self.config_path: str = config_path # 是否公开部署,对外网开放
161
+ self.port: int = port # 是否开启debug模式
162
+ self.share: bool = share # 模型路径
163
+ self.debug: bool = debug # 配置文件路径
164
+ self.language_identification_library: str = (
165
+ language_identification_library # 语种识别库
166
+ )
167
+
168
+ @classmethod
169
+ def from_dict(cls, dataset_path: str, data: Dict[str, any]):
170
+ data["config_path"] = os.path.join(dataset_path, data["config_path"])
171
+ data["model"] = os.path.join(dataset_path, data["model"])
172
+ return cls(**data)
173
+
174
+
175
+ class Server_config:
176
+ def __init__(
177
+ self, models: List[Dict[str, any]], port: int = 5000, device: str = "cuda"
178
+ ):
179
+ self.models: List[Dict[str, any]] = models # 需要加载的所有模型的配置
180
+ self.port: int = port # 端口号
181
+ self.device: str = device # 模型默认使用设备
182
+
183
+ @classmethod
184
+ def from_dict(cls, data: Dict[str, any]):
185
+ return cls(**data)
186
+
187
+
188
+ class Translate_config:
189
+ """翻译api配置"""
190
+
191
+ def __init__(self, app_key: str, secret_key: str):
192
+ self.app_key = app_key
193
+ self.secret_key = secret_key
194
+
195
+ @classmethod
196
+ def from_dict(cls, data: Dict[str, any]):
197
+ return cls(**data)
198
+
199
+
200
+ class Config:
201
+ def __init__(self, config_path: str):
202
+ if not os.path.isfile(config_path) and os.path.isfile("default_config.yml"):
203
+ shutil.copy(src="default_config.yml", dst=config_path)
204
+ print(
205
+ f"已根据默认配置文件default_config.yml生成配置文件{config_path}。请按该配置文件的说明进行配置后重新运行。"
206
+ )
207
+ print("如无特殊需求,请勿修改default_config.yml或备份该文件。")
208
+ sys.exit(0)
209
+ with open(file=config_path, mode="r", encoding="utf-8") as file:
210
+ yaml_config: Dict[str, any] = yaml.safe_load(file.read())
211
+ dataset_path: str = yaml_config["dataset_path"]
212
+ openi_token: str = yaml_config["openi_token"]
213
+ self.dataset_path: str = dataset_path
214
+ self.mirror: str = yaml_config["mirror"]
215
+ self.openi_token: str = openi_token
216
+ self.resample_config: Resample_config = Resample_config.from_dict(
217
+ dataset_path, yaml_config["resample"]
218
+ )
219
+ self.preprocess_text_config: Preprocess_text_config = (
220
+ Preprocess_text_config.from_dict(
221
+ dataset_path, yaml_config["preprocess_text"]
222
+ )
223
+ )
224
+ self.bert_gen_config: Bert_gen_config = Bert_gen_config.from_dict(
225
+ dataset_path, yaml_config["bert_gen"]
226
+ )
227
+ self.emo_gen_config: Emo_gen_config = Emo_gen_config.from_dict(
228
+ dataset_path, yaml_config["emo_gen"]
229
+ )
230
+ self.train_ms_config: Train_ms_config = Train_ms_config.from_dict(
231
+ dataset_path, yaml_config["train_ms"]
232
+ )
233
+ self.webui_config: Webui_config = Webui_config.from_dict(
234
+ dataset_path, yaml_config["webui"]
235
+ )
236
+ self.server_config: Server_config = Server_config.from_dict(
237
+ yaml_config["server"]
238
+ )
239
+ self.translate_config: Translate_config = Translate_config.from_dict(
240
+ yaml_config["translate"]
241
+ )
242
+
243
+
244
+ parser = argparse.ArgumentParser()
245
+ # 为避免与以前的config.json起冲突,将其更名如下
246
+ parser.add_argument("-y", "--yml_config", type=str, default="config.yml")
247
+ args, _ = parser.parse_known_args()
248
+ config = Config(args.yml_config)
BanG-Dream/config.yml ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 全局配置
2
+ # 对于希望在同一时间使用多个配置文件的情况,例如两个GPU同时跑两个训练集:通过环境变量指定配置文件,不指定则默认为./config.yml
3
+
4
+ # 拟提供通用路径配置,统一存放数据,避免数据放得很乱
5
+ # 每个数据集与其对应的模型存放至统一路径下,后续所有的路径配置均为相对于datasetPath的路径
6
+ # 不填或者填空则路径为相对于项目根目录的路径
7
+ dataset_path: "Data/V23"
8
+
9
+ # 模型镜像源,默认huggingface,使用openi镜像源需指定openi_token
10
+ mirror: ""
11
+ openi_token: "" # openi token
12
+
13
+ # resample 音频重采样配置
14
+ # 注意, “:” 后需要加空格
15
+ resample:
16
+ # 目标重采样率
17
+ sampling_rate: 44100
18
+ # 音频文件输入路径,重采样会将该路径下所有.wav音频文件重采样
19
+ # 请填入相对于datasetPath的相对路径
20
+ in_dir: "" # 相对于根目录的路径为 /datasetPath/in_dir
21
+ # 音频文件重采样后输出路径
22
+ out_dir: ""
23
+
24
+
25
+ # preprocess_text 数据集预处理相关配置
26
+ # 注意, “:” 后需要加空格
27
+ preprocess_text:
28
+ # 原始文本文件路径,文本格式应为{wav_path}|{speaker_name}|{language}|{text}。
29
+ transcription_path: "filelists/whole.list"
30
+ # 数据清洗后文本路径,可以不填。不填则将在原始文本目录生成
31
+ cleaned_path: ""
32
+ # 训练集路径
33
+ train_path: "filelists/train.list"
34
+ # 验证集路径
35
+ val_path: "filelists/val.list"
36
+ # 配置文件路径
37
+ config_path: "configs/config.json"
38
+ # 每个语言的验证集条数
39
+ val_per_lang: 4
40
+ # 验证集最大条数,多于的会被截断并放到训练集中
41
+ max_val_total: 800
42
+ # 是否进行数据清洗
43
+ clean: true
44
+
45
+
46
+ # bert_gen 相关配置
47
+ # 注意, “:” 后需要加空格
48
+ bert_gen:
49
+ # 训练数据集配置文件路径
50
+ config_path: "configs/config.json"
51
+ # 并行数
52
+ num_processes: 4
53
+ # 使用设备:可选项 "cuda" 显卡推理,"cpu" cpu推理
54
+ # 该选项同时决定了get_bert_feature的默认设备
55
+ device: "cuda"
56
+ # 使用多卡推理
57
+ use_multi_device: false
58
+
59
+ # emo_gen 相关配置
60
+ # 注意, “:” 后需要加空格
61
+ emo_gen:
62
+ # 训练数据集配置文件路径
63
+ config_path: "configs/config.json"
64
+ # 并行数
65
+ num_processes: 16
66
+ # 使用设备:可选项 "cuda" 显卡推理,"cpu" cpu推理
67
+ device: "cuda"
68
+ # 使用多卡推理
69
+ use_multi_device: false
70
+
71
+ # train 训练配置
72
+ # 注意, “:” 后需要加空格
73
+ train_ms:
74
+ env:
75
+ MASTER_ADDR: "localhost"
76
+ MASTER_PORT: 10086
77
+ WORLD_SIZE: 1
78
+ LOCAL_RANK: 0
79
+ RANK: 0
80
+ # 可以填写任意名的环境变量
81
+ # THE_ENV_VAR_YOU_NEED_TO_USE: "1234567"
82
+ # 底模设置
83
+ base:
84
+ use_base_model: True
85
+ repo_id: "Stardust_minus/Bert-VITS2"
86
+ model_image: "Bert-VITS2_2.3底模" # openi网页的模型名
87
+ # 训练模型存储目录:与旧版本的区别,原先数据集是存放在logs/model_name下的,现在改为统一存放在Data/你的数据集/models下
88
+ model: "models"
89
+ # 配置文件路径
90
+ config_path: "configs/config.json"
91
+ # 训练使用的worker,不建议超过CPU核心数
92
+ num_workers: 22
93
+ # 关闭此项可以节约接近50%的磁盘空间,但是可能导致实际训练速度变慢和更高的CPU使用率。
94
+ spec_cache: True
95
+ # 保存的检查点数量,多于此数目的权重会被删除来节省空间。
96
+ keep_ckpts: 8
97
+
98
+
99
+ # webui webui配置
100
+ # 注意, “:” 后需要加空格
101
+ webui:
102
+ # 推理设备
103
+ device: "cuda"
104
+ # 模型路径
105
+ model: "models/G_408000.pth"
106
+ # 配置文件路径
107
+ config_path: "configs/config.json"
108
+ # 端口号
109
+ port: 7860
110
+ # 是否公开部署,对外网开放
111
+ share: false
112
+ # 是否开启debug模式
113
+ debug: false
114
+ # 语种识别库,可选langid, fastlid
115
+ language_identification_library: "langid"
116
+
117
+
118
+ # server-fastapi配置
119
+ # 注意, “:” 后需要加空格
120
+ # 注意,本配置下的所有配置均为相对于根目录的路径
121
+ server:
122
+ # 端口号
123
+ port: 5000
124
+ # 模型默认使用设备:但是当前并没有实现这个配置。
125
+ device: "cuda"
126
+ # 需要加载的所有模型的配置,可以填多个模型,也可以不填模型,等网页成功后手动加载模型
127
+ # 不加载模型的配置格式:删除默认给的两个模型配置,给models赋值 [ ],也就是空列表。参考模型2的speakers 即 models: [ ]
128
+ # 注意,所有模型都必须正确配置model与config的路径,空路径会导致加载错误。
129
+ # 也可以不填模型,等网页加载成功后手动填写models。
130
+ models:
131
+ - # 模型的路径
132
+ model: ""
133
+ # 模型config.json的路径
134
+ config: ""
135
+ # 模型使用设备,若填写则会覆盖默认配置
136
+ device: "cuda"
137
+ # 模型默认使用的语言
138
+ language: "ZH"
139
+ # 模型人物默认参数
140
+ # 不必填写所有人物,不填的使用默认值
141
+ # 暂时不用填写,当前尚未实现按人区分配置
142
+ speakers:
143
+ - speaker: "科比"
144
+ sdp_ratio: 0.2
145
+ noise_scale: 0.6
146
+ noise_scale_w: 0.8
147
+ length_scale: 1
148
+ - speaker: "五条悟"
149
+ sdp_ratio: 0.3
150
+ noise_scale: 0.7
151
+ noise_scale_w: 0.8
152
+ length_scale: 0.5
153
+ - speaker: "安倍晋三"
154
+ sdp_ratio: 0.2
155
+ noise_scale: 0.6
156
+ noise_scale_w: 0.8
157
+ length_scale: 1.2
158
+ - # 模型的路径
159
+ model: ""
160
+ # 模型config.json的路径
161
+ config: ""
162
+ # 模型使用设备,若填写则会覆盖默认配置
163
+ device: "cpu"
164
+ # 模型默认使用的语言
165
+ language: "JP"
166
+ # 模型人物默认参数
167
+ # 不必填写所有人物,不填的使用默认值
168
+ speakers: [ ] # 也可以不填
169
+
170
+ # 百度翻译开放平台 api配置
171
+ # api接入文档 https://api.fanyi.baidu.com/doc/21
172
+ # 请不要在github等网站公开分享你的app id 与 key
173
+ translate:
174
+ # 你的APPID
175
+ "app_key": "20231117001883321"
176
+ # 你的密钥
177
+ "secret_key": "lMQbvZHeJveDceLof2wf"
BanG-Dream/data_utils.py ADDED
@@ -0,0 +1,405 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import random
3
+ import torch
4
+ import torch.utils.data
5
+ from tqdm import tqdm
6
+ import numpy as np
7
+ from tools.log import logger
8
+ import commons
9
+ from mel_processing import spectrogram_torch, mel_spectrogram_torch
10
+ from utils import load_wav_to_torch, load_filepaths_and_text
11
+ from text import cleaned_text_to_sequence
12
+ from config import config
13
+
14
+ """Multi speaker version"""
15
+
16
+
17
+ class TextAudioSpeakerLoader(torch.utils.data.Dataset):
18
+ """
19
+ 1) loads audio, speaker_id, text pairs
20
+ 2) normalizes text and converts them to sequences of integers
21
+ 3) computes spectrograms from audio files.
22
+ """
23
+
24
+ def __init__(self, audiopaths_sid_text, hparams):
25
+ self.audiopaths_sid_text = load_filepaths_and_text(audiopaths_sid_text)
26
+ self.max_wav_value = hparams.max_wav_value
27
+ self.sampling_rate = hparams.sampling_rate
28
+ self.filter_length = hparams.filter_length
29
+ self.hop_length = hparams.hop_length
30
+ self.win_length = hparams.win_length
31
+ self.sampling_rate = hparams.sampling_rate
32
+ self.spk_map = hparams.spk2id
33
+ self.hparams = hparams
34
+
35
+ self.use_mel_spec_posterior = getattr(
36
+ hparams, "use_mel_posterior_encoder", False
37
+ )
38
+ if self.use_mel_spec_posterior:
39
+ self.n_mel_channels = getattr(hparams, "n_mel_channels", 80)
40
+
41
+ self.cleaned_text = getattr(hparams, "cleaned_text", False)
42
+
43
+ self.add_blank = hparams.add_blank
44
+ self.min_text_len = getattr(hparams, "min_text_len", 1)
45
+ self.max_text_len = getattr(hparams, "max_text_len", 384)
46
+
47
+ random.seed(1234)
48
+ random.shuffle(self.audiopaths_sid_text)
49
+ self._filter()
50
+
51
+ def _filter(self):
52
+ """
53
+ Filter text & store spec lengths
54
+ """
55
+ # Store spectrogram lengths for Bucketing
56
+ # wav_length ~= file_size / (wav_channels * Bytes per dim) = file_size / (1 * 2)
57
+ # spec_length = wav_length // hop_length
58
+
59
+ audiopaths_sid_text_new = []
60
+ lengths = []
61
+ skipped = 0
62
+ logger.info("Init dataset...")
63
+ for _id, spk, language, text, phones, tone, word2ph in tqdm(
64
+ self.audiopaths_sid_text
65
+ ):
66
+ audiopath = f"{_id}"
67
+ if self.min_text_len <= len(phones) and len(phones) <= self.max_text_len:
68
+ phones = phones.split(" ")
69
+ tone = [int(i) for i in tone.split(" ")]
70
+ word2ph = [int(i) for i in word2ph.split(" ")]
71
+ audiopaths_sid_text_new.append(
72
+ [audiopath, spk, language, text, phones, tone, word2ph]
73
+ )
74
+ lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length))
75
+ else:
76
+ skipped += 1
77
+ logger.info(
78
+ "skipped: "
79
+ + str(skipped)
80
+ + ", total: "
81
+ + str(len(self.audiopaths_sid_text))
82
+ )
83
+ self.audiopaths_sid_text = audiopaths_sid_text_new
84
+ self.lengths = lengths
85
+
86
+ def get_audio_text_speaker_pair(self, audiopath_sid_text):
87
+ # separate filename, speaker_id and text
88
+ audiopath, sid, language, text, phones, tone, word2ph = audiopath_sid_text
89
+
90
+ bert, ja_bert, en_bert, phones, tone, language = self.get_text(
91
+ text, word2ph, phones, tone, language, audiopath
92
+ )
93
+
94
+ spec, wav = self.get_audio(audiopath)
95
+ sid = torch.LongTensor([int(self.spk_map[sid])])
96
+
97
+ return (phones, spec, wav, sid, tone, language, bert, ja_bert, en_bert)
98
+
99
+ def get_audio(self, filename):
100
+ audio, sampling_rate = load_wav_to_torch(filename)
101
+ if sampling_rate != self.sampling_rate:
102
+ raise ValueError(
103
+ "{} {} SR doesn't match target {} SR".format(
104
+ filename, sampling_rate, self.sampling_rate
105
+ )
106
+ )
107
+ audio_norm = audio / self.max_wav_value
108
+ audio_norm = audio_norm.unsqueeze(0)
109
+ spec_filename = filename.replace(".wav", ".spec.pt")
110
+ if self.use_mel_spec_posterior:
111
+ spec_filename = spec_filename.replace(".spec.pt", ".mel.pt")
112
+ try:
113
+ spec = torch.load(spec_filename)
114
+ except:
115
+ if self.use_mel_spec_posterior:
116
+ spec = mel_spectrogram_torch(
117
+ audio_norm,
118
+ self.filter_length,
119
+ self.n_mel_channels,
120
+ self.sampling_rate,
121
+ self.hop_length,
122
+ self.win_length,
123
+ self.hparams.mel_fmin,
124
+ self.hparams.mel_fmax,
125
+ center=False,
126
+ )
127
+ else:
128
+ spec = spectrogram_torch(
129
+ audio_norm,
130
+ self.filter_length,
131
+ self.sampling_rate,
132
+ self.hop_length,
133
+ self.win_length,
134
+ center=False,
135
+ )
136
+ spec = torch.squeeze(spec, 0)
137
+ if config.train_ms_config.spec_cache:
138
+ torch.save(spec, spec_filename)
139
+ return spec, audio_norm
140
+
141
+ def get_text(self, text, word2ph, phone, tone, language_str, wav_path):
142
+ phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str)
143
+ if self.add_blank:
144
+ phone = commons.intersperse(phone, 0)
145
+ tone = commons.intersperse(tone, 0)
146
+ language = commons.intersperse(language, 0)
147
+ for i in range(len(word2ph)):
148
+ word2ph[i] = word2ph[i] * 2
149
+ word2ph[0] += 1
150
+ bert_path = wav_path.replace(".wav", ".bert.pt")
151
+ try:
152
+ bert_ori = torch.load(bert_path)
153
+ assert bert_ori.shape[-1] == len(phone)
154
+ except Exception as e:
155
+ logger.warning("Bert load Failed")
156
+ logger.warning(e)
157
+
158
+ if language_str == "ZH":
159
+ bert = bert_ori
160
+ ja_bert = torch.randn(1024, len(phone))
161
+ en_bert = torch.randn(1024, len(phone))
162
+ elif language_str == "JP":
163
+ bert = torch.randn(1024, len(phone))
164
+ ja_bert = bert_ori
165
+ en_bert = torch.randn(1024, len(phone))
166
+ elif language_str == "EN":
167
+ bert = torch.randn(1024, len(phone))
168
+ ja_bert = torch.randn(1024, len(phone))
169
+ en_bert = bert_ori
170
+ phone = torch.LongTensor(phone)
171
+ tone = torch.LongTensor(tone)
172
+ language = torch.LongTensor(language)
173
+ return bert, ja_bert, en_bert, phone, tone, language
174
+
175
+ def get_sid(self, sid):
176
+ sid = torch.LongTensor([int(sid)])
177
+ return sid
178
+
179
+ def __getitem__(self, index):
180
+ return self.get_audio_text_speaker_pair(self.audiopaths_sid_text[index])
181
+
182
+ def __len__(self):
183
+ return len(self.audiopaths_sid_text)
184
+
185
+
186
+ class TextAudioSpeakerCollate:
187
+ """Zero-pads model inputs and targets"""
188
+
189
+ def __init__(self, return_ids=False):
190
+ self.return_ids = return_ids
191
+
192
+ def __call__(self, batch):
193
+ """Collate's training batch from normalized text, audio and speaker identities
194
+ PARAMS
195
+ ------
196
+ batch: [text_normalized, spec_normalized, wav_normalized, sid]
197
+ """
198
+ # Right zero-pad all one-hot text sequences to max input length
199
+ _, ids_sorted_decreasing = torch.sort(
200
+ torch.LongTensor([x[1].size(1) for x in batch]), dim=0, descending=True
201
+ )
202
+
203
+ max_text_len = max([len(x[0]) for x in batch])
204
+ max_spec_len = max([x[1].size(1) for x in batch])
205
+ max_wav_len = max([x[2].size(1) for x in batch])
206
+
207
+ text_lengths = torch.LongTensor(len(batch))
208
+ spec_lengths = torch.LongTensor(len(batch))
209
+ wav_lengths = torch.LongTensor(len(batch))
210
+ sid = torch.LongTensor(len(batch))
211
+
212
+ text_padded = torch.LongTensor(len(batch), max_text_len)
213
+ tone_padded = torch.LongTensor(len(batch), max_text_len)
214
+ language_padded = torch.LongTensor(len(batch), max_text_len)
215
+ bert_padded = torch.FloatTensor(len(batch), 1024, max_text_len)
216
+ ja_bert_padded = torch.FloatTensor(len(batch), 1024, max_text_len)
217
+ en_bert_padded = torch.FloatTensor(len(batch), 1024, max_text_len)
218
+
219
+ spec_padded = torch.FloatTensor(len(batch), batch[0][1].size(0), max_spec_len)
220
+ wav_padded = torch.FloatTensor(len(batch), 1, max_wav_len)
221
+ text_padded.zero_()
222
+ tone_padded.zero_()
223
+ language_padded.zero_()
224
+ spec_padded.zero_()
225
+ wav_padded.zero_()
226
+ bert_padded.zero_()
227
+ ja_bert_padded.zero_()
228
+ en_bert_padded.zero_()
229
+
230
+ for i in range(len(ids_sorted_decreasing)):
231
+ row = batch[ids_sorted_decreasing[i]]
232
+
233
+ text = row[0]
234
+ text_padded[i, : text.size(0)] = text
235
+ text_lengths[i] = text.size(0)
236
+
237
+ spec = row[1]
238
+ spec_padded[i, :, : spec.size(1)] = spec
239
+ spec_lengths[i] = spec.size(1)
240
+
241
+ wav = row[2]
242
+ wav_padded[i, :, : wav.size(1)] = wav
243
+ wav_lengths[i] = wav.size(1)
244
+
245
+ sid[i] = row[3]
246
+
247
+ tone = row[4]
248
+ tone_padded[i, : tone.size(0)] = tone
249
+
250
+ language = row[5]
251
+ language_padded[i, : language.size(0)] = language
252
+
253
+ bert = row[6]
254
+ bert_padded[i, :, : bert.size(1)] = bert
255
+
256
+ ja_bert = row[7]
257
+ ja_bert_padded[i, :, : ja_bert.size(1)] = ja_bert
258
+
259
+ en_bert = row[8]
260
+ en_bert_padded[i, :, : en_bert.size(1)] = en_bert
261
+
262
+ return (
263
+ text_padded,
264
+ text_lengths,
265
+ spec_padded,
266
+ spec_lengths,
267
+ wav_padded,
268
+ wav_lengths,
269
+ sid,
270
+ tone_padded,
271
+ language_padded,
272
+ bert_padded,
273
+ ja_bert_padded,
274
+ en_bert_padded,
275
+ )
276
+
277
+
278
+ class DistributedBucketSampler(torch.utils.data.distributed.DistributedSampler):
279
+ """
280
+ Maintain similar input lengths in a batch.
281
+ Length groups are specified by boundaries.
282
+ Ex) boundaries = [b1, b2, b3] -> any batch is included either {x | b1 < length(x) <=b2} or {x | b2 < length(x) <= b3}.
283
+
284
+ It removes samples which are not included in the boundaries.
285
+ Ex) boundaries = [b1, b2, b3] -> any x s.t. length(x) <= b1 or length(x) > b3 are discarded.
286
+ """
287
+
288
+ def __init__(
289
+ self,
290
+ dataset,
291
+ batch_size,
292
+ boundaries,
293
+ num_replicas=None,
294
+ rank=None,
295
+ shuffle=True,
296
+ ):
297
+ super().__init__(dataset, num_replicas=num_replicas, rank=rank, shuffle=shuffle)
298
+ self.lengths = dataset.lengths
299
+ self.batch_size = batch_size
300
+ self.boundaries = boundaries
301
+
302
+ self.buckets, self.num_samples_per_bucket = self._create_buckets()
303
+ self.total_size = sum(self.num_samples_per_bucket)
304
+ self.num_samples = self.total_size // self.num_replicas
305
+
306
+ def _create_buckets(self):
307
+ buckets = [[] for _ in range(len(self.boundaries) - 1)]
308
+ for i in range(len(self.lengths)):
309
+ length = self.lengths[i]
310
+ idx_bucket = self._bisect(length)
311
+ if idx_bucket != -1:
312
+ buckets[idx_bucket].append(i)
313
+
314
+ try:
315
+ for i in range(len(buckets) - 1, 0, -1):
316
+ if len(buckets[i]) == 0:
317
+ buckets.pop(i)
318
+ self.boundaries.pop(i + 1)
319
+ assert all(len(bucket) > 0 for bucket in buckets)
320
+ # When one bucket is not traversed
321
+ except Exception as e:
322
+ print("Bucket warning ", e)
323
+ for i in range(len(buckets) - 1, -1, -1):
324
+ if len(buckets[i]) == 0:
325
+ buckets.pop(i)
326
+ self.boundaries.pop(i + 1)
327
+
328
+ num_samples_per_bucket = []
329
+ for i in range(len(buckets)):
330
+ len_bucket = len(buckets[i])
331
+ total_batch_size = self.num_replicas * self.batch_size
332
+ rem = (
333
+ total_batch_size - (len_bucket % total_batch_size)
334
+ ) % total_batch_size
335
+ num_samples_per_bucket.append(len_bucket + rem)
336
+ return buckets, num_samples_per_bucket
337
+
338
+ def __iter__(self):
339
+ # deterministically shuffle based on epoch
340
+ g = torch.Generator()
341
+ g.manual_seed(self.epoch)
342
+
343
+ indices = []
344
+ if self.shuffle:
345
+ for bucket in self.buckets:
346
+ indices.append(torch.randperm(len(bucket), generator=g).tolist())
347
+ else:
348
+ for bucket in self.buckets:
349
+ indices.append(list(range(len(bucket))))
350
+
351
+ batches = []
352
+ for i in range(len(self.buckets)):
353
+ bucket = self.buckets[i]
354
+ len_bucket = len(bucket)
355
+ if len_bucket == 0:
356
+ continue
357
+ ids_bucket = indices[i]
358
+ num_samples_bucket = self.num_samples_per_bucket[i]
359
+
360
+ # add extra samples to make it evenly divisible
361
+ rem = num_samples_bucket - len_bucket
362
+ ids_bucket = (
363
+ ids_bucket
364
+ + ids_bucket * (rem // len_bucket)
365
+ + ids_bucket[: (rem % len_bucket)]
366
+ )
367
+
368
+ # subsample
369
+ ids_bucket = ids_bucket[self.rank :: self.num_replicas]
370
+
371
+ # batching
372
+ for j in range(len(ids_bucket) // self.batch_size):
373
+ batch = [
374
+ bucket[idx]
375
+ for idx in ids_bucket[
376
+ j * self.batch_size : (j + 1) * self.batch_size
377
+ ]
378
+ ]
379
+ batches.append(batch)
380
+
381
+ if self.shuffle:
382
+ batch_ids = torch.randperm(len(batches), generator=g).tolist()
383
+ batches = [batches[i] for i in batch_ids]
384
+ self.batches = batches
385
+
386
+ assert len(self.batches) * self.batch_size == self.num_samples
387
+ return iter(self.batches)
388
+
389
+ def _bisect(self, x, lo=0, hi=None):
390
+ if hi is None:
391
+ hi = len(self.boundaries) - 1
392
+
393
+ if hi > lo:
394
+ mid = (hi + lo) // 2
395
+ if self.boundaries[mid] < x and x <= self.boundaries[mid + 1]:
396
+ return mid
397
+ elif x <= self.boundaries[mid]:
398
+ return self._bisect(x, lo, mid)
399
+ else:
400
+ return self._bisect(x, mid + 1, hi)
401
+ else:
402
+ return -1
403
+
404
+ def __len__(self):
405
+ return self.num_samples // self.batch_size
BanG-Dream/default_config.yml ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 全局配置
2
+ # 对于希望在同一时间使用多个配置文件的情况,例如两个GPU同时跑两个训练集:通过环境变量指定配置文件,不指定则默认为./config.yml
3
+
4
+ # 拟提供通用路径配置,统一存放数据,避免数据放得很乱
5
+ # 每个数据集与其对应的模型存放至统一路径下,后续所有的路径配置均为相对于datasetPath的路径
6
+ # 不填或者填空则路径为相对于项目根目录的路径
7
+ dataset_path: "Data/"
8
+
9
+ # 模型镜像源,默认huggingface,使用openi镜像源需指定openi_token
10
+ mirror: ""
11
+ openi_token: "" # openi token
12
+
13
+ # resample 音频重采样配置
14
+ # 注意, “:” 后需要加空格
15
+ resample:
16
+ # 目标重采样率
17
+ sampling_rate: 44100
18
+ # 音频文件输入路径,重采样会将该路径下所有.wav音频文件重采样
19
+ # 请填入相对于datasetPath的相对路径
20
+ in_dir: "audios/raw" # 相对于根目录的路径为 /datasetPath/in_dir
21
+ # 音频文件重采样后输出路径
22
+ out_dir: "audios/wavs"
23
+
24
+
25
+ # preprocess_text 数据集预处理相关配置
26
+ # 注意, “:” 后需要加空格
27
+ preprocess_text:
28
+ # 原始文本文件路径,文本格式应为{wav_path}|{speaker_name}|{language}|{text}。
29
+ transcription_path: "filelists/你的数据集文本.list"
30
+ # 数据清洗后文本路径,可以不填。不填则将在原始文本目录生成
31
+ cleaned_path: ""
32
+ # 训练集路径
33
+ train_path: "filelists/train.list"
34
+ # 验证集路径
35
+ val_path: "filelists/val.list"
36
+ # 配置文件路径
37
+ config_path: "config.json"
38
+ # 每个语言的验证集条数
39
+ val_per_lang: 4
40
+ # 验证集最大条数,多于的会被截断并放到训练集中
41
+ max_val_total: 12
42
+ # 是否进行数据清洗
43
+ clean: true
44
+
45
+
46
+ # bert_gen 相关配置
47
+ # 注意, “:” 后需要加空格
48
+ bert_gen:
49
+ # 训练数据集配置文件路径
50
+ config_path: "config.json"
51
+ # 并行数
52
+ num_processes: 4
53
+ # 使用设备:可选项 "cuda" 显卡推理,"cpu" cpu推理
54
+ # 该选项同时决定了get_bert_feature的默认设备
55
+ device: "cuda"
56
+ # 使用多卡推理
57
+ use_multi_device: false
58
+
59
+ # emo_gen 相关配置
60
+ # 注意, “:” 后需要加空格
61
+ emo_gen:
62
+ # 训练数据集配置文件路径
63
+ config_path: "config.json"
64
+ # 并行数
65
+ num_processes: 4
66
+ # 使用设备:可选项 "cuda" 显卡推理,"cpu" cpu推理
67
+ device: "cuda"
68
+ # 使用多卡推理
69
+ use_multi_device: false
70
+
71
+ # train 训练配置
72
+ # 注意, “:” 后需要加空格
73
+ train_ms:
74
+ env:
75
+ MASTER_ADDR: "localhost"
76
+ MASTER_PORT: 10086
77
+ WORLD_SIZE: 1
78
+ LOCAL_RANK: 0
79
+ RANK: 0
80
+ # 可以填写任意名的环境变量
81
+ # THE_ENV_VAR_YOU_NEED_TO_USE: "1234567"
82
+ # 底模设置
83
+ base:
84
+ use_base_model: false
85
+ repo_id: "Stardust_minus/Bert-VITS2"
86
+ model_image: "Bert-VITS2_2.3底模" # openi网页的模型名
87
+ # 训练模型存储目录:与旧版本的区别,原先数据集是存放在logs/model_name下的,现在改为统一存放在Data/你的数据集/models下
88
+ model: "models"
89
+ # 配置文件路径
90
+ config_path: "config.json"
91
+ # 训练使用的worker,不建议超过CPU核心数
92
+ num_workers: 16
93
+ # 关闭此项可以节约接近50%的磁盘空间,但是可能导致实际训练速度变慢和更高的CPU使用率。
94
+ spec_cache: True
95
+ # 保存的检查点数量,多于此数目的权重会被删除来节省空间。
96
+ keep_ckpts: 8
97
+
98
+
99
+ # webui webui配置
100
+ # 注意, “:” 后需要加空格
101
+ webui:
102
+ # 推理设备
103
+ device: "cuda"
104
+ # 模型路径
105
+ model: "models/G_8000.pth"
106
+ # 配置文件路径
107
+ config_path: "config.json"
108
+ # 端口号
109
+ port: 7860
110
+ # 是否公开部署,对外网开放
111
+ share: false
112
+ # 是否开启debug模式
113
+ debug: false
114
+ # 语种识别库,可选langid, fastlid
115
+ language_identification_library: "langid"
116
+
117
+
118
+ # server-fastapi配置
119
+ # 注意, “:” 后需要加空格
120
+ # 注意,本配置下的所有配置均为相对于根目录的路径
121
+ server:
122
+ # 端口号
123
+ port: 5000
124
+ # 模型默认使用设备:但是当前并没有实现这个配置。
125
+ device: "cuda"
126
+ # 需要加载的所有模型的配置,可以填多个模型,也可以不填模型,等网页成功后手动加载模型
127
+ # 不加载模型的配置格式:删除默认给的两个模型配置,给models赋值 [ ],也就是空列表。参考模型2的speakers 即 models: [ ]
128
+ # 注意,所有模型都必须正确配置model与config的路径,空路径会导致加载错误。
129
+ # 也可以不填模型,等网页加载成功后手动填写models。
130
+ models:
131
+ - # 模型的路径
132
+ model: ""
133
+ # 模型config.json的路径
134
+ config: ""
135
+ # 模型使用设备,若填写则会覆盖默认配置
136
+ device: "cuda"
137
+ # 模型默认使用的语言
138
+ language: "ZH"
139
+ # 模型人物默认参数
140
+ # 不必填写所有人物,不填的使用默认值
141
+ # 暂时不用填写,当前尚未实现按人区分配置
142
+ speakers:
143
+ - speaker: "科比"
144
+ sdp_ratio: 0.2
145
+ noise_scale: 0.6
146
+ noise_scale_w: 0.8
147
+ length_scale: 1
148
+ - speaker: "五条悟"
149
+ sdp_ratio: 0.3
150
+ noise_scale: 0.7
151
+ noise_scale_w: 0.8
152
+ length_scale: 0.5
153
+ - speaker: "安倍晋三"
154
+ sdp_ratio: 0.2
155
+ noise_scale: 0.6
156
+ noise_scale_w: 0.8
157
+ length_scale: 1.2
158
+ - # 模型的路径
159
+ model: ""
160
+ # 模型config.json的路径
161
+ config: ""
162
+ # 模型使用设备,若填写则会覆盖默认配置
163
+ device: "cpu"
164
+ # 模型默认使用的语言
165
+ language: "JP"
166
+ # 模型人物默认参数
167
+ # 不必填写所有人物,不填的使用默认值
168
+ speakers: [ ] # 也可以不填
169
+
170
+ # 百度翻译开放平台 api配置
171
+ # api接入文档 https://api.fanyi.baidu.com/doc/21
172
+ # 请不要在github等网站公开分享你的app id 与 key
173
+ translate:
174
+ # 你的APPID
175
+ "app_key": ""
176
+ # 你的密钥
177
+ "secret_key": ""
BanG-Dream/emo_gen.py ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ from torch.utils.data import Dataset
4
+ from torch.utils.data import DataLoader
5
+ from transformers import Wav2Vec2Processor
6
+ from transformers.models.wav2vec2.modeling_wav2vec2 import (
7
+ Wav2Vec2Model,
8
+ Wav2Vec2PreTrainedModel,
9
+ )
10
+ import librosa
11
+ import numpy as np
12
+ import argparse
13
+ from config import config
14
+ import utils
15
+ import os
16
+ from tqdm import tqdm
17
+
18
+
19
+ class RegressionHead(nn.Module):
20
+ r"""Classification head."""
21
+
22
+ def __init__(self, config):
23
+ super().__init__()
24
+
25
+ self.dense = nn.Linear(config.hidden_size, config.hidden_size)
26
+ self.dropout = nn.Dropout(config.final_dropout)
27
+ self.out_proj = nn.Linear(config.hidden_size, config.num_labels)
28
+
29
+ def forward(self, features, **kwargs):
30
+ x = features
31
+ x = self.dropout(x)
32
+ x = self.dense(x)
33
+ x = torch.tanh(x)
34
+ x = self.dropout(x)
35
+ x = self.out_proj(x)
36
+
37
+ return x
38
+
39
+
40
+ class EmotionModel(Wav2Vec2PreTrainedModel):
41
+ r"""Speech emotion classifier."""
42
+
43
+ def __init__(self, config):
44
+ super().__init__(config)
45
+
46
+ self.config = config
47
+ self.wav2vec2 = Wav2Vec2Model(config)
48
+ self.classifier = RegressionHead(config)
49
+ self.init_weights()
50
+
51
+ def forward(
52
+ self,
53
+ input_values,
54
+ ):
55
+ outputs = self.wav2vec2(input_values)
56
+ hidden_states = outputs[0]
57
+ hidden_states = torch.mean(hidden_states, dim=1)
58
+ logits = self.classifier(hidden_states)
59
+
60
+ return hidden_states, logits
61
+
62
+
63
+ class AudioDataset(Dataset):
64
+ def __init__(self, list_of_wav_files, sr, processor):
65
+ self.list_of_wav_files = list_of_wav_files
66
+ self.processor = processor
67
+ self.sr = sr
68
+
69
+ def __len__(self):
70
+ return len(self.list_of_wav_files)
71
+
72
+ def __getitem__(self, idx):
73
+ wav_file = self.list_of_wav_files[idx]
74
+ audio_data, _ = librosa.load(wav_file, sr=self.sr)
75
+ processed_data = self.processor(audio_data, sampling_rate=self.sr)[
76
+ "input_values"
77
+ ][0]
78
+ return torch.from_numpy(processed_data)
79
+
80
+
81
+ model_name = "./emotional/wav2vec2-large-robust-12-ft-emotion-msp-dim"
82
+ processor = Wav2Vec2Processor.from_pretrained(model_name)
83
+ model = EmotionModel.from_pretrained(model_name)
84
+
85
+
86
+ def process_func(
87
+ x: np.ndarray,
88
+ sampling_rate: int,
89
+ model: EmotionModel,
90
+ processor: Wav2Vec2Processor,
91
+ device: str,
92
+ embeddings: bool = False,
93
+ ) -> np.ndarray:
94
+ r"""Predict emotions or extract embeddings from raw audio signal."""
95
+ model = model.to(device)
96
+ y = processor(x, sampling_rate=sampling_rate)
97
+ y = y["input_values"][0]
98
+ y = torch.from_numpy(y).unsqueeze(0).to(device)
99
+
100
+ # run through model
101
+ with torch.no_grad():
102
+ y = model(y)[0 if embeddings else 1]
103
+
104
+ # convert to numpy
105
+ y = y.detach().cpu().numpy()
106
+
107
+ return y
108
+
109
+
110
+ def get_emo(path):
111
+ wav, sr = librosa.load(path, 16000)
112
+ device = config.bert_gen_config.device
113
+ return process_func(
114
+ np.expand_dims(wav, 0).astype(np.float),
115
+ sr,
116
+ model,
117
+ processor,
118
+ device,
119
+ embeddings=True,
120
+ ).squeeze(0)
121
+
122
+
123
+ if __name__ == "__main__":
124
+ parser = argparse.ArgumentParser()
125
+ parser.add_argument(
126
+ "-c", "--config", type=str, default=config.bert_gen_config.config_path
127
+ )
128
+ parser.add_argument(
129
+ "--num_processes", type=int, default=config.bert_gen_config.num_processes
130
+ )
131
+ args, _ = parser.parse_known_args()
132
+ config_path = args.config
133
+ hps = utils.get_hparams_from_file(config_path)
134
+
135
+ device = config.bert_gen_config.device
136
+
137
+ model_name = "./emotional/wav2vec2-large-robust-12-ft-emotion-msp-dim"
138
+ processor = (
139
+ Wav2Vec2Processor.from_pretrained(model_name)
140
+ if processor is None
141
+ else processor
142
+ )
143
+ model = (
144
+ EmotionModel.from_pretrained(model_name).to(device)
145
+ if model is None
146
+ else model.to(device)
147
+ )
148
+
149
+ lines = []
150
+ with open(hps.data.training_files, encoding="utf-8") as f:
151
+ lines.extend(f.readlines())
152
+
153
+ with open(hps.data.validation_files, encoding="utf-8") as f:
154
+ lines.extend(f.readlines())
155
+
156
+ wavnames = [line.split("|")[0] for line in lines]
157
+ dataset = AudioDataset(wavnames, 16000, processor)
158
+ data_loader = DataLoader(dataset, batch_size=1, shuffle=False, num_workers=16)
159
+
160
+ with torch.no_grad():
161
+ for i, data in tqdm(enumerate(data_loader), total=len(data_loader)):
162
+ wavname = wavnames[i]
163
+ emo_path = wavname.replace(".wav", ".emo.npy")
164
+ if os.path.exists(emo_path):
165
+ continue
166
+ emb = model(data.to(device))[0].detach().cpu().numpy()
167
+ np.save(emo_path, emb)
168
+
169
+ print("Emo vec 生成完毕!")
BanG-Dream/empty_emo.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:07063411ab7d6e7aacfc73c582616c3fbc8fdf518b20d42d8be77bc9caf6fab9
3
+ size 3238
BanG-Dream/export_onnx.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from onnx_modules import export_onnx
2
+ import os
3
+
4
+ if __name__ == "__main__":
5
+ export_path = "BangDreamApi"
6
+ model_path = "Data/V23/models/G_621000.pth"
7
+ config_path = "Data/V23/configs/config.json"
8
+ novq = False
9
+ dev = False
10
+ if not os.path.exists("onnx"):
11
+ os.makedirs("onnx")
12
+ if not os.path.exists(f"onnx/{export_path}"):
13
+ os.makedirs(f"onnx/{export_path}")
14
+ export_onnx(export_path, model_path, config_path, novq, dev)
BanG-Dream/filelists/Mygo.list ADDED
The diff for this file is too large to render. See raw diff
 
BanG-Dream/filelists/Mygo.list.cleaned ADDED
The diff for this file is too large to render. See raw diff
 
BanG-Dream/filelists/Scenarioband4-046.asset ADDED
@@ -0,0 +1 @@
 
 
1
+ {"Base":{"m_GameObject":{"m_FileID":0,"m_PathID":"0000000000000000"},"m_Enabled":1,"m_Script":{"m_FileID":0,"m_PathID":"6adbc306fd0be204"},"m_Name":"Scenarioband4-046","scenarioSceneId":"band4-046","storyType":0,"appearCharacters":[{"characterId":18,"costumeType":"018_casual_winter"},{"characterId":19,"costumeType":"019_live_event_46_sr"},{"characterId":20,"costumeType":"020_live_event_46_sr"},{"characterId":16,"costumeType":"016_live_event_46_ssr"},{"characterId":17,"costumeType":"017_live_event_46_sr"},{"characterId":18,"costumeType":"018_live_event_46_ssr"},{"characterId":218,"costumeType":"218_story_01"}],"firstLayout":[],"firstBgm":"00_Muon","firstBackground":"bg00016","firstBackgroundBundleName":"bg/scenario1","snippets":[{"actionType":6,"progressType":0,"referenceIndex":0,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":1,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":0,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":0,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":1,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":1,"delay":2.0999999046325684,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":2,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":2,"delay":5.800000190734863,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":2,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":3,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":3,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":4,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":5,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":3,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":4,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":6,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":7,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":8,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":0,"referenceIndex":9,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":10,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":4,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":5,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":5,"delay":4.800000190734863,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":6,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":7,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":6,"delay":2.5,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":7,"delay":6.900000095367432,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":8,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":8,"delay":2.9000000953674316,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":11,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":9,"delay":0,"isWaitForSkipMode":0},{"actionType":0,"progressType":1,"referenceIndex":0,"delay":2,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":12,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":0,"referenceIndex":13,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":14,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":15,"delay":0,"isWaitForSkipMode":0},{"actionType":7,"progressType":1,"referenceIndex":0,"delay":0,"isWaitForSkipMode":0},{"actionType":0,"progressType":1,"referenceIndex":0,"delay":1.2000000476837158,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":10,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":9,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":11,"delay":3.700000047683716,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":12,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":10,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":13,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":11,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":12,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":14,"delay":3,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":15,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":13,"delay":0,"isWaitForSkipMode":0},{"actionType":7,"progressType":1,"referenceIndex":1,"delay":0,"isWaitForSkipMode":0},{"actionType":0,"progressType":1,"referenceIndex":0,"delay":1.2000000476837158,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":16,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":14,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":17,"delay":2.299999952316284,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":15,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":18,"delay":0,"isWaitForSkipMode":0},{"actionType":7,"progressType":1,"referenceIndex":2,"delay":0,"isWaitForSkipMode":0},{"actionType":0,"progressType":1,"referenceIndex":0,"delay":1.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":19,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":16,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":20,"delay":0,"isWaitForSkipMode":0},{"actionType":7,"progressType":1,"referenceIndex":3,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":17,"delay":0.5,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":18,"delay":0.5,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":19,"delay":0.5,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":20,"delay":0.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":21,"delay":0.5,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":21,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":22,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":22,"delay":0.5,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":23,"delay":0.5,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":24,"delay":0.5,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":25,"delay":0.5,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":26,"delay":0.5,"isWaitForSkipMode":0},{"actionType":7,"progressType":1,"referenceIndex":4,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":23,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":27,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":24,"delay":3.5999999046325684,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":28,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":25,"delay":2.299999952316284,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":16,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":26,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":17,"delay":0,"isWaitForSkipMode":0},{"actionType":7,"progressType":1,"referenceIndex":5,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":18,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":19,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":29,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":30,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":31,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":20,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":21,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":22,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":32,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":33,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":34,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":27,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":28,"delay":0,"isWaitForSkipMode":0},{"actionType":0,"progressType":1,"referenceIndex":0,"delay":2,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":29,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":30,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":31,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":32,"delay":0,"isWaitForSkipMode":0},{"actionType":0,"progressType":1,"referenceIndex":0,"delay":2,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":33,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":34,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":35,"delay":0,"isWaitForSkipMode":0},{"actionType":0,"progressType":1,"referenceIndex":0,"delay":2,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":23,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":36,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":24,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":25,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":26,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":37,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":35,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":27,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":38,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":28,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":29,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":30,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":39,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":36,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":37,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":31,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":40,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":32,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":33,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":34,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":41,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":38,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":39,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":40,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":41,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":42,"delay":3,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":42,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":43,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":44,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":45,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":46,"delay":0,"isWaitForSkipMode":0}],"talkData":[{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"…………","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"sad01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-001","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(なんで私はあれほどまで、\n感情的になってしまったのかしら……)","tention":0,"lipSyncMode":2,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nnf03","expressionName":"sad01","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-002","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(あの取材があってから、\n酷くナーバスになっているのは自覚があったわ……\nそれにしても――)","tention":0,"lipSyncMode":2,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"sad01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-003","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"その子達がパスパレの曲を歌うなんて、嫌です!\nその話、私は許可できません!!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-004","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"私達パスパレは――\nこの子達の噛ませ犬じゃない!!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-005","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"普段なら、もっと冷静でいられたはずなのに……\n私はなんで――","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"sad01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-006","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(わからない……)","tention":0,"lipSyncMode":2,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nnf01","expressionName":"sad01","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-007","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(わからないからこそ……\nあのときの自分の気持ちを、理解したい……\n理解しないといけない)","tention":0,"lipSyncMode":2,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nnf03","expressionName":"sad01","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-008","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"はぁ……\nただ今は、ライブに向けての練習をしないといけないわね","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"sad01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-009","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"お疲れさまです。\nちょっとスタジオで練習したいのですが、\nお借りしても平気ですか?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-010","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":0}],"windowDisplayName":"スタッフ","body":"あ、千聖さん……お疲れさまです。\nえっと、スタジオは……\n……今、確認してきますっ。こちらでお待ち下さいっ","tention":0,"lipSyncMode":0,"motionChangeFactor":1,"motions":[],"voices":[],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"ありがとうございます……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"smile02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-011","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(あの様子だとスタッフさん達の間に、\nあの話は広まってしまっているようね……)","tention":0,"lipSyncMode":2,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"serious01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-012","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":0}],"windowDisplayName":"スタッフ","body":"あ、そういえば千聖さんにファンレターが届いていたので、\n事務所のテーブルに置いておきました!\nそれじゃあ、確認してきますねっ","tention":0,"lipSyncMode":0,"motionChangeFactor":1,"motions":[],"voices":[],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"周りに気を使わせるくらいなら、\n自分でスタジオを借りればよかったわ……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nnf01","expressionName":"serious01","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-013","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"……ん?\nファンレターって、これのことかしら?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-014","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"これは……っ!?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"serious01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-015","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"千聖ちゃんへ\nこの前は私のために時間を作ってくれてありがとうね。\n約10年ぶりの再会、本当に嬉しかったです!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-016","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"実は前から、何度もテレビ局に取材を\n申し込まれていましたが、そのたびに断っていました","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-017","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"『懐かしのあの人』みたいな番組に出るのって、\nやっぱりすごく恥ずかしくてね……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-018","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"けど、今回は千聖ちゃんと会わせてもらうことを条件に\n取材を受けさせてもらいました","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-019","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"え……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-020","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"妹のようにかわいがっていた千聖ちゃんに、\n今の私を見てほしくって。\nそして、直接お礼が言いたくて","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-021","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"千聖ちゃんがPastel*Palettesという\n夢を見つけたように私も新たな夢を見つけて、\nその夢に向かってまっすぐに進んでいます","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-022","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"子供のころ、私のあとばかりついてきた千聖ちゃんが、\n今はPastel*Palettesという仲間と一緒に、\n夢に向かって進んでいる姿に、いつも励まされてます!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-023","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"本当にありがとうね!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-024","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"これからも千聖ちゃんのこと、\nPastel*Palettesのこと、\nずっとずっと応援してます!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-025","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"…………うう","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nnf01","expressionName":"cry01","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-026","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"……うう……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nnf01","expressionName":"cry01","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-027","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(パスパレが私の、夢……)","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-028","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(今まで、目の前にある目標にばかり目を向けていた私が、\n初めて見た遠くの景色――)","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-029","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(それが――\nずっとパスパレであり続ける、私……)","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-030","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"いつの間にか私、夢を見ていたのね……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-031","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(私が必死に守ろうとしていたもの……\nそれはパスパレだけじゃなかったんだわ……)","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-032","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(本当に守ろうとしていたものは、きっと……\n生まれたての私の、夢……)","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":18,"voiceId":"event135-11-033","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"……!!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-034","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":218}],"windowDisplayName":"みお","body":"私は、アイドルだけでなく、演技にも挑戦したいです。\n小さい頃からそういうのに憧れてましたから","tention":0,"lipSyncMode":0,"motionChangeFactor":1,"motions":[{"characterId":218,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":218}],"windowDisplayName":"みお","body":"千聖さんは私の憧れなんで。\nいつか、絶対に共演してみたいです","tention":0,"lipSyncMode":0,"motionChangeFactor":1,"motions":[{"characterId":218,"motionName":"smile02","expressionName":"default","timingSyncValue":0}],"voices":[],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(もしかしたら私は、自分の夢を守りたいがあまり……)","tention":0,"lipSyncMode":2,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nnf01","expressionName":"serious01","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-035","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(あの子達の夢を壊そうと\nしてしまっていたのかもしれない……)","tention":0,"lipSyncMode":2,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"sad01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-036","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"酷いことしたわね……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nnf04","expressionName":"sad01","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-037","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"しっかりと夢を持っている人は、\nもっと堂々としているものよね――","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nnf03","expressionName":"serious01","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-038","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"……そう。\n『彼女』のように――","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"nod01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-039","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"……ん? 封筒の裏に住所が……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-040","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"(あの時、聞くことができなかった『彼女』の連絡先……)","tention":0,"lipSyncMode":2,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"sad01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-041","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"…………っ","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-042","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":18}],"windowDisplayName":"千聖","body":"す、すみません!\nスタッフの方いらっしゃいますかっ?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":18,"motionName":"serious01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":18,"voiceId":"event135-11-043","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0}],"selectableData":[],"layoutData":[{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"nnf04","expressionName":"sad01","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"nnf03","expressionName":"sad01","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"sad01","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"nnf04","expressionName":"sad01","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"nnf04","expressionName":"sad01","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"serious01","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"serious01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"idle01","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"nf03","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"sad01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"smile03","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"nnf04","expressionName":"cry01","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"cry01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":19,"costumeType":"019_live_event_46_sr","motionName":"smile02","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":20,"costumeType":"020_live_event_46_sr","motionName":"smile01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":19,"costumeType":"","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":20,"costumeType":"","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":16,"costumeType":"016_live_event_46_ssr","motionName":"smile04","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":17,"costumeType":"017_live_event_46_sr","motionName":"smile01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":16,"costumeType":"","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":17,"costumeType":"","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_live_event_46_ssr","motionName":"smile02","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":218,"costumeType":"218_story_01","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":218,"costumeType":"218_story_01","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"018_casual_winter","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":18,"costumeType":"","motionName":"nnf03","expressionName":"smile03","moveSpeedType":0}],"specialEffectData":[{"effectType":14,"stringVal":"","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":8,"stringVal":"駅前","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":4,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""},{"effectType":9,"stringVal":"","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":11,"stringVal":"characters/resourceset/res018041","stringValSub":"card_normal","duration":0,"animationTriggerName":""},{"effectType":3,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""},{"effectType":4,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""},{"effectType":10,"stringVal":"","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":7,"stringVal":"bg/scenario1","stringValSub":"bg00016","duration":0,"animationTriggerName":""},{"effectType":14,"stringVal":"","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":3,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""},{"effectType":2,"stringVal":"","stringValSub":"","duration":1.7999999523162842,"animationTriggerName":""},{"effectType":7,"stringVal":"bg/scenario5","stringValSub":"bg00055","duration":0,"animationTriggerName":""},{"effectType":12,"stringVal":"","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":1,"stringVal":"","stringValSub":"","duration":1.2999999523162842,"animationTriggerName":""},{"effectType":8,"stringVal":"アイドル事務所","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":4,"stringVal":"","stringValSub":"","duration":1.7999999523162842,"animationTriggerName":""},{"effectType":7,"stringVal":"bg/scenario26","stringValSub":"bg00263","duration":0,"animationTriggerName":""},{"effectType":9,"stringVal":"","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":3,"stringVal":"","stringValSub":"","duration":1.2000000476837158,"animationTriggerName":""},{"effectType":4,"stringVal":"","stringValSub":"","duration":0.800000011920929,"animationTriggerName":""},{"effectType":7,"stringVal":"bg/scenario42","stringValSub":"bg00425","duration":0,"animationTriggerName":""},{"effectType":3,"stringVal":"","stringValSub":"","duration":0.800000011920929,"animationTriggerName":""},{"effectType":4,"stringVal":"","stringValSub":"","duration":2.5,"animationTriggerName":""},{"effectType":10,"stringVal":"","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":7,"stringVal":"bg/scenario5","stringValSub":"bg00055","duration":0,"animationTriggerName":""},{"effectType":3,"stringVal":"","stringValSub":"","duration":1.5,"animationTriggerName":""},{"effectType":4,"stringVal":"","stringValSub":"","duration":2.5,"animationTriggerName":""},{"effectType":7,"stringVal":"bg/scenario5","stringValSub":"bg00056","duration":0,"animationTriggerName":""},{"effectType":9,"stringVal":"","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":3,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""},{"effectType":4,"stringVal":"","stringValSub":"","duration":2.5,"animationTriggerName":""},{"effectType":7,"stringVal":"bg/scenario5","stringValSub":"bg00055","duration":0,"animationTriggerName":""},{"effectType":10,"stringVal":"","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":3,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""}],"soundData":[{"playMode":0,"bgm":"","se":"SE_DOOR_C_OPEN","volume":1,"seBundleName":"","duration":0},{"playMode":0,"bgm":"","se":"SE_DOOR_C_CLOSE","volume":1,"seBundleName":"","duration":0},{"playMode":0,"bgm":"","se":"SE_OPEN_LETTER","volume":1,"seBundleName":"event66","duration":0},{"playMode":0,"bgm":"38_GoodNight","se":"","volume":1,"seBundleName":"","duration":2},{"playMode":0,"bgm":"00_Muon","se":"","volume":1,"seBundleName":"","duration":2},{"playMode":0,"bgm":"pastel_18_scenario","se":"","volume":1,"seBundleName":"","duration":0}],"needBundleNames":["characters/resourceset/res018041"],"includeSoundDataBundleNames":[]}}
BanG-Dream/filelists/Scenarioband6-018.asset ADDED
@@ -0,0 +1 @@
 
 
1
+ {"Base":{"m_GameObject":{"m_FileID":0,"m_PathID":"0000000000000000"},"m_Enabled":1,"m_Script":{"m_FileID":0,"m_PathID":"6adbc306fd0be204"},"m_Name":"Scenarioband6-018","scenarioSceneId":"band6-018","storyType":0,"appearCharacters":[{"characterId":27,"costumeType":"027_casual"},{"characterId":26,"costumeType":"026_casual"},{"characterId":29,"costumeType":"029_casual"},{"characterId":30,"costumeType":"030_casual"},{"characterId":28,"costumeType":"028_casual"}],"firstLayout":[],"firstBgm":"03_Normal","firstBackground":"bg00478","firstBackgroundBundleName":"bg/scenario47","snippets":[{"actionType":6,"progressType":1,"referenceIndex":0,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":0,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":0,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":1,"delay":2,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":2,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":3,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":4,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":1,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":2,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":5,"delay":2.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":6,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":7,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":3,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":8,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":9,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":4,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":5,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":6,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":10,"delay":3,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":11,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":12,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":7,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":13,"delay":2.200000047683716,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":14,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":15,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":8,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":9,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":16,"delay":4,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":10,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":17,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":18,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":11,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":19,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":20,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":12,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":21,"delay":2.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":22,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":23,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":13,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":24,"delay":4,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":14,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":25,"delay":3,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":15,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":26,"delay":3,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":16,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":27,"delay":2,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":17,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":28,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":29,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":18,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":19,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":20,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":30,"delay":3,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":21,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":31,"delay":3.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":32,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":33,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":22,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":1,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":34,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":35,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":2,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":3,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":23,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":24,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":25,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":26,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":27,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":28,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":29,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":30,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":31,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":4,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":5,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":36,"delay":0,"isWaitForSkipMode":0},{"actionType":6,"progressType":1,"referenceIndex":6,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":32,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":37,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":38,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":33,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":39,"delay":3,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":34,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":40,"delay":1.5,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":41,"delay":5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":42,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":43,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":35,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":44,"delay":2.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":45,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":46,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":36,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":47,"delay":2,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":48,"delay":4,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":37,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":38,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":39,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":49,"delay":2.5999999046325684,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":50,"delay":6,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":51,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":52,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":40,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":53,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":54,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":41,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":55,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":56,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":57,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":42,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":58,"delay":4,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":59,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":60,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":43,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":61,"delay":3.200000047683716,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":44,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":62,"delay":1.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":63,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":64,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":45,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":65,"delay":2,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":66,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":67,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":46,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":47,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":68,"delay":4,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":69,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":1,"referenceIndex":70,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":71,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":48,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":72,"delay":3.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":73,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":74,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":49,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":75,"delay":1.399999976158142,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":50,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":76,"delay":2.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":77,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":78,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":51,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":52,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":79,"delay":2.5999999046325684,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":80,"delay":5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":81,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":82,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":53,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":83,"delay":3,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":84,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":85,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":54,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":86,"delay":2.299999952316284,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":87,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":88,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":55,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":89,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":90,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":56,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":91,"delay":2,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":92,"delay":4,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":57,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":93,"delay":4,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":94,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":95,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":96,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":0,"referenceIndex":97,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":58,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":98,"delay":2,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":59,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":60,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":99,"delay":2.5,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":100,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":101,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":61,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":62,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":102,"delay":2,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":103,"delay":3.5999999046325684,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":104,"delay":6,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":63,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":64,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":105,"delay":1.399999976158142,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":106,"delay":2.799999952316284,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":107,"delay":0,"isWaitForSkipMode":0},{"actionType":2,"progressType":1,"referenceIndex":108,"delay":0,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":65,"delay":0,"isWaitForSkipMode":0},{"actionType":4,"progressType":0,"referenceIndex":109,"delay":2.299999952316284,"isWaitForSkipMode":0},{"actionType":1,"progressType":1,"referenceIndex":66,"delay":0,"isWaitForSkipMode":0}],"talkData":[{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"早!哦,大家都到了!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"smile02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-001","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"啊,小透子,早上好","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-002","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"真是的,迟到了迟到了!迟到20分钟了!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"angry01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-003","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"抱歉抱歉!我的闹钟没电了!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-004","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":30}],"windowDisplayName":"瑠唯","body":"和桐谷同学交往,就要有心理准备她会迟到","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":30,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":30,"voiceId":"band6-18-005","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":30}],"windowDisplayName":"瑠唯","body":"哪怕是学生会有事,她也能迟到1小时","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":30,"motionName":"nf01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":30,"voiceId":"band6-18-006","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"哎、哎呀,我不过是迟到了而已,宇宙这么大,这点小事简直渺小得不值一提吧?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"nf02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-007","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"我们说你也就算了,哪有自己这样说的……!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-008","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"啊哈哈……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf03","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-009","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"话说回来,能找到地方练习真是太好了。\n在这里的话,休息日也能一起练习了","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"smile01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-010","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"是啊,得好好感谢广町同学才行","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"smile01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-011","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"没有没有,这地方你们可以随便用","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"smile01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-012","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"但我还是吓了一跳啊!\n你家里居然有个这么大的画室!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"smile01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-013","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"你爸爸是雕塑家,而妈妈是画家对吧。好厉害呢","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-014","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"啊啊,嗯……\n啊,你们千万不要去我家那边哦!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"nf03","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-015","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"嗯,嗯。不会去的,但这是为什么……?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-016","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"因为我的家人脾气有点古怪……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"nf02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-017","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf03","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-018","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"啊,对了。我有东西要给大家看","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"nf02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-019","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"什么东西?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-020","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"那个,我们去参加演唱会活动的时候,\n其他乐队不是都有准备自己的演出服吗?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"nf02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-021","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"我觉得我们也应该有演出服,\n所以就做了一套~!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"smile02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-022","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":900000}],"windowDisplayName":"真白・筑紫","body":"做、做了一套!?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"surprised01","expressionName":"default","timingSyncValue":0},{"characterId":29,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":900000,"voiceId":"band6-18-023","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"锵锵!我们的演出服怎么样!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":27,"voiceId":"band6-18-024","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"诶!?你居然能做出这么厉害的演出服!?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":29,"voiceId":"band6-18-025","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":30}],"windowDisplayName":"瑠唯","body":"缝制也很精巧。穿起来应该也很舒服","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":30,"voiceId":"band6-18-026","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"简直就像是店里卖的一样……!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":26,"voiceId":"band6-18-027","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"那是当然的啦?\n毕竟是专业的嘛!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":27,"voiceId":"band6-18-028","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"专业?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":26,"voiceId":"band6-18-029","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"啊,我没说过吗?\n我们家可是代代相传的绸缎庄哦,从很久以前就开始经营了","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":27,"voiceId":"band6-18-030","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"因为认识很多服装方面的朋友,\n我还自己凭兴趣搞了个服装品牌","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":27,"voiceId":"band6-18-031","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"我就是在那里做出了我们的演出服!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":27,"voiceId":"band6-18-032","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":1,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"…………","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[],"voices":[{"characterId":26,"voiceId":"band6-18-033","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"小白,你怎么了?\n怎么石化了~!?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-034","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"啊,对、对不起……\n我只是听到高中生居然就已经开创了自己的服装品牌,被吓了一跳……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-035","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"哎呀,到了我这水平,弄个品牌出来自然是不在话下啦~","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"smile02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-036","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"演出服很漂亮,演出服上的小装饰也很漂亮。\n这也是那个品牌做的吗?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"nf02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-037","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"啊,那是广町做的","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-038","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"广町同学?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-039","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"虽然演出服是我设计的,\n但这些小装���是在我找广町聊过之后,她说要做的","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-040","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"嗯,我就是觉得我应该能做……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-041","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":900000}],"windowDisplayName":"真白・筑紫","body":"…………","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"surprised01","expressionName":"default","timingSyncValue":0},{"characterId":29,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":900000,"voiceId":"band6-18-042","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"咦?怎么了,很奇怪吗?\n我是看着小透子的设计图做的……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"eeto01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-043","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":30}],"windowDisplayName":"瑠唯","body":"我们会吃惊,是因为你随随便便就做出了\n不该是高中生能做的东西","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":30,"motionName":"nf02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":30,"voiceId":"band6-18-044","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"诶……?\n查一下制作方法就能做出来的吧~!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-045","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"怎、怎么可能做得出来!\n这就像是店里卖的东西了!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"nf01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-046","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"而且还是那种很贵的店里卖的……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-047","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"是、是这样吗……\n呜呜,要做出普通的东西真难……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-048","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"哎,既然演出服都做好了,那我们一定要在音乐节上成功亮相!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-049","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"说得没错。啊,对了。\n我有事想跟大家商量,可以吗?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-050","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"我在想,要不要再创作一首原创歌曲\n在音乐节上演出?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-051","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"原创?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf03","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-052","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"我们的原创曲不是只有一首吗?\n我想,再多一首的话,应该更能展现我们的个性","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-053","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"离音乐节还有不少时间,再写一首应该是来得及的","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"nf04","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-054","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"挺好的,写吧写吧!\n我还想要更多的原创曲呢!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"smile01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-055","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"不过,就算说要写一首,实际也是由八潮同学来写就是了……","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"nf03","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-056","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":30}],"windowDisplayName":"瑠唯","body":"无所谓。我在音乐方面也有挺长的空窗期,\n要找回作曲的感觉,这是一个很好的机会","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":30,"motionName":"nf01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":30,"voiceId":"band6-18-057","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"那就这么定了!\n歌词的话……还是由小白来写!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-058","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"是呀!你可不要再说没自信了哦~?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-059","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"我不会再说啦……!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-060","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":26}],"windowDisplayName":"真白","body":"既然事情交给了我,就会尽我所能的……!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":26,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":26,"voiceId":"band6-18-061","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"嗯嗯,我们越来越像一支真正的乐队了!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"nf05","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-062","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"由仓田同学作词,八潮同学作曲。\n小透子和广町同学负责演出服。分工明确!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"nf02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-063","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":27}],"windowDisplayName":"透子","body":"唔?怎么感觉二叶没事干的样子?","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":27,"motionName":"nf03","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":27,"voiceId":"band6-18-064","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"我、我吗?我、我这不是在做好一个出色的队长吗!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"surprised01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-065","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":28}],"windowDisplayName":"七深","body":"啊哈哈,居然自己夸自己出色~!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":28,"motionName":"smile02","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":28,"voiceId":"band6-18-066","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0},{"talkCharacters":[{"characterId":29}],"windowDisplayName":"筑紫","body":"别、别取笑我啦~!","tention":0,"lipSyncMode":1,"motionChangeFactor":1,"motions":[{"characterId":29,"motionName":"awate01","expressionName":"default","timingSyncValue":0}],"voices":[{"characterId":29,"voiceId":"band6-18-067","volume":1}],"speed":0,"fontSize":0,"whenFinishCloseWindow":0,"requirePlayEffect":0,"effectReferenceIdx":0,"requirePlaySound":0,"soundReferenceIdx":0,"whenStartHideWindow":0}],"selectableData":[],"layoutData":[{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"smile01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf03","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":30,"costumeType":"030_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"nf03","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":30,"costumeType":"030_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf02","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"","motionName":"nf05","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"nf05","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"","motionName":"smile02","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"surprised01","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"","motionName":"nf03","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"eeto01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"nf03","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"nf05","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"nf02","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"","motionName":"nf01","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"","motionName":"nf05","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"kime01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf05","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf03","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"nf02","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"smile01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":4,"sideFromOffsetX":0,"sideTo":4,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"nf03","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":30,"costumeType":"030_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":30,"costumeType":"","motionName":"nf04","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"nf02","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":30,"costumeType":"030_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf02","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"sad01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"idle01","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"smile02","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf02","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf03","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf02","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"smile01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"kime01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"nf05","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":30,"costumeType":"030_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":30,"costumeType":"","motionName":"nf04","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":30,"costumeType":"","motionName":"nf05","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"smile01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":30,"costumeType":"030_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"","motionName":"nf02","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"","motionName":"smile02","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":26,"costumeType":"026_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"029_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf04","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"nf03","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"smile01","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"awate01","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":29,"costumeType":"","motionName":"kime01","expressionName":"default","moveSpeedType":0},{"type":3,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":27,"costumeType":"027_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":2,"sideFrom":7,"sideFromOffsetX":0,"sideTo":7,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"028_casual","motionName":"","expressionName":"default","moveSpeedType":0},{"type":0,"sideFrom":3,"sideFromOffsetX":0,"sideTo":3,"sideToOffsetX":0,"depthType":0,"characterId":28,"costumeType":"","motionName":"smile01","expressionName":"default","moveSpeedType":0}],"specialEffectData":[{"effectType":8,"stringVal":"广町家 画室","stringValSub":"","duration":0,"animationTriggerName":""},{"effectType":2,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""},{"effectType":11,"stringVal":"characters/resourceset/res027003","stringValSub":"card_normal","duration":0,"animationTriggerName":""},{"effectType":1,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""},{"effectType":2,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""},{"effectType":7,"stringVal":"bg/scenario47","stringValSub":"bg00478","duration":0,"animationTriggerName":""},{"effectType":1,"stringVal":"","stringValSub":"","duration":0.5,"animationTriggerName":""}],"soundData":[],"needBundleNames":["characters/resourceset/res027003"],"includeSoundDataBundleNames":[]}}
BanG-Dream/filelists/esd.list ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ Example:
2
+ {wav_path}|{speaker_name}|{language}|{text}
3
+ 派蒙_1.wav|派蒙|ZH|前面的区域,以后再来探索吧!
BanG-Dream/filelists/sample.list ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ Example:
2
+ {wav_path}|{speaker_name}|{language}|{text}
3
+ 派蒙_1.wav|派蒙|ZH|前面的区域,以后再来探索吧!
BanG-Dream/filelists/train.list ADDED
The diff for this file is too large to render. See raw diff
 
BanG-Dream/filelists/val.list ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ /content/drive/MyDrive/Mygo/event235-15-063.wav|燈|JP|うん……愛音ちゃん……ありがとう|_ u N . . . . . . a i o t o ch a N . . . . . . a r i g a t o _|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|1 2 1 1 1 1 1 1 2 3 3 1 1 1 1 1 1 7 1
2
+ /content/drive/MyDrive/Mygo/event235-29-022.wav|燈|JP|私……祥ちゃんも……みんな,傷つけて……|_ w a t a k u sh i . . . . . . s a ch i ch a N m o . . . . . . m i N n a , k i z u ts u k e t e . . . . . . _|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|1 8 1 1 1 1 1 1 4 3 2 1 1 1 1 1 1 5 1 8 2 1 1 1 1 1 1 1
3
+ /content/drive/MyDrive/Mygo/event235-30-058.wav|燈|JP|無理じゃない!|_ m u r i j a n a i ! _|0 0 0 0 0 0 0 0 0 0 0 0|1 4 2 3 1 1
4
+ /content/drive/MyDrive/Mygo/event235-32-011.wav|燈|JP|僕が手を離してしまった|_ b o k u g a t e o h a n a sh i t e sh i m a q t a _|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|1 4 2 2 1 3 3 2 5 2 1
5
+ /content/drive/MyDrive/Mygo/event235-05-001.wav|そよ|JP|ごきげんよう,睦ちゃん.今日も菜園のお世話してるの?|_ g o k i g e N y o , b o k u ch a N . ky o m o s a i e N n o o s e w a sh i t e r u n o ? _|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|1 2 3 2 2 1 4 3 1 2 2 3 2 2 1 4 2 4 2 1 1
6
+ /content/drive/MyDrive/Mygo/event235-28-016.wav|そよ|JP|心のどこかで,ここは自分がいる場所じゃないような気がして|_ k o k o r o n o d o k o k a d e , k o k o w a j i b u N g a i r u b a sh o j a n a i y o n a k i g a sh i t e _|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|1 6 2 4 2 2 1 4 2 5 2 3 4 2 3 2 2 2 2 2 2 1
7
+ /content/drive/MyDrive/Mygo/event235-39-005.wav|そよ|JP|やりたいって言ったの誰だっけ.ライブ,明日だけど|_ y a r i t a i q t e i q t a n o d a r e d a q k e . r a i b u , a s u d a k e d o _|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|1 4 3 3 2 2 2 4 2 2 1 1 5 1 3 2 4 1
8
+ /content/drive/MyDrive/Mygo/event235-27-053.wav|そよ|JP|……でも,私,本気で|_ . . . . . . d e m o , w a t a k u sh i , h o N k i d e _|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|1 1 1 1 1 1 1 2 2 1 8 1 5 2 1
BanG-Dream/filelists/圣经.txt ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 素世|至少见一面让我当面道歉好吗?
2
+ 素世|我也吓了一跳,没想到事情会演变成那个样子…
3
+ 素世|所以我想好好说明一下
4
+ 素世|我要是知道就会阻止她们的,但是明明编排表都已经结束了突然间开始演奏
5
+ 素世|没能阻止大家真是对不起…
6
+ 素世|小祥,你在生气对吧…
7
+ 素世|我想你生气也是当然的
8
+ 素世|但是请你相信我。春日影,本来没有在我们的演奏预定曲目里的
9
+ 素世|真的很对不起
10
+ 素世|我答应你再也不会随意演奏了
11
+ 素世|我会让她们保证再也不演奏这首曲子
12
+ 素世|能不能稍微谈一谈?
13
+ 素世|我真的把CRYCHIC的一切看得非常重要
14
+ 素世|所以说,擅自演奏春日影的时候我和小祥你一样难过
15
+ 素世|我希望你能明白我的心情
16
+ 素世|拜托了。我哪里都会去的
17
+ 素世|我也会好好跟你说明我不得不组乐队的理由
18
+ 素世|我想如果你能见我一面,你就一定能明白的
19
+ 素世|我是小祥你的同伴
20
+ 素世|我好想见你
21
+ 祥子|真是会虚情假意呢
22
+ 祥子|想演奏是你们的自由,你们就请便吧
23
+ 祥子|到现在都还执着于过去,真难看
24
+ 祥子|你也差不多该忘记了吧
25
+ 祥子|那么现在那个乐队算什么
26
+ 祥子|你讲的话和做的事全都互相矛盾
27
+ 祥子|旧乐队已经毁了
28
+ 祥子|绝对不可能再复活了
29
+ 祥子|我已经亲手将它结束了
30
+ 祥子|没有人那样拜托你
31
+ 祥子|这是最后的警告
32
+ 祥子|今后不要再和我扯上关系了
33
+ 祥子|你是抱着多大的觉悟说出这种话的
34
+ 祥子|你只不过是一个学生,有办法背负其他人的人生吗
35
+ 祥子|“什么都愿意做”就是这么沉重的话
36
+ 祥子|做不来的事就别轻易说出口
37
+ 祥子|你这个人,满脑子都只想到自己呢
BanG-Dream/filelists/逆襲のシャア.epub ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b393bb47a396001405a3024a0693b6d48ee55ac00c413d2dcdca738e2e3d817a
3
+ size 159221
BanG-Dream/filelists/零零年代的想象力.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:74a9501b9f9a7ebf51b9baff735ec380cc6da656d2f7cae6c3a5bbd5553b6a5f
3
+ size 4585730
BanG-Dream/image/41JjBPWdHtL._SX342_SY445_.jpg ADDED
BanG-Dream/image/41JjBPWdHtL.jpg ADDED
BanG-Dream/image/image.png ADDED

Git LFS Details

  • SHA256: 74a869111047120c8184dae3976c615abe4b3c58d84283508490d52b2a80ad6d
  • Pointer size: 131 Bytes
  • Size of remote file: 119 kB
BanG-Dream/image/あこ.png ADDED

Git LFS Details

  • SHA256: d1a19308810248f080038d0031dc690ca4476688b7f85040f1e411ade90a37e1
  • Pointer size: 131 Bytes
  • Size of remote file: 163 kB
BanG-Dream/image/こころ.png ADDED

Git LFS Details

  • SHA256: f2c86f6ca1cdc615f78a60e8c8e91b83a47ed1ffe4590cfb314de509c8ffa924
  • Pointer size: 131 Bytes
  • Size of remote file: 134 kB
BanG-Dream/image/そよ.png ADDED

Git LFS Details

  • SHA256: c624df97177bdf22199ba78df3ca93991a97cfd0097f0fcf694a1a32ede71c7d
  • Pointer size: 131 Bytes
  • Size of remote file: 133 kB
BanG-Dream/image/たえ.png ADDED

Git LFS Details

  • SHA256: 40cc370912940d6d18770a1e66bbe903c10fae05a4327e776b43d3e38bcfe4d9
  • Pointer size: 131 Bytes
  • Size of remote file: 118 kB
BanG-Dream/image/つくし.png ADDED

Git LFS Details

  • SHA256: cf0241009ddd705dccf2e0fc52444c6c2794a6f8cf53a752de7cad71f3051bce
  • Pointer size: 131 Bytes
  • Size of remote file: 111 kB
BanG-Dream/image/つぐみ.png ADDED

Git LFS Details

  • SHA256: f0b43bb4c13cb17f386a1758454c4d0718775f1a7fe89d8a7caef590765c37ac
  • Pointer size: 131 Bytes
  • Size of remote file: 125 kB
BanG-Dream/image/にゃむ.png ADDED

Git LFS Details

  • SHA256: 6810095337e08e512803377879fea65892f570ef46080de500cf58dc36536184
  • Pointer size: 131 Bytes
  • Size of remote file: 243 kB
BanG-Dream/image/はぐみ.png ADDED

Git LFS Details

  • SHA256: a28f9ab9c09cc0e13617483b208c6965a0f180b2eda872fb1ec0d852ee682a6f
  • Pointer size: 131 Bytes
  • Size of remote file: 112 kB
BanG-Dream/image/ひまり.png ADDED

Git LFS Details

  • SHA256: b1a6c85f7af718984c38540766e908fb3ae035b8baee8808af3598d2cbfd1d04
  • Pointer size: 131 Bytes
  • Size of remote file: 113 kB
BanG-Dream/image/ましろ.png ADDED

Git LFS Details

  • SHA256: 2beb0d2613de9f2bf26eced01ac1a44345af685090842ade4aef58394bcdee41
  • Pointer size: 131 Bytes
  • Size of remote file: 107 kB
BanG-Dream/image//343/201/276/343/201/231/343/201/215.png ADDED
BanG-Dream/image/りみ.png ADDED

Git LFS Details

  • SHA256: e22b2eab156ba42274317bada7cdbfdb3d9170265ef8bd69089af4e7fb70a0c9
  • Pointer size: 131 Bytes
  • Size of remote file: 115 kB
BanG-Dream/image/イヴ.png ADDED

Git LFS Details

  • SHA256: 5f6729d3876a0470a4ff2ef79ad656cafe8d93a51206a36e5c80eef00a37b97d
  • Pointer size: 131 Bytes
  • Size of remote file: 133 kB
BanG-Dream/image/チュチュ.png ADDED

Git LFS Details

  • SHA256: e6e8fff79b839d1f9e0a3edd4aba192c8d8f29df1bd6a4c1e33a72524eb983f7
  • Pointer size: 131 Bytes
  • Size of remote file: 120 kB
BanG-Dream/image/パレオ.png ADDED

Git LFS Details

  • SHA256: 891c0b3f7faafc360a197525b9d70136578cba0e298e3cebefab06e6edee1911
  • Pointer size: 131 Bytes
  • Size of remote file: 131 kB
BanG-Dream/image//343/203/236/343/202/271/343/202/255/343/203/263/343/202/260.png ADDED
BanG-Dream/image/ミッシェル.png ADDED

Git LFS Details

  • SHA256: dd0d58b930b0abb6aaf3817f717025c95fa1390aa78ea23d2eda432b3dbf5b89
  • Pointer size: 131 Bytes
  • Size of remote file: 102 kB
BanG-Dream/image/モカ.png ADDED

Git LFS Details

  • SHA256: 16cae7f47b02a3056b617beb326f56277274f342a40bb3d7e467f03b3e4fa709
  • Pointer size: 131 Bytes
  • Size of remote file: 112 kB
BanG-Dream/image/リサ.png ADDED

Git LFS Details

  • SHA256: d8550208c29cbcdb22dade5c312d571f249fbb0ee3e1c2e21a875979a2261fb4
  • Pointer size: 131 Bytes
  • Size of remote file: 169 kB