Yandex API v3 gRPC для работы с Yandex Speech Kit для задачи STT

Пытаюсь решить задачу автоматизации преобразования телефонных звонков в текст, для последующей оценки качества. Одно из требований - использовать Yandex Speech Kit, сначала пробовал через API v2 REST, но в нем отсутствуют функции лейблинга дикторов на аудиозаписи, поэтому перешел на v3 gRPC, следовал их гайду для решения очень похожей задачи. Единственное, что поменял параметры запроса на те, что подходят под мою задачу. Сервисный аккаунт и API ключ - все сделал, тем не менее вылезает ошибка. Вот измененный код из оффициального гайда:

import grpc

import yandex.cloud.ai.stt.v3.stt_pb2 as stt_pb2
import yandex.cloud.ai.stt.v3.stt_service_pb2_grpc as stt_service_pb2_grpc

CHUNK_SIZE = 4000
API_KEY = '...'
API_KEY_ID = '...'
PATH = 'test_audio.mp3'


def gen(audio_file_name):
    # Specify the recognition settings.
    recognize_options = stt_pb2.StreamingOptions(
        recognition_model=stt_pb2.RecognitionModelOptions(
            audio_format=stt_pb2.AudioFormatOptions(
                raw_audio=stt_pb2.ContainerAudio(
                    audio_encoding=stt_pb2.ContainerAudio.MP3
                )
            ),
            text_normalization=stt_pb2.TextNormalizationOptions(
                text_normalization=stt_pb2.TextNormalizationOptions.TEXT_NORMALIZATION_ENABLED,
                profanity_filter=False,
                literature_text=True
            ),
            language_restriction=stt_pb2.LanguageRestrictionOptions(
                restriction_type=stt_pb2.LanguageRestrictionOptions.WHITELIST,
                language_code=['ru-RU', 'en-EN']
            ),
            audio_processing_type=stt_pb2.RecognitionModelOptions.REAL_TIME,
            speaker_labeling=stt_pb2.SpeakerLabelingOptions.SPEAKER_LABELING_ENABLED
        )
    )

    # Send a message with recognition settings.
    yield stt_pb2.StreamingRequest(session_options=recognize_options)

    # Read the audio file and send its contents in chunks.
    with open(audio_file_name, 'rb') as f:
        data = f.read(CHUNK_SIZE)
        while data != b'':
            yield stt_pb2.StreamingRequest(chunk=stt_pb2.AudioChunk(data=data))
            data = f.read(CHUNK_SIZE)

# Instead of iam_token, provide api_key for authorization as a service account
# with an API key.
# def run(api_key, audio_file_name):


def run(api_key, audio_file_name):
    # Establish a server connection.
    cred = grpc.ssl_channel_credentials()
    channel = grpc.secure_channel('stt.api.cloud.yandex.net:443', cred)
    stub = stt_service_pb2_grpc.RecognizerStub(channel)

    # Send data for recognition.
    it = stub.RecognizeStreaming(gen(audio_file_name), metadata=(
        ('authorization', f'Api-Key {api_key}'),
    ))

    # Process the server responses and output the result to the console.
    try:
        for r in it:
            event_type, alternatives = r.WhichOneof('Event'), None
            if event_type == 'partial' and len(r.partial.alternatives) > 0:
                alternatives = [a.text for a in r.partial.alternatives]
            if event_type == 'final':
                alternatives = [a.text for a in r.final.alternatives]
            if event_type == 'final_refinement':
                alternatives = [a.text for a in r.final_refinement.normalized_text.alternatives]
            print(f'type={event_type}, alternatives={alternatives}')
    except grpc._channel._Rendezvous as err:
        print(f'Error code {err._state.code}, message: {err._state.details}')
        raise err

run(PATH, API_KEY)

Вот ошибка при выполнении кода:

Error code StatusCode.UNKNOWN, message: Exception iterating requests!
Traceback (most recent call last):
  File "C:\Users\wisec\Programms\Work\PyCharm_projects\tts_yandex_kit\cloudapi\output\test.py", line 76, in <module>
    run(PATH, API_KEY)
  File "C:\Users\wisec\Programms\Work\PyCharm_projects\tts_yandex_kit\cloudapi\output\test.py", line 74, in run
    raise err
  File "C:\Users\wisec\Programms\Work\PyCharm_projects\tts_yandex_kit\cloudapi\output\test.py", line 63, in run
    for r in it:
  File "C:\Users\wisec\Programms\Work\PyCharm_projects\tts_yandex_kit\.venv\Lib\site-packages\grpc\_channel.py", line 543, in __next__
    return self._next()
           ^^^^^^^^^^^^
  File "C:\Users\wisec\Programms\Work\PyCharm_projects\tts_yandex_kit\.venv\Lib\site-packages\grpc\_channel.py", line 969, in _next
    raise self
grpc._channel._MultiThreadedRendezvous: <_MultiThreadedRendezvous of RPC that terminated with:
    status = StatusCode.UNKNOWN
    details = "Exception iterating requests!"
    debug_error_string = "None"
>

Process finished with exit code 1

Не знаю в чем может быть проблема, с gRPC впервые работаю, к сожалению по API v3 gRPC на Яндексе нет нормального гайда как по API v2 REST. Буду очень признателен за помощь и совет, в каком направлении искать ошибку или что почитать по gRPC.


Ответы (0 шт):