Skip to content

Commit a467c95

Browse files
committed
fix(stage-pages): cometapi speech layout incorrect
1 parent 7e7b2cd commit a467c95

File tree

1 file changed

+51
-119
lines changed

1 file changed

+51
-119
lines changed

packages/stage-pages/src/pages/settings/providers/speech/comet-api-speech.vue

Lines changed: 51 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,166 +1,98 @@
11
<script setup lang="ts">
2-
import type { RemovableRef } from '@vueuse/core'
32
import type { SpeechProvider } from '@xsai-ext/shared-providers'
43
54
import {
6-
Alert,
7-
ProviderAdvancedSettings,
8-
ProviderApiKeyInput,
9-
ProviderBaseUrlInput,
10-
ProviderBasicSettings,
11-
ProviderSettingsContainer,
12-
ProviderSettingsLayout,
13-
SpeechPlaygroundOpenAICompatible,
5+
SpeechPlayground,
6+
SpeechProviderSettings,
147
} from '@proj-airi/stage-ui/components'
15-
import { useProviderValidation } from '@proj-airi/stage-ui/composables/use-provider-validation'
168
import { useSpeechStore } from '@proj-airi/stage-ui/stores/modules/speech'
179
import { useProvidersStore } from '@proj-airi/stage-ui/stores/providers'
1810
import { FieldRange } from '@proj-airi/ui'
1911
import { storeToRefs } from 'pinia'
20-
import { computed, ref } from 'vue'
12+
import { computed, ref, watch } from 'vue'
13+
import { useI18n } from 'vue-i18n'
2114
2215
const speechStore = useSpeechStore()
2316
const providersStore = useProvidersStore()
24-
const { providers } = storeToRefs(providersStore) as { providers: RemovableRef<Record<string, any>> }
17+
const { providers } = storeToRefs(providersStore)
18+
const { t } = useI18n()
2519
2620
const defaultVoiceSettings = {
2721
speed: 1.0,
2822
}
2923
3024
// Get provider metadata
3125
const providerId = 'comet-api-speech'
32-
33-
// Settings refs
34-
const apiKey = computed({
35-
get: () => providers.value[providerId]?.apiKey || '',
36-
set: (value) => {
37-
if (providers.value[providerId])
38-
providers.value[providerId].apiKey = value
39-
},
40-
})
41-
42-
const baseUrl = computed({
43-
get: () => providers.value[providerId]?.baseUrl || '',
44-
set: (value) => {
45-
if (providers.value[providerId])
46-
providers.value[providerId].baseUrl = value
47-
},
48-
})
49-
50-
const model = computed({
51-
get: () => providers.value[providerId]?.model || 'tts-1',
52-
set: (value) => {
53-
if (providers.value[providerId])
54-
providers.value[providerId].model = value
55-
},
56-
})
57-
58-
const voice = computed({
59-
get: () => providers.value[providerId]?.voice || 'alloy',
60-
set: (value) => {
61-
if (providers.value[providerId])
62-
providers.value[providerId].voice = value
63-
},
64-
})
26+
const defaultModel = 'gpt-4o-mini-tts'
6527
6628
const speed = ref<number>(1.0)
6729
6830
// Check if API key is configured
6931
const apiKeyConfigured = computed(() => !!providers.value[providerId]?.apiKey)
7032
71-
// Generate speech with specific parameters
72-
async function handleGenerateSpeech(input: string, voiceId: string, _useSSML: boolean, modelId?: string) {
33+
const availableVoices = computed(() => {
34+
return speechStore.availableVoices[providerId] || []
35+
})
36+
37+
// Generate speech with ElevenLabs-specific parameters
38+
async function handleGenerateSpeech(input: string, voiceId: string, _useSSML: boolean) {
7339
const provider = await providersStore.getProviderInstance<SpeechProvider<string>>(providerId)
74-
if (!provider)
40+
if (!provider) {
7541
throw new Error('Failed to initialize speech provider')
42+
}
7643
44+
// Get provider configuration
7745
const providerConfig = providersStore.getProviderConfig(providerId)
7846
47+
// Get model from configuration or use default
48+
const model = providerConfig.model as string | undefined || defaultModel
49+
50+
// ElevenLabs doesn't need SSML conversion, but if SSML is provided, use it directly
7951
return await speechStore.speech(
8052
provider,
81-
modelId || model.value,
53+
model,
8254
input,
83-
voiceId || voice.value,
55+
voiceId,
8456
{
8557
...providerConfig,
8658
...defaultVoiceSettings,
87-
speed: speed.value,
8859
},
8960
)
9061
}
9162
92-
// Use the composable to get validation logic and state
93-
const {
94-
t,
95-
router,
96-
providerMetadata,
97-
isValidating,
98-
isValid,
99-
validationMessage,
100-
handleResetSettings,
101-
} = useProviderValidation(providerId)
63+
watch(speed, async () => {
64+
const providerConfig = providersStore.getProviderConfig(providerId)
65+
providerConfig.speed = speed.value
66+
})
10267
</script>
10368

10469
<template>
105-
<ProviderSettingsLayout
106-
:provider-name="providerMetadata?.localizedName"
107-
:provider-icon-color="providerMetadata?.iconColor"
108-
:on-back="() => router.back()"
70+
<SpeechProviderSettings
71+
:provider-id="providerId"
72+
:default-model="defaultModel"
73+
:additional-settings="defaultVoiceSettings"
10974
>
110-
<ProviderSettingsContainer>
111-
<ProviderBasicSettings
112-
:title="t('settings.pages.providers.common.section.basic.title')"
113-
:description="t('settings.pages.providers.common.section.basic.description')"
114-
:on-reset="handleResetSettings"
115-
>
116-
<ProviderApiKeyInput
117-
v-model="apiKey"
118-
:required="false"
119-
:provider-name="providerMetadata?.localizedName"
120-
placeholder="sk-..."
121-
/>
122-
</ProviderBasicSettings>
123-
124-
<ProviderAdvancedSettings :title="t('settings.pages.providers.common.section.advanced.title')">
125-
<ProviderBaseUrlInput
126-
v-model="baseUrl"
127-
:placeholder="providerMetadata?.defaultOptions?.().baseUrl as string || 'https://api.cometapi.com/v1/'"
128-
/>
129-
<FieldRange
130-
v-model="speed"
131-
:label="t('settings.pages.providers.provider.common.fields.field.speed.label')"
132-
:description="t('settings.pages.providers.provider.common.fields.field.speed.description')"
133-
:min="0.5"
134-
:max="2.0" :step="0.01"
135-
/>
136-
</ProviderAdvancedSettings>
137-
138-
<!-- Validation Status -->
139-
<Alert v-if="!isValid && isValidating === 0 && validationMessage" type="error">
140-
<template #title>
141-
{{ t('settings.dialogs.onboarding.validationFailed') }}
142-
</template>
143-
<template v-if="validationMessage" #content>
144-
<div class="whitespace-pre-wrap break-all">
145-
{{ validationMessage }}
146-
</div>
147-
</template>
148-
</Alert>
149-
<Alert v-if="isValid && isValidating === 0" type="success">
150-
<template #title>
151-
{{ t('settings.dialogs.onboarding.validationSuccess') }}
152-
</template>
153-
</Alert>
154-
</ProviderSettingsContainer>
155-
156-
<SpeechPlaygroundOpenAICompatible
157-
v-model:model-value="model"
158-
v-model:voice="voice"
159-
:generate-speech="handleGenerateSpeech"
160-
:api-key-configured="apiKeyConfigured"
161-
default-text="Hello! This is a test of the Comet API Speech."
162-
/>
163-
</ProviderSettingsLayout>
75+
<!-- Voice settings specific to ElevenLabs -->
76+
<template #voice-settings>
77+
<!-- Speed control - common to most providers -->
78+
<FieldRange
79+
v-model="speed"
80+
:label="t('settings.pages.providers.provider.common.fields.field.speed.label')"
81+
:description="t('settings.pages.providers.provider.common.fields.field.speed.description')"
82+
:min="0.5"
83+
:max="2.0" :step="0.01"
84+
/>
85+
</template>
86+
87+
<template #playground>
88+
<SpeechPlayground
89+
:available-voices="availableVoices"
90+
:generate-speech="handleGenerateSpeech"
91+
:api-key-configured="apiKeyConfigured"
92+
default-text="Hello! This is a test of the OpenAI Speech."
93+
/>
94+
</template>
95+
</SpeechProviderSettings>
16496
</template>
16597

16698
<route lang="yaml">

0 commit comments

Comments
 (0)