Chuyển video thành SRT
Creado el: 11 de enero de 2025
Creado el: 11 de enero de 2025
Để chuyển video sang file phụ đề SRT, bạn có thể sử dụng một thư viện xử lý giọng nói như SpeechRecognition và kết hợp với một thư viện hỗ trợ xử lý video như MoviePy. Dưới đây là đoạn code Python minh họa cách thực hiện:
pip install SpeechRecognition moviepy ffmpeg-python
import os import moviepy.editor as mp import speech_recognition as sr def video_to_audio(video_path, audio_path="audio.wav"): """Chuyển video thành file âm thanh.""" clip = mp.VideoFileClip(video_path) clip.audio.write_audiofile(audio_path) return audio_path def audio_to_srt(audio_path, srt_path="output.srt", lang="en-US"): """Chuyển file âm thanh thành phụ đề SRT.""" recognizer = sr.Recognizer() audio = sr.AudioFile(audio_path) with audio as source: print("Đang xử lý file âm thanh...") recognizer.adjust_for_ambient_noise(source) audio_data = recognizer.record(source) print("Nhận diện giọng nói...") try: transcript = recognizer.recognize_google(audio_data, language=lang) print("Nhận diện thành công.") # Tạo file SRT with open(srt_path, "w", encoding="utf-8") as srt_file: srt_file.write("1\n") srt_file.write("00:00:00,000 --> 00:00:10,000\n") srt_file.write(f"{transcript}\n\n") print(f"File SRT đã được lưu tại: {srt_path}") except Exception as e: print("Có lỗi xảy ra:", str(e)) if __name__ == "__main__": video_path = "your_video.mp4" # Thay bằng đường dẫn tới video audio_path = "audio.wav" srt_path = "output.srt" # Chuyển video thành âm thanh video_to_audio(video_path, audio_path) # Chuyển âm thanh thành phụ đề audio_to_srt(audio_path, srt_path)
video_to_audio
: Chuyển đổi file video sang file âm thanh định dạng .wav
.audio_to_srt
: Sử dụng Google Speech API thông qua thư viện SpeechRecognition
để nhận diện giọng nói và tạo file SRT..wav
..srt
chứa nội dung nhận diện từ video.Hãy cho biết nếu bạn cần thêm hướng dẫn về cách cải tiến code này!
Dưới đây là một ứng dụng web "Kiếm tiền làm nhiệm vụ mạng xã hội" được xây dựng bằng Django (Python) + Bootstrap + SQLite.
Trước tiên, cài đặt các thư viện cần thiết:
pip install django crispy-bootstrap4 pillow
django-admin startproject EarnMoney cd EarnMoney django-admin startapp tasks
settings.py
Mở EarnMoney/settings.py
, thêm ứng dụng tasks
và crispy_forms
vào INSTALLED_APPS
:
INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "tasks", # App quản lý nhiệm vụ "crispy_forms", # Bootstrap forms ] CRISPY_TEMPLATE_PACK = "bootstrap4" LOGIN_REDIRECT_URL = "task_list" LOGOUT_REDIRECT_URL = "login"
models.py
Mở tasks/models.py
và định nghĩa các bảng:
from django.db import models from django.contrib.auth.models import User class Task(models.Model): PLATFORM_CHOICES = [ ("facebook", "Facebook"), ("instagram", "Instagram"), ("tiktok", "TikTok"), ("youtube", "YouTube"), ] title = models.CharField(max_length=255) description = models.TextField() platform = models.CharField(max_length=10, choices=PLATFORM_CHOICES) url = models.URLField() reward = models.DecimalField(max_digits=6, decimal_places=2) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title class UserTask(models.Model): STATUS_CHOICES = [ ("pending", "Đang chờ"), ("completed", "Hoàn thành"), ("rejected", "Bị từ chối"), ] user = models.ForeignKey(User, on_delete=models.CASCADE) task = models.ForeignKey(Task, on_delete=models.CASCADE) proof = models.ImageField(upload_to="proofs/") status = models.CharField(max_length=10, choices=STATUS_CHOICES, default="pending") completed_at = models.DateTimeField(auto_now=True) def __str__(self): return f"{self.user.username} - {self.task.title}"
forms.py
)from django import forms from .models import UserTask class TaskSubmissionForm(forms.ModelForm): class Meta: model = UserTask fields = ["proof"] labels = {"proof": "Ảnh chụp bằng chứng hoàn thành"}
views.py
)Mở tasks/views.py
:
from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .models import Task, UserTask from .forms import TaskSubmissionForm @login_required def task_list(request): tasks = Task.objects.all() return render(request, "tasks/task_list.html", {"tasks": tasks}) @login_required def task_detail(request, task_id): task = Task.objects.get(id=task_id) if request.method == "POST": form = TaskSubmissionForm(request.POST, request.FILES) if form.is_valid(): submission = form.save(commit=False) submission.user = request.user submission.task = task submission.save() return redirect("task_list") else: form = TaskSubmissionForm() return render(request, "tasks/task_detail.html", {"task": task, "form": form})
urls.py
)Mở tasks/urls.py
:
from django.urls import path from .views import task_list, task_detail from django.contrib.auth import views as auth_views urlpatterns = [ path("", task_list, name="task_list"), path("task/<int:task_id>/", task_detail, name="task_detail"), path("login/", auth_views.LoginView.as_view(template_name="tasks/login.html"), name="login"), path("logout/", auth_views.LogoutView.as_view(), name="logout"), ]
templates/
)task_list.html
){% extends "base.html" %} {% block content %} <h2>Danh sách nhiệm vụ</h2> <ul> {% for task in tasks %} <li> <a href="{% url 'task_detail' task.id %}">{{ task.title }}</a> - {{ task.platform }} - {{ task.reward }} VND </li> {% endfor %} </ul> {% endblock %}
task_detail.html
){% extends "base.html" %} {% block content %} <h2>{{ task.title }}</h2> <p>{{ task.description }}</p> <a href="{{ task.url }}" target="_blank">Thực hiện nhiệm vụ</a> <form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <button type="submit">Nộp bằng chứng</button> </form> {% endblock %}
login.html
){% extends "base.html" %} {% block content %} <h2>Đăng nhập</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">Đăng nhập</button> </form> {% endblock %}
Khởi tạo database:
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
Chạy server:
python manage.py runserver
Truy cập http://127.0.0.1:8000 để kiểm tra.
Bạn cần hỗ trợ hoặc mở rộng thêm tính năng nào?
Dưới đây là toàn bộ chi tiết và logic xử lý cùng mã nguồn đầy đủ, từng file với code hoàn chỉnh để bạn có thể sao chép về và chạy trực tiếp. Hệ thống này sẽ bao gồm:
EarnMoney/ ├── EarnMoney/ │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ ├── wsgi.py ├── tasks/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations/ │ │ ├── __init__.py │ ├── models.py │ ├── templates/ │ │ ├── tasks/ │ │ │ ├── base.html │ │ │ ├── login.html │ │ │ ├── register.html │ │ │ ├── task_detail.html │ │ │ ├── task_list.html │ │ │ ├── dashboard.html │ ├── tests.py │ ├── urls.py │ ├── views.py ├── manage.py
settings.py
(Cấu hình cơ bản)Tệp EarnMoney/settings.py
:
import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent SECRET_KEY = "your-secret-key" DEBUG = True ALLOWED_HOSTS = [] INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "tasks", "crispy_forms", ] MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", ] ROOT_URLCONF = "EarnMoney.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [os.path.join(BASE_DIR, "templates")], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ] WSGI_APPLICATION = "EarnMoney.wsgi.application" DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": BASE_DIR / "db.sqlite3", } } AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", }, { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, ] LANGUAGE_CODE = "en-us" TIME_ZONE = "UTC" USE_I18N = True USE_TZ = True STATIC_URL = "static/" STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")] DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" CRISPY_TEMPLATE_PACK = "bootstrap4" LOGIN_REDIRECT_URL = "task_list" LOGOUT_REDIRECT_URL = "login"
urls.py
(Điều hướng URL)EarnMoney/urls.py
:from django.contrib import admin from django.urls import path, include urlpatterns = [ path("admin/", admin.site.urls), path("", include("tasks.urls")), ]
tasks/urls.py
:from django.urls import path from .views import task_list, task_detail, dashboard, register_user from django.contrib.auth import views as auth_views urlpatterns = [ path("", task_list, name="task_list"), path("task/<int:task_id>/", task_detail, name="task_detail"), path("dashboard/", dashboard, name="dashboard"), path("login/", auth_views.LoginView.as_view(template_name="tasks/login.html"), name="login"), path("logout/", auth_views.LogoutView.as_view(), name="logout"), path("register/", register_user, name="register"), ]
models.py
(Mô hình dữ liệu)Tệp tasks/models.py
:
from django.db import models from django.contrib.auth.models import User class Task(models.Model): title = models.CharField(max_length=255) description = models.TextField() platform = models.CharField(max_length=50) url = models.URLField() reward = models.DecimalField(max_digits=10, decimal_places=2) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title class UserTask(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) task = models.ForeignKey(Task, on_delete=models.CASCADE) proof = models.ImageField(upload_to="proofs/") status = models.CharField(max_length=20, default="Pending") def __str__(self): return f"{self.user.username} - {self.task.title}"
views.py
(Logic xử lý)Tệp tasks/views.py
:
from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User from .models import Task, UserTask from .forms import TaskSubmissionForm @login_required def task_list(request): tasks = Task.objects.all() return render(request, "tasks/task_list.html", {"tasks": tasks}) @login_required def task_detail(request, task_id): task = Task.objects.get(id=task_id) form = TaskSubmissionForm(request.POST or None, request.FILES or None) if request.method == "POST" and form.is_valid(): submission = form.save(commit=False) submission.user = request.user submission.task = task submission.save() return redirect("task_list") return render(request, "tasks/task_detail.html", {"task": task, "form": form}) @login_required def dashboard(request): user_tasks = UserTask.objects.filter(user=request.user) return render(request, "tasks/dashboard.html", {"user_tasks": user_tasks}) def register_user(request): if request.method == "POST": form = UserCreationForm(request.POST) if form.is_valid(): form.save() return redirect("login") else: form = UserCreationForm() return render(request, "tasks/register.html", {"form": form})
forms.py
(Biểu mẫu)Tệp tasks/forms.py
:
from django import forms from .models import UserTask class TaskSubmissionForm(forms.ModelForm): class Meta: model = UserTask fields = ["proof"]
admin.py
(Quản trị)Tệp tasks/admin.py
:
from django.contrib import admin from .models import Task, UserTask admin.site.register(Task) admin.site.register(UserTask)
templates/
)Tệp cơ bản base.html
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Earn Money</title> <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="/">Earn Money</a> <div class="collapse navbar-collapse"> <ul class="navbar-nav ml-auto"> {% if user.is_authenticated %} <li class="nav-item"><a class="nav-link" href="/dashboard/">Dashboard</a></li> <li class="nav-item"><a class="nav-link" href="/logout/">Logout</a></li> {% else %} <li class="nav-item"><a class="nav-link" href="/login/">Login</a></li> <li class="nav-item"><a class="nav-link" href="/register/">Register</a></li> {% endif %} </ul> </div> </nav> <div class="container mt-4"> {% block content %}{% endblock %} </div> </body> </html>
Còn tiếp: Let me know if you want all templates in full detail!
Tệp base.html
nên nằm trong thư mục templates/tasks/
. Cụ thể, cấu trúc thư mục sẽ như sau:
EarnMoney/
├── EarnMoney/
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
├── tasks/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── migrations/
│ │ ├── __init__.py
│ ├── models.py
│ ├── templates/
│ │ ├── tasks/
│ │ │ ├── base.html
│ │ │ ├── login.html
│ │ │ ├── register.html
│ │ │ ├── task_list.html
│ │ │ ├── task_detail.html
│ │ │ ├── dashboard.html
│ ├── tests.py
│ ├── urls.py
│ ├── views.py
├── manage.py
tasks/templates/tasks/base.html
base.html
đóng vai trò là tệp giao diện chính. Các tệp khác như login.html
, task_list.html
sẽ kế thừa nó thông qua {% extends "tasks/base.html" %}
.templates/tasks/
được Django tự động nhận diện vì nó nằm trong thư mục ứng dụng tasks/
.Nếu cần thêm hướng dẫn, cứ hỏi nhé!