Document markup and improve choice tags
This commit is contained in:
@@ -9,7 +9,7 @@ export class KokoroTTSModule extends TTSHandlerModule {
|
||||
super('kokoro-tts', 'Kokoro TTS');
|
||||
|
||||
// Declare proper dependencies according to architecture principles
|
||||
this.dependencies = ['persistence-manager', 'localization'];
|
||||
this.dependencies = ['persistence-manager', 'localization', 'game-config'];
|
||||
|
||||
// State
|
||||
this.iframe = null;
|
||||
@@ -59,6 +59,13 @@ export class KokoroTTSModule extends TTSHandlerModule {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.addEventListener(document, 'preference-updated', (event) => {
|
||||
const { category, key } = event.detail || {};
|
||||
if (category === 'audio' && ['masterVolume', 'ttsVolume', 'masterVolumeEnabled', 'ttsVolumeEnabled'].includes(key) && this.currentAudio) {
|
||||
this.currentAudio.volume = this.getPlaybackVolume();
|
||||
}
|
||||
});
|
||||
|
||||
const ttsEnabled = persistenceManager.getPreference('tts', 'enabled', false);
|
||||
const preferredHandler = persistenceManager.getPreference('tts', 'preferred_handler', 'none');
|
||||
if (!ttsEnabled || preferredHandler !== this.id) {
|
||||
@@ -256,8 +263,8 @@ export class KokoroTTSModule extends TTSHandlerModule {
|
||||
}
|
||||
|
||||
// Get current locale
|
||||
const localization = this.getModule('localization');
|
||||
const locale = localization ? localization.getLocale() : null;
|
||||
const gameConfig = this.getModule('game-config');
|
||||
const locale = gameConfig?.getLocale?.() || 'en_US';
|
||||
|
||||
// Get preferred voice from preferences
|
||||
const preferredVoiceId = persistenceManager.getPreference('tts', 'kokoro_voice', '');
|
||||
@@ -367,6 +374,20 @@ export class KokoroTTSModule extends TTSHandlerModule {
|
||||
this.setOptions({ volume: Math.max(0, Math.min(1, options.volume)) });
|
||||
}
|
||||
}
|
||||
|
||||
getPlaybackVolume() {
|
||||
const persistenceManager = this.getModule('persistence-manager');
|
||||
if (!persistenceManager) {
|
||||
return this.options.volume;
|
||||
}
|
||||
|
||||
const masterVolume = persistenceManager.getPreference('audio', 'masterVolume', 1.0);
|
||||
const ttsVolume = persistenceManager.getPreference('audio', 'ttsVolume', 1.0);
|
||||
const masterEnabled = persistenceManager.getPreference('audio', 'masterVolumeEnabled', true) !== false;
|
||||
const ttsEnabled = persistenceManager.getPreference('audio', 'ttsVolumeEnabled', true) !== false;
|
||||
|
||||
return Math.max(0, Math.min(1, this.options.volume * (masterEnabled ? masterVolume : 0) * (ttsEnabled ? ttsVolume : 0)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get available voices
|
||||
@@ -431,9 +452,10 @@ export class KokoroTTSModule extends TTSHandlerModule {
|
||||
* @returns {boolean} - Success status
|
||||
*/
|
||||
speakPreloaded(preloadData, callback = null) {
|
||||
const completionCallback = typeof callback === 'function' ? callback : null;
|
||||
if (!this.isReady || !preloadData || !preloadData.audioData) {
|
||||
if (callback) {
|
||||
callback({ success: false, reason: 'invalid_data' });
|
||||
if (completionCallback) {
|
||||
completionCallback({ success: false, reason: 'invalid_data' });
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -446,22 +468,22 @@ export class KokoroTTSModule extends TTSHandlerModule {
|
||||
const audioUrl = URL.createObjectURL(audioBlob);
|
||||
|
||||
const audio = new Audio(audioUrl);
|
||||
audio.volume = this.options.volume;
|
||||
audio.volume = this.getPlaybackVolume();
|
||||
audio.playbackRate = this.options.rate;
|
||||
|
||||
// Set up event handlers
|
||||
audio.onended = () => {
|
||||
this.isSpeaking = false;
|
||||
if (callback) {
|
||||
callback({ success: true });
|
||||
if (completionCallback) {
|
||||
completionCallback({ success: true });
|
||||
}
|
||||
URL.revokeObjectURL(audioUrl);
|
||||
};
|
||||
|
||||
audio.onerror = (error) => {
|
||||
this.isSpeaking = false;
|
||||
if (callback) {
|
||||
callback({ success: false, reason: 'playback_error', error });
|
||||
if (completionCallback) {
|
||||
completionCallback({ success: false, reason: 'playback_error', error });
|
||||
}
|
||||
URL.revokeObjectURL(audioUrl);
|
||||
};
|
||||
@@ -475,8 +497,8 @@ export class KokoroTTSModule extends TTSHandlerModule {
|
||||
}));
|
||||
}).catch(error => {
|
||||
this.isSpeaking = false;
|
||||
if (callback) {
|
||||
callback({ success: false, reason: 'playback_error', error });
|
||||
if (completionCallback) {
|
||||
completionCallback({ success: false, reason: 'playback_error', error });
|
||||
}
|
||||
URL.revokeObjectURL(audioUrl);
|
||||
});
|
||||
@@ -513,7 +535,7 @@ export class KokoroTTSModule extends TTSHandlerModule {
|
||||
|
||||
// Create and play audio
|
||||
const audio = new Audio(audioUrl);
|
||||
audio.volume = this.options.volume;
|
||||
audio.volume = this.getPlaybackVolume();
|
||||
audio.playbackRate = this.options.rate;
|
||||
|
||||
// Set up event handlers
|
||||
|
||||
Reference in New Issue
Block a user