Python 및 Django를 사용한 라이브 기록
Django는 빠른 개발을 위한 일반적인 Python 웹 프레임워크입니다.그것은 우리가 상자를 열면 바로 사용할 수 있도록 필요한 많은 것을 제공했고, 모든 것이 프레임에 포함되며, 배터리가 포함된다는 이념을 따랐다.Deepgram은 인공지능 음성인식을 이용해 실시간 오디오 녹음을 하고, 파이썬 SDK를 활용할 예정이다.
만약 당신이 계속하고 싶다면, 이 프로젝트의 최종 코드는 here in Github 이다.
개시하다
프로젝트를 시작하기 전에 프로젝트에서 사용할 수 있도록 Deepgram API 키를 생성해야 합니다.우리는 할 수 있다go here.이 강좌에서, 우리는 Python 3.10을 사용할 것이지만, Deepgram도 Python의 일부 초기 버전을 지원한다.우리는 또한 Django 버전 4.0과 Django Channels를 사용하여 웹소켓을 처리할 것이다.우리는 프로젝트를 진행하기 위해 가상 환경을 구축해야 한다.우리는 이것here과 그것을 어떻게 만드는지 더 많이 읽을 수 있다.
더욱 진행한다
폴더 디렉터리를 만들어서 우리의 모든 프로젝트 파일을 저장하고 가상 환경을 만듭니다.이전 섹션에서 설명한 대로 가상 환경이 활성화되었는지 확인합니다.모든 의존항이 이 환경에 설치되어 있는지 확인하십시오.
다음은 빠른 참조를 위해 가상 환경을 만들고 활성화하는 데 필요한 명령입니다.
mkdir [% NAME_OF_YOUR_DIRECTORY %]
cd [% NAME_OF_YOUR_DIRECTORY %]
python3 -m venv venv
source venv/bin/activate
터미널에서 다음 종속성을 설치해야 합니다.pip install Django
pip install deepgram-sdk
pip install python-dotenv
pip install channels
Django 프로젝트 만들기
터미널
django-admin startproject stream
에서 이 명령을 실행해서 Django 프로젝트를 만듭니다.이제 프로젝트 디렉토리는 다음과 같습니다.
Django 응용 프로그램 만들기
응용 프로그램 서버 부분의 코드를
transcript
라는 응용 프로그램에 저장해야 합니다.우리 프로젝트에 manage.py
를 확보합시다.다음과 같이 디렉토리를 스트리밍 항목으로 변경해야 합니다.cd stream
python3 manage.py startapp transcript
프로젝트와 같은 디렉터리 단계에서 새 프로그램을 볼 수 있습니다. transcript
우리는 이 새
transcript
프로그램을 사용하고 있다는 프로젝트를 알려야 한다.이 작업을 수행하려면 stream
파일의 settings.py
폴더로 이동하여 응용 프로그램을 INSTALLED_APPS
에 추가합니다.색인 뷰 만들기
HTML 페이지를 보여 주는 starter Django 프로그램을 시작하고 실행합니다. 그러면 프로젝트를 실시간으로 기록할 수 있습니다.
templates
프로그램에 transcript
라는 폴더를 만듭니다.templates 폴더에 index.html
라는 다른 디렉터리에 transcript
파일을 만듭니다.transcript/templates/transcript/index.html
에 다음 HTML 태그를 추가합니다.<!DOCTYPE html>
<html>
<head>
<title>Live Transcription</title>
</head>
<body>
<h1>Transcribe Audio With Django</h1>
<p id="status">Connection status will go here</p>
<p id="transcript"></p>
</body>
</html>
다음 코드를 저희 views.py
프로그램과 transcript
프로그램에 추가하십시오.from django.shortcuts import render
def index(request):
return render(request, 'transcript/index.html')
우리는 urls.py
프로그램에서 우리의 보기를 호출하기 위해 transcript
를 만들어야 한다.새
urls.py
파일에 다음 코드를 추가합니다.from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
우리는 이 파일을 transcript.urls
모듈을 가리키고 가리키고 stream/urls.py
를 가리켜야 한다.stream/urls.py
에 코드를 추가하려면 다음과 같이 하십시오.from django.conf.urls import include
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('', include('transcript.urls')),
path('admin/', admin.site.urls),
]
터미널에서 개발 서버를 시작하여 python3 manage.py runserver
로 프로젝트를 실행하면 index.html
의 로컬 호스트로 이동할 때 http://127.0.0.1:8000
페이지가 브라우저에 표시됩니다.Django 채널 통합
stream/asgi.py
파일에 코드를 추가해야 합니다.import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import transcript.routing
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "stream.settings")
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
transcript.routing.websocket_urlpatterns
)
),
})
이제 채널 라이브러리를 INSTALLED_APPS
파일의 settings.py
에 추가해야 합니다stream/settings.py
.또한 파일 하단의
stream/settings.py
에 다음 행을 추가해야 합니다.ASGI_APPLICATION = 'stream.asgi.application'
모든 채널이 정상적으로 작동하는지 확인하려면 개발 서버python3 manage.py runserver
를 실행하십시오.우리는 터미널에서 다음과 같은 출력을 보아야 한다.Deepgram API 키 추가
Dell API 키에서는 Deepgram을 사용할 수 있습니다.키를 저장하기 위해
.env
파일을 만듭니다.Github로 코드를 밀어넣을 때 키를 숨기고 .gitignore
파일에 추가할 수 있도록 합니다.Deepgram API 키를 사용하여 다음 환경 변수를 추가할 수 있습니다grab here.
DEEPGRAM_API_KEY="abcde12345"
다음에 저희 consumers.py
프로그램에 transcript
파일을 만들어서 저희 서버를 충당합니다.이 코드를 저희
consumers.py
에 추가합니다.이 코드는 프로젝트에 키를 로드하고 응용 프로그램에서 액세스합니다.from channels.generic.websocket import AsyncWebsocketConsumer
from dotenv import load_dotenv
from deepgram import Deepgram
import os
load_dotenv()
class TranscriptConsumer(AsyncWebsocketConsumer):
dg_client = Deepgram(os.getenv('DEEPGRAM_API_KEY'))
또한 routing.py
애플리케이션에 transcript
파일을 추가해야 합니다.채널 서버에 의해 캡처된 HTTP 요청을 보내면 파일은 채널에서 올바른 코드를 실행하도록 유도합니다.from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'listen', consumers.TranscriptConsumer.as_asgi()),
]
브라우저에서 마이크 데이터 가져오기
다음 단계는 브라우저에서 마이크 데이터를 가져오는 것입니다. 자바스크립트가 필요할 것입니다.
<script></script>
의 index.html
탭에서 이 코드를 사용하면 사용자의 마이크에서 데이터에 접근할 수 있습니다.<script>
navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {
if (!MediaRecorder.isTypeSupported('audio/webm')) return alert('Browser not supported')
const mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/webm' })
})
</script>
브라우저에서 마이크를 사용하는 방법에 대한 자세한 내용은 this post를 참조하십시오.서버와 브라우저 사이의 Websocket 연결
프로젝트에서 WebSocket을 사용해야 합니다.WebSocket을 서버와 클라이언트 간의 연결으로 간주하고, 열린 상태를 유지하며, 연속적인 메시지를 왔다 갔다 할 수 있습니다.
첫 번째 웹소켓 연결은 Django 프로그램을 저장하는 파이썬 서버와 브라우저 클라이언트 사이입니다.이 프로젝트에서, 우리는 Django Channels 를 사용하여 웹소켓 서버를 처리할 것입니다.
클라이언트 연결을 위해 Django 웹 서버 코드를 감청하는 WebSocket 포트를 만들어야 합니다.
consumers.py
파일에서 이전 절re_path(r'listen', consumers.TranscriptConsumer.as_asgi())
에서 이 연결을 완성했습니다.class TranscriptConsumer(AsyncWebsocketConsumer):
dg_client = Deepgram(os.getenv('DEEPGRAM_API_KEY'))
async def connect(self):
await self.connect_to_deepgram()
await self.accept()
async def receive(self, bytes_data):
self.socket.send(bytes_data)
위의 코드는 서버와 클라이언트 사이의 WebSocket 연결을 수락합니다.연결이 열려 있는 상태라면 클라이언트로부터 메시지를 받을 때까지 바이트를 받고 기다릴 것입니다.서버와 브라우저의 연결이 열려 있을 때, 우리는 메시지를 기다리고 데이터를 보낼 것입니다.index.html
에서 이 코드는 클라이언트 연결을 수신하고 다음과 같이 클라이언트에 연결합니다.<script>
...
const socket = new WebSocket('ws://localhost:8000/listen')
</script>
서버와 Deepgram 사이의 Websocket 연결
오디오와 실시간 기록을 얻기 위해 중앙 Django 서버와 Deepgram 사이에 연결을 만들어야 합니다.이 코드를 저희
consumers.py
파일에 추가합니다.from typing import Dict
class TranscriptConsumer(AsyncWebsocketConsumer):
dg_client = Deepgram(os.getenv('DEEPGRAM_API_KEY'))
async def get_transcript(self, data: Dict) -> None:
if 'channel' in data:
transcript = data['channel']['alternatives'][0]['transcript']
if transcript:
await self.send(transcript)
async def connect_to_deepgram(self):
try:
self.socket = await self.dg_client.transcription.live({'punctuate': True, 'interim_results': False})
self.socket.registerHandler(self.socket.event.CLOSE, lambda c: print(f'Connection closed with code {c}.'))
self.socket.registerHandler(self.socket.event.TRANSCRIPT_RECEIVED, self.get_transcript)
except Exception as e:
raise Exception(f'Could not open socket: {e}')
async def connect(self):
await self.connect_to_deepgram()
await self.accept()
async def disconnect(self, close_code):
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
async def receive(self, bytes_data):
self.socket.send(bytes_data)
함수connect_to_deepgram
는 Deepgram에 연결하고 Deepgram에 대한 플러그인 연결을 만들고 연결이 닫혔는지 감청하며 전송된 기록 대상을 가져옵니다.get_transcript
방법은 Deepgram에서 복사본을 가져와 클라이언트에게 보냅니다.마지막으로, 우리
index.html
에서, 우리는 아래 이벤트의 데이터를 수신하고 가져와야 한다.그들이 우리의 컨트롤러에 로그인하고 있음을 주의하십시오.이 행사에 대해 더 알고 싶으시면 this blog post보세요.<script>
socket.onopen = () => {
document.querySelector('#status').textContent = 'Connected'
console.log({
event: 'onopen'
})
mediaRecorder.addEventListener('dataavailable', async (event) => {
if (event.data.size > 0 && socket.readyState == 1) {
socket.send(event.data)
}
})
mediaRecorder.start(250)
}
socket.onmessage = (message) => {
const received = message.data
if (received) {
console.log(received)
document.querySelector('#transcript').textContent += ' ' + received
}
}
socket.onclose = () => {
console.log({
event: 'onclose'
})
}
socket.onerror = (error) => {
console.log({
event: 'onerror',
error
})
}
</script>
응용 프로그램을 시작하고 실시간 기록을 가져오기 시작합니다.터미널에서 python3 manage.py runserver
를 실행하고 포트 8000http://127.0.0.1:8000/
에서 로컬 호스트를 내보냅니다.만약 우리가 아직 없다면, 우리의 마이크에 접근하는 것을 허락해 주십시오.연설을 시작하려면 다음과 같은 문자 기록을 보아야 한다.Django와 Deepgram과 실시간 기록 프로젝트를 구축한 것을 축하합니다.code here 에서 프로젝트를 어떻게 실행하는지에 대한 설명을 찾을 수 있습니다.질문이 있으면 언제든지 트위터에 연락 주세요.
Reference
이 문제에 관하여(Python 및 Django를 사용한 라이브 기록), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/deepgram/live-transcription-with-python-and-django-4aj2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)