Рубрики
Без рубрики

Использование Django и AssemblyAI для более точной транскрипции вызовов Twilio

Используйте Python, Django и API транскрипции AssemblyAI для повышения точности записи телефонных звонков с программируемой голосовой связью Twilio.

Автор оригинала: Matt Makai.

Запись телефонных звонков с одним или несколькими участниками легко с Программируемый голосовой API Twilio , но точность преобразования речи в текст может быть низкой, особенно для транскрипции слов из нишевых областей, таких как здравоохранение и инженерия. API AssemblyAI для транскрипции обеспечивает гораздо более высокую точность по умолчанию и с помощью дополнительных списков ключевых слов. точность для записей .

В этом руководстве мы запишем запись исходящего звонка Twilio на AssemblyAI. API для более точного преобразования речи в текст.

Предварительные требования к учебнику

Убедитесь, что у вас установлен Python 3, потому что Python 2 достиг своего истек срок службы в начале 2020 года и больше не поддерживается. Желательно, чтобы у вас было установлен Python 3.7 или выше в вашей среде разработки. В этом руководстве также будут использоваться:

Мы будем использовать следующие зависимости, чтобы завершить это руководство:

Весь код в этом сообщении в блоге доступен с открытым исходным кодом по лицензии MIT. на GitHub в разделе каталог django-exact-twilio-voice-transcriptions репозитория blog-code-examples . Используйте исходный код по своему усмотрению для своих собственных проектов.

Настройка нашей среды разработки

Перейдите в каталог, в котором вы храните свой Python виртуальные среды. Создайте новый virtualenv для этого проекта, используя следующие команда.

Запустите проект Django, создав новый виртуальная среда используя следующую команду. Рекомендую использовать отдельный каталог например ~/venvs/ (тильда – это ярлык для домашней страницы вашего пользователя каталог), чтобы вы всегда знали, где находятся все ваши виртуальные файлы располагается.

python3 -m venv ~/venvs/djtranscribe

Активируйте virtualenv с помощью сценария оболочки activate :

source ~/venvs/djtranscribe/bin/activate

После выполнения указанной выше команды в командной строке появится измените так, чтобы имя virtualenv добавлялось к исходный формат командной строки, поэтому, если ваша подсказка просто $ , теперь он будет выглядеть следующим образом:

(djtranscribe) $

Помните, что вы должны активировать виртуальный сервер в каждом новом терминале. окно, в котором вы хотите использовать зависимости в файле virtualenv.

Теперь мы можем установить Django пакет в активированный, но в остальном пустой файл virtualenv.

pip install django==3.1.3 requests==2.24.0 twilio==6.45.2

Найдите вывод, подобный следующему, чтобы убедиться в правильности пакеты были установлены правильно из PyPI.

(djtranscribe) $ pip install django==3.1.3 requests==2.24.0 twilio=6.45.2
pip install django requests twilio
Collecting django
  Downloading Django-3.1.3-py3-none-any.whl (7.8 MB)
     |████████████████████████████████| 7.8 MB 2.6 MB/s 
Collecting requests
  Using cached requests-2.24.0-py2.py3-none-any.whl (61 kB)
Collecting twilio
  Downloading twilio-6.47.0.tar.gz (460 kB)
     |████████████████████████████████| 460 kB 19.6 MB/s 
Collecting sqlparse>=0.2.2
  Downloading sqlparse-0.4.1-py3-none-any.whl (42 kB)
     |████████████████████████████████| 42 kB 4.8 MB/s 
Collecting pytz
  Downloading pytz-2020.4-py2.py3-none-any.whl (509 kB)
     |████████████████████████████████| 509 kB 31.0 MB/s 
Collecting asgiref<4,>=3.2.10
  Downloading asgiref-3.3.0-py3-none-any.whl (19 kB)
Collecting chardet<4,>=3.0.2
  Using cached chardet-3.0.4-py2.py3-none-any.whl (133 kB)
