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