Распознавание речи (Speech Recognition, Speech-to-text, STT) — это технология, позволяющая преобразовывать звуковые волны в текстовое представление. Основное применение — голосовые команды, диктовка текста.
Изучим работу фреймворка Tinkoff VoiceKit.
NB! Для демо-использования инструмента вам потребуется зарегистрироваться и получить токен. На старте выдают 1000 демо-рублей.
Для начала клонируем репозиторий с примерами:
git clone https://github.com/Tinkoff/voicekit-examples.git
Обратимся сразу к файлу stt_recognize_sentiment_analysis.py: он не только транскрибирует услышанное, но и оценивает интонацию и тональность используемых слов. В нем для начала импортируем необходимые библиотеки:
import sys
from tinkoff.cloud.stt.v1 import stt_pb2_grpc, stt_pb2
from auth import authorization_metadata
import grpc
import os
from dotenv import load_dotenv
from os import environ as env
load_dotenv()
endpoint = os.environ.get("VOICEKIT_ENDPOINT") or "api.tinkoff.ai:443" # Можно оставить и 443-й эндпоинт для начала
api_key = os.environ["VOICEKIT_API_KEY"]
secret_key = os.environ["VOICEKIT_SECRET_KEY"]
def build_request():
request = stt_pb2.RecognizeRequest()
with open("/path/to/audio.wav", "rb") as f:
request.audio.content = f.read()
request.config.encoding = stt_pb2.AudioEncoding.LINEAR16
request.config.sample_rate_hertz = 8000
request.config.num_channels = 1
request.config.enable_sentiment_analysis = True
return request
def print_recognition_response_with_negative_probas(response):
for result in response.results:
print("Channel", result.channel)
print("Phrase start:", result.start_time.ToTimedelta())
print("Phrase end: ", result.end_time.ToTimedelta())
for alternative in result.alternatives:
print('"' + alternative.transcript + '"')
print("sentiment_analysis_results:")
print(f"\tnegative_prob_audio={result.sentiment_analysis_result.negative_prob_audio:.2f}")
print(f"\tnegative_prob_audio_text={result.sentiment_analysis_result.negative_prob_audio_text:.2f}")
print("----------------------------")
stub = stt_pb2_grpc.SpeechToTextStub(grpc.secure_channel(endpoint, grpc.ssl_channel_credentials()))
metadata = authorization_metadata(api_key, secret_key, "tinkoff.cloud.stt")
response = stub.Recognize(build_request(), metadata=metadata)
print_recognition_response_with_negative_probas(response)
У меня есть запись звонка с ругательствами. В результате при обработке его скриптом получим такие выходные данные:
Channel 0
Phrase start: 0:00:26.850000
Phrase end: 0:00:28.440000
"вы блядь только продаете"
sentiment_analysis_results:
negative_prob_audio=0.00
negative_prob_audio_text=0.00
----------------------------
Channel 0
Phrase start: 0:00:29.190000
Phrase end: 0:00:30.750000
"понимаете а потом"
sentiment_analysis_results:
negative_prob_audio=0.00
negative_prob_audio_text=0.00
----------------------------
Channel 0
Phrase start: 0:00:31.560000
Phrase end: 0:00:32.790000
"ставите перед"
sentiment_analysis_results:
negative_prob_audio=0.00
negative_prob_audio_text=0.00
----------------------------
Это решение порой неверно распознает слова (но и люди не идеальны), однако прекрасно справляется с распознаванием негатива, все маты и повышения тона найдены на записи точно.
© Лена Капаца. Все права защищены.