Collecting idna<3,>=2.5
  Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting certifi>=2017.4.17
  Using cached certifi-2020.6.20-py2.py3-none-any.whl (156 kB)
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
  Downloading urllib3-1.25.11-py2.py3-none-any.whl (127 kB)
     |████████████████████████████████| 127 kB 24.5 MB/s 
Collecting six
  Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting PyJWT>=1.4.2
  Using cached PyJWT-1.7.1-py2.py3-none-any.whl (18 kB)
Using legacy 'setup.py install' for twilio, since package 'wheel' is not installed.
Installing collected packages: sqlparse, pytz, asgiref, django, chardet, idna, certifi, urllib3, requests, six, PyJWT, twilio
    Running setup.py install for twilio ... done
Successfully installed PyJWT-1.7.1 asgiref-3.3.0 certifi-2020.6.20 chardet-3.0.4 django-3.1.3 idna-2.10 pytz-2020.4 requests-2.24.0 six-1.15.0 sqlparse-0.4.1 twilio-6.47.0 urllib3-1.25.11

Теперь мы можем приступить к написанию кода приложения, поскольку у нас есть все установлены необходимые зависимости.

Запуск нашего проекта Django

Начнем писать наше приложение.

Мы можем использовать инструмент Django django-admin для создания шаблонная структура кода для начала нашего проекта. Перейдите в каталог, в котором вы разрабатываете свои приложения. За Например, я обычно использую /Users/matt/devel/py/ для всех моих Проекты Python. Затем выполните следующую команду, чтобы запустить Django проект с названием djtranscribe :

django-admin.py startproject djtranscribe

Обратите внимание, что в этом руководстве мы используем одно и то же имя для обоих virtualenv и каталог проекта Django, но они могут быть разные имена, если вы предпочитаете это для организации ваших собственных проектов.

Команда django-admin создает каталог с именем djtranscribe вместе с несколькими подкаталогами, с которыми вы должны быть знакомы если вы ранее работали с Django.

Поменяйте каталоги в новый проект.

cd djtranscribe

Создайте новое приложение Django в djtranscribe с именем caller .

python manage.py startapp caller

Django создаст в проекте новую папку с именем caller . Мы должны обновить URL-адреса, чтобы приложение было доступно, прежде чем писать наш код views.py .

Откройте djtranscribe/djtranscribe/urls.py . Добавьте выделенное строки, чтобы преобразователь URL проверил приложение вызывающий для дополнительных маршрутов для соответствия URL-адресам, которые запрашиваются это приложение Django.

# djtranscribe/djtranscribe/urls.py
from django.conf.urls import include
from django.contrib import admin
from django.urls import path


urlpatterns = [
    path('', include('caller.urls')),
    path('admin/', admin.site.urls),
]

Сохраните djtranscribe/djtranscribe/urls.py и откройте djtranscribe/djtranscribe/settings.py . Добавьте приложение вызывающий в settings.py , вставив выделенная строка:

# djtranscribe/djtranscribe/settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'caller',
]

Убедитесь, что вы изменили значения по умолчанию DEBUG и SECRET_KEY значения в settings.py перед развертыванием любого кода в производственной среде. Безопасный ваше приложение правильно с информацией из Django контрольный список производственного развертывания чтобы вы не добавляли свой проект в список взломанных приложений В интернете.

Сохраните и закройте settings.py .

Затем перейдите в каталог djtranscribe/caller . Создайте новый файл с именем urls.py , содержащий маршруты для приложения вызывающего .

Добавьте все эти строки в пустой djtranscribe/caller/urls.py файл.

# djtranscribe/caller/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'', views.index, name="index"),
]

Сохраните djtranscribe/caller/urls.py . открыто djtranscribe/caller/views.py , чтобы добавить следующие две выделенные строки.

# djtranscribe/caller/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse('Hello, world!', 200)

Мы можем проверить, что этот простой шаблонный ответ исправьте, прежде чем мы начнем добавлять мясо функциональности в проект. Перейдите в базовый каталог вашего проекта Django где находится файл manage.py . Выполнить разработку сервер с помощью следующей команды:

