Python 및 Django를 사용한 라이브 기록

너는 어떻게 파이톤으로 음성에서 텍스트로의 실시간 기록을 진행할 수 있는지 생각해 본 적이 있니?우리는 본문의 목표를 실현하기 위해 Django와 Deepgram을 사용할 것이다.
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
터미널에서 다음 종속성을 설치해야 합니다.
  • Django
  • 의 최신 버전
  • Deepgram Python SDK
  • dotenv 라이브러리, 환경 변수를 처리하는 데 도움을 줍니다
  • Django 채널의 최신 버전
  • 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를 만들어야 한다.
    django urls
    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 에서 프로젝트를 어떻게 실행하는지에 대한 설명을 찾을 수 있습니다.질문이 있으면 언제든지 트위터에 연락 주세요.

    좋은 웹페이지 즐겨찾기