forked from open-webui/open-webui
		
	feat: convo mode
This commit is contained in:
		
							parent
							
								
									cb5520c519
								
							
						
					
					
						commit
						3015bb766d
					
				
					 3 changed files with 34 additions and 2 deletions
				
			
		|  | @ -674,6 +674,7 @@ | ||||||
| 							{#if messages.length == 0 || messages.at(-1).done == true} | 							{#if messages.length == 0 || messages.at(-1).done == true} | ||||||
| 								{#if speechRecognitionEnabled} | 								{#if speechRecognitionEnabled} | ||||||
| 									<button | 									<button | ||||||
|  | 										id="voice-input-button" | ||||||
| 										class=" text-gray-600 dark:text-gray-300 transition rounded-lg p-1.5 mr-0.5 self-center" | 										class=" text-gray-600 dark:text-gray-300 transition rounded-lg p-1.5 mr-0.5 self-center" | ||||||
| 										type="button" | 										type="button" | ||||||
| 										on:click={() => { | 										on:click={() => { | ||||||
|  |  | ||||||
|  | @ -149,6 +149,9 @@ | ||||||
| 
 | 
 | ||||||
| 					audio.onended = () => { | 					audio.onended = () => { | ||||||
| 						speaking = null; | 						speaking = null; | ||||||
|  | 						if ($settings.conversationMode) { | ||||||
|  | 							document.getElementById('voice-input-button')?.click(); | ||||||
|  | 						} | ||||||
| 					}; | 					}; | ||||||
| 					audio.play().catch((e) => console.error('Error playing audio:', e)); | 					audio.play().catch((e) => console.error('Error playing audio:', e)); | ||||||
| 				} | 				} | ||||||
|  | @ -166,6 +169,9 @@ | ||||||
| 
 | 
 | ||||||
| 						speak.onend = () => { | 						speak.onend = () => { | ||||||
| 							speaking = null; | 							speaking = null; | ||||||
|  | 							if ($settings.conversationMode) { | ||||||
|  | 								document.getElementById('voice-input-button')?.click(); | ||||||
|  | 							} | ||||||
| 						}; | 						}; | ||||||
| 						speak.voice = voice; | 						speak.voice = voice; | ||||||
| 						speechSynthesis.speak(speak); | 						speechSynthesis.speak(speak); | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ | ||||||
| 
 | 
 | ||||||
| 	// Voice | 	// Voice | ||||||
| 
 | 
 | ||||||
|  | 	let conversationMode = false; | ||||||
| 	let speechAutoSend = false; | 	let speechAutoSend = false; | ||||||
| 	let responseAutoPlayback = false; | 	let responseAutoPlayback = false; | ||||||
| 
 | 
 | ||||||
|  | @ -37,6 +38,11 @@ | ||||||
| 		}, 100); | 		}, 100); | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
|  | 	const toggleConversationMode = async () => { | ||||||
|  | 		conversationMode = !conversationMode; | ||||||
|  | 		saveSettings({ conversationMode: conversationMode }); | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
| 	const toggleResponseAutoPlayback = async () => { | 	const toggleResponseAutoPlayback = async () => { | ||||||
| 		responseAutoPlayback = !responseAutoPlayback; | 		responseAutoPlayback = !responseAutoPlayback; | ||||||
| 		saveSettings({ responseAutoPlayback: responseAutoPlayback }); | 		saveSettings({ responseAutoPlayback: responseAutoPlayback }); | ||||||
|  | @ -50,6 +56,7 @@ | ||||||
| 	onMount(async () => { | 	onMount(async () => { | ||||||
| 		let settings = JSON.parse(localStorage.getItem('settings') ?? '{}'); | 		let settings = JSON.parse(localStorage.getItem('settings') ?? '{}'); | ||||||
| 
 | 
 | ||||||
|  | 		conversationMode = settings.conversationMode ?? false; | ||||||
| 		speechAutoSend = settings.speechAutoSend ?? false; | 		speechAutoSend = settings.speechAutoSend ?? false; | ||||||
| 		responseAutoPlayback = settings.responseAutoPlayback ?? false; | 		responseAutoPlayback = settings.responseAutoPlayback ?? false; | ||||||
| 
 | 
 | ||||||
|  | @ -104,7 +111,25 @@ | ||||||
| 			</div> | 			</div> | ||||||
| 
 | 
 | ||||||
| 			<div class=" py-0.5 flex w-full justify-between"> | 			<div class=" py-0.5 flex w-full justify-between"> | ||||||
| 				<div class=" self-center text-xs font-medium">Voice Input Auto-Send</div> | 				<div class=" self-center text-xs font-medium">Conversation Mode</div> | ||||||
|  | 
 | ||||||
|  | 				<button | ||||||
|  | 					class="p-1 px-3 text-xs flex rounded transition" | ||||||
|  | 					on:click={() => { | ||||||
|  | 						toggleConversationMode(); | ||||||
|  | 					}} | ||||||
|  | 					type="button" | ||||||
|  | 				> | ||||||
|  | 					{#if conversationMode === true} | ||||||
|  | 						<span class="ml-2 self-center">On</span> | ||||||
|  | 					{:else} | ||||||
|  | 						<span class="ml-2 self-center">Off</span> | ||||||
|  | 					{/if} | ||||||
|  | 				</button> | ||||||
|  | 			</div> | ||||||
|  | 
 | ||||||
|  | 			<div class=" py-0.5 flex w-full justify-between"> | ||||||
|  | 				<div class=" self-center text-xs font-medium">Auto-send input after 3 sec.</div> | ||||||
| 
 | 
 | ||||||
| 				<button | 				<button | ||||||
| 					class="p-1 px-3 text-xs flex rounded transition" | 					class="p-1 px-3 text-xs flex rounded transition" | ||||||
|  | @ -122,7 +147,7 @@ | ||||||
| 			</div> | 			</div> | ||||||
| 
 | 
 | ||||||
| 			<div class=" py-0.5 flex w-full justify-between"> | 			<div class=" py-0.5 flex w-full justify-between"> | ||||||
| 				<div class=" self-center text-xs font-medium">TTS Automatic Playback</div> | 				<div class=" self-center text-xs font-medium">Auto-playback response</div> | ||||||
| 
 | 
 | ||||||
| 				<button | 				<button | ||||||
| 					class="p-1 px-3 text-xs flex rounded transition" | 					class="p-1 px-3 text-xs flex rounded transition" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek