Oauth 2.0 如何在Rust中使用google_speech1发送语音到文本请求?

Oauth 2.0 如何在Rust中使用google_speech1发送语音到文本请求?,oauth-2.0,rust,google-speech-api,Oauth 2.0,Rust,Google Speech Api,我正在尝试使用google_speech1来处理Rust,但是文档提供了不完整的示例,这使得我很难弄清楚如何将语音发送到文本请求,因为我在Rust和使用google语音Api方面都是新手 更具体地说,我希望能够发送本地音频文件,指示源语言并检索转录 这是我在官方文档中找到的最接近的() 使用speech1::recognizerRequest; //由于该方法需要一个请求,您通常会用所需的信息填充它 //进入各自的结构。此处显示的某些零件可能不适用! //此处显示的值可能是随机的,不具有代表性!

我正在尝试使用google_speech1来处理Rust,但是文档提供了不完整的示例,这使得我很难弄清楚如何将语音发送到文本请求,因为我在Rust和使用google语音Api方面都是新手

更具体地说,我希望能够发送本地音频文件,指示源语言并检索转录

这是我在官方文档中找到的最接近的()

使用speech1::recognizerRequest;
//由于该方法需要一个请求,您通常会用所需的信息填充它
//进入各自的结构。此处显示的某些零件可能不适用!
//此处显示的值可能是随机的,不具有代表性!
让mut req=RecognizeRequest::default();
//您可以通过随意调用相应的设置程序来配置可选参数,以及
//使用“doit()”执行最后一个调用。
//此处显示的值可能是随机的,不具有代表性!
让结果=hub.speech().识别(req)
.doit();
更新 退一步说,即使是网站上提供的简单示例也似乎无法正常运行。下面是一些非常基本的代码示例:

pub mod speech\u api\u演示{
extern板条箱google_speech1作为speech1;
外部板条箱;
外部板条箱生锈;
外部板条箱yup_oauth2作为oauth2;
使用oauth2::{ApplicationSecret,Authenticator,DefaultAuthenticatorDelegate,MemoryStorage};
使用speech1::Speech;
使用speech1::{Error,Result};
使用std::fs::File;
使用std::io::Read;
#[派生(反序列化、序列化、默认)]
发布结构控制台应用程序机密{
发布网站:选项,
pub已安装:选项,
}
pub fn演讲样本演示(){
/*
用于生成应用程序机密的自定义代码
*/
让mut文件=
文件::打开(“C:\\Users\\YOURNAME\\.google service cli\\speech1 secret.json”).unwrap();
让mut data=String::new();
file.read_to_string(&mut data).unwrap();
使用serde_json作为json;
让我的_console_secret=json::from_str:(&data);
断言!(我的控制台密码是ok());
让unwrappedConsoleSecret=my_console_secret.unwrap();
断言!(unwrappedConsoleSecret.installed.is_some()&unwrappedConsoleSecret.web.is_none());
保密:ApplicationSecret=unwrappedConsoleSecret.installed.unwrap();
/*
生成应用程序机密的自定义代码-结束
*/
//实例化身份验证程序。它将为您选择合适的身份验证流,
//除非将“None”替换为所需的流。
//提供您自己的“AuthenticatorDelegate”,以调整其操作方式并获取有关的反馈
//发生了什么事。你可能想带上你自己的“令牌存储”来保存令牌和
//从存储器中检索它们。
让auth=Authenticator::new(
&秘密,
DefaultAuthenticatorDelegate,
hyper::Client::with_连接器(hyper::net::HttpsConnector::新建)(
hyper_rustls::TlsClient::new(),
)),
::default(),
没有一个
);
让mut hub=Speech::new(
hyper::Client::with_连接器(hyper::net::HttpsConnector::新建)(
hyper_rustls::TlsClient::new(),
)),
啊,,
);
让result=hub.operations().get(“name”).doit();
比赛结果{
错误(e)=>匹配e{
//错误枚举提供了有关确切发生情况的详细信息。
//您也可以只使用它的'Debug'、'Display'或'Error'特性
错误::HttpError(389;)
|错误::缺少密钥
|错误::缺少令牌(\u1)
|错误::已取消
|错误::UploadSizeLimitExceed(,)
|错误::失败(\u1)
|错误::BADDREQUEST(\u0)
|错误::FieldClash(\u1)
|错误::JsonDecodeError(,)=>(println!(“{}”,e)),
},
Ok(res)=>println!(“成功:{:?}”,res),
}
}
}
运行此代码(调用speech\u sample\u demo)会出现以下错误:

令牌检索失败,错误为:作用域无效:“无说明” 提供

我还尝试了一些非常难看的代码,将作用域强制添加到请求中,但没有任何区别。我很难理解这个错误的含义。我的请求中是否遗漏了什么,或者是另一端有什么妨碍了我?或者api代码库刚刚被破坏了

还请注意,默认情况下提供的客户id和客户机密不再起作用,当我使用它们时,它会说帐户已被删除

然后,我设置了一个OAuth2.0客户端,生成了json文件,并将其复制到默认位置,然后开始获取上面的错误。也许只是我没有正确设置GoogleAPI帐户,但无论如何,如果其他人能尝试一下,看看我是否是唯一一个有这些问题的人,那就太好了


一旦我不再运行这样一个简单的请求,我就有更多的代码可以通过音频文件进行测试,但现在它在过程的早期就失败了。

您得到的错误源于生成凭证文件时使用的OAuth不允许您访问Google speech API。因此,问题不在您的Rust代码中,而是在用于生成OAuth访问令牌的脚本中

基本上,这意味着当您生成OAuth json文件时,您请求以一般方式访问GoogleAPI,但您没有说明要使用哪些特定API。根据,您需要请求访问
https://www.googleapis.com/auth/cloud-platform
范围。

您缺少t
    use oauth2::{ApplicationSecret, Authenticator, DefaultAuthenticatorDelegate, MemoryStorage,FlowType};



let Flo = FlowType::InstalledInteractive;
let auth = Authenticator::new(
                &secret,
                DefaultAuthenticatorDelegate,
                hyper::Client::with_connector(hyper::net::HttpsConnector::new(
                    hyper_rustls::TlsClient::new(),
                )),
                <MemoryStorage as Default>::default(),
                None,)