Для обработки сохраненных аудифовайлов можно использовать сервис для распознавания аудио Tinkoff.
В Google Colab подгрузим нужные бибиотеки:
!pip install tinkoff-voicekit-client protobuf==3.20.3 !pip install pydub # установка библиотеки pydub from pydub import AudioSegment
Посмотрим, что за параметры у загруженного аудиофайла:
# чтение из файла любого формата music = AudioSegment.from_file(file='call.mp3', format='mp3') print("Продолжительность аудио, сек:", music.duration_seconds) print("Частота дискретизации:", music.frame_rate) print("Количество каналов:", music.channels)
Результат:
Продолжительность аудио, сек: 90.0 Частота дискретизации: 16000 Количество каналов: 2
Обрежем первые 15 секунд аудио. На моей записи там гудки. Не влияет на распознавание. Можно и не делать.
# представление 15 секунд в миллисекундах time_to_cut = 15 * 1000 # обрезка файла при помощи индексации #music[time_to_cut:] # сохраним фрагмент в файл с заданной миллисекунды music[time_to_cut:].export('cutted.mp3', format='mp3')
Для использования сервиса Tinkoff VoiceKit необходима регистрация на платформе https://software.tinkoff.ru/auth/login/
После регистрации на балансе будет 1000 рублей, которые можно использовать для тестирования сервиса.
После регистрации необходимо создать и сохранить 2 ключа: API-key и SECRET-key.
- API_KEY можно сгенерировать в личном кабинете в разделе VoiceKit в любой момент времени.
- SECRET_KEY генерируется автоматически только при получении первого API_KEY, потом SECRET_KEY будет недоступен, поэтому крайне ВАЖНО сразу его сохранить.
Передаем параметры для авторизации:
import getpass # передаем API_KEY API_KEY = getpass.getpass("Tinkoff API Key:") # передаем SECRET_KEY SECRET_KEY = getpass.getpass("Tinkoff SECRET Key:")
Метод Recognize
Используется для распознавания аудиофайлов разных форматов (mp3, wav, s16). Для транскрибации текста метод принимает словарь параметров:
audio_config = {"encoding": "MPEG_AUDIO", "sample_rate_hertz": 16000, "num_channels": 2} "encoding" - кодировка, может быть: 'LINEAR16', 'ALAW', 'MULAW', 'LINEAR32F', 'RAW_OPUS', 'MPEG_AUDIO'; "sample_rate_hertz" - частота дискретизации записи; "num_channels" - количество каналов записи (1 или 2).
Для распознавания речи используем следующий код:
from tinkoff_voicekit_client import ClientSTT from pprint import pprint # создаем клиент, передаем ключи client = ClientSTT(API_KEY, SECRET_KEY) # указываем параметры аудио audio_config = { "encoding": "MPEG_AUDIO", "sample_rate_hertz": music.frame_rate, "num_channels": music.channels, "enable_automatic_punctuation": True, } # вызываем метод recognize response = client.recognize("cutted.mp3", audio_config) pprint(response)
При распечатке данных возвращаемого объекта:
{'results': [{'alternatives': [{'confidence': -3.803578, 'transcript': 'Алло.', 'words': [{'confidence': 0.0, 'end_time': '3.270s', 'start_time': '3.060s', 'word': 'алло'}]}], 'channel': 1, 'end_time': '3.270s', 'start_time': '3.060s'}, {'alternatives': [{'confidence': -4.384712, 'transcript': 'Здравствуйте, Алина.', 'words': [{'confidence': 0.0, 'end_time': '4.320s', 'start_time': '3.870s', 'word': 'здравствуйте'}, {'confidence': 0.0, 'end_time': '4.710s', 'start_time': '4.410s', 'word': 'алина'}]}], 'channel': 0, 'end_time': '4.710s', 'start_time': '3.870s'}, ... ]}
В исходной записи звонок записан на два канала:
- 0-й канал — то, что говорит менеджер.
- 1-й канал — речь клиента.
for fragment in response['results']: alternatives = fragment['alternatives'] for alternative in alternatives: str = "" if fragment['channel'] == 0: str += "Менеджер:" else: str += "Клиент:" str += " " + alternative["transcript"] + "\t[Start: " + fragment["start_time"] + ", End: " + fragment["end_time"] + "]" print(str)
Результат распознавания:
Клиент: Алло. [Start: 3.060s, End: 3.270s] Менеджер: Здравствуйте, Алина. [Start: 3.870s, End: 4.710s]
Для удобства можно перевести время в секундах в миллисекунды, чтобы можно было оперативно прослушать фразу, которая плохо распозналась:
def strTimeToInt(strtime): strtime = strtime.replace("s","") return int(float(strtime)*1000) strTimeToInt("3.060s") for fragment in response['results']: alternatives = fragment['alternatives'] for alternative in alternatives: text = "" if fragment['channel'] == 0: text += "Менеджер:" else: text += "Клиент:" start_time = str(strTimeToInt(fragment["start_time"])) end_time = str(strTimeToInt(fragment["end_time"])) text += " " + alternative["transcript"] + "\tmusic[" + start_time + ":" + end_time + "]" print(text)
Тогда получаем:
Клиент: Алло. music[3060:3270] Менеджер: Здравствуйте, Алина. music[3870:4710]
Вставляя код
music[3060:3270]
в cell Colab получаем возможность прослушать выбранный фрагмент.