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

Повышенная точность транскрипции голоса Twilio с помощью Python и Flask

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

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

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

Необходимые инструменты для этого приложения

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

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

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

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

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

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

python3 -m venv ~/venvs/record-transcribe

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

source ~/venvs/record-transcribe/bin/activate

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

(record-transcribe) $

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

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

pip install Flask==1.1.2 requests==2.24.0 twilio==6.45.4

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

(recordtranscribe) $ pip install Flask==1.1.2 requests==2.24.0 twilio=6.45.4
Collecting Flask
  Using cached https://files.pythonhosted.org/packages/f2/28/2a03252dfb9ebf377f40fba6a7841b47083260bf8bd8e737b0c6952df83f/Flask-1.1.2-py2.py3-none-any.whl
Collecting requests
  Using cached https://files.pythonhosted.org/packages/45/1e/0c169c6a5381e241ba7404532c16a21d86ab872c9bed8bdcd4c423954103/requests-2.24.0-py2.py3-none-any.whl
Collecting twilio
  Using cached https://files.pythonhosted.org/packages/d0/4e/7c377eb1a1d57f011dc1bee2fee77cf1e9a08407b8d44ea25a187a30c78d/twilio-6.45.4.tar.gz
Collecting Werkzeug>=0.15 (from Flask)
  Using cached https://files.pythonhosted.org/packages/cc/94/5f7079a0e00bd6863ef8f1da638721e9da21e5bacee597595b318f71d62e/Werkzeug-1.0.1-py2.py3-none-any.whl
Collecting itsdangerous>=0.24 (from Flask)
  Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting click>=5.1 (from Flask)
  Using cached https://files.pythonhosted.org/packages/d2/3d/fa76db83bf75c4f8d338c2fd15c8d33fdd7ad23a9b5e57eb6c5de26b430e/click-7.1.2-py2.py3-none-any.whl
Collecting Jinja2>=2.10.1 (from Flask)
  Using cached https://files.pythonhosted.org/packages/30/9e/f663a2aa66a09d838042ae1a2c5659828bb9b41ea3a6efa20a20fd92b121/Jinja2-2.11.2-py2.py3-none-any.whl
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests)
  Using cached https://files.pythonhosted.org/packages/9f/f0/a391d1463ebb1b233795cabfc0ef38d3db4442339de68f847026199e69d7/urllib3-1.25.10-py2.py3-none-any.whl
Collecting idna<3,>=2.5 (from requests)
  Using cached https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
  Using cached https://files.pythonhosted.org/packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl
Collecting chardet<4,>=3.0.2 (from requests)
  Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Collecting six (from twilio)
  Using cached https://files.pythonhosted.org/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl
Collecting pytz (from twilio)
  Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl
Collecting PyJWT>=1.4.2 (from twilio)
  Using cached https://files.pythonhosted.org/packages/87/8b/6a9f14b5f781697e51259d81657e6048fd31a113229cf346880bb7545565/PyJWT-1.7.1-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->Flask)
  Using cached https://files.pythonhosted.org/packages/0c/12/37f68957526d1ec0883b521934b4e1b8ff3dd8e4fab858a5bf3e487bcee9/MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl
Installing collected packages: Werkzeug, itsdangerous, click, MarkupSafe, Jinja2, Flask, urllib3, idna, certifi, chardet, requests, six, pytz, PyJWT, twilio
  Running setup.py install for twilio ... done
Successfully installed Flask-1.1.2 Jinja2-2.11.2 MarkupSafe-1.1.1 PyJWT-1.7.1 Werkzeug-1.0.1 certifi-2020.6.20 chardet-3.0.4 click-7.1.2 idna-2.10 itsdangerous-1.1.0 pytz-2020.1 requests-2.24.0 six-1.15.0 twilio-6.45.4 urllib3-1.25.10

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

Сборка нашего приложения

Пора вникнуть в код! Мы собираемся написать три исходных файла в это приложение:

  • app.py : приложение Flask, которое будет обрабатывать телефонный звонок и записывать
  • transcribe.py : короткий скрипт Python для вызова AssemblyAI с
  • запись и запуск процесса транскрипции
  • print_transcription.py : сценарий для печати вывода
  • транскрипция на терминал

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

Создайте новый каталог с именем record-transcribe для хранения исходных файлов. и перейдите в новый каталог.

mkdir record-transcribe
cd record-transcribe

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

import os                                                                                                                                                                                                                                     
from flask import Flask, request
from twilio.twiml.voice_response import VoiceResponse
from twilio.rest import Client


app = Flask(__name__)

# pulls credentials from environment variables
client = Client()

