---
Browse files**DeepSeek V3 Tasks**
1. Generate all frontend and backend source code exactly as specified.
2. Integrate Whisper v3 and DeepSeek Speech API with auto-fallback logic.
3. Implement GPU-toggle logic from `.env`.
4. Include full `README.md` with setup and deploy instructions.
5. Provide `.env.example` prefilled with required keys.
6. Output should include:
- `/client` folder
- `/server` folder
- `README.md`
- `.env.example`
- Optional Dockerfile for container deployment.
---
Deliver the entire ready-to-run project with clear folder separation, build commands, and production optimization. All responses should contain the **complete codebase**, not summaries or pseudocode.
- api-docs.html +118 -0
- index.html +87 -21
api-docs.html
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" class="dark">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>API Documentation - AudioSlicer Pro</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.net.min.js"></script>
|
| 11 |
+
</head>
|
| 12 |
+
<body class="bg-gray-900 text-gray-100 min-h-screen">
|
| 13 |
+
<div id="vanta-bg" class="vanta-container"></div>
|
| 14 |
+
|
| 15 |
+
<div class="container mx-auto px-4 py-12 max-w-5xl">
|
| 16 |
+
<header class="mb-12">
|
| 17 |
+
<h1 class="text-3xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-secondary mb-2">
|
| 18 |
+
AudioSlicer Pro API
|
| 19 |
+
</h1>
|
| 20 |
+
<p class="text-gray-400">REST API documentation for integrating with our audio processing services</p>
|
| 21 |
+
</header>
|
| 22 |
+
|
| 23 |
+
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
|
| 24 |
+
<div class="lg:col-span-1">
|
| 25 |
+
<div class="bg-gray-800 rounded-xl p-6 shadow-xl border border-gray-700 sticky top-8">
|
| 26 |
+
<h2 class="text-xl font-semibold mb-4">Endpoints</h2>
|
| 27 |
+
<ul class="space-y-2">
|
| 28 |
+
<li><a href="#transcription" class="text-primary hover:text-primary/80">Transcription</a></li>
|
| 29 |
+
<li><a href="#segmentation" class="text-primary hover:text-primary/80">Segmentation</a></li>
|
| 30 |
+
<li><a href="#analysis" class="text-primary hover:text-primary/80">Analysis</a></li>
|
| 31 |
+
</ul>
|
| 32 |
+
<div class="mt-8">
|
| 33 |
+
<h2 class="text-xl font-semibold mb-4">Authentication</h2>
|
| 34 |
+
<div class="bg-gray-700 p-4 rounded-lg">
|
| 35 |
+
<code class="text-xs">X-API-KEY: your_api_key</code>
|
| 36 |
+
</div>
|
| 37 |
+
</div>
|
| 38 |
+
</div>
|
| 39 |
+
</div>
|
| 40 |
+
|
| 41 |
+
<div class="lg:col-span-2 space-y-12">
|
| 42 |
+
<section id="transcription" class="bg-gray-800 rounded-xl p-6 shadow-xl border border-gray-700">
|
| 43 |
+
<div class="flex items-center mb-4">
|
| 44 |
+
<span class="bg-primary text-white px-3 py-1 rounded-full text-xs font-medium mr-3">POST</span>
|
| 45 |
+
<h2 class="text-xl font-semibold">/api/transcribe</h2>
|
| 46 |
+
</div>
|
| 47 |
+
|
| 48 |
+
<p class="text-gray-400 mb-6">Transcribe audio files using Whisper v3 or DeepSeek Speech models.</p>
|
| 49 |
+
|
| 50 |
+
<h3 class="font-medium mb-2">Parameters</h3>
|
| 51 |
+
<div class="bg-gray-700 rounded-lg p-4 mb-6 overflow-x-auto">
|
| 52 |
+
<pre class="text-sm"><code>{
|
| 53 |
+
"audio": "base64_encoded_audio",
|
| 54 |
+
"model": "whisper|deepseek|auto",
|
| 55 |
+
"language": "auto|en|es|fr|de|...",
|
| 56 |
+
"timestamps": true,
|
| 57 |
+
"speakers": false
|
| 58 |
+
}</code></pre>
|
| 59 |
+
</div>
|
| 60 |
+
|
| 61 |
+
<h3 class="font-medium mb-2">Example Response</h3>
|
| 62 |
+
<div class="bg-gray-700 rounded-lg p-4 overflow-x-auto">
|
| 63 |
+
<pre class="text-sm"><code>{
|
| 64 |
+
"success": true,
|
| 65 |
+
"processing_time": 4.32,
|
| 66 |
+
"segments": [
|
| 67 |
+
{
|
| 68 |
+
"start": 0.0,
|
| 69 |
+
"end": 5.24,
|
| 70 |
+
"text": "Hello world...",
|
| 71 |
+
"speaker": "Speaker 1"
|
| 72 |
+
}
|
| 73 |
+
]
|
| 74 |
+
}</code></pre>
|
| 75 |
+
</div>
|
| 76 |
+
</section>
|
| 77 |
+
|
| 78 |
+
<section id="segmentation" class="bg-gray-800 rounded-xl p-6 shadow-xl border border-gray-700">
|
| 79 |
+
<div class="flex items-center mb-4">
|
| 80 |
+
<span class="bg-green-500 text-white px-3 py-1 rounded-full text-xs font-medium mr-3">POST</span>
|
| 81 |
+
<h2 class="text-xl font-semibold">/api/segment</h2>
|
| 82 |
+
</div>
|
| 83 |
+
<p class="text-gray-400 mb-6">Split audio files into logical segments based on silence detection.</p>
|
| 84 |
+
<!-- Additional content would go here -->
|
| 85 |
+
</section>
|
| 86 |
+
|
| 87 |
+
<section id="analysis" class="bg-gray-800 rounded-xl p-6 shadow-xl border border-gray-700">
|
| 88 |
+
<div class="flex items-center mb-4">
|
| 89 |
+
<span class="bg-blue-500 text-white px-3 py-1 rounded-full text-xs font-medium mr-3">GET</span>
|
| 90 |
+
<h2 class="text-xl font-semibold">/api/analyze</h2>
|
| 91 |
+
</div>
|
| 92 |
+
<p class="text-gray-400 mb-6">Analyze audio characteristics and metadata.</p>
|
| 93 |
+
<!-- Additional content would go here -->
|
| 94 |
+
</section>
|
| 95 |
+
</div>
|
| 96 |
+
</div>
|
| 97 |
+
</div>
|
| 98 |
+
|
| 99 |
+
<script>
|
| 100 |
+
VANTA.NET({
|
| 101 |
+
el: "#vanta-bg",
|
| 102 |
+
mouseControls: true,
|
| 103 |
+
touchControls: true,
|
| 104 |
+
gyroControls: false,
|
| 105 |
+
minHeight: 200.00,
|
| 106 |
+
minWidth: 200.00,
|
| 107 |
+
scale: 1.00,
|
| 108 |
+
scaleMobile: 1.00,
|
| 109 |
+
color: '#3b82f6',
|
| 110 |
+
backgroundColor: '#0f172a',
|
| 111 |
+
points: 10.00,
|
| 112 |
+
maxDistance: 22.00,
|
| 113 |
+
spacing: 18.00
|
| 114 |
+
})
|
| 115 |
+
feather.replace()
|
| 116 |
+
</script>
|
| 117 |
+
</body>
|
| 118 |
+
</html>
|
index.html
CHANGED
|
@@ -94,13 +94,16 @@
|
|
| 94 |
</div>
|
| 95 |
|
| 96 |
<div class="space-y-4">
|
| 97 |
-
<
|
| 98 |
-
<
|
| 99 |
-
<
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
|
|
|
|
|
|
|
|
|
| 104 |
<h3 class="text-sm font-medium text-gray-300 mb-3 flex items-center">
|
| 105 |
<i data-feather="sliders" class="w-4 h-4 mr-2"></i>
|
| 106 |
Segmentation Parameters
|
|
@@ -115,7 +118,7 @@
|
|
| 115 |
<input type="number" min="1" max="30" value="5" class="w-full bg-gray-600 border border-gray-500 rounded px-3 py-1">
|
| 116 |
</div>
|
| 117 |
<div class="flex justify-between">
|
| 118 |
-
<button class="bg-primary hover:bg-primary/90 text-white px-4 py-2 rounded-md text-sm flex items-center">
|
| 119 |
<i data-feather="play" class="w-4 h-4 mr-1"></i>
|
| 120 |
Process
|
| 121 |
</button>
|
|
@@ -124,7 +127,15 @@
|
|
| 124 |
Advanced
|
| 125 |
</button>
|
| 126 |
</div>
|
| 127 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
</div>
|
| 129 |
</div>
|
| 130 |
<!-- Progress Bar -->
|
|
@@ -253,19 +264,32 @@
|
|
| 253 |
<!-- Footer -->
|
| 254 |
<footer class="mt-16 text-center text-gray-500 text-sm">
|
| 255 |
<div class="flex justify-center space-x-6 mb-4">
|
| 256 |
-
<a href="
|
| 257 |
-
<a href="
|
| 258 |
-
<a href="
|
| 259 |
-
<a href="
|
|
|
|
| 260 |
</div>
|
| 261 |
-
|
| 262 |
</footer>
|
| 263 |
</div>
|
| 264 |
|
| 265 |
<script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 266 |
// Initialize Vanta.js background
|
| 267 |
VANTA.NET({
|
| 268 |
-
|
| 269 |
mouseControls: true,
|
| 270 |
touchControls: true,
|
| 271 |
gyroControls: false,
|
|
@@ -282,18 +306,60 @@
|
|
| 282 |
|
| 283 |
// Initialize feather icons
|
| 284 |
feather.replace()
|
| 285 |
-
//
|
| 286 |
-
document.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 287 |
const emptyState = document.getElementById('empty-state')
|
| 288 |
const segmentsContainer = document.getElementById('segments-container')
|
| 289 |
|
| 290 |
emptyState.classList.add('hidden')
|
| 291 |
segmentsContainer.classList.remove('hidden')
|
| 292 |
|
| 293 |
-
//
|
| 294 |
-
document.getElementById('processing-time').textContent =
|
| 295 |
-
document.getElementById('segment-count').textContent =
|
| 296 |
-
|
|
|
|
|
|
|
| 297 |
</script>
|
| 298 |
</body>
|
| 299 |
</html>
|
|
|
|
| 94 |
</div>
|
| 95 |
|
| 96 |
<div class="space-y-4">
|
| 97 |
+
<form id="uploadForm" class="border-2 border-dashed border-gray-600 rounded-lg p-8 text-center cursor-pointer hover:bg-gray-700/50 transition">
|
| 98 |
+
<input type="file" id="audioFile" accept=".mp3,.wav,.flac" class="hidden">
|
| 99 |
+
<label for="audioFile" class="block">
|
| 100 |
+
<i data-feather="upload" class="w-8 h-8 mx-auto text-gray-400 mb-2"></i>
|
| 101 |
+
<p class="text-gray-400">Upload audio file</p>
|
| 102 |
+
<p class="text-gray-500 text-xs mt-1">MP3, WAV, FLAC (max 100MB)</p>
|
| 103 |
+
</label>
|
| 104 |
+
<div id="fileInfo" class="hidden mt-2 text-xs text-primary"></div>
|
| 105 |
+
</form>
|
| 106 |
+
<div class="bg-gray-700 rounded-lg p-4">
|
| 107 |
<h3 class="text-sm font-medium text-gray-300 mb-3 flex items-center">
|
| 108 |
<i data-feather="sliders" class="w-4 h-4 mr-2"></i>
|
| 109 |
Segmentation Parameters
|
|
|
|
| 118 |
<input type="number" min="1" max="30" value="5" class="w-full bg-gray-600 border border-gray-500 rounded px-3 py-1">
|
| 119 |
</div>
|
| 120 |
<div class="flex justify-between">
|
| 121 |
+
<button id="processBtn" type="button" class="bg-primary hover:bg-primary/90 text-white px-4 py-2 rounded-md text-sm flex items-center">
|
| 122 |
<i data-feather="play" class="w-4 h-4 mr-1"></i>
|
| 123 |
Process
|
| 124 |
</button>
|
|
|
|
| 127 |
Advanced
|
| 128 |
</button>
|
| 129 |
</div>
|
| 130 |
+
<div id="apiSelect" class="hidden">
|
| 131 |
+
<label class="block text-xs text-gray-400 mb-1">Processing Engine</label>
|
| 132 |
+
<select class="w-full bg-gray-600 border border-gray-500 rounded px-3 py-1 text-sm">
|
| 133 |
+
<option value="whisper">Whisper v3 (Recommended)</option>
|
| 134 |
+
<option value="deepseek">DeepSeek Speech</option>
|
| 135 |
+
<option value="auto">Auto (Fallback)</option>
|
| 136 |
+
</select>
|
| 137 |
+
</div>
|
| 138 |
+
</div>
|
| 139 |
</div>
|
| 140 |
</div>
|
| 141 |
<!-- Progress Bar -->
|
|
|
|
| 264 |
<!-- Footer -->
|
| 265 |
<footer class="mt-16 text-center text-gray-500 text-sm">
|
| 266 |
<div class="flex justify-center space-x-6 mb-4">
|
| 267 |
+
<a href="/api-docs" class="hover:text-primary transition">API</a>
|
| 268 |
+
<a href="/tutorials" class="hover:text-primary transition">Tutorials</a>
|
| 269 |
+
<a href="/pricing" class="hover:text-primary transition">Pricing</a>
|
| 270 |
+
<a href="https://github.com/audioslicer/pro" target="_blank" class="hover:text-primary transition">GitHub</a>
|
| 271 |
+
<a href="/status" class="hover:text-primary transition">System Status</a>
|
| 272 |
</div>
|
| 273 |
+
<p>© 2023 AudioSlicer Pro - AI-Powered Audio Processing</p>
|
| 274 |
</footer>
|
| 275 |
</div>
|
| 276 |
|
| 277 |
<script>
|
| 278 |
+
// API Configuration
|
| 279 |
+
const API_CONFIG = {
|
| 280 |
+
whisper: {
|
| 281 |
+
endpoint: '/api/transcribe/whisper',
|
| 282 |
+
model: 'large-v3'
|
| 283 |
+
},
|
| 284 |
+
deepseek: {
|
| 285 |
+
endpoint: '/api/transcribe/deepseek',
|
| 286 |
+
model: 'deepseek-speech'
|
| 287 |
+
}
|
| 288 |
+
}
|
| 289 |
+
|
| 290 |
// Initialize Vanta.js background
|
| 291 |
VANTA.NET({
|
| 292 |
+
el: "#vanta-bg",
|
| 293 |
mouseControls: true,
|
| 294 |
touchControls: true,
|
| 295 |
gyroControls: false,
|
|
|
|
| 306 |
|
| 307 |
// Initialize feather icons
|
| 308 |
feather.replace()
|
| 309 |
+
// File upload handler
|
| 310 |
+
document.getElementById('audioFile').addEventListener('change', function(e) {
|
| 311 |
+
const file = e.target.files[0]
|
| 312 |
+
if (file) {
|
| 313 |
+
document.getElementById('fileInfo').textContent = `Selected: ${file.name} (${(file.size/1024/1024).toFixed(2)}MB)`
|
| 314 |
+
document.getElementById('fileInfo').classList.remove('hidden')
|
| 315 |
+
}
|
| 316 |
+
})
|
| 317 |
+
|
| 318 |
+
// Process button handler
|
| 319 |
+
document.getElementById('processBtn').addEventListener('click', async function() {
|
| 320 |
+
const fileInput = document.getElementById('audioFile')
|
| 321 |
+
const file = fileInput.files[0]
|
| 322 |
+
|
| 323 |
+
if (!file) {
|
| 324 |
+
alert('Please select an audio file first')
|
| 325 |
+
return
|
| 326 |
+
}
|
| 327 |
+
|
| 328 |
+
const formData = new FormData()
|
| 329 |
+
formData.append('audio', file)
|
| 330 |
+
formData.append('model', document.querySelector('#apiSelect select').value)
|
| 331 |
+
formData.append('language', document.querySelector('select').value)
|
| 332 |
+
|
| 333 |
+
try {
|
| 334 |
+
const response = await fetch(API_CONFIG.whisper.endpoint, {
|
| 335 |
+
method: 'POST',
|
| 336 |
+
body: formData
|
| 337 |
+
})
|
| 338 |
+
|
| 339 |
+
if (!response.ok) throw new Error('Transcription failed')
|
| 340 |
+
|
| 341 |
+
const data = await response.json()
|
| 342 |
+
displayResults(data.segments)
|
| 343 |
+
|
| 344 |
+
} catch (error) {
|
| 345 |
+
console.error('Error:', error)
|
| 346 |
+
// Fallback logic would go here
|
| 347 |
+
}
|
| 348 |
+
})
|
| 349 |
+
|
| 350 |
+
function displayResults(segments) {
|
| 351 |
const emptyState = document.getElementById('empty-state')
|
| 352 |
const segmentsContainer = document.getElementById('segments-container')
|
| 353 |
|
| 354 |
emptyState.classList.add('hidden')
|
| 355 |
segmentsContainer.classList.remove('hidden')
|
| 356 |
|
| 357 |
+
// Update UI with actual segments
|
| 358 |
+
document.getElementById('processing-time').textContent = `Processed in ${data.processing_time}s`
|
| 359 |
+
document.getElementById('segment-count').textContent = `${segments.length} segments`
|
| 360 |
+
|
| 361 |
+
// Render segments...
|
| 362 |
+
}
|
| 363 |
</script>
|
| 364 |
</body>
|
| 365 |
</html>
|