Анализ результатов распознавания
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.