yandex-cloud / docs

Yandex Cloud documentation
https://cloud.yandex.ru/docs
Creative Commons Attribution 4.0 International
209 stars 602 forks source link

Ошибка при установке библиотеки speechKit #757

Closed sorokin-as closed 3 weeks ago

sorokin-as commented 2 months ago

Делаю по инструкции у меня нет ни каких GRPC пакетов но либа отказывается ставиться! Уже 3 часа пытаюсь запустить быстрый старт)

image

sorokin-as commented 2 months ago

сделал все что тут написано https://yandex.cloud/ru/docs/speechkit/sdk/python/version-conflict

сделал вообще чистое окружение новое, плевать все равно ГРПС пакеты ставит. Зачем выкладитьвать такие либы?)

tatlush commented 2 months ago

@sorokin-as Андрей, здравствуйте! gRPC пакеты и должны ставиться, без них SpeechKit не будет работать. какая ошибка возникает при установке Python SDK?

sorokin-as commented 2 months ago

@sorokin-as Андрей, здравствуйте! gRPC пакеты и должны ставиться, без них SpeechKit не будет работать. какая ошибка возникает при установке Python SDK?

либа пытается установиться потом говорит что у нее ошибка и сама себя откатывает

sorokin-as commented 2 months ago

Мне с библиотекой через gRPC взаимодействовать? по REST API нет варианта?

tatlush commented 2 months ago

либа пытается установиться потом говорит что у нее ошибка и сама себя откатывает

Попробуйте установить библиотеку в виртуальном окружении Python. Если не получится, создайте обращение в техническую поддержку Yandex Cloud.

Python SDK предоставляет REST-интерфейс, но для ее работы необходим пакет grpc-tools. то, что при установке yandex-speechkit ставится и grpc-tools, нормально и ожидаемо.

Также SpeechKit API v3 поддерживает REST для TTS и без использования библиотеки, а STT появится в ближайшем будущем.

ZhakovArtyom commented 1 month ago

Та же проблема, установка выходит с ошибкой и на ubuntu и в powershell

tatlush commented 1 month ago

Та же проблема, установка выходит с ошибкой и на ubuntu и в powershell @ZhakovArtyom, тот же совет, виртуальное окружение, если не поможет, пишите в поддержку. Тут мы вам, увы, помочь не сможем

ZhakovArtyom commented 1 month ago

Спасибо за ответ, у меня получилось установить на python 3.10 (3.11-3.12 выходили ошибки), но на этом ошибки не закончились. при запуске будет, даже при установленной ffmpeg RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work

tatlush commented 1 month ago

@ZhakovArtyom Виртуальное окружение создает "чистую" независимую среду. Скорее всего вы не установили в него ffmpeg.

ZhakovArtyom commented 1 month ago

я и в venv и в poetry окружении делал... Может быть кому-то поможет, у меня получилось через api/v2 и бакеты распознавать в асинхронном режиме


import boto3
import requests
from aiohttp import ClientSession

class SpeechkitBaseHTTPClient:
    def __init__(self,
                 base_url: str,
                 api_key: str,
                 storage_url: str,
                 aws_access_key_id: str,
                 aws_secret_access_key: str,
                 bucket_name: str,
                 storage_object_key: str,
                 file_path: str
                 ) -> None:
        self._session = ClientSession(
            base_url=base_url,
            headers={
                'Authorization': f"Api-Key {api_key}",
            }
        )
        self._operation_header = {
            'Authorization': f"Api-Key {api_key}",
        }
        self._body = {
            "config": {
                "specification": {
                    "languageCode": "ru-RU",
                    "model": "general",
                    "profanityFilter": False,
                    "literature_text": True,
                    "audioEncoding": "MP3",
                    "sampleRateHertz": None,
                    "audioChannelCount": None,
                    "rawResults": False
                }
            },
            "audio": {
                "uri": None
            }
        }

        self._s3 = boto3.session.Session().client(
            service_name='s3',
            aws_access_key_id=aws_access_key_id,
            aws_secret_access_key=aws_secret_access_key,
            endpoint_url=storage_url
        )
        self._bucket_name = bucket_name
        self._storage_object_key = storage_object_key
        self._file_path = file_path

class SpeechkitHTTPClient(SpeechkitBaseHTTPClient):

    async def transcribe_audio(self):
        try:
            self._s3.upload_file(self._file_path, self._bucket_name, self._storage_object_key)
            print(
                f'Файл {self._file_path} успешно загружен в бакет {self._bucket_name} с ключом {self._storage_object_key}')
        except Exception as e:
            print(f'Ошибка загрузки файла: {e}')
        filelink = self._s3.generate_presigned_url('get_object',
                                                   Params={'Bucket': self._bucket_name,
                                                           'Key': self._storage_object_key},
                                                   ExpiresIn=3600)
        body = self._body
        body["audio"]["uri"] = filelink
        async with self._session.post(
                f"/speech/stt/v2/longRunningRecognize",
                json=body
        ) as resp:
            result = await resp.json()
            print(result)
            recognize_id = result['id']
            text = await self.get_recognize_text(recognize_id)
            return text

    async def get_recognize_text(self, recognize_id):
        while True:
            GET = "https://operation.api.cloud.yandex.net/operations/{id}"
            resp = requests.get(GET.format(id=recognize_id), headers=self._operation_header)
            result = resp.json()
            if result['done']:
                break
            print("Not ready")
            time.sleep(3)

        recognize_text = []
        for chunk in result['response']['chunks']:
            recognize_text.append(chunk['alternatives'][0]['text'])
        return '\n'.join(recognize_text)

Возможно не самый красивый код, но рабочий🙂