Tags
Creators
Details
Licensed GPL-3.0-only
Published 6 days ago
Updated 2 days ago
All versions
2.0.0
Release
DreamVoice 2.0.03 weeks ago 7
Uploaded by
Compatibility
Minecraft: Java Edition
26.1.2
Platforms
Paper
Purpur
Spigot
Required content
Changes
Changelog 2.0.0
🚀 Architectural Overhaul & Modular Storage
- Modular Folder & Storage Architecture:
- Transitioned from a monolithic layout to a clean, isolated per-module directory structure under
plugins/DreamVoice/modules/:modules/wall/config.json: Acoustic occlusion, diffraction, and material attenuation properties.modules/speaker/data.json: 3D directional and omni speaker locations and configurations.modules/radio/data.json: Walkie-talkie and radio frequency channels.modules/record/: Dedicated subdirectories for raw capture (recordings/) and converted audio files (exports/).modules/wiretap/data.json: Wiretapping bugs persistence.modules/projection/data.json: Voice projections.modules/transmitter/data.json: Voice transmitters.
- Preserved Root Audio Library:
- The
plugins/DreamVoice/sounds/directory remains directly at the root, allowing all modules (Speakers, Radios, Intercoms) to seamlessly share common sound effects, chimes, and alarms without duplicate assets.
- The
- Root
config.jsonDedicated to Modules:- The root
config.jsonis now streamlined to exclusively handle module toggling (modules: { wall: true, speaker: true, ... }).
- The root
- Per-Module Persistence Configuration (
config.json):- Each persistent module (
speaker,radio,wiretap,projection,transmitter,room) includes its ownpersistenceblock withinmodules/<module>/config.json:save_on_stop: Whenfalse, ignores saving on server shutdown (onDreamDisable).auto_save: Enables or disables background periodic auto-saving.auto_save_interval_seconds: Dedicated interval in seconds for asynchronous persistence per module.
- Each persistent module (
- Zero-Loss Hot Migration:
- Automatic migration on startup: existing data from
data/*.json,recordings/, andexports/are moved safely into their respectivemodules/directories with zero administrative intervention and zero downtime.
- Automatic migration on startup: existing data from
- Transitioned from a monolithic layout to a clean, isolated per-module directory structure under
🌍 DreamAPI LangService Integration
- Decoupled Localization Engine:
- Integrated DreamAPI's
LangService(fr.dreamin.dreamapi.api.lang.service.LangService). - DreamVoice explicitly boots
LangServiceImplwhen running with@EnableServices(mode = LoadMode.NONE). - All hardcoded chat, action bar, title, and item lore strings are moved to
plugins/DreamVoice/lang/lang-dreamvoice.json. - Automatic per-player client locale resolution (
player.locale()) with seamless fallback to English defaults.
- Integrated DreamAPI's
🎒 DreamAPI ItemRegistryService Voice Handlers
VoiceItemHandler&VoiceItemContext:- Introduced native voice handlers designed for DreamAPI's
ItemDefinition.builder():VoiceItemHandler.addFilter("filterId"): Applies voice filter (e.g. onItemAction.SET_ARMORorItemAction.HELD).VoiceItemHandler.removeFilter("filterId"): Removes voice filter (e.g. onItemAction.REMOVE_ARMORorItemAction.UNHELD).VoiceItemHandler.toggleFilter("filterId"): Toggles filter on/off with feedback (e.g. onItemAction.RIGHT_CLICK).VoiceItemHandler.timedFilter("filterId", Duration): Applies a filter for a typedjava.time.Durationbefore auto-reverting.VoiceItemHandler.connectRadio("frequency")&disconnectRadio().VoiceItemHandler.of(consumer): Exposes an enrichedVoiceItemContextfor custom item logic directly in item builders.
- Introduced native voice handlers designed for DreamAPI's
🎛️ Custom File Filters & Auto-Registration Engine
- Annotation-Driven Auto-Registration (
@AutoVoiceFilter):- Introduced
@AutoVoiceFilter(priority = ..., enabled = ...)for automated discovery and registration of third-party or addon filters viavoiceFilterService.registerAnnotatedFilters(Collection<Class<?>>).
- Introduced
- Dynamic File Filters (
.yml,.json,.java):- Removed hardcoded filter implementations from
coresource code in favor of a 100% file-first architecture. - All 13 built-in filters (
AlienVoiceFilter.java,CaveVoiceFilter.java,DeepVoiceFilter.java,DisguiseVoiceFilter.java,GasmaskVoiceFilter.java,GhostVoiceFilter.java,HeliumVoiceFilter.java,MegaphoneVoiceFilter.java,MuffledVoiceFilter.java,RadioVoiceFilter.java,RobotVoiceFilter.java,TelephoneVoiceFilter.java,UnderwaterVoiceFilter.java) are stored incore/src/main/resources/modules/filter/filters/and automatically extracted toplugins/DreamVoice/modules/filter/filters/upon first server boot. - Filters can be created, tweaked, or removed on the fly in
plugins/DreamVoice/modules/filter/filters/. - Declarative DSP pipeline for
.ymland.json: support forlowpass,highpass,gain,overdrive,ring_modulator, anddelay/echo. - Hot-compilation of
.javasource files on-the-fly via JDKJavaCompilerwith custom in-memory classloading and dependency resolution against DreamVoice and DreamAPI. - Filter Exporter Engine:
- Added API method
voiceFilterService.exportFilter(filterId, format)supporting"yml","json", and"java". - Added commands:
/voice filter list,/voice filter reload, and/voice filter export <filter> <yml|json|java>. - Allows exporting any active filter into a declarative pipeline file (
.yml/.json) or extracting its full Java source code (.java) directly intomodules/filter/filters/.
- Added API method
- Removed hardcoded filter implementations from
🏰 Acoustic Zones & Soundproof Rooms (Acoustic Rooms)
- Module
room(plugins/DreamVoice/modules/room/):modules/room/config.json: Defines reusable acoustic presets with dedicated sound isolation percentage (isolation_pct), spatial reverberation (reverb), and automated voice filters (filters). Includes modulepersistenceconfiguration.modules/room/data.json: Stores active rooms and their DreamAPICuboidspatial bounds.
- Soundproofing & Room Attenuation Integration:
- Connected directly to
VoiceWallServiceImpl.processEntitySoundPacket. - Sound isolation blocks sound transmission completely (100% loss) if either the sender or receiver is inside a fully soundproof room, or if they are in distinct isolated rooms.
- Proportional sound attenuation loss is calculated based on effective isolation percentages.
- Connected directly to
- Dynamic Presence & Filter Stacking:
- Event listeners for DreamAPI
CuboidPlayerEnterEventandCuboidPlayerLeaveEventautomatically track player room transitions and attach or detach room filters seamlessly.
- Event listeners for DreamAPI
- Commands & Management:
- Added
/voice room list,/voice room info <id>,/voice room delete <id>, and/voice room reload.
- Added
🎙️ Speech-to-Text, Keyword Spotting & Interactive Transcription Stations
- Module
speech(plugins/DreamVoice/modules/speech/):config.json: Comprehensive configuration with English default texts, transcription mode selection (LOCALorSIDECAR), station parameters, and analysis display settings.keywords.json: Dedicated configuration defining keywords, aliases, confidence thresholds, cooldowns, and required permissions.models/: Dedicated directory storing offline Vosk models, manageable manually or downloaded via command.
- Realtime Keyword Spotting (KWS) with Constrained Vosk Grammar:
- Ultra-lightweight asynchronous background listening per player powered by Vosk.
- Utilizes a constrained grammar JSON array containing only registered keywords and
[unk], minimizing CPU usage and eliminating dictionary hallucinations. - Instant recognizer reset on keyword trigger to prevent duplicate triggers across consecutive 20ms audio frames.
- Configurable audio energy gate (
min_energy_threshold) preventing microphone hiss and background noise from feeding into the speech decoder. - Automatic phonetic buffer clearance on speech pauses (
silence_reset_ms), eliminating phantom residue and cross-phrase keyword hallucinations. - Triggers the Bukkit
VoiceKeywordSpokenEvent(player, keyword, matchedWord, confidence)for game scripting, roleplay spells, secret doors, and voice interactions. - Live debug inspector via
/voice speech debug [player]or global console logging.
- Interactive Audio Cassette Transcription Stations:
- Right-click with an Audio Cassette on a configured block (
LECTERN,JUKEBOX, or custom block materials). - Fully customizable analysis feedback with multiple display types (
ACTION_BAR,CHAT,TITLE), default English strings, andLangServicei18n translation keys. - Configurable sound effects and particle animations during the analysis period.
- Generates a formatted Written Book (
Material.WRITTEN_BOOK) containing paginated transcripts, timestamps ([00:14] Player: Text), and translatable metadata. - Automatic lectern placement (
put_on_lectern) when interacting with an empty lectern.
- Right-click with an Audio Cassette on a configured block (
- Hybrid Local (Vosk) & Sidecar (faster-whisper) Transcription Engine:
LOCALmode: runs directly inside the JVM usingcom.alphacephei:vosk.SIDECARmode: offloads audio transcription over asynchronous HTTP to an external Whisper instance with automatic fallback to local Vosk (fallback_to_local).- Production-ready official Pterodactyl Egg (
egg-dreamvoice-transcription.json).
- Model Management & Commands:
/voice speech download <lang|model>: Asynchronously downloads and unpacks official Vosk models without server freezes. Supports both lightweight small models (fr,en,de,es,it,ja,ru,pt,nl,zh) and high-accuracy big server models (fr-big,en-big,de-big,es-big,it-big,ja-big,ru-big,zh-big,hi-big,uk-big)./voice speech models&/voice speech setmodel <model>: Inspects and selects the active speech recognition model./voice speech transcribe <id> [book|chat]: Manual transcription utility for staff, moderators, and storytellers./voice speech keywords: Displays all active keyword spotting definitions and trigger phrases./voice speech reload: Hot-reloads speech configuration, keywords, and Vosk grammar definitions.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:WRYhkDTs:M8ZDYzFc"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:WRYhkDTs:M8ZDYzFc"
}