python manage.py runserver

Сервер разработки Django не должен запускаться без каких-либо проблем, кроме предупреждение о неприменении миграции.

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

November 15, 2020 - 14:07:03
Django version 3.1.3, using settings 'djtranscribe.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Откройте веб-браузер и перейдите по адресу localhost: 8000 .

Веб-браузер отображает простой текст «Hello, world!».

Вы должны увидеть «Привет, мир!» отображается в браузере. Это означает, что пока все работает правильно, и мы можем теперь добавьте возможности набора, записи и транскрибирования в наш проект Django.

Добавление Twilio в проект Django

Пора добавить голосовой API Twilio в микс, чтобы мы могли набрать номер телефонный звонок из нашего проекта Django и сделать запись из этого.

Начните с открытия djtranscribe/djtranscribe/settings.py и изменив его следующим выделенным import os линия:

# djtranscribe/djtranscribe/settings.py
import os
from pathlib import Path


# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

Затем в нижней части файла settings.py добавьте следующие выделенные строки, которые будут настройками, взятыми из переменные среды, которые мы настроим позже.

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'


BASE_URL = os.getenv("BASE_URL")
TWIML_INSTRUCTIONS_URL = "{}/record/".format(BASE_URL)
TWILIO_PHONE_NUMBER = os.getenv("TWILIO_PHONE_NUMBER")

Сохраните settings.py и перейдите в каталог приложения Django caller .

Обновите djtranscribe/caller/urls.py следующим новым код:

# djtranscribe/caller/urls.py
from django.conf.urls import url 
from . import views

urlpatterns = [ 
    url(r'dial/(\d+)/$', views.dial, name="dial"),
    url(r'record/$', views.record_twiml, name="record-twiml"),
    url(r'get-recording-url/([A-Za-z0-9]+)/$', views.get_recording_url,
        name='recording-url'),
]

Затем откройте djtranscribe/views.py и обновите его следующими код, заменяющий то, что уже существует в файле:

# djtranscribe/caller/views.py
from django.conf import settings
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

from twilio.rest import Client
from twilio.twiml.voice_response import VoiceResponse


def dial(request, phone_number):
    """Dials an outbound phone call to the number in the URL. Just
    as a heads up you will never want to leave a URL like this exposed
    without authentication and further phone number format verification.
    phone_number should be just the digits with the country code first,
    for example 14155559812."""
    # pulls credentials from environment variables
    twilio_client = Client()
    call = twilio_client.calls.create(
            to='+{}'.format(phone_number),
            from_=settings.TWILIO_PHONE_NUMBER,
            url=settings.TWIML_INSTRUCTIONS_URL,
    )   
    print(call.sid)
    return HttpResponse("dialing +{}. call SID is: {}".format(
                            phone_number, call.sid))


@csrf_exempt
def record_twiml(request):
    """Returns TwiML which prompts the caller to record a message"""
    # Start our TwiML response
    response = VoiceResponse()

    # Use  to give the caller some instructions
    response.say('Ahoy! Call recording starts now.')

    # Use  to record the caller's message
    response.record()

    # End the call with 
    response.hangup()

    return HttpResponse(str(response), content_type='application/xml')


def get_recording_url(request, call_sid):
    """Returns an HttpResponse with plain text of the link to one or more
    recordings from the specified Call SID."""
    # pulls credentials from environment variables
    twilio_client = Client()
    recording_urls = ""
    call = twilio_client.calls.get(call_sid)
    for r in call.recordings.list():
        recording_urls="\n".join([recording_urls, "".join(['https://api.twilio.com', r.uri])])
    return HttpResponse(str(recording_urls), 200)

Каждая из перечисленных выше функций просмотра выполняет один из шагов, необходимых для создать запись телефонного звонка, набранного Twilio, а затем получить его как файл. dial программно инициирует исходящий вызов, record_twiml возвращает инструкции для воспроизведения сообщения, которое звонок записывается, записывает его, а затем вешает трубку, когда звонок сделано. get_recording_url возвращает только URL-адрес записанный телефонный звонок, чтобы на следующем этапе мы могли отправить файл в AssemblyAI.

