dsh-live2dwaifu 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -380,6 +380,12 @@ curl -X POST http://127.0.0.1:<端口>/dsh-live2d/api/push \
380
380
 
381
381
  版本号怎么走:动了功能和结构就抬第二位(1.2.0),只补洞和小修就抬第三位(1.2.1)。
382
382
 
383
+ ### 1.2.2
384
+
385
+ - 人设卡、音色、语料三个页面的按钮和说明改成通用说法:保存/追加保存/覆盖保存/放弃修改/选择文件/播放/关掉。
386
+ - 状态提示统一成「读取中/已读取/保存中/已保存/保存失败」,不再出现「读…」「存好了」这种。
387
+ - 语料页的示例和解析结果里,标签从「他/你」换成「对方/角色」。
388
+
383
389
  ### 1.2.1
384
390
 
385
391
  - 人设卡、音色、语料三个页面右上角各加了一个「关掉」。之前只能点外层那条栏上的按钮,页面本身没出口。
@@ -48,32 +48,32 @@
48
48
  <body>
49
49
 
50
50
  <h1>语料</h1>
51
- <p class="sub">把角色说过的话喂进来,之后说话就照这个调子。不用排版整齐,能读懂就行。</p>
51
+ <p class="sub">导入角色说过的话,作为生成回复时的语气参考。不要求格式整齐,能解析即可。</p>
52
52
 
53
53
  <div class="row">
54
54
  <select id="models"></select>
55
55
  <div class="btns">
56
- <button class="act" id="pick">选文件</button>
57
- <button class="act primary" id="append">加进去</button>
58
- <button class="act" id="replace">替换成这些</button>
56
+ <button class="act" id="pick">选择文件</button>
57
+ <button class="act primary" id="append">追加保存</button>
58
+ <button class="act" id="replace">覆盖保存</button>
59
59
  </div>
60
60
  <span class="state" id="state"></span>
61
61
  </div>
62
62
 
63
63
  <div class="cols">
64
64
  <div class="col box">
65
- <h2>把话贴进来</h2>
66
- <textarea id="raw" spellcheck="false" placeholder="随便贴,几种写法都认:
65
+ <h2>粘贴文本</h2>
66
+ <textarea id="raw" spellcheck="false" placeholder="直接粘贴,支持以下几种写法:
67
67
 
68
- 他:今天吃啥
69
- 你:锅里还有,热的。
68
+ 对方:今天忙吗
69
+ 角色:刚坐下,手还是湿的。
70
70
 
71
- 或者只贴角色的台词,一行一句:
72
- 锅里还有,热的。
73
- 先坐下。水在桌上。
71
+ 或者只粘贴角色台词,一行一句:
72
+ 刚坐下,手还是湿的。
73
+ 水在桌上。
74
74
 
75
- 也支持带引号的一句:「嗯。我也是。」"></textarea>
76
- <div id="drop">拖文件进来,或者点一下选(可以多选)<br /><span style="font-size:11px">文本、字幕、表格都认;图片和视频见下面</span></div>
75
+ 也支持带引号的一句:「嗯,我也是。」"></textarea>
76
+ <div id="drop">拖放文件到此处,或点击选择文件(支持多选)<br /><span style="font-size:11px">支持文本、字幕、表格;图片与视频见下方说明</span></div>
77
77
  <input id="files" type="file" multiple accept=".txt,.json,.jsonl,.csv,.md,.srt,.vtt,.ass,image/*,video/*" style="display:none" />
78
78
  <div class="tips">
79
79
  认得的写法:<code>对方:… / 角色:…</code>、<code>「…」</code>、<code>- …</code>、一行一句、
@@ -84,8 +84,8 @@
84
84
  </div>
85
85
 
86
86
  <div class="col box">
87
- <h2>解析出来长这样</h2>
88
- <div class="stat" id="stat">还没有内容</div>
87
+ <h2>解析结果</h2>
88
+ <div class="stat" id="stat">暂无内容</div>
89
89
  <div id="preview"></div>
