Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

issues #6655 Open ai tts issues #6696

Merged
merged 2 commits into from
Jul 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion api/core/model_runtime/model_providers/openai/tts/tts.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,8 @@ def _tts_invoke_streaming(self, model: str, credentials: dict, content_text: str
# doc: https://platform.openai.com/docs/guides/text-to-speech
credentials_kwargs = self._to_credential_kwargs(credentials)
client = OpenAI(**credentials_kwargs)
if not voice or voice not in self.get_tts_model_voices(model=model, credentials=credentials):
model_support_voice = [x.get("value") for x in self.get_tts_model_voices(model=model, credentials=credentials)]
if not voice or voice not in model_support_voice:
voice = self._get_model_default_voice(model, credentials)
word_limit = self._get_model_word_limit(model, credentials)
if len(content_text) > word_limit:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ const VoiceParamConfig: FC = () => {

let languageItem = languages.find(item => item.value === textToSpeechConfig.language)
const localLanguagePlaceholder = languageItem?.name || t('common.placeholder.select')
if (languages && !languageItem)
if (languages && !languageItem && languages.length > 0)
languageItem = languages[0]
const language = languageItem?.value
const voiceItems = useSWR({ appId, language }, fetchAppVoices).data
let voiceItem = voiceItems?.find(item => item.value === textToSpeechConfig.voice)
if (voiceItems && !voiceItem)
if (voiceItems && !voiceItem && voiceItems.length > 0)
voiceItem = voiceItems[0]

const localVoicePlaceholder = voiceItem?.name || t('common.placeholder.select')
Expand Down Expand Up @@ -125,9 +125,11 @@ const VoiceParamConfig: FC = () => {
<div
className='mb-2 leading-[18px] text-[13px] font-semibold text-gray-800'>{t('appDebug.voice.voiceSettings.voice')}</div>
<Listbox
value={voiceItem}
value={voiceItem ?? {}}
disabled={!languageItem}
onChange={(value: Item) => {
if (!value.value)
return
setTextToSpeechConfig({
...textToSpeechConfig,
voice: String(value.value),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ const TextToSpeech: FC = () => {
<AudioBtn
value={languageInfo?.example}
isAudition
voice={textToSpeechConfig.voice}
noCache
/>
)}
Expand Down
6 changes: 6 additions & 0 deletions web/app/components/app/text-generate/item/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { useStore as useAppStore } from '@/app/components/app/store'
import WorkflowProcessItem from '@/app/components/base/chat/chat/answer/workflow-process'
import type { WorkflowProcess } from '@/app/components/base/chat/types'
import type { SiteInfo } from '@/models/share'
import { useChatContext } from '@/app/components/base/chat/chat/context'

const MAX_DEPTH = 3

Expand Down Expand Up @@ -127,6 +128,10 @@ const GenerationItem: FC<IGenerationItemProps> = ({
const [childFeedback, setChildFeedback] = useState<Feedbacktype>({
rating: null,
})
const {
config,
} = useChatContext()

const setCurrentLogItem = useAppStore(s => s.setCurrentLogItem)
const setShowPromptLogModal = useAppStore(s => s.setShowPromptLogModal)

Expand Down Expand Up @@ -430,6 +435,7 @@ const GenerationItem: FC<IGenerationItemProps> = ({
<AudioBtn
id={messageId!}
className={'mr-1'}
voice={config?.text_to_speech?.voice}
/>
</>
)}
Expand Down
2 changes: 1 addition & 1 deletion web/app/components/base/audio-btn/audio.player.manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export class AudioPlayerManager {
}

this.msgId = id
this.audioPlayers = new AudioPlayer(url, isPublic, id, msgContent, callback)
this.audioPlayers = new AudioPlayer(url, isPublic, id, msgContent, voice, callback)
return this.audioPlayers
}
}
Expand Down
5 changes: 2 additions & 3 deletions web/app/components/base/audio-btn/audio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ export default class AudioPlayer {
isPublic: boolean
callback: ((event: string) => {}) | null

constructor(streamUrl: string, isPublic: boolean, msgId: string | undefined, msgContent: string | null | undefined, callback: ((event: string) => {}) | null) {
constructor(streamUrl: string, isPublic: boolean, msgId: string | undefined, msgContent: string | null | undefined, voice: string | undefined, callback: ((event: string) => {}) | null) {
this.audioContext = new AudioContext()
this.msgId = msgId
this.msgContent = msgContent
this.url = streamUrl
this.isPublic = isPublic
this.voice = voice
this.callback = callback

// Compatible with iphone ios17 ManagedMediaSource
Expand Down Expand Up @@ -154,7 +155,6 @@ export default class AudioPlayer {
this.mediaSource?.endOfStream()
clearInterval(endTimer)
}
console.log('finishStream endOfStream endTimer')
}, 10)
}

Expand All @@ -169,7 +169,6 @@ export default class AudioPlayer {
const arrayBuffer = this.cacheBuffers.shift()!
this.sourceBuffer?.appendBuffer(arrayBuffer)
}
console.log('finishStream timer')
}, 10)
}

Expand Down
4 changes: 2 additions & 2 deletions web/app/components/base/audio-btn/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,11 @@ const AudioBtn = ({
}
const handleToggle = async () => {
if (audioState === 'playing' || audioState === 'loading') {
setAudioState('paused')
setTimeout(() => setAudioState('paused'), 1)
AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).pauseAudio()
}
else {
setAudioState('loading')
setTimeout(() => setAudioState('loading'), 1)
AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).playAudio()
}
}
Expand Down
1 change: 1 addition & 0 deletions web/app/components/base/chat/chat/answer/operation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ const Operation: FC<OperationProps> = ({
id={id}
value={content}
noCache={false}
voice={config?.text_to_speech?.voice}
className='hidden group-hover:block'
/>
</>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ const VoiceParamConfig = ({
<div
className='mb-2 leading-[18px] text-[13px] font-semibold text-gray-800'>{t('appDebug.voice.voiceSettings.voice')}</div>
<Listbox
value={voiceItem}
value={voiceItem ?? {}}
disabled={!languageItem}
onChange={(value: Item) => {
handleChange({
Expand Down