Модификации нашего проекта Django сделаны. Далее нам нужно использовать две службы, Twilio и Ngrok, для включения некоторых машин произойти телефонного звонка и запуска приложения из нашего локальная машина.

Учетные данные Twilio и переменные среды

Зарегистрируйтесь в Twilio или войдите в свою существующую учетную запись . Как только вы попадете на Twilio Console , вы можете получить свои TWILIO_ACCOUNT_SID и TWILIO_AUTH_TOKEN на правая часть страницы:

Консоль Twilio.

При регистрации вы должны иметь номер телефона, назначенный вашей учетной записи. Вы можете использовать это или приобретите новый номер телефона использовать.

Задайте три переменные среды с именами TWILIO_ACCOUNT_SID , TWILIO_AUTH_TOKEN и TWILIO_PHONE_NUMBER с помощью команды export . в вашем терминале. Обязательно замените значения на свой собственный SID учетной записи, Токен аутентификации и номер телефона Twilio.

export TWILIO_ACCOUNT_SID=xxxxxxxxxxxxx    # found in twilio.com/console
export TWILIO_AUTH_TOKEN=yyyyyyyyyyyyyy    # found in twilio.com/console
export TWILIO_PHONE_NUMBER=+17166382453    # replace with your Twilio number

Обратите внимание, что вы должны использовать команду export в каждом окне командной строки. что вы хотите, чтобы этот ключ был доступен. Сценарии, которые мы пишем, будут не сможете получить доступ к API Twilio, если у вас не экспортированы токены в среде, в которой вы запускаете скрипт.

Перед запуском app.py необходимо установить еще одну переменную среды. Нам нужно использовать Ngrok в качестве туннеля localhost, чтобы веб-перехватчик Twilio мог отправить HTTP-запрос POST в наше приложение Django, работающее на наша местная среда разработки.

Запустите Ngrok в новом окне терминала, потому что вам нужно будет оставить его выполняется, пока мы запускаем наш другой код Python:

./ngrok http 8000
Нгрок создает туннель localhost.

Скопируйте HTTPS-версию URL-адреса для пересылки и установите BASE_URL значение переменной окружения. Например, на этом скриншоте вы установит для BASE_URL значение https://7764c1810ad3.ngrok.io с помощью следующая команда:

export BASE_URL=https://7764c1810ad3.ngrok.io    # use your ngrok URL, or domain. no trailing slash

Нам также необходимо обновить файлы djtranscribe/djtranscribe/settings.py Список ALLOWED_HOSTS для включения URL-адреса переадресации Ngrok в противном случае веб-перехватчик от Twilio просит инструкций о том, как обработать телефонный звонок, не удастся. Откройте settings.py файл и обновите ALLOWED_HOSTS , указав свой Ngrok Forwarding имя хоста перечислите следующее:

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.getenv('SECRET_KEY', 'development key')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['7764c1810ad3.ngrok.io','127.0.0.1','localhost']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'caller',
]

Хорошо, мы наконец можем повторно запустить наше веб-приложение Django. Убедитесь, что Нгрок все еще работает в другом окне, ваш virtualenv активен и в этом терминал у вас установлены четыре переменные среды, затем запустите runserver в корневом каталоге проекта, где manage.py расположен:

python manage.py runserver

Давайте сделаем так, чтобы наш телефон зазвонил, протестировав приложение.

Тестирование программируемой записи голоса Twilio

Мы можем протестировать наше приложение, перейдя на localhost через порт 8000. Перейдите по этому URL-адресу в своем веб-браузере, заменив «14155551234» на номер телефона, по которому вы хотите позвонить, где человек на будет записана строка: http://localhost: 8000/dial/14155551234.

Теперь на этот номер должен поступить звонок от вашего Twilio. количество. Поднимите, запишите сообщение, которое хотите использовать для проверки расшифровку, а затем положите трубку.