90
90
  <div class="tips" id="saved"></div>
91
91
  </div>
@@ -168,10 +168,10 @@
168
168
  box.innerHTML = '';
169
169
  var show = [];
170
170
  for (var i = 0; i < parsed.pairs.length && show.length < 8; i += 1) {
171
- show.push('他:' + parsed.pairs[i].user + '<br>你:' + parsed.pairs[i].assistant);
171
+ show.push('对方:' + parsed.pairs[i].user + '<br>角色:' + parsed.pairs[i].assistant);
172
172
  }
173
173
  for (var j = 0; j < parsed.lines.length && show.length < 14; j += 1) {
174
- show.push('你:' + parsed.lines[j]);
174
+ show.push('角色:' + parsed.lines[j]);
175
175
  }
176
176
  show.forEach(function (html) {
177
177
  var d = document.createElement('div');
@@ -191,15 +191,15 @@
191
191
 
192
192
  function load() {
193
193
  if (!modelId) return;
194
- $('state').textContent = '读…';
194
+ $('state').textContent = '读取中';
195
195
  fetch('/dsh-live2d/api/corpus?id=' + encodeURIComponent(modelId))
196
196
  .then(function (r) { return r.json(); })
197
197
  .then(function (d) {
198
198
  stored = { lines: d.lines || [], pairs: d.pairs || [] };
199
- $('state').textContent = '读好了';
199
+ $('state').textContent = '已读取';
200
200
  render();
201
201
  })
202
- .catch(function (e) { $('state').textContent = '读不了:' + e.message; });
202
+ .catch(function (e) { $('state').textContent = '读取失败:' + e.message; });
203
203
  }
204
204
 
205
205
  function save(mode) {
@@ -214,10 +214,10 @@
214
214
  };
215
215
  }
216
216
  if (!payload.lines.length && !payload.pairs.length) {
217
- $('state').textContent = '没有可存的内容';
217
+ $('state').textContent = '没有可保存的内容';
218
218
  return;
219
219
  }
220
- $('state').textContent = '存…';
220
+ $('state').textContent = '保存中';
221
221
  fetch('/dsh-live2d/api/corpus', {
222
222
  method: 'POST',
223
223
  headers: { 'content-type': 'application/json' },
@@ -225,13 +225,13 @@
225
225
  })
226
226
  .then(function (r) { return r.json(); })
227
227
  .then(function (d) {
228
- if (!d.ok) { $('state').textContent = '没存上:' + (d.error || '?'); return; }
229
- $('state').textContent = '存好了,共 ' + d.total + ' 条';
228
+ if (!d.ok) { $('state').textContent = '保存失败:' + (d.error || '未知错误'); return; }
229
+ $('state').textContent = '已保存,共 ' + d.total + ' 条';
230
230
  $('raw').value = '';
231
231
  files = [];
232
232
  load();
233
233
  })
234
- .catch(function (e) { $('state').textContent = '没存上:' + e.message; });
234
+ .catch(function (e) { $('state').textContent = '保存失败:' + e.message; });
235
235
  }
236
236
 
237
237
  $('raw').addEventListener('input', reparse);
@@ -262,17 +262,17 @@
262
262
  texts.push(f);
263
263
  });
264
264
  if (skipped.length) {
265
- $('saved').textContent = '这些没读:' + skipped.join('、') + ' —— 图片先留着当形象参考,视频请导出字幕(.srt)或直接贴台词。';
265
+ $('saved').textContent = '未读取:' + skipped.join('、') + '。图片可留作形象参考;视频请先导出字幕(.srt)或直接粘贴台词。';
266
266
  }
267
- if (!texts.length) { $('state').textContent = '没有可读的文本'; return; }
268
- $('state').textContent = '读文件…';
267
+ if (!texts.length) { $('state').textContent = '没有可读取的文本文件'; return; }
268
+ $('state').textContent = '正在读取文件';
269
269
  var left = texts.length;
