Анализ результатов распознавания

SpeechKit API v3 может анализировать аудио во время распознавания и вместе с результатами возвращать дополнительную информацию: наличие и временные метки начала и конца определенных слов и речевых оборотов, длительность фраз и пауз, скорость речи говорящего, количество слов в фразах и другие метки и метрики речевой аналитики.

Классификаторы аудио

Примечание

Классификаторы доступны только для речи на русском языке.

Классификаторы могут применяться к промежуточным и окончательным результатам распознавания. Чтобы включить классификатор, определите параметр recognition_classifier в настройках сессии. Результаты срабатывания классификаторов будут приходить отдельным сообщением сразу после событий, указанных в настройках классификатора. Для классификаторов это могут быть события типа partial, eou_update или final.

SpeechKit поддерживает следующие классификаторы:

Классификатор Описание Результат
formal_greeting Формальное приветствие (например, "добрый день", "здравствуйте"") Вероятность соответствия фразы формальному приветствию
informal_greeting Неформальное приветствие (например, "привет", "дарова") Вероятность соответствия фразы неформальному приветствию
formal_farewell Формальное прощание (например, "до свидания", "всего доброго") Вероятность соответствия фразы формальному прощанию
informal_farewell Неформальное прощание (например, "пока", "адьес") Вероятность соответствия фразы неформальному прощанию
insult Оскорбления (например, "дурак", "урод") Вероятность соответствия фразы классу оскорблений
profanity Мат Вероятность принадлежности фразы классу мата
gender Пол Вероятности для классов male и female
negative Негатив Вероятность негативной окраски распознанной фразы
answerphone Ответ робота Вероятность принадлежности фразы голосовому боту или автоответчику
session_options = stt_pb2.StreamingRequest(
  session_options=stt_pb2.StreamingOptions(
    recognition_model="general",

    # Настройки классификаторов
    recognition_classifier=stt_pb2.RecognitionClassifierOptions(
      classifiers=[
        # Определять оскорбления в фразах
        stt_pb2.RecognitionClassifier(
          classifier="insult",
          triggers=[stt_pb2.RecognitionClassifier.ON_UTTERANCE]
        ),
        # Определять мат в фразах
        stt_pb2.RecognitionClassifier(
          classifier="profanity",
          triggers=[stt_pb2.RecognitionClassifier.ON_UTTERANCE]
        ),
      ]
    )
  )
)
import os
from yandex_ai_studio_sdk import AIStudio

# Аутентификация через переменные окружения:
# export YC_API_KEY=<API-ключ>
# export YC_FOLDER_ID=<идентификатор_каталога>
sdk = AIStudio(
    auth=os.environ['YC_API_KEY'],
    folder_id=os.environ['YC_FOLDER_ID'],
)

# Классификаторы работают со стерео-аудио (channels=2):
# каждый канал соответствует одному участнику диалога.
stt = sdk.speechkit.speech_to_text(
    audio_format=sdk.speechkit.AudioFormat.PCM16(8000, channels=2),
    language_codes='ru-RU',
    recognition_classifiers=(
        # Определять оскорбления в фразах.
        sdk.speechkit.speech_to_text.RecognitionClassifier.on_utterance('insult'),
        # Определять мат в фразах.
        sdk.speechkit.speech_to_text.RecognitionClassifier.on_utterance('profanity'),
    ),
)

# Используйте стерео-файл LPCM с частотой дискретизации 8000 Гц.
with open('dialog.pcm', 'rb') as f:
    audio_data = f.read()

# Классификаторы доступны только в потоковом режиме.
for event in stt.run_stream(audio_data):
    if classifier_update := event.classifier_update:
        confidence = classifier_update.labels.get('confidence', 0.0)
        if confidence > 0.3:
            print(
                f'[диктор {event.channel_tag}] '
                f'Классификатор {classifier_update.name!r}: '
                f'уверенность {confidence:.2f}'
            )

# Способ 2: получение результатов классификаторов из асинхронного распознавания.
operation = stt.run_deferred(audio_data)
result = operation.wait()
for channel in result:
    for utterance in channel:
        # Результаты классификаторов с триггером on_utterance.
        for classifier_name, classifier_result in utterance.classifiers.items():
            confidence = classifier_result.labels.get('confidence', 0.0)
            print(
                f'[диктор {channel.tag}] '
                f'Фраза: {utterance.text!r} '
                f'→ {classifier_name}: уверенность {confidence:.2f}'
            )

Статистики аудио

SpeechKit позволяет анализировать диалоги и речь отдельных участников и подсчитывать статистики для каждого участника и для диалога в целом. Результаты анализа содержат дискретные характеристики аудио и описательные статистики распределений этих значений.

Для каждого участника диалога можно определить:

  • скорость и длительность речи;
  • длительность пауз;
  • количество и размеры фраз.

Для диалога в целом доступны:

  • длительность одновременной речи и пауз;
  • количество и временные метки перебиваний.

Чтобы включить подсчет статистик, в настройках сессии определите параметр speech_analysis.

recognize_options = stt_pb2.StreamingOptions(
        recognition_model=stt_pb2.RecognitionModelOptions(
            ..
            speech_analysis = stt_pb2.SpeechAnalysisOptions(
                enable_speaker_analysis = True,
                enable_conversation_analysis = True,
                descriptive_statistics_quantiles = [0.5, 0.9]
            ),
            ...
        )
import os
from yandex_ai_studio_sdk import AIStudio

# Аутентификация через переменные окружения:
# export YC_API_KEY=<API-ключ>
# export YC_FOLDER_ID=<идентификатор_каталога>
sdk = AIStudio(
    auth=os.environ['YC_API_KEY'],
    folder_id=os.environ['YC_FOLDER_ID'],
)

# Анализ статистик работает со стерео-аудио (channels=2):
# каждый канал соответствует одному участнику диалога.
stt = sdk.speechkit.speech_to_text(
    audio_format=sdk.speechkit.AudioFormat.PCM16(8000, channels=2),
    language_codes='ru-RU',
)
stt = stt.configure(
    speech_analysis=stt.SpeechAnalysis(
        speaker_analysis=True,
        conversation_analysis=True,
        descriptive_statistics_quantiles=[0.5, 0.9],
    ),
)

# Используйте стерео-файл LPCM с частотой дискретизации 8000 Гц.
with open('dialog.pcm', 'rb') as f:
    audio_data = f.read()

# Способ 1: получение результатов анализа из потокового распознавания.
for event in stt.run_stream(audio_data):
    if speaker_analysis := event.speaker_analysis:
        print(f'[диктор {event.channel_tag}] анализ диктора: {speaker_analysis}')
    if conversation_analysis := event.conversation_analysis:
        print(f'Анализ разговора: {conversation_analysis}')

# Способ 2: получение результатов анализа из асинхронного распознавания.
operation = stt.run_deferred(audio_data)
result = operation.wait()
print(f'Анализ разговора: {result.conversation_analysis}')
for channel in result:
    print(f'[диктор {channel.tag}] анализ диктора: {channel.speaker_analysis}')

Результаты анализа будут приходить в сообщениях speaker_analysis и conversation_analysis.