Если вы получили сообщение об ошибке, убедитесь, что все переменные среды установлены. Вы можете проверить значения, используя команду echo, например это:

echo $BASE_URL

Когда звонок закончится, скопируйте показ SID звонка на веб-страницу так что мы можем использовать его, чтобы найти, где записываемый звук файл сохраняется.

Идентификатор безопасности вызова Twilio обслуживается через веб-приложение Django.

Перейдите на localhost: 8000/get-record-url/с идентификатором безопасности вызова. в конце. Например, “localhost: 8000/get-record-url/CAda3f2f49ff4e8ef2be6b726edb998c92”.

URL-адрес записи разговора Twilio.

Скопируйте весь вывод, кроме “.json” в конце, затем вставьте его в адресную строку веб-браузера с добавлением “api.twilio.com”. Например, “https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300”. Это вызовет запись. Скопируйте весь URL-адрес, и мы будем его использовать в качестве входных данных в сервис AssemblyAI.

Транскрипция с помощью AssemblyAI API

Теперь мы можем использовать AssemblyAI API для преобразования речи в текст на запись разговора, которая только что была сделана.

Зарегистрируйте учетную запись AssemblyAI и войдите в панель управления AssemblyAI , затем скопируйте «Ваш токен API», как показано на этом снимке экрана:

Панель управления AssemblyAI.

Нам нужно экспортировать наш ключ API AssemblyAI как переменную среды так что наше приложение Python может использовать его для аутентификации с их API. Нам также необходимо передать общедоступный URL-адрес для записи, поэтому мы также установим это как переменную среды.

# make sure to replace this URL with the one for your recording
export ASSEMBLYAI_KEY=your-api-key-here
export RECORDING_URL=https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300

Создайте новый файл с именем transcribe.py и напишите в нем следующий код:

import os
import requests

endpoint = "https://api.assemblyai.com/v2/transcript"

json = {
  "audio_url": os.getenv("RECORDING_URL")
}

headers = {
    "authorization": os.getenv("ASSEMBLYAI_KEY"),
    "content-type": "application/json"
}

response = requests.post(endpoint, json=json, headers=headers)

print(response.json())

Приведенный выше код вызывает службу транскрипции AssemblyAI, используя секретный ключ и передает ему URL с записью файла. Скрипт распечатывает ответ JSON от службы, который будет содержать идентификатор транскрипции, который мы будем использовать для доступа результаты после завершения обработки.

Запустите сценарий с помощью команды python :

python transcribe.py

В качестве вывода вы получите JSON, аналогичный тому, что вы видите здесь:

{'audio_end_at': None, 'acoustic_model': 'assemblyai_default', 'text': None, 'audio_url': 'https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300', 'speed_boost': False, 'language_model': 'assemblyai_default', 'redact_pii': False, 'confidence': None, 'webhook_status_code': None, 'id': 'zibe9vwmx-82ce-476c-85a7-e82c09c67daf', 'status': 'queued',
'boost_param': None, 'words': None, 'format_text': True, 'webhook_url': None, 'punctuate': True, 'utterances': None, 'audio_duration': None, 'auto_highlights': False, 'word_boost': [], 'dual_channel': None, 'audio_start_from': None}

Найдите значение, содержащееся в поле id ответа JSON. Нам нужно это значение, чтобы найти окончательный результат нашей транскрипции. Скопируйте идентификатор транскрипции и установите его как переменную среды для использования в качестве входных данных финальный сценарий:

# replace with what's found within `id` from the JSON response
export TRANSCRIPTION_ID=aksd19vwmx-82ce-476c-85a7-e82c09c67daf

Нам просто нужно немного больше Python, который ищет результат, и мы все сделанный.

Получить транскрипцию AssemblyAI

AssemblyAI будет занята расшифровкой записи. В зависимости от размера файл может занять от нескольких секунд до нескольких минут для работа для завершения. Мы можем использовать следующий код, чтобы убедиться, что работа все еще в процессе или уже завершено. Если транскрипция будет выполнена, будет напечатано результаты на терминал.