BASE_URL = os.getenv("BASE_URL")
twiml_instructions_url = "{}/record".format(BASE_URL)
recording_callback_url = "{}/callback".format(BASE_URL)
twilio_phone_number = os.getenv("TWILIO_PHONE_NUMBER")


@app.route("/record", methods=["GET", "POST"])
def record():
    """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 str(response)

Нам нужно добавить в app.py еще пару функций, но сначала давайте посмотрим, что делает приведенный выше код.

Мы импортировали части вспомогательных библиотек Flask и Twilio, которые будут позволяют нам программно создавать и управлять телефонными звонками, которые Twilio записи. Обратите внимание, что когда мы создаем экземпляр вспомогательной библиотеки Twilio с пустой конструктор Client () , он автоматически читает две среды переменные, TWILIO_ACCOUNT_SID и TWILIO_AUTH_TOKEN для получения соответствующих разрешения для вашей учетной записи Twilio. Если эти две переменные среды не установлены с этими точными именами, вам нужно будет явно передать SID учетной записи и токен аутентификации для вашей учетной записи в конструктор.

После импорта создаются экземпляры библиотек Flask и Twilio. Затем мы настраиваем BASE_URL путем чтения из переменной среды. В этом руководстве BASE_URL будет от Ngrok, но он также может быть вашим доменом, в котором развернуто ваше приложение, например “https://www.twilio.com”. Мы еще не установили эти переменные среды, но мы сделаем это вскоре после того, как закончим писать app.py .

После установки BASE_URL и трех других переменных, установленных средой переменных, у нас есть функция record . Эта функция маршрут Flask , который генерирует TwiML это говорит Twilio, как обращаться с телефонным звонком. Во-первых, автоматический голос предупреждает человека, который поднимает трубку, о том, что телефонный звонок записывается. потом запись начинается. Все, что говорит собеседник, будет записано. и хранится Twilio.

Завершите app.py , добавив эти две следующие функции после Функция record :

@app.route("/dial/")
def dial(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."""
    call = client.calls.create(
            to='+{}'.format(phone_number),
            from_=twilio_phone_number,
            url=twiml_instructions_url,
    )
    print(call.sid)
    return "dialing +{}. call SID is: {}".format(phone_number, call.sid)


@app.route("/get-recording-url/")
def get_recording_url(call_sid):
    recording_urls = ""
    call = client.calls.get(call_sid)
    for r in call.recordings.list():
        recording_urls="\n".join([recording_urls, r.uri])
    return str(recording_urls)

Функция dial создает маршрут Flask, который принимает номер телефона. вход как часть пути второго уровня. Обратите внимание, что в производстве приложение, которое необходимо иметь более эффективную проверку номера телефона, иначе вы возникнет проблема безопасности с несанкционированными входами. Мы делаем это здесь, чтобы легко получить номер телефона в качестве ввода, а не создать целый пользовательский интерфейс с помощью HTML-формы, просто чтобы получить телефонный номер. dial вызывает Twilio Voice API с помощью нашего Учетные данные учетной записи Twilio, чтобы мы могли звонить на исходящий телефон звонок на номер, отправленный через URL. twiml_instructions_url должен быть установлен на URL-адрес функции record , чтобы он мог передавать правильный набор и запись инструкций TwiML о том, как Twilio сервис должен обрабатывать набор телефонного звонка.

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

Наш файл app.py готов. Нам просто нужно экспортировать нашу среду переменные для наших учетных данных 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 в наше приложение app.py Flask, работающее на наша местная среда разработки.

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

./ngrok http 5000
Ngrok работает с туннелем localhost.

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

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

Хорошо, мы наконец можем запустить app.py . Убедитесь, что вы все еще используете Ngrok в другом окне ваш virtualenv активен и в этом терминале у вас установлены четыре переменные среды, затем запустите flask run команда:

flask run

Вы должны увидеть вывод Flask примерно так:

* Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Это законное предупреждение: используйте эту команду только для цели разработки и когда вы хотите развернуть для производства вам необходимо использовать настоящий WSGI-сервер как Gunicorn.

Пришло время протестировать наше приложение.

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

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

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

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

echo $BASE_URL

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

SID вызова Twilio.

Перейдите к “localhost: 5000/get-record-url/” с идентификатором безопасности вызова. в конце. Например, “localhost: 5000/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.

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

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

Что теперь?

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

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

  • Как преобразовать записи речи в текст с помощью Python
  • Сообщение об исключениях в скриптах Python с помощью Sentry
  • Основные типы данных в Python: строки

Вопросов? Дай мне знать через запрос на выпуск GitHub в репозитории Full Stack Python , в Твиттере @fullstackpython или @mattmakai . Если вы видите проблему или ошибку в этом руководстве, пожалуйста, форк исходного репозитория на GitHub и отправьте запрос на перенос с исправлением.