270
270
  texts.forEach(function (f) {
271
271
  var reader = new FileReader();
272
272
  reader.onload = function () {
273
273
  files.push(String(reader.result || ''));
274
274
  left -= 1;
275
- if (left === 0) { $('state').textContent = '读好了 ' + texts.length + ' 个文件'; reparse(); }
275
+ if (left === 0) { $('state').textContent = '已读取 ' + texts.length + ' 个文件'; reparse(); }
276
276
  };
277
277
  reader.onerror = function () { left -= 1; if (left === 0) reparse(); };
278
278
  reader.readAsText(f, 'utf-8');
@@ -305,10 +305,10 @@
305
305
  });
306
306
  modelId = d.selected || (list[0] && list[0].id) || '';
307
307
  if (modelId) sel.value = modelId;
308
- if (!list.length) { $('state').textContent = '还没有模型'; return; }
308
+ if (!list.length) { $('state').textContent = '尚未导入模型'; return; }
309
309
  load();
310
310
  })
311
- .catch(function (e) { $('state').textContent = '读不了模型表:' + e.message; });
311
+ .catch(function (e) { $('state').textContent = '读取模型列表失败:' + e.message; });
312
312
 
313
313
  $('models').addEventListener('change', function (e) {
314
314
  modelId = e.target.value;
@@ -47,20 +47,20 @@
47
47
 
48
48
  <div class="left">
49
49
  <div class="card"><iframe id="live" src="/dsh-live2d/viewer?embed=1"></iframe></div>
50
- <div class="tip">左边就是她本人。改完存一下,她下一句就按新的人设说。</div>
50
+ <div class="tip">左侧是当前模型预览。保存后,下一次回答就会按新的设定生成。</div>
51
51
  </div>
52
52
 
53
53
  <div class="panel">
54
54
  <h1>人设卡</h1>
55
- <p class="sub">她是谁、怎么说话,全在这段字里。</p>
55
+ <p class="sub">角色的身份、性格、说话方式,都写在这里。</p>
56
56
 
57
57
  <div class="group">
58
- <h2>配给哪个模型</h2>
58
+ <h2>目标模型</h2>
59
59
  <select id="models"></select>
60
60
  </div>
61
61
 
62
62
  <div class="group">
63
- <h2>人设</h2>
63
+ <h2>角色设定</h2>
64
64
  <textarea id="persona" spellcheck="false"></textarea>
65
65
  </div>
66
66
 
@@ -69,18 +69,18 @@
69
69
  <label class="switch">
70
70
  <input type="checkbox" id="isolation" checked />
71
71
  <span>
72
- <b>让她待在自己的世界里</b>
73
- <em>打开后,她不知道什么是程序、界面、插件、模型。问起来就当你在她身边,不提“系统”“设置”“网页”。关掉她就会老老实实承认自己是插件里的角色。</em>
72
+ <b>角色视角隔离</b>
73
+ <em>打开后,角色不会提到程序、界面、插件、模型这些词,按设定世界的视角回答。关闭后角色会承认自己是插件里的角色。</em>
74
74
  </span>
75
75
  </label>
76
76
  </div>
77
77
 
78
78
  <div class="foot">
79
- <button class="act primary" id="save">存</button>
80
- <button class="act" id="reload">撤销改动</button>
79
+ <button class="act primary" id="save">保存</button>
80
+ <button class="act" id="reload">放弃修改</button>
81
81
  <span class="state" id="state"></span>
82
82
  </div>
83
- <div class="tip">存在 <code>~/.dsh/dsh-live2d/models/&lt;id&gt;/meta.json</code> 的 <code>persona</code> 字段里,想手改也行。</div>
83
+ <div class="tip">保存在 <code>~/.dsh/dsh-live2d/models/&lt;id&gt;/meta.json</code> 的 <code>persona</code> 字段,也可以直接编辑该文件。</div>
84
84
  </div>
85
85
 
86
86
  <script>
@@ -96,20 +96,20 @@
96
96
 
97
97
  function load() {
98
98
  if (!modelId) return;
99
- state.textContent = '读…';
99
+ state.textContent = '读取中';
100
100
  fetch('/dsh-live2d/api/persona?id=' + encodeURIComponent(modelId))
101
101
  .then(function (r) { return r.json(); })
102
102
  .then(function (d) {
103
103
  area.value = d.persona || '';
104
104
  iso.checked = d.isolation !== false;
105
- state.textContent = d.custom ? '这份是手写的' : '还是默认那份';
105
+ state.textContent = d.custom ? '已自定义' : '使用默认设定';
106
106
  })
107
- .catch(function (e) { state.textContent = '读不了:' + e.message; });
107
+ .catch(function (e) { state.textContent = '读取失败:' + e.message; });
108
108
  }
109
109
 
110
110
  function save() {
111
111
  if (!modelId) return;
112
- state.textContent = '存…';
112
+ state.textContent = '保存中';
113
113
  fetch('/dsh-live2d/api/persona', {
114
114
  method: 'POST',
115
115
  headers: { 'content-type': 'application/json' },
@@ -117,12 +117,12 @@
117
117
  })
118
118
  .then(function (r) { return r.json(); })
119
119
  .then(function (d) {
120
- state.textContent = d.ok ? '存好了' : '没存上:' + (d.error || '?');
120
+ state.textContent = d.ok ? '已保存' : '保存失败:' + (d.error || '未知错误');
121
121
  if (d.ok) {
122
122
  frame.src = '/dsh-live2d/viewer?embed=1&t=' + Date.now();
123
123
  }
124
124
  })
125
- .catch(function (e) { state.textContent = '没存上:' + e.message; });
125
+ .catch(function (e) { state.textContent = '保存失败:' + e.message; });
126
126
  }
127
127
 
128
128
  $('save').addEventListener('click', save);
@@ -145,10 +145,10 @@
145
145
  });