Создайте новый файл с именем print_transcription.py со следующим кодом:

import os
import requests

endpoint = "https://api.assemblyai.com/v2/transcript/{}".format(os.getenv("TRANSCRIPTION_ID"))

headers = {
    "authorization": os.getenv("ASSEMBLYAI_KEY"),
}

response = requests.get(endpoint, headers=headers)

print(response.json())
print("\n\n")
print(response.json()['text'])

Код выше в print_transcription.py очень похож на код в предыдущем исходном файле transcribe.py . импортирует os (операционная система) из стандартной библиотеки Python, как мы сделали в двух предыдущих файлах, для получения переменных среды TRANSCRIPTION_ID и ASSEMBLYAI_KEY значения.

endpoint – это конечная точка AssemblyAI API для получения транскрипции. Мы устанавливаем соответствующий заголовок authorization и выполнить вызов API с помощью функции requests.get . Затем мы печатаем ответ JSON, а также только текст, который был расшифрован.

Пришло время проверить этот третий файл. Выполните следующую команду в терминал:

python print_transcription.py

Ваш результат будет отличаться в зависимости от вашей записи, но вы должны увидеть результат в терминале, подобном следующему:

{'audio_end_at': None, 'acoustic_model': 'assemblyai_default', 'auto_highlights_result': None, 'text': 'An object relational mapper is a code library that automates the transfer of data stored in a relational database tables into objects that are more commonly used in application. Code or MS provide a high level abstraction upon a relational database that allows the developer to write Python code. Instead of sequel to create read update and delete data and schemas in their database developers can use the programming language that they are comfortable with comfortable to work with the database instead of writing sequel statements or short procedures.', 'audio_url': 'https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300', 'speed_boost': False, 'language_model': 'assemblyai_default', 'id': 'zibe9vwmx-82ce-476c-85a7-e82c09c67daf', 'confidence': 0.931797752808989, 'webhook_status_code': None, 'status': 'completed', 'boost_param': None, 'redact_pii': False, 'words': [{'text': 'An', 'confidence': 1.0, 'end': 90, 'start': 0}, {'text': 'object', 'confidence': 0.94, 'end': 570, 'start': 210}, {'text': 'relational', 'confidence': 0.89, 'end': 1080, 'start': 510}, {'text': 'mapper', 'confidence': 0.97, 'end': 1380, 'start': 1020}, {'text': 'is', 'confidence': 0.88, 'end': 1560, 'start': 1350}, {'text': 'a', 'confidence': 0.99, 'end': 1620, 'start': 1500}, {'text': 'code', 'confidence': 0.93, 'end': 1920, 'start': 1620}, {'text': 'library', 'confidence': 0.94, 'end': 2250, 'start': 1860}, {'text': 'that', 'confidence': 0.99, 'end': 2490, 'start': 2220}, {'text': 'automates', 'confidence': 0.93, 'end': 2940, 'start': 2430}, {'text': 'the', 'confidence': 0.95, 'end': 3150, 'start': 2910}, {'text': 'transfer', 'confidence': 0.98, 'end': 3510, 'start': 3090}, {'text': 'of', 'confidence':
0.99, 'end': 3660, 'start': 3480}, {'text': 'data', 'confidence': 0.84, 'end': 3960, 'start': 3630}, {'text': 'stored', 'confidence': 0.89, 'end': 4350, 'start': 3900}, {'text': 'in', 'confidence': 0.98, 'end': 4500, 'start': 4290}, {'text': 'a', 'confidence': 0.85, 'end': 4560, 'start': 4440}, {'text': 'relational', 'confidence': 0.87, 'end': 5580, 'start': 4500}, {'text': 'database', 'confidence': 0.92, 'end':
6030, 'start': 5520}, {'text': 'tables', 'confidence': 0.93, 'end': 6330, 'start': 5970}, {'text': 'into', 'confidence': 0.92, 'end': 7130, 'start': 6560}, {'text': 'objects', 'confidence': 0.96, 'end': 7490, 'start': 7100}, {'text': 'that', 'confidence': 0.97, 'end': 7700, 'start': 7430}, {'text': 'are', 'confidence': 0.9, 'end': 7850, 'start': 7640}, {'text': 'more', 'confidence': 0.97, 'end': 8030, 'start': 7790}, {'text': 'commonly', 'confidence': 0.92, 'end': 8480, 'start': 7970}, {'text': 'used', 'confidence': 0.86, 'end': 8750, 'start': 8420}, {'text': 'in', 'confidence': 0.94, 'end': 9050, 'start': 8840}, {'text': 'application.', 'confidence': 0.98, 'end': 9860, 'start': 9110}, {'text': 'Code', 'confidence': 0.93, 'end': 10040, 'start': 9830}, {'text': 'or', 'confidence': 1.0, 'end': 11210, 'start': 10220}, {'text': 'MS', 'confidence': 0.83, 'end': 11480, 'start': 11180}, {'text': 'provide', 'confidence': 0.94, 'end': 11870, 'start': 11510}, {'text': 'a', 'confidence': 1.0, 'end': 11960, 'start': 11840}, {'text': 'high', 'confidence': 1.0, 'end': 12200, 'start': 11930}, {'text': 'level', 'confidence': 0.94, 'end': 12440, 'start': 12170}, {'text': 'abstraction', 'confidence': 0.95, 'end': 12980, 'start': 12410}, {'text':
'upon', 'confidence': 0.94, 'end': 13220, 'start': 12950}, {'text': 'a', 'confidence': 1.0, 'end': 13280, 'start': 13160}, {'text': 'relational', 'confidence': 0.94, 'end': 13820, 'start': 13280}, {'text': 'database', 'confidence': 0.95, 'end': 14210, 'start': 13790}, {'text': 'that', 'confidence': 0.96, 'end': 14420, 'start': 14150}, {'text': 'allows', 'confidence': 0.99, 'end': 14720, 'start': 14360}, {'text':
'the', 'confidence': 0.56, 'end': 14870, 'start': 14690}, {'text': 'developer', 'confidence': 0.98, 'end': 15290, 'start': 14810}, {'text': 'to', 'confidence': 0.94, 'end': 15410, 'start': 15230}, {'text': 'write', 'confidence': 0.96, 'end': 15680, 'start': 15380}, {'text': 'Python', 'confidence': 0.94, 'end': 16070, 'start': 15620}, {'text': 'code.', 'confidence': 0.98, 'end': 16310, 'start': 16070}, {'text': 'Instead', 'confidence': 0.97, 'end': 17160, 'start': 16500}, {'text': 'of', 'confidence': 0.93, 'end': 17340, 'start': 17130}, {'text': 'sequel', 'confidence': 0.86, 'end': 17820, 'start': 17280}, {'text': 'to', 'confidence': 0.91, 'end': 18090, 'start': 17880}, {'text': 'create', 'confidence': 0.89, 'end': 18450, 'start': 18090}, {'text': 'read', 'confidence': 0.88, 'end': 18840, 'start': 18480}, {'text': 'update', 'confidence': 0.92, 'end': 19290, 'start': 18870}, {'text': 'and', 'confidence': 0.94, 'end': 19590, 'start': 19230}, {'text': 'delete', 'confidence': 0.89, 'end': 19920, 'start': 19530}, {'text': 'data',
'confidence': 0.95, 'end': 20190, 'start': 19890}, {'text': 'and', 'confidence': 0.92, 'end': 20490, 'start': 20250}, {'text': 'schemas', 'confidence': 0.86, 'end': 21000, 'start': 20430}, {'text': 'in', 'confidence': 0.94, 'end': 21210, 'start': 21000}, {'text': 'their', 'confidence': 0.98, 'end': 21510, 'start': 21150}, {'text': 'database', 'confidence': 0.97, 'end': 21900, 'start': 21450}, {'text': 'developers', 'confidence': 0.83, 'end': 23200, 'start': 22420}, {'text': 'can', 'confidence': 0.95, 'end': 23440, 'start': 23200}, {'text': 'use', 'confidence': 0.97, 'end': 23650, 'start': 23410}, {'text': 'the', 'confidence': 0.99, 'end': 23890, 'start': 23590}, {'text': 'programming', 'confidence': 0.97, 'end': 24370, 'start': 23830}, {'text': 'language', 'confidence': 1.0, 'end': 24700, 'start': 24310}, {'text': 'that', 'confidence': 1.0, 'end': 24880, 'start': 24640}, {'text': 'they', 'confidence': 0.99, 'end': 25060, 'start': 24820}, {'text': 'are', 'confidence': 0.85, 'end': 25210, 'start': 25000}, {'text': 'comfortable', 'confidence': 0.92, 'end': 25780, 'start': 25180}, {'text': 'with', 'confidence': 1.0, 'end': 25960, 'start': 25720}, {'text': 'comfortable', 'confidence': 0.94, 'end': 29090, 'start': 28090}, {'text': 'to', 'confidence': 0.84, 'end': 29840, 'start': 29180}, {'text': 'work', 'confidence': 0.95, 'end': 30050, 'start': 29780}, {'text': 'with', 'confidence': 0.98, 'end': 30290, 'start': 30020}, {'text': 'the', 'confidence': 0.69, 'end': 30440, 'start': 30230}, {'text': 'database', 'confidence': 0.98, 'end': 30860, 'start': 30380}, {'text': 'instead', 'confidence': 1.0, 'end': 32780, 'start': 31780}, {'text': 'of', 'confidence': 0.98, 'end': 32900, 'start': 32720}, {'text': 'writing', 'confidence': 0.87, 'end': 33320, 'start': 32870}, {'text': 'sequel', 'confidence': 0.88, 'end': 33860, 'start': 33290}, {'text': 'statements', 'confidence': 0.95, 'end': 34310, 'start': 33800}, {'text': 'or', 'confidence': 0.9, 'end': 34460, 'start': 34250}, {'text': 'short', 'confidence': 0.9, 'end': 34790, 'start': 34430}, {'text': 'procedures.', 'confidence': 0.98, 'end': 35270, 'start': 34760}], 'format_text': True, 'webhook_url': None, 'punctuate': True, 'utterances': None, 'audio_duration': 36.288, 'auto_highlights': False, 'word_boost': [],
'dual_channel': None, 'audio_start_from': None}


