openvibers/openvibe.chat Commits
2fat's one-of-a-kind voice: Bass Boss (voice_twofat) (#132)
Changes
@@@ -97,6 +97,8 @@ const VOICE_CATALOG = {gc_journey_oracle: { name: 'JourneyOracle', emoji: 'πΊοΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Journey-F', gender: 'FEMALE', locale: 'en-US' } },// One of a kind (2026-10-22): Josh's Vegas Announcer, a deep, unhurried Neural2 voice.voice_vegas: { name: 'VegasAnnouncer', emoji: 'ποΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Neural2-J', gender: 'MALE', locale: 'en-US', pitch: -4.0, speakingRate: 0.9 } },++ // One of a kind (2026-10-23): 2fat's Bass Boss, the deepest Neural2 voice there is (pitch -8).++ voice_twofat: { name: 'BassBoss', emoji: 'ποΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Neural2-D', gender: 'MALE', locale: 'en-US', pitch: -8.0, speakingRate: 1.0 } },gc_journey_whisper: { name: 'JourneyWhisper', emoji: 'πΊοΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Journey-O', gender: 'FEMALE', locale: 'en-US' } },// ββ Amazon Polly voices βββββββββββββββββββββββββββββββββββ@@@ -57,6 +57,10 @@ const voiceOf = (r) => Buffer.from(String(r.audio), 'base64').toString().replaceassert.deepStrictEqual([vegas.engine, vegas.voiceId, voiceOf(vegas)], ['google-cloud', 'voice_vegas', 'en-US-Neural2-J']);const sent = JSON.parse(asked[0].body).audioConfig;assert.deepStrictEqual([sent.pitch, sent.speakingRate], [-4, 0.9], 'its own pitch and rate reach Google');++ // 2fat's Bass Boss (2026-10-23): one of a kind too, deeper still.++ const boss = await tts.synthesize('Bangers only', 'voice_twofat', '2fat');++ assert.deepStrictEqual([boss.engine, boss.voiceId, voiceOf(boss)], ['google-cloud', 'voice_twofat', 'en-US-Neural2-D']);++ assert.strictEqual(JSON.parse(asked[asked.length - 1].body).audioConfig.pitch, -8);const plain = await tts.synthesize('hello', 'gc_studio_m', 'x');assert.deepStrictEqual(JSON.parse(asked[asked.length - 1].body).audioConfig, { audioEncoding: 'MP3', speakingRate: 1, pitch: 0 }, 'other Google voices keep the defaults');assert.strictEqual(voiceOf(plain), 'en-US-Studio-Q');
@@ -97,6 +97,8 @@ const VOICE_CATALOG = {
@@ -97,6 +97,8 @@ const VOICE_CATALOG = {
gc_journey_oracle: { name: 'JourneyOracle', emoji: 'πΊοΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Journey-F', gender: 'FEMALE', locale: 'en-US' } },
gc_journey_oracle: { name: 'JourneyOracle', emoji: 'πΊοΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Journey-F', gender: 'FEMALE', locale: 'en-US' } },
// One of a kind (2026-10-22): Josh's Vegas Announcer, a deep, unhurried Neural2 voice.
// One of a kind (2026-10-22): Josh's Vegas Announcer, a deep, unhurried Neural2 voice.
voice_vegas: { name: 'VegasAnnouncer', emoji: 'ποΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Neural2-J', gender: 'MALE', locale: 'en-US', pitch: -4.0, speakingRate: 0.9 } },
voice_vegas: { name: 'VegasAnnouncer', emoji: 'ποΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Neural2-J', gender: 'MALE', locale: 'en-US', pitch: -4.0, speakingRate: 0.9 } },
+ // One of a kind (2026-10-23): 2fat's Bass Boss, the deepest Neural2 voice there is (pitch -8).
+ voice_twofat: { name: 'BassBoss', emoji: 'ποΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Neural2-D', gender: 'MALE', locale: 'en-US', pitch: -8.0, speakingRate: 1.0 } },
gc_journey_whisper: { name: 'JourneyWhisper', emoji: 'πΊοΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Journey-O', gender: 'FEMALE', locale: 'en-US' } },
gc_journey_whisper: { name: 'JourneyWhisper', emoji: 'πΊοΈ', engine: 'google-cloud', rarity: 'mythic', tier: 6, cloudVoice: { name: 'en-US-Journey-O', gender: 'FEMALE', locale: 'en-US' } },
// ββ Amazon Polly voices βββββββββββββββββββββββββββββββββββ
// ββ Amazon Polly voices βββββββββββββββββββββββββββββββββββ
@@ -57,6 +57,10 @@ const voiceOf = (r) => Buffer.from(String(r.audio), 'base64').toString().replace
@@ -57,6 +57,10 @@ const voiceOf = (r) => Buffer.from(String(r.audio), 'base64').toString().replace
assert.deepStrictEqual([vegas.engine, vegas.voiceId, voiceOf(vegas)], ['google-cloud', 'voice_vegas', 'en-US-Neural2-J']);
assert.deepStrictEqual([vegas.engine, vegas.voiceId, voiceOf(vegas)], ['google-cloud', 'voice_vegas', 'en-US-Neural2-J']);
const sent = JSON.parse(asked[0].body).audioConfig;
const sent = JSON.parse(asked[0].body).audioConfig;
assert.deepStrictEqual([sent.pitch, sent.speakingRate], [-4, 0.9], 'its own pitch and rate reach Google');
assert.deepStrictEqual([sent.pitch, sent.speakingRate], [-4, 0.9], 'its own pitch and rate reach Google');
+ // 2fat's Bass Boss (2026-10-23): one of a kind too, deeper still.
+ const boss = await tts.synthesize('Bangers only', 'voice_twofat', '2fat');
+ assert.deepStrictEqual([boss.engine, boss.voiceId, voiceOf(boss)], ['google-cloud', 'voice_twofat', 'en-US-Neural2-D']);
+ assert.strictEqual(JSON.parse(asked[asked.length - 1].body).audioConfig.pitch, -8);
const plain = await tts.synthesize('hello', 'gc_studio_m', 'x');
const plain = await tts.synthesize('hello', 'gc_studio_m', 'x');
assert.deepStrictEqual(JSON.parse(asked[asked.length - 1].body).audioConfig, { audioEncoding: 'MP3', speakingRate: 1, pitch: 0 }, 'other Google voices keep the defaults');
assert.deepStrictEqual(JSON.parse(asked[asked.length - 1].body).audioConfig, { audioEncoding: 'MP3', speakingRate: 1, pitch: 0 }, 'other Google voices keep the defaults');
assert.strictEqual(voiceOf(plain), 'en-US-Studio-Q');
assert.strictEqual(voiceOf(plain), 'en-US-Studio-Q');