146
146
  modelId = d.selected || (list[0] && list[0].id) || '';
147
147
  if (modelId) sel.value = modelId;
148
- if (!list.length) { state.textContent = '还没有模型'; return; }
148
+ if (!list.length) { state.textContent = '尚未导入模型'; return; }
149
149
  load();
150
150
  })
151
- .catch(function (e) { state.textContent = '读不了模型表:' + e.message; });
151
+ .catch(function (e) { state.textContent = '读取模型列表失败:' + e.message; });
152
152
  })();
153
153
  </script>
154
154
  <button id="sheet-close" class="sheet-close">关掉</button>
package/assets/tone.html CHANGED
@@ -50,20 +50,20 @@
50
50
 
51
51
  <div class="left">
52
52
  <div class="card"><iframe id="live" src="/dsh-live2d/viewer?embed=1"></iframe></div>
53
- <div class="tip">没声音就先点她一下——浏览器要一次点击才允许出声。</div>
53
+ <div class="tip">没有声音时,先点击一次页面——浏览器要求先有用户操作才允许播放。</div>
54
54
  </div>
55
55
 
56
56
  <div class="panel">
57
- <h1>音色</h1>
58
- <p class="sub">一个字一声短音。音量 0 就是安静,只留气泡和口型。</p>
57
+ <h1>声音</h1>
58
+ <p class="sub">每说一个字发一声短音。音量调到 0 即静音,只保留文字和口型。</p>
59
59
 
60
60
  <div class="group">
61
- <h2>配给哪个模型</h2>
61
+ <h2>目标模型</h2>
62
62
  <select id="models"></select>
63
63
  </div>
64
64
 
65
65
  <div class="group">
66
- <h2>音色</h2>
66
+ <h2>音色预设</h2>
67
67
  <div class="presets" id="presets">
68
68
  <button data-p="soft" class="on">柔和</button>
69
69
  <button data-p="crisp">清脆</button>
@@ -82,19 +82,19 @@
82
82
  </div>
83
83
 
84
84
  <div class="group">