An object relational mapper is a code library that automates the transfer of data stored in a relational database tables into objects that are more commonly used in application. Code or MS provide a high level abstraction upon a relational database that allows the developer to write Python code. Instead of sequel to create read update and delete data and schemas in their database developers can use the programming language that they are comfortable with comfortable to work with the database instead of writing sequel statements or short procedures.

Это большой объем продукции. В первой части представлены результаты транскрипция и уверенность в точности каждого транскрибируемого слова. Вторая часть – это просто текстовый вывод из транскрипции.

Теперь вы можете взять этот базовый код и добавить его в любое приложение. который требует высококачественного преобразования текста в речь. Если результаты недостаточно хороши для вас, ознакомьтесь с этим руководством на выбор модели, которая лучше соответствует вашим данным так же как повышение точности ключевых слов или фраз .

Дополнительные ресурсы

Мы только что закончили создание высокоточного приложения для транскрипции записей.

Затем попробуйте некоторые из этих других связанных руководств по Django:

  • Использование Sentry для обработки исключений Python в проектах Django
  • Отслеживание ежедневных пользовательских данных в Django с помощью django-user-visit
  • Как быстро использовать Bootstrap 4 в шаблоне Django с CDN

Вопросов? Дай мне знать через запрос на выпуск GitHub в репозитории Full Stack Python , в Твиттере @fullstackpython или @mattmakai . Что-то не так с этим сообщением? Вилка источник этой страницы на GitHub и отправьте запрос на перенос.