Распознавание речи (Speech Recognition) - Лена Капаца
Распознавание речи (Speech Recognition) by Лена Капаца June 14, 2024 Основы

Распознавание речи (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()
 
 

Зададим ключ API и секретный ключ, которые получили в консоли Tinkoff VoiceKit:

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"]
 
Функция build_request(), которую мы опишем ниже, вычитывает аудиофайл и задает его характеристики для последующей обработки:

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("----------------------------")
 
 
Инициализируем экземпляр класса stt_pb2_grpc.SpeechToTextStub и загрузим в него аудиозапись:
 
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

----------------------------

 

Это решение порой неверно распознает слова (но и люди не идеальны), однако прекрасно справляется с распознаванием негатива, все маты и повышения тона найдены на записи точно.

© Лена Капаца. Все права защищены.