AI Transcription System with Web Interface Development

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
AI Transcription System with Web Interface Development
Medium
from 1 week to 3 months
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    823
  • image_logo-aider_0.jpg
    AIDER company logo development
    762
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    848

Development of an AI transcription system with a web interface. The transcription web interface is a full-fledged SaaS product or an internal company tool: file upload, task management, transcript editing, export. The user does not need to understand the technical part. ### Stack - Backend: FastAPI + Celery + Redis - Frontend: React + Type

Script + Tailwind - STT: faster-whisper (GPU) + cloud fallback - Storage: S3 (MinIO for on-premise) - DB: PostgreSQL ### Backend API```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 Loading Componenttsx 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} />}
); };