agentvibes 5.12.0 → 5.13.0
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/.claude/commands/agent-vibes/commands.json +0 -20
- package/.claude/commands/agent-vibes/unmute.md +6 -2
- package/.claude/config/audio-effects.cfg +6 -6
- package/.claude/github-star-reminder.txt +1 -1
- package/.claude/hooks/agentvibes-session-id.sh +69 -0
- package/.claude/hooks/bmad-party-speak.sh +20 -4
- package/.claude/hooks/bmad-speak.sh +60 -2
- package/.claude/hooks/bmad-tts-injector.sh +20 -1
- package/.claude/hooks/bmad-voice-manager.sh +25 -3
- package/.claude/hooks/clawdbot-receiver-SECURE.sh +21 -2
- package/.claude/hooks/clawdbot-receiver.sh +19 -1
- package/.claude/hooks/elevenlabs-voices.sh +62 -0
- package/.claude/hooks/kokoro-installer.sh +20 -10
- package/.claude/hooks/language-manager.sh +10 -3
- package/.claude/hooks/party-set-room.sh +71 -0
- package/.claude/hooks/party-stage-roster.py +328 -0
- package/.claude/hooks/personality-manager.sh +19 -2
- package/.claude/hooks/piper-voice-manager.sh +3 -2
- package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +24 -5
- package/.claude/hooks/play-tts-elevenlabs.sh +38 -118
- package/.claude/hooks/play-tts-kokoro.sh +33 -6
- package/.claude/hooks/play-tts-soprano.sh +3 -2
- package/.claude/hooks/play-tts-ssh-remote.sh +37 -29
- package/.claude/hooks/play-tts-termux-ssh.sh +5 -4
- package/.claude/hooks/play-tts.sh +66 -61
- package/.claude/hooks/provider-catalog.json +352 -0
- package/.claude/hooks/provider-catalog.sh +161 -0
- package/.claude/hooks/provider-commands.sh +2 -1
- package/.claude/hooks/provider-manager.sh +47 -9
- package/.claude/hooks/python-resolver.sh +117 -0
- package/.claude/hooks/session-id.sh +56 -0
- package/.claude/hooks/session-start-tts.sh +39 -0
- package/.claude/hooks/speed-manager.sh +1 -1
- package/.claude/hooks/translate-manager.sh +3 -2
- package/.claude/hooks/translator.py +1 -1
- package/.claude/hooks/voice-manager.sh +242 -10
- package/.claude/hooks-windows/language-manager.ps1 +7 -1
- package/.claude/hooks-windows/personality-manager.ps1 +16 -1
- package/.claude/hooks-windows/play-tts-kokoro.ps1 +20 -4
- package/.claude/hooks-windows/play-tts.ps1 +32 -3
- package/.claude/hooks-windows/provider-catalog.ps1 +140 -0
- package/.claude/hooks-windows/provider-manager.ps1 +63 -8
- package/.claude/hooks-windows/tts-watcher.ps1 +33 -12
- package/.claude/hooks-windows/voice-manager-windows.ps1 +49 -0
- package/.mcp.json +0 -7
- package/README.md +12 -3
- package/RELEASE_NOTES.md +43 -0
- package/mcp-server/server.py +146 -49
- package/mcp-server/test_mcp_correctness.py +20 -2
- package/mcp-server/test_windows_script_parity.py +0 -2
- package/package.json +1 -1
- package/src/cli/list-voices.js +218 -114
- package/src/console/bling.js +71 -0
- package/src/console/music-preview.js +79 -0
- package/src/console/tabs/music-tab.js +16 -39
- package/src/console/tabs/settings-tab.js +195 -13
- package/src/console/tabs/setup-tab.js +9 -34
- package/src/console/tabs/voices-tab.js +83 -14
- package/src/console/widgets/track-picker.js +82 -0
- package/src/installer.js +124 -10
- package/src/services/provider-catalog.js +412 -0
- package/src/services/provider-voice-catalog.js +52 -73
- package/src/services/tts-engine-service.js +29 -0
- package/src/utils/provider-validator.js +62 -12
- package/.claude/commands/agent-vibes/language.md +0 -23
- package/.claude/commands/agent-vibes/learn.md +0 -67
- package/.claude/commands/agent-vibes/replay-target.md +0 -14
- package/.claude/commands/agent-vibes/target-voice.md +0 -26
- package/.claude/commands/agent-vibes/target.md +0 -30
- package/.claude/hooks/learn-manager.sh +0 -492
- package/.claude/hooks/replay-target-audio.sh +0 -95
- package/.claude/hooks-windows/learn-manager.ps1 +0 -241
|
@@ -1,87 +1,55 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Provider voice catalogs —
|
|
3
|
-
* of the cloud/neural providers, plus a helper that returns the voice pool for
|
|
4
|
-
* whichever provider is currently active.
|
|
2
|
+
* Provider voice catalogs — BACK-COMPAT SHIM.
|
|
5
3
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* The canonical source of provider voice data is now
|
|
5
|
+
* `src/services/provider-catalog.js` (the Provider Catalog, SSOT Layer 2). This
|
|
6
|
+
* module re-exports the static voice lists (`ELEVENLABS_VOICES`,
|
|
7
|
+
* `KOKORO_VOICE_IDS`) and the gender helper from the catalog, and keeps the
|
|
8
|
+
* `voicesForProvider()` convenience used by BMAD gender-aware auto-assignment.
|
|
9
|
+
*
|
|
10
|
+
* Kept as a shim so existing importers (and test/unit/provider-voice-catalog.test.js)
|
|
11
|
+
* continue to work unmodified.
|
|
10
12
|
*
|
|
11
13
|
* @module services/provider-voice-catalog
|
|
12
14
|
*/
|
|
13
15
|
|
|
14
16
|
import { isSingleVoiceProvider } from './agent-voice-store.js';
|
|
17
|
+
import {
|
|
18
|
+
ELEVENLABS_VOICES,
|
|
19
|
+
KOKORO_VOICE_IDS,
|
|
20
|
+
kokoroGender,
|
|
21
|
+
} from './provider-catalog.js';
|
|
22
|
+
|
|
23
|
+
export { ELEVENLABS_VOICES, KOKORO_VOICE_IDS, kokoroGender };
|
|
15
24
|
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{ id: '
|
|
29
|
-
{ id: '
|
|
30
|
-
{ id: '
|
|
31
|
-
{ id: '
|
|
32
|
-
{ id: '
|
|
33
|
-
{ id: 'iP95p4xoKVk53GoZ742B', name: 'Chris', gender: 'Male', lang: 'en-US', desc: 'Charming, down-to-earth' },
|
|
34
|
-
{ id: 'nPczCjzI2devNBz1zQrb', name: 'Brian', gender: 'Male', lang: 'en-US', desc: 'Deep, comforting' },
|
|
35
|
-
{ id: 'onwK4e9ZLuTAKqWW03F9', name: 'Daniel', gender: 'Male', lang: 'en-GB', desc: 'Steady broadcaster' },
|
|
36
|
-
{ id: 'pFZP5JQG7iQjIQuC4Bku', name: 'Lily', gender: 'Female', lang: 'en-GB', desc: 'Velvety actress' },
|
|
37
|
-
{ id: 'pNInz6obpgDQGcFmaJgB', name: 'Adam', gender: 'Male', lang: 'en-US', desc: 'Dominant, firm' },
|
|
38
|
-
{ id: 'pqHfZKP75CvOlQylNhV4', name: 'Bill', gender: 'Male', lang: 'en-US', desc: 'Wise, mature' },
|
|
39
|
-
// ── Added from the ElevenLabs voice library (raw library voice_ids) ───────
|
|
40
|
-
{ id: 'HBDoL4wkcalemIO0nUAu', name: 'Emily', gender: 'Female', lang: 'en-GB', desc: 'RPG, immersive' },
|
|
41
|
-
{ id: 'Mtmp3KhFIjYpWYRycDe3', name: 'John', gender: 'Male', lang: 'en-US', desc: 'Raspy surfer' },
|
|
42
|
-
{ id: '8kgj5469z1URcH4MB2G4', name: 'Sakuya', gender: 'Female', lang: 'en-US', desc: 'Cheerful anime' },
|
|
43
|
-
{ id: '2ajXGJNYBR0iNHpS4VZb', name: 'Rob', gender: 'Male', lang: 'en-GB', desc: 'Tough, gritty' },
|
|
44
|
-
{ id: 'mMdTuD2nnFiCH88UdXSb', name: 'Jane', gender: 'Female', lang: 'en-US', desc: 'Cinematic villain' },
|
|
25
|
+
/**
|
|
26
|
+
* Curated built-in voices for the OS-native "discovered" providers (Windows SAPI,
|
|
27
|
+
* macOS `say`). Their real voices live on the target device — for a remote
|
|
28
|
+
* receiver we cannot enumerate them from here — so these standard voices (shipped
|
|
29
|
+
* by default on Windows 10/11 and macOS) give the picker an honest, selectable
|
|
30
|
+
* list. The `id` is the exact name the player passes to SelectVoice / `say -v`;
|
|
31
|
+
* if the receiver lacks one it falls back to the system default (benign).
|
|
32
|
+
*
|
|
33
|
+
* Verified against a real Windows 11 install (System.Speech GetInstalledVoices).
|
|
34
|
+
* The receiver remains authoritative — this is UI convenience, not inventory SSOT.
|
|
35
|
+
*/
|
|
36
|
+
const WINDOWS_SAPI_VOICES = [
|
|
37
|
+
{ id: 'Microsoft David Desktop', name: 'David (Desktop)', gender: 'Male', lang: 'en-US' },
|
|
38
|
+
{ id: 'Microsoft Zira Desktop', name: 'Zira (Desktop)', gender: 'Female', lang: 'en-US' },
|
|
39
|
+
{ id: 'Microsoft David', name: 'David', gender: 'Male', lang: 'en-US' },
|
|
40
|
+
{ id: 'Microsoft Mark', name: 'Mark', gender: 'Male', lang: 'en-US' },
|
|
41
|
+
{ id: 'Microsoft Zira', name: 'Zira', gender: 'Female', lang: 'en-US' },
|
|
45
42
|
];
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
'
|
|
51
|
-
'
|
|
52
|
-
|
|
53
|
-
'bf_alice','bf_emma','bf_isabella','bf_lily',
|
|
54
|
-
'bm_daniel','bm_fable','bm_george','bm_lewis',
|
|
55
|
-
// Japanese
|
|
56
|
-
'jf_alpha','jf_gongitsune','jf_nezumi','jf_tebukuro','jm_kumo',
|
|
57
|
-
// Mandarin Chinese
|
|
58
|
-
'zf_xiaobei','zf_xiaoni','zf_xiaoxiao','zf_xiaoyi','zm_yunxi','zm_yunxia','zm_yunyang',
|
|
59
|
-
// Spanish
|
|
60
|
-
'ef_dora','em_alex','em_santa',
|
|
61
|
-
// French
|
|
62
|
-
'ff_siwis',
|
|
63
|
-
// Hindi
|
|
64
|
-
'hf_alpha','hm_omega',
|
|
65
|
-
// Italian
|
|
66
|
-
'if_sara','im_nicola',
|
|
67
|
-
// Brazilian Portuguese
|
|
68
|
-
'pf_dora','pm_alex','pm_santa',
|
|
69
|
-
// Korean
|
|
70
|
-
'kf_alpha','km_hyunsu',
|
|
44
|
+
const MACOS_VOICES = [
|
|
45
|
+
{ id: 'Samantha', name: 'Samantha', gender: 'Female', lang: 'en-US' },
|
|
46
|
+
{ id: 'Alex', name: 'Alex', gender: 'Male', lang: 'en-US' },
|
|
47
|
+
{ id: 'Daniel', name: 'Daniel', gender: 'Male', lang: 'en-GB' },
|
|
48
|
+
{ id: 'Karen', name: 'Karen', gender: 'Female', lang: 'en-AU' },
|
|
49
|
+
{ id: 'Moira', name: 'Moira', gender: 'Female', lang: 'en-IE' },
|
|
71
50
|
];
|
|
72
51
|
|
|
73
|
-
|
|
74
|
-
* Infer a Kokoro voice's gender from its id. Kokoro ids follow `<lang><sex>_name`
|
|
75
|
-
* where the 2nd character is `f` (female) or `m` (male).
|
|
76
|
-
* @param {string} id
|
|
77
|
-
* @returns {'Female'|'Male'|''}
|
|
78
|
-
*/
|
|
79
|
-
export function kokoroGender(id) {
|
|
80
|
-
const c = typeof id === 'string' && id.length > 1 ? id[1].toLowerCase() : '';
|
|
81
|
-
if (c === 'f') return 'Female';
|
|
82
|
-
if (c === 'm') return 'Male';
|
|
83
|
-
return '';
|
|
84
|
-
}
|
|
52
|
+
export { WINDOWS_SAPI_VOICES, MACOS_VOICES };
|
|
85
53
|
|
|
86
54
|
/**
|
|
87
55
|
* Return the voice pool for the currently-active provider as `{ id, gender }`
|
|
@@ -108,6 +76,17 @@ export function voicesForProvider(provider, { scanInstalledVoices, getVoiceMeta
|
|
|
108
76
|
return ELEVENLABS_VOICES.map(v => ({ id: v.id, gender: v.gender || '' }));
|
|
109
77
|
}
|
|
110
78
|
|
|
79
|
+
// OS-native discovered providers: their voices live on the target device (the
|
|
80
|
+
// receiver in remote mode), so they can't be scanned here. Return the curated
|
|
81
|
+
// built-in list instead of falling through to the Piper disk scan (which would
|
|
82
|
+
// mislabel them as Piper voices).
|
|
83
|
+
if (p === 'sapi' || p === 'windows-sapi') {
|
|
84
|
+
return WINDOWS_SAPI_VOICES.map(v => ({ id: v.id, gender: v.gender || '' }));
|
|
85
|
+
}
|
|
86
|
+
if (p === 'macos' || p === 'macos-say' || p === 'say') {
|
|
87
|
+
return MACOS_VOICES.map(v => ({ id: v.id, gender: v.gender || '' }));
|
|
88
|
+
}
|
|
89
|
+
|
|
111
90
|
// Single-voice providers (e.g. soprano): one synthetic entry named after the
|
|
112
91
|
// provider — every agent ends up sharing it, which is correct for these.
|
|
113
92
|
if (isSingleVoiceProvider(p)) {
|
|
@@ -123,4 +102,4 @@ export function voicesForProvider(provider, { scanInstalledVoices, getVoiceMeta
|
|
|
123
102
|
return [];
|
|
124
103
|
}
|
|
125
104
|
|
|
126
|
-
export default { ELEVENLABS_VOICES, KOKORO_VOICE_IDS, kokoroGender, voicesForProvider };
|
|
105
|
+
export default { ELEVENLABS_VOICES, KOKORO_VOICE_IDS, WINDOWS_SAPI_VOICES, MACOS_VOICES, kokoroGender, voicesForProvider };
|
|
@@ -53,6 +53,22 @@ export function getAvailableEngines() {
|
|
|
53
53
|
return TTS_ENGINES.filter(e => !e.platform || e.platform === process.platform);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
/** Is this engine runnable on the current OS? (Native engines are platform-bound.) */
|
|
57
|
+
export function isEngineSupported(engineId) {
|
|
58
|
+
const e = TTS_ENGINES.find(x => x.id === engineId);
|
|
59
|
+
return !!e && (!e.platform || e.platform === process.platform);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Every engine, each tagged with `supported` for the current platform. Unlike
|
|
64
|
+
* getAvailableEngines() (which hides off-platform engines), this lists them all
|
|
65
|
+
* so the picker can show e.g. Windows SAPI greyed "(Not supported)" on Linux
|
|
66
|
+
* instead of appearing to be missing.
|
|
67
|
+
*/
|
|
68
|
+
export function getAllEngines() {
|
|
69
|
+
return TTS_ENGINES.map(e => ({ ...e, supported: !e.platform || e.platform === process.platform }));
|
|
70
|
+
}
|
|
71
|
+
|
|
56
72
|
export function checkEngineInstalled(engineId) {
|
|
57
73
|
const engine = TTS_ENGINES.find(e => e.id === engineId);
|
|
58
74
|
if (!engine) return false;
|
|
@@ -110,6 +126,19 @@ export function checkEngineInstalled(engineId) {
|
|
|
110
126
|
return false;
|
|
111
127
|
}
|
|
112
128
|
|
|
129
|
+
/**
|
|
130
|
+
* Map a picker engine id to the provider name the SSH-remote sender + receiver
|
|
131
|
+
* understand. play-tts-ssh-remote.sh validates
|
|
132
|
+
* piper|soprano|macos|windows-sapi|kokoro|elevenlabs, but the picker/config use
|
|
133
|
+
* 'sapi' and 'macos-say'. This is the single translation point.
|
|
134
|
+
* @param {string} engineId
|
|
135
|
+
* @returns {string} receiver/sender provider name
|
|
136
|
+
*/
|
|
137
|
+
const RECEIVER_PROVIDER_MAP = { sapi: 'windows-sapi', 'macos-say': 'macos' };
|
|
138
|
+
export function receiverProviderId(engineId) {
|
|
139
|
+
return RECEIVER_PROVIDER_MAP[engineId] || engineId;
|
|
140
|
+
}
|
|
141
|
+
|
|
113
142
|
export function getEngineStatuses() {
|
|
114
143
|
return getAvailableEngines().map(e => ({
|
|
115
144
|
...e,
|
|
@@ -7,6 +7,64 @@ import { spawnSync } from 'node:child_process';
|
|
|
7
7
|
import path from 'node:path'; // For safe path operations and traversal prevention
|
|
8
8
|
import fs from 'node:fs'; // For checking file/directory existence
|
|
9
9
|
import os from 'node:os'; // For os.homedir() to prevent HOME injection attacks
|
|
10
|
+
import { listProviders, displayName as catalogDisplayName } from '../services/provider-catalog.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Canonical set of TTS synthesis providers AgentVibes knows how to use.
|
|
14
|
+
* SINGLE SOURCE OF TRUTH: every user-facing dispatcher (MCP set_provider
|
|
15
|
+
* allowlist, voice switch, voice list, Windows provider manager) must recognise
|
|
16
|
+
* these providers — platform-scoped where noted below. A provider that lives
|
|
17
|
+
* here but is missing from a dispatcher is the "silent drop to Piper / Unknown
|
|
18
|
+
* provider" class of bug (see AVI-S8.1). The dispatcher-parity conformance test
|
|
19
|
+
* asserts this invariant.
|
|
20
|
+
*
|
|
21
|
+
* Platform notes: `macos` is Darwin-only; `windows-sapi`/`windows-piper` are
|
|
22
|
+
* Windows-only. `kokoro` ships a play-tts runtime on BOTH Unix
|
|
23
|
+
* (play-tts-kokoro.sh) and PowerShell (play-tts-kokoro.ps1). `elevenlabs` ships
|
|
24
|
+
* a Unix runtime only (play-tts-elevenlabs.sh) — there is NO
|
|
25
|
+
* play-tts-elevenlabs.ps1 yet — so it is recognised by the portable (bash/JS)
|
|
26
|
+
* dispatchers but intentionally excluded from the Windows provider manager
|
|
27
|
+
* until a PowerShell runtime lands (AVI-S8.2).
|
|
28
|
+
* @type {readonly string[]}
|
|
29
|
+
*/
|
|
30
|
+
export const SUPPORTED_PROVIDERS = Object.freeze(listProviders().map((p) => p.id));
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Providers that use the SAME id on every OS and have at least a Unix (bash)
|
|
34
|
+
* runtime. Every PORTABLE dispatcher — the MCP set_provider allowlist,
|
|
35
|
+
* voice-manager.sh, and list-voices.js — must recognise these regardless of
|
|
36
|
+
* platform. DERIVED VIEW over the catalog: the providers with a Unix runtime
|
|
37
|
+
* whose voices are enumerable without disk (static/name-to-id) — i.e. kokoro and
|
|
38
|
+
* elevenlabs.
|
|
39
|
+
* @type {readonly string[]}
|
|
40
|
+
*/
|
|
41
|
+
export const CROSS_PLATFORM_PROVIDERS = Object.freeze(
|
|
42
|
+
listProviders()
|
|
43
|
+
.filter((p) => p.runtime.unix !== null && (p.voiceModel === 'static' || p.voiceModel === 'name-to-id'))
|
|
44
|
+
.map((p) => p.id),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Subset of {@link CROSS_PLATFORM_PROVIDERS} that ALSO ships a PowerShell runtime
|
|
49
|
+
* (play-tts-*.ps1), so the Windows provider manager (provider-manager.ps1) must
|
|
50
|
+
* recognise them too. `elevenlabs` is excluded until play-tts-elevenlabs.ps1
|
|
51
|
+
* exists (AVI-S8.2). DERIVED VIEW over the catalog.
|
|
52
|
+
* @type {readonly string[]}
|
|
53
|
+
*/
|
|
54
|
+
export const WINDOWS_RUNTIME_PROVIDERS = Object.freeze(
|
|
55
|
+
listProviders()
|
|
56
|
+
.filter((p) => p.runtime.unix !== null && (p.voiceModel === 'static' || p.voiceModel === 'name-to-id') && p.runtime.windows !== null)
|
|
57
|
+
.map((p) => p.id),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Is `name` a provider AgentVibes canonically supports?
|
|
62
|
+
* @param {string} name
|
|
63
|
+
* @returns {boolean}
|
|
64
|
+
*/
|
|
65
|
+
export function isKnownProvider(name) {
|
|
66
|
+
return SUPPORTED_PROVIDERS.includes(String(name || '').toLowerCase());
|
|
67
|
+
}
|
|
10
68
|
|
|
11
69
|
/**
|
|
12
70
|
* Helper: Check if command exists in PATH
|
|
@@ -603,16 +661,8 @@ function getPackageInfo(pkgName) {
|
|
|
603
661
|
* @returns {string} Display name
|
|
604
662
|
*/
|
|
605
663
|
export function getProviderDisplayName(providerName) {
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
elevenlabs: 'ElevenLabs',
|
|
611
|
-
macos: 'macOS Say',
|
|
612
|
-
sapi: 'Windows SAPI',
|
|
613
|
-
'windows-sapi': 'Windows SAPI',
|
|
614
|
-
'windows-piper': 'Piper TTS'
|
|
615
|
-
};
|
|
616
|
-
|
|
617
|
-
return names[providerName] || providerName;
|
|
664
|
+
// DERIVED VIEW: delegate to the Provider Catalog (single source of truth for
|
|
665
|
+
// display names). The catalog resolves aliases (e.g. 'sapi' → Windows SAPI) and
|
|
666
|
+
// passes unknown ids through unchanged, preserving this function's contract.
|
|
667
|
+
return catalogDisplayName(providerName);
|
|
618
668
|
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Set your main/native language for learning mode
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
Set your main/native language. This is the language you already know and will hear first when learning mode is enabled.
|
|
6
|
-
|
|
7
|
-
Usage:
|
|
8
|
-
```
|
|
9
|
-
/agent-vibes:language english
|
|
10
|
-
/agent-vibes:language spanish
|
|
11
|
-
/agent-vibes:language french
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
The main language uses your currently selected voice. When learning mode is ON, TTS will speak in your main language FIRST, then translate to your target language.
|
|
15
|
-
|
|
16
|
-
Default: english
|
|
17
|
-
|
|
18
|
-
Supported languages: english, spanish, french, german, italian, portuguese, chinese, japanese, korean, hindi, arabic, polish, dutch, turkish, swedish, russian, and 15+ more.
|
|
19
|
-
|
|
20
|
-
After setting your main language:
|
|
21
|
-
1. Set your target language with `/agent-vibes:target <language>`
|
|
22
|
-
2. Set target voice with `/agent-vibes:target-voice <voice>`
|
|
23
|
-
3. Enable learning mode with `/agent-vibes:learn`
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Enable or disable language learning mode
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
Turn language learning mode ON or OFF. When enabled, Claude will speak acknowledgments and completions in BOTH your main language and target language.
|
|
6
|
-
|
|
7
|
-
Usage:
|
|
8
|
-
```
|
|
9
|
-
/agent-vibes:learn # Turn ON
|
|
10
|
-
/agent-vibes:learn off # Turn OFF
|
|
11
|
-
/agent-vibes:learn status # Show current setup
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
## How Learning Mode Works:
|
|
15
|
-
|
|
16
|
-
When learning mode is **ON**:
|
|
17
|
-
1. **First**: Speak in your main language (using your current voice)
|
|
18
|
-
2. **Then**: Speak the SAME message translated to your target language (using target voice)
|
|
19
|
-
|
|
20
|
-
Example:
|
|
21
|
-
```
|
|
22
|
-
Main language (English, Aria): "I'll check that for you"
|
|
23
|
-
Target language (Spanish, Antoni): "Lo verificaré para ti"
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Setup Steps:
|
|
27
|
-
|
|
28
|
-
1. Set your main language:
|
|
29
|
-
```
|
|
30
|
-
/agent-vibes:language english
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
2. Set your target language:
|
|
34
|
-
```
|
|
35
|
-
/agent-vibes:target spanish
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
3. Set target voice (recommended):
|
|
39
|
-
```
|
|
40
|
-
/agent-vibes:target-voice Antoni
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
4. Enable learning mode:
|
|
44
|
-
```
|
|
45
|
-
/agent-vibes:learn
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
5. Check your setup:
|
|
49
|
-
```
|
|
50
|
-
/agent-vibes:learn status
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Notes:
|
|
54
|
-
|
|
55
|
-
- Translations are **direct translations** of what was said in the main language
|
|
56
|
-
- Same **personality/sentiment** applies to both languages
|
|
57
|
-
- Works with all AgentVibes features (BMAD, personalities, etc.)
|
|
58
|
-
- Requires multilingual voices for target language (Antoni, Rachel, Domi, Bella, etc.)
|
|
59
|
-
- Small pause (0.5s) between main and target language announcements
|
|
60
|
-
|
|
61
|
-
## Disable Learning Mode:
|
|
62
|
-
|
|
63
|
-
```
|
|
64
|
-
/agent-vibes:learn off
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
This returns to normal single-language TTS mode.
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Replay the last target language audio (for language learning mode)
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
Replay the last message that was spoken in your target language during language learning mode.
|
|
6
|
-
|
|
7
|
-
This is useful when learning a new language - you can hear the translation again without triggering a new one.
|
|
8
|
-
|
|
9
|
-
Usage:
|
|
10
|
-
- `/agent-vibes:replay-target` - Replay the last target language audio
|
|
11
|
-
|
|
12
|
-
**Note:** This only works when language learning mode is active (`/agent-vibes:learn`).
|
|
13
|
-
|
|
14
|
-
!bash .claude/hooks/replay-target-audio.sh
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Set the voice for your target language
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
Set which voice to use when speaking your target language. This should typically be a multilingual voice that supports your target language.
|
|
6
|
-
|
|
7
|
-
Usage:
|
|
8
|
-
```
|
|
9
|
-
/agent-vibes:target-voice Antoni
|
|
10
|
-
/agent-vibes:target-voice Rachel
|
|
11
|
-
/agent-vibes:target-voice Domi
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
Recommended multilingual voices:
|
|
15
|
-
- **Antoni** - Best for Spanish, Portuguese
|
|
16
|
-
- **Rachel** - Best for French, English
|
|
17
|
-
- **Domi** - Best for German, European languages
|
|
18
|
-
- **Bella** - Best for Italian, Romance languages
|
|
19
|
-
- **Charlotte** - European languages
|
|
20
|
-
- **Matilda** - Latin languages
|
|
21
|
-
|
|
22
|
-
These voices support 30+ languages using Piper TTS' Multilingual v2 model.
|
|
23
|
-
|
|
24
|
-
After setting your target voice:
|
|
25
|
-
- Enable learning mode with `/agent-vibes:learn`
|
|
26
|
-
- Check your setup with `/agent-vibes:learn status`
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Set the language you want to learn
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
Set the target language you want to learn. When learning mode is enabled, TTS will speak in your main language FIRST, then speak the translation in your target language.
|
|
6
|
-
|
|
7
|
-
Usage:
|
|
8
|
-
```
|
|
9
|
-
/agent-vibes:target spanish
|
|
10
|
-
/agent-vibes:target french
|
|
11
|
-
/agent-vibes:target german
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
Recommended voices by target language:
|
|
15
|
-
- Spanish → Antoni (Piper TTS) / es_ES-davefx-medium (Piper)
|
|
16
|
-
- French → Rachel (Piper TTS) / fr_FR-siwis-medium (Piper)
|
|
17
|
-
- German → Domi (Piper TTS) / de_DE-thorsten-medium (Piper)
|
|
18
|
-
- Italian → Bella (Piper TTS) / it_IT-riccardo-x_low (Piper)
|
|
19
|
-
- Portuguese → Matilda (Piper TTS) / pt_BR-faber-medium (Piper)
|
|
20
|
-
- Chinese → Amy (Piper TTS) / zh_CN-huayan-medium (Piper)
|
|
21
|
-
- Japanese → Antoni (Piper TTS) / ja_JP-hikari-medium (Piper)
|
|
22
|
-
- Other languages → Antoni (Piper TTS) / check available Piper voices
|
|
23
|
-
|
|
24
|
-
**Note:** The system will automatically suggest the correct voice based on your active TTS provider. After setting your target language, the suggestion will match whether you're using Piper TTS or Piper.
|
|
25
|
-
|
|
26
|
-
After setting your target language:
|
|
27
|
-
1. Set the voice for target language with `/agent-vibes:target-voice <voice>`
|
|
28
|
-
2. Enable learning mode with `/agent-vibes:learn`
|
|
29
|
-
|
|
30
|
-
Supported languages: spanish, french, german, italian, portuguese, chinese, japanese, korean, hindi, arabic, polish, dutch, turkish, swedish, russian, and 15+ more.
|