Compare commits
16 Commits
v2.0.4
...
sidecar-v1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2246723220 | ||
|
|
1c586738f3 | ||
|
|
fb02a24334 | ||
|
|
ce64cacc5e | ||
|
|
14a7ca3b30 | ||
|
|
5b7387f9c6 | ||
|
|
293362baa1 | ||
|
|
41f50dedec | ||
|
|
d8b7811153 | ||
|
|
ec8922672c | ||
|
|
375669f657 | ||
|
|
c8b11fb0ad | ||
|
|
273a926f03 | ||
|
|
5bbbc38875 | ||
|
|
d50be6654d | ||
|
|
68abf49018 |
@@ -13,10 +13,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
NODE_VERSION: "20"
|
NODE_VERSION: "20"
|
||||||
RELEASE_TAG: ${{ inputs.tag }}
|
RELEASE_TAG: "${{ inputs.tag }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Show tag
|
- name: Show tag
|
||||||
run: echo "Building for tag: ${RELEASE_TAG}"
|
run: |
|
||||||
|
echo "Building for tag: ${RELEASE_TAG}"
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -13,10 +13,11 @@ jobs:
|
|||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
env:
|
env:
|
||||||
NODE_VERSION: "20"
|
NODE_VERSION: "20"
|
||||||
RELEASE_TAG: ${{ inputs.tag }}
|
RELEASE_TAG: "${{ inputs.tag }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Show tag
|
- name: Show tag
|
||||||
run: echo "Building for tag: ${RELEASE_TAG}"
|
run: |
|
||||||
|
echo "Building for tag: ${RELEASE_TAG}"
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ jobs:
|
|||||||
name: Build App (Windows)
|
name: Build App (Windows)
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
env:
|
env:
|
||||||
RELEASE_TAG: ${{ inputs.tag }}
|
RELEASE_TAG: "${{ inputs.tag }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Show tag
|
- name: Show tag
|
||||||
shell: powershell
|
shell: powershell
|
||||||
|
|||||||
@@ -13,10 +13,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
PYTHON_VERSION: "3.11"
|
PYTHON_VERSION: "3.11"
|
||||||
RELEASE_TAG: ${{ inputs.tag }}
|
RELEASE_TAG: "${{ inputs.tag }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Show tag
|
- name: Show tag
|
||||||
run: echo "Building cloud sidecar for tag ${RELEASE_TAG}"
|
run: |
|
||||||
|
echo "Building cloud sidecar for tag ${RELEASE_TAG}"
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@@ -85,7 +86,7 @@ jobs:
|
|||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
env:
|
env:
|
||||||
PYTHON_VERSION: "3.11"
|
PYTHON_VERSION: "3.11"
|
||||||
RELEASE_TAG: ${{ inputs.tag }}
|
RELEASE_TAG: "${{ inputs.tag }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Show tag
|
- name: Show tag
|
||||||
shell: powershell
|
shell: powershell
|
||||||
@@ -161,10 +162,11 @@ jobs:
|
|||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
env:
|
env:
|
||||||
PYTHON_VERSION: "3.11"
|
PYTHON_VERSION: "3.11"
|
||||||
RELEASE_TAG: ${{ inputs.tag }}
|
RELEASE_TAG: "${{ inputs.tag }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Show tag
|
- name: Show tag
|
||||||
run: echo "Building cloud sidecar for tag ${RELEASE_TAG}"
|
run: |
|
||||||
|
echo "Building cloud sidecar for tag ${RELEASE_TAG}"
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -13,10 +13,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
PYTHON_VERSION: "3.11"
|
PYTHON_VERSION: "3.11"
|
||||||
RELEASE_TAG: ${{ inputs.tag }}
|
RELEASE_TAG: "${{ inputs.tag }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Show tag
|
- name: Show tag
|
||||||
run: echo "Building for tag: ${RELEASE_TAG}"
|
run: |
|
||||||
|
echo "Building for tag: ${RELEASE_TAG}"
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@@ -39,26 +40,16 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y portaudio19-dev
|
sudo apt-get install -y portaudio19-dev
|
||||||
|
|
||||||
- name: Build sidecar (CUDA)
|
|
||||||
run: |
|
|
||||||
uv sync --frozen || uv sync
|
|
||||||
uv run pyinstaller local-transcription-headless.spec
|
|
||||||
|
|
||||||
- name: Package sidecar (CUDA)
|
|
||||||
run: |
|
|
||||||
cd dist/local-transcription-backend && zip -r ../../sidecar-linux-x86_64-cuda.zip .
|
|
||||||
|
|
||||||
- name: Build sidecar (CPU)
|
- name: Build sidecar (CPU)
|
||||||
|
env:
|
||||||
|
UV_NO_SOURCES: "1"
|
||||||
run: |
|
run: |
|
||||||
rm -rf dist/local-transcription-backend build/
|
uv sync
|
||||||
uv pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu --force-reinstall
|
|
||||||
# Run pyinstaller directly from venv to prevent uv run from
|
|
||||||
# re-resolving torch back to the CUDA version via pyproject.toml sources
|
|
||||||
.venv/bin/pyinstaller local-transcription-headless.spec
|
.venv/bin/pyinstaller local-transcription-headless.spec
|
||||||
|
|
||||||
- name: Package sidecar (CPU)
|
- name: Package sidecar (CPU)
|
||||||
run: |
|
run: |
|
||||||
cd dist/local-transcription-backend && zip -r ../../sidecar-linux-x86_64-cpu.zip .
|
cd dist/local-transcription-backend && zip -9 -r ../../sidecar-linux-x86_64-cpu.zip .
|
||||||
|
|
||||||
- name: Upload to sidecar release
|
- name: Upload to sidecar release
|
||||||
env:
|
env:
|
||||||
|
|||||||
@@ -13,10 +13,11 @@ jobs:
|
|||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
env:
|
env:
|
||||||
PYTHON_VERSION: "3.11"
|
PYTHON_VERSION: "3.11"
|
||||||
RELEASE_TAG: ${{ inputs.tag }}
|
RELEASE_TAG: "${{ inputs.tag }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Show tag
|
- name: Show tag
|
||||||
run: echo "Building for tag: ${RELEASE_TAG}"
|
run: |
|
||||||
|
echo "Building for tag: ${RELEASE_TAG}"
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ jobs:
|
|||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
env:
|
env:
|
||||||
PYTHON_VERSION: "3.11"
|
PYTHON_VERSION: "3.11"
|
||||||
RELEASE_TAG: ${{ inputs.tag }}
|
RELEASE_TAG: "${{ inputs.tag }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Show tag
|
- name: Show tag
|
||||||
shell: powershell
|
shell: powershell
|
||||||
@@ -54,29 +54,18 @@ jobs:
|
|||||||
choco install 7zip -y
|
choco install 7zip -y
|
||||||
}
|
}
|
||||||
|
|
||||||
- name: Build sidecar (CUDA)
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
uv sync --frozen
|
|
||||||
if ($LASTEXITCODE -ne 0) { uv sync }
|
|
||||||
uv run pyinstaller local-transcription-headless.spec
|
|
||||||
|
|
||||||
- name: Package sidecar (CUDA)
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
7z a -tzip -mx=5 sidecar-windows-x86_64-cuda.zip .\dist\local-transcription-backend\*
|
|
||||||
|
|
||||||
- name: Build sidecar (CPU)
|
- name: Build sidecar (CPU)
|
||||||
shell: powershell
|
shell: powershell
|
||||||
|
env:
|
||||||
|
UV_NO_SOURCES: "1"
|
||||||
run: |
|
run: |
|
||||||
Remove-Item -Recurse -Force dist\local-transcription-backend, build -ErrorAction SilentlyContinue
|
uv sync
|
||||||
uv pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu --force-reinstall
|
|
||||||
.venv\Scripts\pyinstaller.exe local-transcription-headless.spec
|
.venv\Scripts\pyinstaller.exe local-transcription-headless.spec
|
||||||
|
|
||||||
- name: Package sidecar (CPU)
|
- name: Package sidecar (CPU)
|
||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
7z a -tzip -mx=5 sidecar-windows-x86_64-cpu.zip .\dist\local-transcription-backend\*
|
7z a -tzip -mx=9 sidecar-windows-x86_64-cpu.zip .\dist\local-transcription-backend\*
|
||||||
|
|
||||||
- name: Upload to sidecar release
|
- name: Upload to sidecar release
|
||||||
shell: powershell
|
shell: powershell
|
||||||
|
|||||||
@@ -109,50 +109,14 @@ jobs:
|
|||||||
|
|
||||||
for workflow in build-app-linux.yml build-app-windows.yml build-app-macos.yml; do
|
for workflow in build-app-linux.yml build-app-windows.yml build-app-macos.yml; do
|
||||||
echo "Dispatching ${workflow} for ${TAG}..."
|
echo "Dispatching ${workflow} for ${TAG}..."
|
||||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
|
HTTP_CODE=$(curl -s -w "%{http_code}" -o /tmp/dispatch_resp.txt -X POST \
|
||||||
-H "Authorization: token ${BUILD_TOKEN}" \
|
-H "Authorization: token ${BUILD_TOKEN}" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d "{\"ref\": \"main\", \"inputs\": {\"tag\": \"${TAG}\"}}" \
|
-d "{\"ref\": \"main\", \"inputs\": {\"tag\": \"${TAG}\"}}" \
|
||||||
"${REPO_API}/actions/workflows/${workflow}/dispatches")
|
"${REPO_API}/actions/workflows/${workflow}/dispatches")
|
||||||
echo " -> HTTP ${HTTP_CODE}"
|
echo " -> HTTP ${HTTP_CODE}"
|
||||||
|
[ "$HTTP_CODE" != "204" ] && cat /tmp/dispatch_resp.txt && echo ""
|
||||||
done
|
done
|
||||||
|
|
||||||
- name: Clean up old app releases
|
# NOTE: Automatic cleanup disabled -- it races with async builds.
|
||||||
env:
|
# Clean up old releases manually from the Gitea UI when needed.
|
||||||
BUILD_TOKEN: ${{ secrets.BUILD_TOKEN }}
|
|
||||||
run: |
|
|
||||||
REPO_API="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}"
|
|
||||||
KEEP=3
|
|
||||||
PROTECT_TAG="v1.4.0"
|
|
||||||
|
|
||||||
echo "Cleaning up old app releases (keeping latest ${KEEP} + ${PROTECT_TAG})..."
|
|
||||||
|
|
||||||
# Get all app releases (v* tags, not sidecar-v*)
|
|
||||||
RELEASES=$(curl -s -H "Authorization: token ${BUILD_TOKEN}" \
|
|
||||||
"${REPO_API}/releases?limit=50" | jq -c '[.[] | select(.tag_name | startswith("v")) | select(.tag_name | startswith("sidecar") | not)]')
|
|
||||||
|
|
||||||
TOTAL=$(echo "$RELEASES" | jq 'length')
|
|
||||||
echo "Found ${TOTAL} app releases"
|
|
||||||
|
|
||||||
if [ "$TOTAL" -le "$KEEP" ]; then
|
|
||||||
echo "Nothing to clean up"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Skip the newest KEEP releases, delete the rest (except protected)
|
|
||||||
echo "$RELEASES" | jq -c ".[$KEEP:][]" | while read -r release; do
|
|
||||||
ID=$(echo "$release" | jq -r '.id')
|
|
||||||
TAG=$(echo "$release" | jq -r '.tag_name')
|
|
||||||
|
|
||||||
if [ "$TAG" = "$PROTECT_TAG" ]; then
|
|
||||||
echo " Protecting ${TAG}"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " Deleting release ${TAG} (ID: ${ID})..."
|
|
||||||
curl -s -X DELETE -H "Authorization: token ${BUILD_TOKEN}" \
|
|
||||||
"${REPO_API}/releases/${ID}"
|
|
||||||
# Keep the git tag -- only delete the release (assets).
|
|
||||||
# Deleting tags breaks builds that haven't checked out yet.
|
|
||||||
done
|
|
||||||
echo "Cleanup complete"
|
|
||||||
|
|||||||
@@ -128,37 +128,5 @@ jobs:
|
|||||||
echo " -> HTTP ${HTTP_CODE}"
|
echo " -> HTTP ${HTTP_CODE}"
|
||||||
done
|
done
|
||||||
|
|
||||||
- name: Clean up old sidecar releases
|
# NOTE: Automatic cleanup disabled -- it races with async builds.
|
||||||
if: steps.check_changes.outputs.has_changes == 'true'
|
# Clean up old releases manually from the Gitea UI when needed.
|
||||||
env:
|
|
||||||
BUILD_TOKEN: ${{ secrets.BUILD_TOKEN }}
|
|
||||||
run: |
|
|
||||||
REPO_API="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}"
|
|
||||||
KEEP=2
|
|
||||||
|
|
||||||
echo "Cleaning up old sidecar releases (keeping latest ${KEEP})..."
|
|
||||||
|
|
||||||
# Get all sidecar releases (sidecar-v* tags)
|
|
||||||
RELEASES=$(curl -s -H "Authorization: token ${BUILD_TOKEN}" \
|
|
||||||
"${REPO_API}/releases?limit=50" | jq -c '[.[] | select(.tag_name | startswith("sidecar-v"))]')
|
|
||||||
|
|
||||||
TOTAL=$(echo "$RELEASES" | jq 'length')
|
|
||||||
echo "Found ${TOTAL} sidecar releases"
|
|
||||||
|
|
||||||
if [ "$TOTAL" -le "$KEEP" ]; then
|
|
||||||
echo "Nothing to clean up"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Skip the newest KEEP releases, delete the rest
|
|
||||||
echo "$RELEASES" | jq -c ".[$KEEP:][]" | while read -r release; do
|
|
||||||
ID=$(echo "$release" | jq -r '.id')
|
|
||||||
TAG=$(echo "$release" | jq -r '.tag_name')
|
|
||||||
|
|
||||||
echo " Deleting sidecar release ${TAG} (ID: ${ID})..."
|
|
||||||
curl -s -X DELETE -H "Authorization: token ${BUILD_TOKEN}" \
|
|
||||||
"${REPO_API}/releases/${ID}"
|
|
||||||
# Keep the git tag -- only delete the release (assets).
|
|
||||||
# Deleting tags breaks builds that haven't checked out yet.
|
|
||||||
done
|
|
||||||
echo "Cleanup complete"
|
|
||||||
|
|||||||
@@ -106,6 +106,12 @@ class AppController:
|
|||||||
DeviceManager = None
|
DeviceManager = None
|
||||||
|
|
||||||
self.device_manager = DeviceManager() if DeviceManager else None
|
self.device_manager = DeviceManager() if DeviceManager else None
|
||||||
|
self.is_cloud_only = DeviceManager is None
|
||||||
|
|
||||||
|
# If this is the cloud-only sidecar and mode is still "local",
|
||||||
|
# auto-switch to "byok" so the engine doesn't try to load Whisper.
|
||||||
|
if self.is_cloud_only and self.config.get('remote.mode', 'local') == 'local':
|
||||||
|
self.config.set('remote.mode', 'byok')
|
||||||
|
|
||||||
# State
|
# State
|
||||||
self._state = AppState.INITIALIZING
|
self._state = AppState.INITIALIZING
|
||||||
@@ -300,8 +306,17 @@ class AppController:
|
|||||||
# Lazy-import heavy local transcription dependencies
|
# Lazy-import heavy local transcription dependencies
|
||||||
global RealtimeTranscriptionEngine
|
global RealtimeTranscriptionEngine
|
||||||
if RealtimeTranscriptionEngine is None:
|
if RealtimeTranscriptionEngine is None:
|
||||||
from client.transcription_engine_realtime import RealtimeTranscriptionEngine as _RTE
|
try:
|
||||||
RealtimeTranscriptionEngine = _RTE
|
from client.transcription_engine_realtime import RealtimeTranscriptionEngine as _RTE
|
||||||
|
RealtimeTranscriptionEngine = _RTE
|
||||||
|
except ImportError:
|
||||||
|
# Cloud-only sidecar -- local engine not available
|
||||||
|
self._set_state(
|
||||||
|
AppState.ERROR,
|
||||||
|
"Local transcription not available in this build. "
|
||||||
|
"Please switch to Cloud (Deepgram) mode in Settings."
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
if self.device_manager:
|
if self.device_manager:
|
||||||
self.device_manager.set_device(device_config)
|
self.device_manager.set_device(device_config)
|
||||||
@@ -358,7 +373,15 @@ class AppController:
|
|||||||
|
|
||||||
self._set_state(AppState.READY, f"Ready | Device: {device_display}")
|
self._set_state(AppState.READY, f"Ready | Device: {device_display}")
|
||||||
else:
|
else:
|
||||||
self._set_state(AppState.ERROR, message)
|
# Cloud sidecar with no API key -- show helpful setup message
|
||||||
|
# instead of a scary error. The user needs to enter their key.
|
||||||
|
if self.is_cloud_only:
|
||||||
|
self._set_state(
|
||||||
|
AppState.READY,
|
||||||
|
"Setup needed: Open Settings > Remote Transcription > enter your Deepgram API key"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self._set_state(AppState.ERROR, message)
|
||||||
|
|
||||||
# ── Transcription Control ──────────────────────────────────────
|
# ── Transcription Control ──────────────────────────────────────
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "local-transcription",
|
"name": "local-transcription",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2.0.4",
|
"version": "2.0.8",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite dev",
|
"dev": "vite dev",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "local-transcription"
|
name = "local-transcription"
|
||||||
version = "1.0.4"
|
version = "1.0.7"
|
||||||
description = "A standalone desktop application for real-time speech-to-text transcription using Whisper models"
|
description = "A standalone desktop application for real-time speech-to-text transcription using Whisper models"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "local-transcription"
|
name = "local-transcription"
|
||||||
version = "2.0.4"
|
version = "2.0.8"
|
||||||
description = "Real-time speech-to-text transcription for streamers"
|
description = "Real-time speech-to-text transcription for streamers"
|
||||||
authors = ["Local Transcription Contributors"]
|
authors = ["Local Transcription Contributors"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"productName": "Local Transcription",
|
"productName": "Local Transcription",
|
||||||
"version": "2.0.4",
|
"version": "2.0.8",
|
||||||
"identifier": "net.anhonesthost.local-transcription",
|
"identifier": "net.anhonesthost.local-transcription",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../dist",
|
"frontendDist": "../dist",
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
} else {
|
} else {
|
||||||
await backendStore.apiPost("/api/start");
|
await backendStore.apiPost("/api/start");
|
||||||
}
|
}
|
||||||
|
// Poll status to update UI immediately instead of waiting
|
||||||
|
// for WebSocket broadcast (which can be delayed or missed)
|
||||||
|
await backendStore.pollStatus();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("Failed to toggle transcription:", err);
|
console.error("Failed to toggle transcription:", err);
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@@ -36,11 +36,12 @@
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Listen for progress events from the Tauri backend
|
// Listen for progress events from the Tauri backend
|
||||||
unlisten = await listen<{ progress: number; message: string }>(
|
unlisten = await listen<{ downloaded: number; total: number; phase: string; message: string }>(
|
||||||
"sidecar-download-progress",
|
"sidecar-download-progress",
|
||||||
(event) => {
|
(event) => {
|
||||||
progress = event.payload.progress;
|
const { downloaded, total, message } = event.payload;
|
||||||
progressMessage = event.payload.message;
|
progress = total > 0 ? (downloaded / total) * 100 : 0;
|
||||||
|
progressMessage = message;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -125,23 +126,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label class="variant-option" class:selected={variant === "cuda"}>
|
|
||||||
<input
|
|
||||||
type="radio"
|
|
||||||
name="variant"
|
|
||||||
value="cuda"
|
|
||||||
bind:group={variant}
|
|
||||||
/>
|
|
||||||
<div class="variant-info">
|
|
||||||
<span class="variant-name">Local - GPU (NVIDIA CUDA)</span>
|
|
||||||
<span class="variant-desc">~2 GB download</span>
|
|
||||||
<span class="variant-detail">
|
|
||||||
Runs Whisper AI models locally using your NVIDIA GPU for fast
|
|
||||||
transcription. No internet needed after download. Requires an
|
|
||||||
NVIDIA GPU with CUDA support.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button class="download-btn" onclick={startDownload}>
|
<button class="download-btn" onclick={startDownload}>
|
||||||
|
|||||||
@@ -302,6 +302,7 @@ export const backendStore = {
|
|||||||
setPort,
|
setPort,
|
||||||
connect: connectWebSocket,
|
connect: connectWebSocket,
|
||||||
disconnect,
|
disconnect,
|
||||||
|
pollStatus,
|
||||||
apiUrl,
|
apiUrl,
|
||||||
apiFetch,
|
apiFetch,
|
||||||
apiGet,
|
apiGet,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"""Version information for Local Transcription."""
|
"""Version information for Local Transcription."""
|
||||||
|
|
||||||
__version__ = "2.0.4"
|
__version__ = "2.0.8"
|
||||||
__version_info__ = (2, 0, 4)
|
__version_info__ = (2, 0, 8)
|
||||||
|
|
||||||
# Version history:
|
# Version history:
|
||||||
# 1.4.0 - Auto-update feature:
|
# 1.4.0 - Auto-update feature:
|
||||||
|
|||||||
Reference in New Issue
Block a user