auto-git:
[add] dist/assets/index-DifKT69O.js [change] backend/main.py [change] backend/schemas.py [change] backend/whisper_admin.py [change] dist/index.html [change] electron/main.cjs [change] src/App.jsx [change] src/GeneralSettings.jsx [change] src/audioInput.js [unlink] dist/assets/index-Dm7DZNSo.js
This commit is contained in:
@@ -295,6 +295,7 @@ export default function App() {
|
||||
const imageDragDepthRef = useRef(0)
|
||||
const [audioInputEnabled, setAudioInputEnabled] = useState(false)
|
||||
const [audioInputDeviceId, setAudioInputDeviceId] = useState('')
|
||||
const [audioInputLanguage, setAudioInputLanguage] = useState('')
|
||||
const [isRecordingAudio, setIsRecordingAudio] = useState(false)
|
||||
const [isTranscribingAudio, setIsTranscribingAudio] = useState(false)
|
||||
const [audioRecordingMs, setAudioRecordingMs] = useState(0)
|
||||
@@ -554,6 +555,7 @@ export default function App() {
|
||||
body: JSON.stringify({
|
||||
mime_type: mimeType || detectedMimeType || 'audio/webm',
|
||||
audio_base64: payload,
|
||||
language: audioInputLanguage || null,
|
||||
}),
|
||||
})
|
||||
const data = await expectBackendJson(response)
|
||||
@@ -1144,6 +1146,7 @@ async function regenerateFromIndex(index, overrideUserText = null) {
|
||||
setStreamOutput(settings.streamOutput || false);
|
||||
setAudioInputEnabled(settings.audioInputEnabled === true);
|
||||
setAudioInputDeviceId(typeof settings.audioInputDeviceId === 'string' ? settings.audioInputDeviceId : '');
|
||||
setAudioInputLanguage(typeof settings.audioInputLanguage === 'string' ? settings.audioInputLanguage : '');
|
||||
setScrollPositions(settings.scrollPositions || {}); // Load scroll positions
|
||||
applyColorScheme(settings.colorScheme || 'Default'); // Apply initial scheme
|
||||
}).finally(() => {
|
||||
@@ -2788,6 +2791,7 @@ async function createNewChat() {
|
||||
onStreamOutputChange={setStreamOutput}
|
||||
onAudioInputEnabledChange={setAudioInputEnabled}
|
||||
onAudioInputDeviceChange={setAudioInputDeviceId}
|
||||
onAudioInputLanguageChange={setAudioInputLanguage}
|
||||
onLibrariesPurged={handleLibrariesPurged}
|
||||
/>
|
||||
)}
|
||||
|
||||
@@ -2,6 +2,8 @@ import React, { useEffect, useState } from 'react';
|
||||
import {
|
||||
AUDIO_INPUT_DEVICE_ID_KEY,
|
||||
AUDIO_INPUT_ENABLED_KEY,
|
||||
AUDIO_INPUT_LANGUAGE_KEY,
|
||||
AUDIO_INPUT_LANGUAGE_OPTIONS,
|
||||
ensureAudioInputPermission,
|
||||
listAudioInputDevices,
|
||||
supportsAudioInputCapture,
|
||||
@@ -13,6 +15,7 @@ const EMBED_MODEL_KEY = 'embedModel';
|
||||
const MODEL_KEY = 'chatModel';
|
||||
const STREAM_KEY = 'streamOutput';
|
||||
const DEFAULT_AUDIO_INPUT_DEVICE_ID = '';
|
||||
const DEFAULT_AUDIO_INPUT_LANGUAGE = '';
|
||||
const DEFAULT_BACKEND_API_URL = 'http://127.0.0.1:8000';
|
||||
const DEFAULT_OLLAMA_API_URL = 'http://127.0.0.1:11434';
|
||||
const DEFAULT_EMBED_MODEL = 'nomic-embed-text:latest';
|
||||
@@ -47,6 +50,7 @@ export default function GeneralSettings({
|
||||
onBackendApiUrlChange,
|
||||
onAudioInputEnabledChange,
|
||||
onAudioInputDeviceChange,
|
||||
onAudioInputLanguageChange,
|
||||
}) {
|
||||
const [backendApiUrl, setBackendApiUrl] = useState('');
|
||||
const [ollamaApiUrl, setOllamaApiUrl] = useState('');
|
||||
@@ -56,6 +60,7 @@ export default function GeneralSettings({
|
||||
const [streamOutput, setStreamOutput] = useState(false);
|
||||
const [audioInputEnabled, setAudioInputEnabled] = useState(false);
|
||||
const [audioInputDeviceId, setAudioInputDeviceId] = useState(DEFAULT_AUDIO_INPUT_DEVICE_ID);
|
||||
const [audioInputLanguage, setAudioInputLanguage] = useState(DEFAULT_AUDIO_INPUT_LANGUAGE);
|
||||
const [audioInputDevices, setAudioInputDevices] = useState([]);
|
||||
const [isRefreshingAudioDevices, setIsRefreshingAudioDevices] = useState(false);
|
||||
const [audioInputStatus, setAudioInputStatus] = useState({ tone: 'neutral', message: '' });
|
||||
@@ -87,6 +92,11 @@ export default function GeneralSettings({
|
||||
? settings.audioInputDeviceId
|
||||
: DEFAULT_AUDIO_INPUT_DEVICE_ID
|
||||
);
|
||||
setAudioInputLanguage(
|
||||
typeof settings.audioInputLanguage === 'string'
|
||||
? settings.audioInputLanguage
|
||||
: DEFAULT_AUDIO_INPUT_LANGUAGE
|
||||
);
|
||||
setUpdateStatus(status || DEFAULT_UPDATE_STATUS);
|
||||
});
|
||||
|
||||
@@ -268,6 +278,15 @@ export default function GeneralSettings({
|
||||
}
|
||||
};
|
||||
|
||||
const handleAudioInputLanguageChange = (event) => {
|
||||
const nextLanguage = event.target.value;
|
||||
setAudioInputLanguage(nextLanguage);
|
||||
window.electronAPI.setSetting(AUDIO_INPUT_LANGUAGE_KEY, nextLanguage);
|
||||
if (onAudioInputLanguageChange) {
|
||||
onAudioInputLanguageChange(nextLanguage);
|
||||
}
|
||||
};
|
||||
|
||||
const handleCheckForUpdates = async () => {
|
||||
setIsCheckingForUpdates(true);
|
||||
try {
|
||||
@@ -425,6 +444,18 @@ export default function GeneralSettings({
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
<select
|
||||
className="select"
|
||||
value={audioInputLanguage}
|
||||
onChange={handleAudioInputLanguageChange}
|
||||
disabled={!audioInputSupported}
|
||||
>
|
||||
{AUDIO_INPUT_LANGUAGE_OPTIONS.map(language => (
|
||||
<option key={language.value || 'auto'} value={language.value}>
|
||||
{language.label}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
<button
|
||||
type="button"
|
||||
className="button"
|
||||
@@ -437,6 +468,9 @@ export default function GeneralSettings({
|
||||
{audioInputStatus.message && (
|
||||
<p className={`setting-status ${audioInputStatus.tone}`}>{audioInputStatus.message}</p>
|
||||
)}
|
||||
<p className="setting-description">
|
||||
Whisper can auto-detect the spoken language, but you can force a fixed input language here when auto-detection drifts.
|
||||
</p>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,22 @@
|
||||
export const AUDIO_INPUT_ENABLED_KEY = 'audioInputEnabled'
|
||||
export const AUDIO_INPUT_DEVICE_ID_KEY = 'audioInputDeviceId'
|
||||
export const AUDIO_INPUT_LANGUAGE_KEY = 'audioInputLanguage'
|
||||
|
||||
export const AUDIO_INPUT_LANGUAGE_OPTIONS = [
|
||||
{ value: '', label: 'Auto' },
|
||||
{ value: 'de', label: 'German' },
|
||||
{ value: 'en', label: 'English' },
|
||||
{ value: 'fr', label: 'French' },
|
||||
{ value: 'es', label: 'Spanish' },
|
||||
{ value: 'it', label: 'Italian' },
|
||||
{ value: 'pt', label: 'Portuguese' },
|
||||
{ value: 'nl', label: 'Dutch' },
|
||||
{ value: 'pl', label: 'Polish' },
|
||||
{ value: 'tr', label: 'Turkish' },
|
||||
{ value: 'ru', label: 'Russian' },
|
||||
{ value: 'ja', label: 'Japanese' },
|
||||
{ value: 'zh', label: 'Chinese' },
|
||||
]
|
||||
|
||||
const AUDIO_RECORDER_MIME_CANDIDATES = [
|
||||
'audio/webm;codecs=opus',
|
||||
|
||||
Reference in New Issue
Block a user