Как отправить речь на текстовый запрос с помощью google_speech1 в Rust? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь использовать google_speech1 для Rust, но в документации приведены неполные примеры, что очень затрудняет мне, как новичку в Rust, так и при использовании Google Speech Api, чтобы выяснить, как выполнить отправку речи в текст запрос.

В частности, я хотел бы иметь возможность отправлять локальный аудиофайл, указывать исходный язык и получать транскрипцию.

Вот самое близкое, что я мог найти в официальной документации (https://docs.rs/google-speech1/1.0.8+20181005/google_speech1/struct.SpeechRecognizeCall.html):

use speech1::RecognizeRequest;

// As the method needs a request, you would usually fill it with the desired information
// into the respective structure. Some of the parts shown here might not be applicable !
// Values shown here are possibly random and not representative !
let mut req = RecognizeRequest::default();

// You can configure optional parameters by calling the respective setters at will, and
// execute the final call using `doit()`.
// Values shown here are possibly random and not representative !
let result = hub.speech().recognize(req)
             .doit();

UPDATE Делая шаг назад, даже простые примеры, представленные на сайте, похоже, не работают должным образом. Вот пример самого базового кода:

pub mod speech_api_demo {
    extern crate google_speech1 as speech1;
    extern crate hyper;
    extern crate hyper_rustls;
    extern crate yup_oauth2 as oauth2;
    use oauth2::{ApplicationSecret, Authenticator, DefaultAuthenticatorDelegate, MemoryStorage};
    use speech1::Speech;
    use speech1::{Error, Result};
    use std::fs::File;
    use std::io::Read;

    #[derive(Deserialize, Serialize, Default)]
    pub struct ConsoleApplicationSecret {
        pub web: Option<ApplicationSecret>,
        pub installed: Option<ApplicationSecret>,
    }

    pub fn speech_sample_demo() {
        /*
           Custom code to generate application secret
        */

        let mut file =
            File::open("C:\\Users\\YOURNAME\\.google-service-cli\\speech1-secret.json").unwrap();
        let mut data = String::new();
        file.read_to_string(&mut data).unwrap();

        use serde_json as json;
        let my_console_secret = json::from_str::<ConsoleApplicationSecret>(&data);

        assert!(my_console_secret.is_ok());
        let unwrappedConsoleSecret = my_console_secret.unwrap();
        assert!(unwrappedConsoleSecret.installed.is_some() && unwrappedConsoleSecret.web.is_none());

        let secret: ApplicationSecret = unwrappedConsoleSecret.installed.unwrap();

        /*
           Custom code to generate application secret - END
        */

        // Instantiate the authenticator. It will choose a suitable authentication flow for you,
        // unless you replace  `None` with the desired Flow.
        // Provide your own `AuthenticatorDelegate` to adjust the way it operates and get feedback about
        // what's going on. You probably want to bring in your own `TokenStorage` to persist tokens and
        // retrieve them from storage.
        let auth = Authenticator::new(
            &secret,
            DefaultAuthenticatorDelegate,
            hyper::Client::with_connector(hyper::net::HttpsConnector::new(
                hyper_rustls::TlsClient::new(),
            )),
            <MemoryStorage as Default>::default(),
            None,
        );
        let mut hub = Speech::new(
            hyper::Client::with_connector(hyper::net::HttpsConnector::new(
                hyper_rustls::TlsClient::new(),
            )),
            auth,
        );

        let result = hub.operations().get("name").doit();

        match result {
            Err(e) => match e {
                // The Error enum provides details about what exactly happened.
                // You can also just use its `Debug`, `Display` or `Error` traits
                Error::HttpError(_)
                | Error::MissingAPIKey
                | Error::MissingToken(_)
                | Error::Cancelled
                | Error::UploadSizeLimitExceeded(_, _)
                | Error::Failure(_)
                | Error::BadRequest(_)
                | Error::FieldClash(_)
                | Error::JsonDecodeError(_, _) => (println!("{}", e)),
            },
            Ok(res) => println!("Success: {:?}", res),
        }
    }
}

Запуск этого кода (вызов speech_sample_demo) приводит к следующей ошибке:

Не удалось получить токен с ошибкой: недопустимая область действия: 'нет описания при условии '

Я также попробовал какой-то очень уродливый код, чтобы заставить область видимости в запросе, но это ничего не изменило. Мне трудно понять, что означает эта ошибка. Я что-то упускаю в своем запросе или что-то мешает на другом конце? Или, может быть, эта библиотека кода API просто сломана?

Также обратите внимание, что идентификатор клиента и секрет клиента, предоставленные по умолчанию, больше не работают, когда я использовал их, он сказал бы, что учетная запись удалена.

Затем я настроил клиент OAuth 2.0 и сгенерировал файл json, который я скопировал в папку по умолчанию, а затем начал получать сообщение об ошибке выше. Может быть, это просто я не настраиваю учетную запись Google Api должным образом, но в любом случае было бы замечательно, если бы кто-то еще мог попробовать это, чтобы увидеть, есть ли у меня только эти проблемы.

После того, как я выполнил такой простой запрос, у меня есть еще несколько готовых к тестированию кода, который отправляет аудиофайл, но сейчас он очень рано завершается неудачей.

1 Ответ

0 голосов
/ 10 апреля 2019

Полученная вами ошибка происходит от здесь и означает, что OAuth scope , который вы использовали при создании файла учетных данных , не позволяет вам получить доступ к Googleречевой API.Таким образом, проблема не в вашем коде Rust, а в сценарии, который вы использовали для генерации ваших токенов доступа OAuth.

По сути, это означает, что когда вы генерировали свой JA-файл OAuth, вы запрашивали доступ к API Googleв общем, но вы не сказали, какие именно API вы хотели использовать.Согласно этому документу вам необходимо запросить доступ к области действия https://www.googleapis.com/auth/cloud-platform.

...