Розробка AI-системи транскрибації з веб-інтерфейсом

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка AI-системи транскрибації з веб-інтерфейсом
Середній
від 1 тижня до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1122
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    859

Розробка AI-системи транскрибації з веб-інтерфейсом Веб-інтерфейс транскрибації — повноцінний SaaS-продукт або внутрішній інструмент компанії: завантаження файлів, керування завданнями, редагування транскрипту, експорт. Користувач не повинен розумітися на технічній частині. ### Стек - Backend: FastAPI + Celery + Redis - Frontend: React + TypeScript + Tailwind - STT: faster-whisper (GPU) + хмарний fallback - Storage: S3 (MinIO для on-premise) - DB: PostgreSQL ##```python

from fastapi import FastAPI, UploadFile, BackgroundTasks from celery import Celery import uuid

app = FastAPI() celery = Celery('transcription', broker='redis://localhost:6379/0')

@app.post("/api/transcription/upload") async def upload_audio( file: UploadFile, language: str = "ru", speakers: int = None, user_id: str = Depends(get_current_user) ): # Сохраняем файл job_id = str(uuid.uuid4()) file_path = await save_to_storage(file, job_id)

# Создаём задачу
job = await db.transcription_jobs.insert_one({
    "id": job_id,
    "user_id": user_id,
    "status": "queued",
    "file_path": file_path,
    "language": language,
    "created_at": datetime.utcnow()
})

# Ставим в очередь
celery.send_task(
    'transcribe_audio',
    args=[job_id, file_path, language, speakers]
)

return {"job_id": job_id, "status": "queued"}

@app.get("/api/transcription/{job_id}") async def get_transcription(job_id: str, user_id = Depends(get_current_user)): job = await db.transcription_jobs.find_one({"id": job_id, "user_id": user_id}) if not job: raise HTTPException(404) return job ### React компонент завантаженняtsx const TranscriptionUploader: React.FC = () => { const [status, setStatus] = useState<'idle'|'uploading'|'processing'|'done'>('idle'); const [jobId, setJobId] = useState(); const [transcript, setTranscript] = useState();

const handleUpload = async (file: File) => { setStatus('uploading'); const form = new FormData(); form.append('file', file); form.append('language', 'ru');

const { job_id } = await api.post('/transcription/upload', form);
setJobId(job_id);
setStatus('processing');

// Polling статуса
const interval = setInterval(async () => {
  const job = await api.get(`/transcription/${job_id}`);
  if (job.status === 'completed') {
    setTranscript(job.transcript);
    setStatus('done');
    clearInterval(interval);
  }
}, 3000);

};

return (

<FileDropzone onFile={handleUpload} accept="audio/,video/" /> {status === 'processing' && <ProgressSpinner jobId={jobId} />} {transcript && <TranscriptEditor text={transcript} jobId={jobId} />}
); };