Распознавание голоса Tinkoff Voicekit

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

Spread the love
Запись опубликована в рубрике IT рецепты. Добавьте в закладки постоянную ссылку.

Обсуждение закрыто.