-
Couldn't load subscription status.
- Fork 0
ans125/Django-Transcript-Assembly-ai
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
I used assembly ai api for transciprting youtube video speech into text and use python library as well for first download audio of this video file
-------------------------------------------------------
aiohttp==3.8.4
aiosignal==1.3.1
anyio==3.6.2
arabic-reshaper==3.0.0
asgiref==3.6.0
asn1crypto==1.5.1
assemblyai==0.17.0
async-timeout==4.0.2
attrs==22.2.0
cachetools==4.2.4
certifi==2022.12.7
cffi==1.15.1
charset-normalizer==3.0.1
click==8.1.3
cryptography==39.0.2
cssselect2==0.7.0
defusedxml==0.7.1
Django==4.1.7
django-allauth==0.54.0
django-extensions==3.2.1
django-googledrive-storage==1.6.0
django-storages==1.13.2
fastapi==0.94.1
frozenlist==1.3.3
google-api-core==2.10.2
google-api-python-client==2.97.0
google-auth==1.35.0
google-auth-httplib2==0.1.0
googleapis-common-protos==1.60.0
h11==0.14.0
html5lib==1.1
httpcore==0.17.3
httplib2==0.22.0
httpx==0.24.1
idna==3.4
iniconfig==2.0.0
lxml==4.9.2
multidict==6.0.4
openai==0.27.5
psycopg2==2.9.6
psycopg2-binary==2.9.6
pytube==15.0.0
requests==2.28.2
sqlparse==0.4.3
webencodings==0.5.1
websockets==11.0.3
-----------------------------------------------------------------------------------------------
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
deactivate
source venv/bin/activate # Use `venv\Scripts\activate` on Windows
pip install --upgrade httpcore
pip install httpcore==0.13.6
pip install --upgrade googletrans
pip install googletrans==4.0.0-rc1
pip install -r requirements.txt
python manage.py runserver
--------------------------------------------------------------------------------------------
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from django.conf import settings
import json
from pytube import YouTube
import os
import assemblyai as aai
from .models import BlogPost
# Create your views here.
@login_required
def index(request):
return render(request, 'index.html')
@csrf_exempt
def generate_blog(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
yt_link = data['link']
except (KeyError, json.JSONDecodeError):
return JsonResponse({'error': 'Invalid data sent'}, status=400)
# get yt title
title = yt_title(yt_link)
# get transcript
transcription = get_transcription(yt_link)
if not transcription:
return JsonResponse({'error': "Failed to get transcript"}, status=500)
# Generate blog content from the transcript
blog_content = generate_blog_from_transcription(transcription)
if not blog_content:
return JsonResponse({'error': "Failed to generate blog article"}, status=500)
# Save blog article to database
new_blog_article = BlogPost.objects.create(
user=request.user,
youtube_title=title,
youtube_link=yt_link,
generated_content=blog_content,
)
new_blog_article.save()
# Return blog article as a response
return JsonResponse({'content': blog_content})
else:
return JsonResponse({'error': 'Invalid request method'}, status=405)
def yt_title(link):
yt = YouTube(link)
title = yt.title
return title
def download_audio(link):
yt = YouTube(link)
video = yt.streams.filter(only_audio=True).first()
out_file = video.download(output_path=settings.MEDIA_ROOT)
base, ext = os.path.splitext(out_file)
new_file = base + '.mp3'
os.rename(out_file, new_file)
return new_file
def get_transcription(link):
audio_file = download_audio(link)
# Your AssemblyAI API key
aai.settings.api_key = "84d29c9d45e04dc2870c581dfd197bff"
transcriber = aai.Transcriber()
transcript = transcriber.transcribe(audio_file)
return transcript.text
def generate_blog_from_transcription(transcription):
# No OpenAI code here, only AssemblyAI
# Process the transcription here as needed for generating the blog content
return "Mp3 file has been downloaded"
def blog_list(request):
blog_articles = BlogPost.objects.filter(user=request.user)
return render(request, "all-blogs.html", {'blog_articles': blog_articles})
def blog_details(request, pk):
blog_article_detail = BlogPost.objects.get(id=pk)
if request.user == blog_article_detail.user:
return render(request, 'blog-details.html', {'blog_article_detail': blog_article_detail})
else:
return redirect('/')
def user_login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('/')
else:
error_message = "Invalid username or password"
return render(request, 'login.html', {'error_message': error_message})
return render(request, 'login.html')
def user_signup(request):
if request.method == 'POST':
username = request.POST['username']
email = request.POST['email']
password = request.POST['password']
repeatPassword = request.POST['repeatPassword']
if password == repeatPassword:
try:
user = User.objects.create_user(username, email, password)
user.save()
login(request, user)
return redirect('/')
except:
error_message = 'Error creating account'
return render(request, 'signup.html', {'error_message':error_message})
else:
error_message = 'Password do not match'
return render(request, 'signup.html', {'error_message':error_message})
return render(request, 'signup.html')
def user_logout(request):
logout(request)
return redirect('/')
------------------------------------------------------------------------------------------------------
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from django.conf import settings
import json
from pytube import YouTube
import os
import assemblyai as aai
from .models import BlogPost
# View for rendering the index page, accessible only to logged-in users
@login_required
def index(request):
"""
Renders the index page.
Returns:
Rendered index page.
"""
return render(request, 'index.html')
# View for generating blog content from a YouTube video link
@csrf_exempt
def generate_blog(request):
"""
Generates blog content from a YouTube video link.
If the request method is POST, it extracts the YouTube link from the request data,
retrieves the video title and transcript, generates blog content from the transcript,
saves the blog article to the database, and returns the generated content as a response.
If the request method is not POST, it returns an error response.
Returns:
JSON response containing the generated blog content or an error message.
"""
if request.method == 'POST':
try:
data = json.loads(request.body)
yt_link = data['link']
except (KeyError, json.JSONDecodeError):
return JsonResponse({'error': 'Invalid data sent'}, status=400)
# get YouTube video title
title = yt_title(yt_link)
# get transcript from the YouTube video
transcription = get_transcription(yt_link)
if not transcription:
return JsonResponse({'error': "Failed to get transcript"}, status=500)
# generate blog content from the transcript
blog_content = generate_blog_from_transcription(transcription)
if not blog_content:
return JsonResponse({'error': "Failed to generate blog article"}, status=500)
# save blog article to database
new_blog_article = BlogPost.objects.create(
user=request.user,
youtube_title=title,
youtube_link=yt_link,
generated_content=blog_content,
)
new_blog_article.save()
# return blog article as a response
return JsonResponse({'content': blog_content})
else:
return JsonResponse({'error': 'Invalid request method'}, status=405)
# Helper function to get the YouTube video title
def yt_title(link):
"""
Retrieves the title of a YouTube video.
Args:
link (str): The YouTube video link.
Returns:
str: The title of the YouTube video.
"""
yt = YouTube(link)
title = yt.title
return title
# Helper function to download audio from a YouTube video
def download_audio(link):
"""
Downloads audio from a YouTube video.
Args:
link (str): The YouTube video link.
Returns:
str: The path to the downloaded audio file.
"""
yt = YouTube(link)
video = yt.streams.filter(only_audio=True).first()
out_file = video.download(output_path=settings.MEDIA_ROOT)
base, ext = os.path.splitext(out_file)
new_file = base + '.mp3'
os.rename(out_file, new_file)
return new_file
# Helper function to get transcription from the audio file using AssemblyAI
def get_transcription(link):
"""
Retrieves transcription from an audio file using AssemblyAI.
Args:
link (str): The YouTube video link.
Returns:
str: The transcription text.
"""
audio_file = download_audio(link)
aai.settings.api_key = "84d29c9d45e04dc2870c581dfd197bff" # Your AssemblyAI API key
transcriber = aai.Transcriber()
transcript = transcriber.transcribe(audio_file)
return transcript.text
# Helper function to generate blog content from the transcription
def generate_blog_from_transcription(transcription):
"""
Generates blog content from a transcription.
Args:
transcription (str): The transcription text.
Returns:
str: The generated blog content.
"""
# For now, simply return the transcription itself as the blog content
return transcription
# View for rendering the list of blog articles
def blog_list(request):
"""
Renders the list of blog articles.
Args:
request: The HTTP request.
Returns:
Rendered page displaying the list of blog articles.
"""
blog_articles = BlogPost.objects.filter(user=request.user)
return render(request, "all-blogs.html", {'blog_articles': blog_articles})
# View for rendering details of a specific blog article
def blog_details(request, pk):
"""
Renders details of a specific blog article.
Args:
request: The HTTP request.
pk (int): The primary key of the blog article.
Returns:
Rendered page displaying details of the specified blog article.
"""
blog_article_detail = BlogPost.objects.get(id=pk)
if request.user == blog_article_detail.user:
return render(request, 'blog-details.html', {'blog_article_detail': blog_article_detail})
else:
return redirect('/')
# View for user login
def user_login(request):
"""
Handles user login.
Args:
request: The HTTP request.
Returns:
Rendered login page with error message if login fails.
"""
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('/')
else:
error_message = "Invalid username or password"
return render(request, 'login.html', {'error_message': error_message})
return render(request, 'login.html')
# View for user signup
def user_signup(request):
"""
Handles user signup.
Args:
request: The HTTP request.
Returns:
Rendered signup page with error message if signup fails.
"""
if request.method == 'POST':
username = request.POST['username']
email = request.POST['email']
password = request.POST['password']
repeatPassword = request.POST['repeatPassword']
if password == repeatPassword:
try:
user = User.objects.create_user(username, email, password)
user.save()
login(request, user)
return redirect('/')
except:
error_message = 'Error creating account'
return render(request, 'signup.html', {'error_message':error_message})
else:
error_message = 'Password do not match'
return render(request, 'signup.html', {'error_message':error_message})
return render(request, 'signup.html')
# View for user logout
def user_logout(request):
"""
Handles user logout.
Args:
request: The HTTP request.
Returns:
Redirects to the homepage after logout.
"""
logout(request)
return redirect('/')
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published