85
- <h2>试一句</h2>
85
+ <h2>试听</h2>
86
86
  <div class="typebox">
87
87
  <input id="text" value="窗台那盆,红了。" />
88
- <button class="act primary" id="say">说</button>
88
+ <button class="act primary" id="say">播放</button>
89
89
  </div>
90
90
  </div>
91
91
 
92
92
  <div class="foot">
93
- <button class="act primary" id="save">存到这只模型</button>
93
+ <button class="act primary" id="save">保存</button>
94
94
  <button class="act" id="reset">恢复默认</button>
95
95
  <span class="state" id="state"></span>
96
96
  </div>
97
- <div class="tip">每只模型各存一份。换模型、换人,声音跟着换。</div>
97
+ <div class="tip">每只模型单独保存一份音色设置。</div>
98
98
  </div>
99
99
 
100
100
  <script>
@@ -185,12 +185,12 @@
185
185
  voice = Object.assign({}, DEFAULTS);
186
186
  show();
187
187
  pushTone();
188
- state.textContent = '已恢复默认,还没存';
188
+ state.textContent = '已恢复默认值,尚未保存';
189
189
  });
190
190
 
191
191
  $('save').addEventListener('click', function () {
192
192
  if (!modelId) return;
193
- state.textContent = '存…';
193
+ state.textContent = '保存中';
194
194
  fetch('/dsh-live2d/api/voice', {
195
195
  method: 'POST',
196
196
  headers: { 'content-type': 'application/json' },
@@ -198,9 +198,9 @@
198
198
  })
199
199
  .then(function (r) { return r.json(); })
200
200
  .then(function (d) {
201
- state.textContent = d.ok ? '存好了' : '没存上:' + (d.error || '?');
201
+ state.textContent = d.ok ? '已保存' : '保存失败:' + (d.error || '未知错误');
202
202
  })
203
- .catch(function (e) { state.textContent = '没存上:' + e.message; });
203
+ .catch(function (e) { state.textContent = '保存失败:' + e.message; });
204
204
  });
205
205
 
206
206
  sel.addEventListener('change', function () {
@@ -210,7 +210,7 @@
210
210
 
211
211
  function loadVoice(alsoSwitch) {
212
212
  if (!modelId) return;
213
- state.textContent = '读…';
213
+ state.textContent = '读取中';
214
214
  if (alsoSwitch) {
215
215
  fetch('/dsh-live2d/api/select', {
216
216
  method: 'POST',
@@ -227,9 +227,9 @@
227
227
  show();
228
228
  pushTone();
229
229
  setTimeout(pushTone, 900);
230
- state.textContent = '读好了';
230
+ state.textContent = '已读取';
231
231
  })
232
- .catch(function (e) { state.textContent = '读不了:' + e.message; });
232
+ .catch(function (e) { state.textContent = '读取失败:' + e.message; });
233
233
  }
234
234
 
235
235
  fetch('/dsh-live2d/api/models')
@@ -246,12 +246,12 @@
246
246
  modelId = d.selected || (list[0] && list[0].id) || '';
247
247
  if (modelId) sel.value = modelId;
248
248
  if (!list.length) {
249
- state.textContent = '还没有模型';
249
+ state.textContent = '尚未导入模型';
250
250
  return;
251
251
  }
252
252
  loadVoice(false);
253
253
  })
254
- .catch(function (e) { state.textContent = '读不了模型表:' + e.message; });
254
+ .catch(function (e) { state.textContent = '读取模型列表失败:' + e.message; });
255
255
 
256
256
  frame.addEventListener('load', function () {
257
257
  pushTone();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-live2dwaifu",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "description": "给 DSH 网页右下角请一个 Live2D 角色:会眨眼、会呼吸、视线跟着鼠标、点她有反应、说话时嘴动、心情变了眉毛跟着动。模型不用内置——谁装谁放自己的文件夹;支持自定义 .exp3.json 表情和 .motion3.json 动作,卡片能拖能缩,背景可换。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",