@goodandready/dsh-voice 0.6.0 → 0.6.1

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.
Files changed (2) hide show
  1. package/lib/client.js +17 -0
  2. package/package.json +1 -1
package/lib/client.js CHANGED
@@ -125,6 +125,18 @@ window.__ModuleLoader__.load({
125
125
  actions.setDraft(draft ? draft + ' ' + text : text)
126
126
  }
127
127
 
128
+ // Объявление о том, что человек заговорил.
129
+ //
130
+ // Нужно, чтобы озвучка немедленно замолчала: слушать ответ и говорить
131
+ // одновременно невозможно, а перекрикивать собственный плагин — глупо.
132
+ // Связи между плагинами нет: голос кричит в окно, кто хочет — слышит.
133
+ // Поэтому оба плагина работают и поодиночке.
134
+ function announceVoice(phase) {
135
+ try {
136
+ window.dispatchEvent(new CustomEvent('dsh-voice:speaking', { detail: { phase } }))
137
+ } catch (noEvents) { /* окна нет — значит и слушать некому */ }
138
+ }
139
+
128
140
  // ------------------------------------------------- распознавание в браузере
129
141
  //
130
142
  // Отдельная нога, не похожая на все остальные: речь распознаёт сам браузер,
@@ -318,6 +330,9 @@ window.__ModuleLoader__.load({
318
330
 
319
331
  function startRecording(mode) {
320
332
  if (voice.phase !== 'idle' && voice.phase !== 'error') return
333
+ // Кричим до открытия микрофона, а не после: чем раньше замолчит
334
+ // озвучка, тем меньше её попадёт в запись.
335
+ announceVoice('start')
321
336
  voice.set({ phase: 'recording', mode, error: '', levels: [], caption: '' })
322
337
  modeChain(mode).then((info) => {
323
338
  // Браузерная нога — только если её прямо поставили первой в цепочке.
@@ -399,6 +414,7 @@ window.__ModuleLoader__.load({
399
414
  }
400
415
 
401
416
  function cancelCurrent() {
417
+ announceVoice('end')
402
418
  if (voice.browser) {
403
419
  voice.browser.abort()
404
420
  voice.browser = null
@@ -418,6 +434,7 @@ window.__ModuleLoader__.load({
418
434
  // Останов по второму нажатию: диктовка досылает хвост, голосовое —
419
435
  // отправляет всю запись и открывает окно отмены.
420
436
  function stopCurrent() {
437
+ announceVoice('end')
421
438
  if (voice.browser) {
422
439
  const mode = voice.mode
423
440
  const said = (voice.browserFinals || []).join(' ').trim()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-voice",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Voice input for DeepSeek Harness: dictation chunked by pauses and voice messages, each with its own provider fallback chain (Deepgram, Groq, HuggingFace, local whisper.cpp, plus any OpenAI-compatible API of your own).",
5
5
  "license": "MIT",
6
6
  "type": "module",