([]);
+ const [loadingVoices, setLoadingVoices] = useState(false);
+
const _loadConfig = useCallback(async () => {
if (!instanceId) return;
try {
setLoading(true);
- const result = await teamsbotApi.getConfig(instanceId);
- setConfig(result.config);
- setFormData(result.config);
+ const [configResult, languagesResult] = await Promise.all([
+ teamsbotApi.getConfig(instanceId),
+ teamsbotApi.fetchLanguages(),
+ ]);
+ setConfig(configResult.config);
+ setFormData(configResult.config);
+ setLanguages(languagesResult);
+ // Load voices for the current language
+ const lang = configResult.config.language || 'de-DE';
+ const voicesResult = await teamsbotApi.fetchVoices(lang);
+ setVoices(voicesResult);
setError(null);
} catch (err: any) {
setError(err.message || 'Fehler beim Laden der Konfiguration');
@@ -110,12 +87,21 @@ export const TeamsbotSettingsView: React.FC = () => {
setFormData(prev => ({ ...prev, [field]: value }));
};
- const _handleLanguageChange = (language: string) => {
+ const _handleLanguageChange = async (language: string) => {
_updateField('language', language);
- // Auto-select first voice for the new language
- const voices = VOICE_PRESETS[language] || [];
- if (voices.length > 0 && !voices.find(v => v.id === formData.voiceId)) {
- _updateField('voiceId', voices[0].id);
+ // Load voices for the new language dynamically
+ setLoadingVoices(true);
+ try {
+ const voicesResult = await teamsbotApi.fetchVoices(language);
+ setVoices(voicesResult);
+ // Auto-select first voice if current voice doesn't match
+ if (voicesResult.length > 0 && !voicesResult.find(v => v.name === formData.voiceId)) {
+ _updateField('voiceId', voicesResult[0].name);
+ }
+ } catch {
+ setVoices([]);
+ } finally {
+ setLoadingVoices(false);
}
};
@@ -124,7 +110,8 @@ export const TeamsbotSettingsView: React.FC = () => {
setTestingVoice(true);
try {
const language = formData.language || 'de-DE';
- const testText = TEST_TEXTS[language] || TEST_TEXTS['de-DE'];
+ const botName = formData.botName || 'AI Assistant';
+ const testText = `Hallo, ich bin ${botName}. So klinge ich in diesem Meeting.`;
const result = await teamsbotApi.testVoice(instanceId, testText, language, formData.voiceId);
if (result.success && result.audio) {
@@ -233,14 +220,19 @@ export const TeamsbotSettingsView: React.FC = () => {
value={formData.language || 'de-DE'}
onChange={(e) => _handleLanguageChange(e.target.value)}
>
- Deutsch (Deutschland)
- Deutsch (Schweiz)
- English (US)
- English (UK)
- Francais
- Italiano
+ {languages.length > 0 ? (
+ languages.map(lang => (
+ {lang.name} ({lang.code})
+ ))
+ ) : (
+ <>
+ Deutsch (Deutschland)
+ English (US)
+ Francais
+ >
+ )}
- Sprache fuer Captions und Sprachausgabe
+ Sprache fuer Captions und Sprachausgabe ({languages.length} Sprachen verfuegbar)
@@ -251,16 +243,19 @@ export const TeamsbotSettingsView: React.FC = () => {
style={{ flex: 1 }}
value={formData.voiceId || ''}
onChange={(e) => _updateField('voiceId', e.target.value)}
+ disabled={loadingVoices}
>
Standard-Stimme
- {(VOICE_PRESETS[formData.language || 'de-DE'] || []).map(voice => (
- {voice.label} ({voice.id})
+ {voices.map(voice => (
+
+ {_formatVoiceName(voice)} - {voice.name}
+
))}
@@ -268,7 +263,9 @@ export const TeamsbotSettingsView: React.FC = () => {
Test
- Google TTS Stimme - klicke Test um eine Vorschau zu hoeren
+
+ {loadingVoices ? 'Lade Stimmen...' : `${voices.length} Stimmen verfuegbar - klicke Test fuer Vorschau`}
+