Поскольку я работаю юристом, в судебных делах я часто сталкиваюсь с такими доказательствами, как записи телефонных разговоров участвующих сторон. Из-за того, что записи телефонных разговоров, предоставленные заинтересованными сторонами, были либо на некачественном китайском языке, либо на диалектах, было трудно найти ключевую информацию в разговоре. Во время перекрестного допроса в суде предоставление только записи телефонного разговора без предоставления расшифрованной текстовой версии, очевидно, не оставит хорошего впечатления на суде первой инстанции. Как мы все знаем, самое ценное для юриста – это время, так можно ли реализовать такой утомительный рабочий процесс по расшифровке файлов записей с помощью технологий искусственного интеллекта?
Облачное распознавание речи Tencent(Automatic Speech Recognition,ASR)даПреобразование речи в текстиз PaaS продукты, которые могут предоставить предприятиям высокорентабельные услуги по распознаванию речи. Он используется большим количеством внутренних предприятий, таких как WeChat, Honor of Kings, Tencent Video и т. д. Он также обслуживает множество бизнес-сценариев, таких как транскрипция записей колл-центра, транскрипция конференций в реальном времени, метод голосового ввода, цифровые люди, интерактивные прямая трансляция и анализ контента в классе. Продукт имеет богатый опыт внедрения в отрасли.
Версия скорости распознавания файлов записи,Это подпродукт серии Облачное распознавание речи Tencent (ASR).,Может идентифицировать файлы записи в течение 2 часов.,Обычно 30 минут аудио можно распознать в течение 10 секунд.,Подходит для быстрого создания субтитров для коротких видеороликов.、Быстрая проверка качества транскрипции голоса、Транскрипция голоса новостей и другие сценарии, где транскрипция зависит от времени.
Прежде чем вызвать интерфейс, связанный с распознаванием речи, вам необходимо ввести Консоль распознавания речи,Выполните аутентификацию по настоящему имени и аутентификацию по лицу,После завершения сертификации,Прочитав «Пользовательское соглашение», поставьте галочку «Я прочитал и согласен с «Пользовательским соглашением».,Затем нажмите [Открыть сейчас],Открыть одним кликомРаспознавание файлов записи,Распознавание речи в реальном времени, распознавание предложений, версия скорости распознавания файлов записи, интерфейс службы асинхронного распознавания голосового потока,Если вам нужно активироватьПроверка бизнес-лицензииилиПроверка счета-фактуры НДСФункция,Вы можете перейти на страницу ознакомления с сервисом официального сайта, чтобы подать заявку на активацию.,Воспользоваться услугой можно после прохождения обзора.
Версии Python 2.7, 3.6-3.9
VScode или другая интегрированная среда разработки.
Git
Файл тестовой записи.
Войдите в терминал в каталоге проекта (используя CMD или GIT BASH) и введите следующую команду:
git clone https://github.com/TencentCloud/tencentcloud-speech-sdk-python.git
Введите следующую команду в терминале, чтобы установить зависимости этого подпакета:
pip install --upgrade tencentcloud-sdk-python-common tencentcloud-sdk-python-asr
Справочный код приведен в примерах официального SDK. В целях обучения и тестирования в этой статье только изменяется существующий код.
Сначала перейдите к строкам 12–16 примера кода и заполните соответствующую информацию об учетной записи. Если вы еще не открывали ключ API, сначала введите его. API Страница управления ключами Создать новый ключ
# Примечание. Перед использованием обязательно заполните APPID, SECRET_ID и SECRET_KEY, иначе приложение не будет работать! ! !
APPID = "125861****"
SECRET_ID = "****jIcgU1HI2VhcHfndEYcPxEExPbWA****"
SECRET_KEY = "****wykFagX8UaS5SZQ3QXTAaolj****"
ENGINE_TYPE = "8k_zh" # Тип модели двигателя,По умолчанию нетелефонная сцена 16к_ж,Подробный на китайском языке.
На этом этапе мы выполнили основные условия для тестирования функции API распознавания речи. Откройте CMD в каталоге файлов flashexample.py и введите.
Команда python flashexample.py, запустите
C:\Users\XXXX\Desktop\record2text\tencentcloud-speech-sdk-python\examples\asr>python flashexample.py
request_id: 6657fc0349377b7eeee72cb0
channel_id: 0
Пекинский музей науки и техники.
Вы можете получить request_id (идентификатор запроса), Channel_id (идентификатор канала) и Пекинский музей науки и технологий. (Результаты распознавания речи текстового типа)
Примечание. В пакете SDK файл test.wav по умолчанию включен в каталог файлов flashexample.py.
На данный момент наш проект выполнил 1/3 цели. Далее нам нужно только использовать настоящую запись телефона для распознавания речи и сохранить входной контент в виде текстового документа в ожидаемом нами формате.
Прежде всего, нам нужно преобразовать запись телефона в текстовый документ, который можно будет использовать напрямую. Нам нужно включить функцию разделения динамиков.
Добавьте следующий код под строкой 40 исходного кода.
req.set_speaker_diarization(1) #Добавить и установить этот параметр,Включить ли разделение динамиков (в настоящее время поддерживается китайский китайский язык),По умолчанию – 0.,0: Не включено,1: Вкл.
Таким образом, содержимое ответа, которое мы получим, будет иметь содержимое предложения_list, которое представляет собой список результатов распознавания на уровне предложения/абзаца, из которого мы можем отделить идентификатор говорящего, время начала разговора и т. д.
Поскольку аудиофайл, поставляемый с SDK, очень короткий и содержит только одно предложение, невозможно протестировать целевой контент, которого мы в настоящее время ожидаем достичь;
Здесь необходимо подготовить запись телефонного разговора для последующего тестирования. В данной статье файл test.mp3 сохранен в текущем каталоге.
Найдите строку 38 в исходном коде и измените целевой тип звука, чтобы он соответствовал формату MP3, измените его следующим образом:
req.set_voice_format("mp3") #поддерживать wav、pcm、ogg-opus、speex、silk、mp3、m4a、aac、amr。
В строке 44 кода установите каталог аудиофайла:
audio = "./test.mp3"
Как видно из кода в конце статьи, результат печати этого примера заключается в обходе и выводе результатов распознавания во всех каналах, а печатается только текстовая часть.
for channl_result in resp["flash_result"]:
print("channel_id: ", channl_result["channel_id"])
print(channl_result["text"])
Это явно не то, чего мы хотим. Во-первых, часть предложения_list — это то, что нам нужно. Во-вторых, в этом проекте нет нескольких каналов и его не нужно обходить, поэтому код переписывается следующим образом:
flash_result = resp["flash_result"][0]
print(resp["audio_duration"],flash_result["sentence_list"])
Теперь запустите файл еще раз, и вы получите следующие результаты:
/*
* Совет: Код строки слишком длинный, система автоматически комментирует и не выделяет его. Один клик копировать удалит системные комментарии
* 287136 [{'text': 'Эх. ', 'start_time': 11100, 'end_time': 11850, 'speaker_id': 0}, {'text': «Привет, здравствуйте, мистер Ли, верно?» ', 'start_time': 11960, 'end_time': 13470, 'speaker_id': 1}, {'text': «Ах, да, привет. ', 'start_time': 13920, 'end_time': 14790, 'speaker_id': 0}, {'text': «Банк Хуа Ся здесь. ', 'start_time': 14790, 'end_time': 16030, 'speaker_id': 1}, {'text': «Здравствуйте, мы просто звоним вам, чтобы проверить, связывалось ли с вами в этот период полицейское управление? ', 'start_time': 16440, 'end_time': 21350, 'speaker_id': 1}, {'text': — Я тебе только что звонил? ', 'start_time': 24080, 'end_time': 26130, 'speaker_id': 0}, {'text': 'только. ', 'start_time': 26280, 'end_time': 27170, 'speaker_id': 1}, {'text': — Кажется, нет. ', 'start_time': 27380, 'end_time': 29790, 'speaker_id': 1}, {'text': — Что ты только что сказал? Позвони мне. ', 'start_time': 34600, 'end_time': 37710, 'speaker_id': 0}, {'text': «Это банк Хуа Ся. Разве вы раньше не говорили, что с вашей картой возникла проблема?» Тогда вам нужна помощь органов общественной безопасности, мы хотим, чтобы мы вам помогли. Обратитесь в бюро общественной безопасности для проверки. ', 'start_time': 37960, 'end_time': 45750, 'speaker_id': 1}, {'text': 'Для проверки вам следует связаться со мной просто 。', 'start_time': 48820, 'end_time': 51650, 'speaker_id': 0}, {'text': — Ближайшее бюро общественной безопасности, бригада уголовного розыска или что-то в этом роде. ', 'start_time': 51920, 'end_time': 54770, 'speaker_id': 0}, {'text': — Мы не сможем этого сделать. Я только что звонил тебе. ', 'start_time': 55740, 'end_time': 58770, 'speaker_id': 1}, {'text': «Ах, да. ', 'start_time': 60320, 'end_time': 61170, 'speaker_id': 0}, {'text': 'Ну что сказать. ', 'start_time': 61200, 'end_time': 62610, 'speaker_id': 0}, {'text': «Наш банк Хуа Ся раньше. Разве вы не говорили, что у вас есть вопросы по поводу этой карты? ', 'start_time': 63660, 'end_time': 68950, 'speaker_id': 1}, {'text': 'ох ох, Тогда мы ответим вам сейчас. ', 'start_time': 69660, 'end_time': 72130, 'speaker_id': 1}, {'text': «Это ваша карта. Вы использовали эту карту раньше. Разве эта карта не была заморожена агентством общественной безопасности? ', 'start_time': 72680, 'end_time': 77570, 'speaker_id': 1}, {'text': «А потом, ох. ', 'start_time': 79620, 'end_time': 80470, 'speaker_id': 0}, {'text': — Тогда, если он нам понадобится, мы сначала сообщим об этом тебе и сообщим решение, а ты сможешь следовать за ним. ', 'start_time': 80470, 'end_time': 85610, 'speaker_id': 1}, {'text': — На самом деле твою проблему решить проще, просто поговори с тестем. Охранное агентство проведет проверку, а потом выдаст мне письмо, и мы поможем вам разобраться. Пока это письмо у вас есть, все будет хорошо. ', 'start_time': 85680, 'end_time': 93770, 'speaker_id': 1}, {'text': «Больше я вам ничего не скажу. Мы находимся в этом районе. Вы хотите, чтобы я увидел самолет, но у меня его нет. ', 'start_time': 95800, 'end_time': 99640, 'speaker_id': 0}, {'text': «Ответ: если вас здесь нет, пожалуйста, посмотрите, смогут ли это проверить люди из бюро общественной безопасности, и попросите их отправить нам письмо. ', 'start_time': 99640, 'end_time': 105770, 'speaker_id': 1}, {'text': «Мы, я, я. ', 'start_time': 106660, 'end_time': 107635, 'speaker_id': 0}, {'text': — Мы можем пойти туда и забрать его, это нормально. Нам нужно его письмо, чтобы решить вашу проблему. ', 'start_time': 107635, 'end_time': 112550, 'speaker_id': 1}, {'text': 'С кем мне связаться? ', 'start_time': 113140, 'end_time': 114550, 'speaker_id': 0}, {'text': «Это полицейский участок по ближайшему месту жительства или Гуйлиньский центр по борьбе с мошенничеством. ', 'start_time': 115400, 'end_time': 120550, 'speaker_id': 1}, {'text': «Ближайший полицейский участок — тот, где мы живем. ', 'start_time': 121360, 'end_time': 124390, 'speaker_id': 0}, {'text': — Нет, это отделение полиции по вашему месту жительства. ', 'start_time': 124480, 'end_time': 127790, 'speaker_id': 1}, {'text': «Ой, а зачем вы идете в отделение полиции, где вы зарегистрированы?» ', 'start_time': 128500, 'end_time': 130550, 'speaker_id': 0}, {'text': — Что ж, наше агентство общественной безопасности позвонит нам и ответит. Им нужно, чтобы вы связались с ними там. ', 'start_time': 130960, 'end_time': 135810, 'speaker_id': 1}, {'text': «Пойдите, проверьте это. ', 'start_time': 135920, 'end_time': 137070, 'speaker_id': 1}, {'text': 'Меня здесь нет , Меня нет дома, я за городом. ', 'start_time': 137600, 'end_time': 140900, 'speaker_id': 0}, {'text': «Если вы находитесь за городом, вы Я хотел бы узнать, сможете ли вы уточнить у них по телефону. Могут ли они выдать письмо, если вам неудобно его забрать, мы можем забрать его за вас. ', 'start_time': 140900, 'end_time': 149650, 'speaker_id': 1}, {'text': «Пока у меня есть это письмо, все будет в порядке. ', 'start_time': 149800, 'end_time': 151370, 'speaker_id': 1}, {'text': 'ой. ', 'start_time': 152220, 'end_time': 152950, 'speaker_id': 0}, {'text': 'Но я я Попробуйте выйти на связь, я посмотрю, что за письмо там выйдет. Пожалуйста, могу сделать заметки и разберусь. ', 'start_time': 153000, 'end_time': 158040, 'speaker_id': 0}, {'text': — Письмо с банковского счета будет проштамповано ими. ', 'start_time': 158040, 'end_time': 162270, 'speaker_id': 1}, {'text': «Какое решение для контроля? ', 'start_time': 162700, 'end_time': 164890, 'speaker_id': 0}, {'text': «Решение подъема, Освободительное решение, решение. ', 'start_time': 165160, 'end_time': 167350, 'speaker_id': 1}, {'text': «Контролировать и разблокировать банковские счета. ', 'start_time': 167350, 'end_time': 170090, 'speaker_id': 0}, {'text': «Да, да, у них там есть счет. Да, да, у них там есть счет. ', 'start_time': 170090, 'end_time': 173425, 'speaker_id': 1}, {'text': 'ах. ', 'start_time': 173425, 'end_time': 174510, 'speaker_id': 0}, {'text': — В любом случае, конкретное название должно быть таким грубым, и тогда будет их Бюро общественной безопасности. ', 'start_time': 174660, 'end_time': 180050, 'speaker_id': 1}, {'text': «Ах, да, есть. ', 'start_time': 180050, 'end_time': 180870, 'speaker_id': 0}, {'text': — Там будет печать их бюро общественной безопасности. ', 'start_time': 180870, 'end_time': 182930, 'speaker_id': 1}, {'text': «Если они на моей стороне. ', 'start_time': 183260, 'end_time': 184550, 'speaker_id': 1}, {'text': «Место, где я зарегистрирован, — небольшой город. Эй, а можно ли производить эту вещь в маленьком городе? Вот это. ', 'start_time': 184550, 'end_time': 189620, 'speaker_id': 0}, {'text': «Тогда вы отправляетесь в Гуйлиньский центр по борьбе с мошенничеством. С другой стороны центр мошенничества находится на Шаньдунской дороге. ', 'start_time': 189620, 'end_time': 195210, 'speaker_id': 1}, {'text': «Меня нет рядом. ', 'start_time': 196200, 'end_time': 197850, 'speaker_id': 0}, {'text': 'Местный. ', 'start_time': 198400, 'end_time': 199350, 'speaker_id': 1}, {'text': «Что касается номера телефона Центра по борьбе с мошенничеством, пожалуйста, подождите немного, я посмотрю, смогу ли я его увидеть. Я проверю его для вас. ', 'start_time': 200260, 'end_time': 205435, 'speaker_id': 1}, {'text': «Это правда, что я не могу дозвониться до этого телефонного звонка. ', 'start_time': 205435, 'end_time': 207235, 'speaker_id': 0}, {'text': «Разве это не разумно? ', 'start_time': 207235, 'end_time': 208270, 'speaker_id': 1}, {'text': «Ах, это должно быть 8989318. Я не могу дозвониться. ', 'start_time': 208980, 'end_time': 212880, 'speaker_id': 0}, {'text': «А как насчет 9696110?» ', 'start_time': 212880, 'end_time': 215910, 'speaker_id': 1}, {'text': — Тогда я спрашиваю. ', 'start_time': 217260, 'end_time': 218470, 'speaker_id': 0}, {'text': «Дело не в том, что сейчас никто не ответил на звонок. Кажется, звонило больше людей. Сейчас никто не ответил. ', 'start_time': 218540, 'end_time': 223130, 'speaker_id': 0}, {'text': «Ну, это. ', 'start_time': 223260, 'end_time': 224160, 'speaker_id': 0}, {'text': 'Смотреть Ну посмотрите на него. Вы можете позвонить ему еще несколько раз, чтобы узнать, как обстоят дела. То есть, если он может выдать письмо, а вам неудобно возвращаться, он сверится с вами и проверит. ситуация ясна. ', 'start_time': 224160, 'end_time': 234170, 'speaker_id': 1}, {'text': — Тогда они тоже согласились выдать это письмо. Вам неудобно возвращаться и получать его. Тогда мы сможем пойти за ним, без проблем. ', 'start_time': 234200, 'end_time': 239470, 'speaker_id': 1}, {'text': 'Эм. ', 'start_time': 239840, 'end_time': 240550, 'speaker_id': 0}, {'text': «Да, позвольте мне сначала обратиться в полицейский участок в моем городе. ', 'start_time': 241260, 'end_time': 245710, 'speaker_id': 0}, {'text': — Ну, полицейскому участку маленького городка, возможно, все же придется обратиться в центр по борьбе с мошенничеством. ', 'start_time': 246160, 'end_time': 250770, 'speaker_id': 1}, {'text': «Ой, а что мне делать, если я сейчас не могу выйти на связь?» ', 'start_time': 251520, 'end_time': 254170, 'speaker_id': 0}, {'text': 'Эм. ', 'start_time': 254300, 'end_time': 255390, 'speaker_id': 0}, {'text': «Тогда тебе, возможно, придется попробовать еще несколько раз, потому что это письмо все еще есть у меня и у него, поэтому наш банк может решить эту проблему». ', 'start_time': 255580, 'end_time': 261630, 'speaker_id': 1}, {'text': «Такова ситуация сейчас. ', 'start_time': 261880, 'end_time': 262990, 'speaker_id': 1}, {'text': «Тогда дай мне ударить еще несколько раз и посмотреть, сработает ли это, хорошо». ', 'start_time': 263480, 'end_time': 266100, 'speaker_id': 0}, {'text': «Да, тогда он, он, этот Затем, если агентство общественной безопасности с его стороны согласится опубликовать его, вы можете попросить агентство общественной безопасности связаться с нами еще раз, и мы достанем его и поможем вам решить. Это не проблема. ', 'start_time': 266100, 'end_time': 275950, 'speaker_id': 1}, {'text': — Ладно, ладно, ладно, ладно, дай мне попробовать. ', 'start_time': 276740, 'end_time': 278870, 'speaker_id': 0}, {'text': «Попробуй, это хорошо. ', 'start_time': 278870, 'end_time': 281360, 'speaker_id': 1}, {'text': 'Хорошо, ага. ', 'start_time': 281360, 'end_time': 281945, 'speaker_id': 0}, {'text': 'Хорошо, пока. ', 'start_time': 281945, 'end_time': 282635, 'speaker_id': 1}, {'text': 'Хорошо, пока. ', 'start_time': 282635, 'end_time': 284030, 'speaker_id': 0}, {'text': «Ах, извини. ', 'start_time': 285500, 'end_time': 286490, 'speaker_id': 0}]
*/
Теперь у нас есть общая длительность звонка и массив объектов, разделенных разговором. Далее нам остается только сохранить полученные данные в word в подходящем формате и задача выполнена.
Введите pip install python-docx в командной строке, чтобы установить связанные зависимости.
pip install python-docx
Добавьте эту зависимость в начало проекта flashexample.py и добавьте следующий код:
from docx import Document
В конце файла примера flashexample.py мы добавляем следующий код сразу после шага 4.6:
# Создайте новый документ Word
document = Document()
# добавить заголовок
document.add_heading('Запись телефонного разговора (текстовая версия)', 0)
# добавить абзац
document.add_paragraph(f'Общая продолжительность этого вызова: {resp["audio_duration"]/1000} секунд')
document.add_paragraph('A:\t\t\t\tB:\n')
Следуя приведенному выше коду, мы добавляем в обход ранее полученный массив предложения_list и записываем его в документ word:
for sentence_list in flash_result["sentence_list"]:
document.add_paragraph(f'время:{sentence_list["start_time"]/1000}-{sentence_list["end_time"]/1000}')
if sentence_list["speaker_id"] == 0:
document.add_paragraph(f'A:{sentence_list["text"]}')
else:
document.add_paragraph(f'B:{sentence_list["text"]}')
Наконец, добавьте следующую команду, чтобы сохранить документ Word.
# сохранить документ
document.save('example.docx')
Затем введите python flashexample.py в командной строке для проверки.
Как видите, наш целевой файл example.docx создан в каталоге проекта. Давайте откроем его и проверим.
На данный момент мы полностью реализовали содержание проекта по конвертации записей телефонных разговоров в текстовые документы.
В будущем вам нужно будет только сохранить запись в папке проекта, ввести команду запуска, и мы сможем реализовать функцию преобразования в один клик!
Взяв в качестве примера второй абзац вывода, мы центрируем выводимый текст и изменим код следующим образом:
# добавить абзац
paragraph = document.add_paragraph(f'Общая продолжительность этого вызова: {resp["audio_duration"]/1000} секунд')
# Установить центр абзацавыравнивание
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
# Установить цвет шрифта
run = paragraph.runs[0]
font = run.font
font.size = Pt(13) # Установить размер шрифта
font.bold = True #Выделить жирным шрифтом
font.color.rgb = RGBColor(255,0,0) #Установить цвет шрифтакрасный
Эффект после изменения:
Выше приведено все содержание использования функции распознавания речи Tencent Cloud для преобразования записей разговоров в текстовые документы одним щелчком мыши. Спасибо за чтение.