use std::env;
use open_lark::{
prelude::*,
service::ai::models::{
FileRecognizeRequest, LanguageDetectRequest, SpeechFile, SpeechRecognizeRequest,
TranslateRequest,
},
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenvy::dotenv().ok();
let app_id = env::var("APP_ID")?;
let app_secret = env::var("APP_SECRET")?;
let client = LarkClient::builder(&app_id, &app_secret)
.with_app_type(AppType::SelfBuild)
.with_enable_token_cache(true)
.build();
println!("开始演示 AI 能力接口...\n");
println!("1. 智能文档处理示例");
demonstrate_document_ai(&client).await?;
println!("\n2. 光学字符识别示例");
demonstrate_ocr(&client).await?;
println!("\n3. 语音识别示例");
demonstrate_speech_recognition(&client).await?;
println!("\n4. 机器翻译示例");
demonstrate_translation(&client).await?;
println!("\nAI 能力接口演示完成!");
Ok(())
}
async fn demonstrate_document_ai(client: &LarkClient) -> Result<(), Box<dyn std::error::Error>> {
println!("测试智能文档处理服务...");
let resume_request = FileRecognizeRequest {
file: "resume_file_token_or_base64".to_string(),
};
match client
.ai
.document_ai
.parse_resume(resume_request, None)
.await
{
Ok(response) => println!("✓ 简历解析成功: {:?}", response.data),
Err(e) => println!("✗ 简历解析失败: {e:?}"),
}
let id_card_request = FileRecognizeRequest {
file: "id_card_file_token_or_base64".to_string(),
};
match client
.ai
.document_ai
.recognize_id_card(id_card_request, None)
.await
{
Ok(response) => println!("✓ 身份证识别成功: {:?}", response.data),
Err(e) => println!("✗ 身份证识别失败: {e:?}"),
}
let driving_license_request = FileRecognizeRequest {
file: "driving_license_file_token_or_base64".to_string(),
};
match client
.ai
.document_ai
.recognize_driving_license(driving_license_request, None)
.await
{
Ok(response) => println!("✓ 驾驶证识别成功: {:?}", response.data),
Err(e) => println!("✗ 驾驶证识别失败: {e:?}"),
}
let bank_card_request = FileRecognizeRequest {
file: "bank_card_file_token_or_base64".to_string(),
};
match client
.ai
.document_ai
.recognize_bank_card(bank_card_request, None)
.await
{
Ok(response) => println!("✓ 银行卡识别成功: {:?}", response.data),
Err(e) => println!("✗ 银行卡识别失败: {e:?}"),
}
let business_license_request = FileRecognizeRequest {
file: "business_license_file_token_or_base64".to_string(),
};
match client
.ai
.document_ai
.recognize_business_license(business_license_request, None)
.await
{
Ok(response) => println!("✓ 营业执照识别成功: {:?}", response.data),
Err(e) => println!("✗ 营业执照识别失败: {e:?}"),
}
let vat_invoice_request = FileRecognizeRequest {
file: "vat_invoice_file_token_or_base64".to_string(),
};
match client
.ai
.document_ai
.recognize_vat_invoice(vat_invoice_request, None)
.await
{
Ok(response) => println!("✓ 增值税发票识别成功: {:?}", response.data),
Err(e) => println!("✗ 增值税发票识别失败: {e:?}"),
}
let contract_request = FileRecognizeRequest {
file: "contract_file_token_or_base64".to_string(),
};
match client
.ai
.document_ai
.extract_contract_fields(contract_request, None)
.await
{
Ok(response) => println!("✓ 合同字段提取成功: {:?}", response.data),
Err(e) => println!("✗ 合同字段提取失败: {e:?}"),
}
let business_card_request = FileRecognizeRequest {
file: "business_card_file_token_or_base64".to_string(),
};
match client
.ai
.document_ai
.recognize_business_card(business_card_request, None)
.await
{
Ok(response) => println!("✓ 名片识别成功: {:?}", response.data),
Err(e) => println!("✗ 名片识别失败: {e:?}"),
}
Ok(())
}
async fn demonstrate_ocr(client: &LarkClient) -> Result<(), Box<dyn std::error::Error>> {
println!("测试光学字符识别服务...");
let ocr_request = FileRecognizeRequest {
file: "image_file_token_or_base64".to_string(),
};
match client
.ai
.optical_char_recognition
.basic_recognize(ocr_request, None)
.await
{
Ok(response) => println!("✓ OCR文字识别成功: {:?}", response.data),
Err(e) => println!("✗ OCR文字识别失败: {e:?}"),
}
Ok(())
}
async fn demonstrate_speech_recognition(
client: &LarkClient,
) -> Result<(), Box<dyn std::error::Error>> {
println!("测试语音识别服务...");
let speech_request = SpeechRecognizeRequest {
speech: SpeechFile {
file_token: Some("speech_file_token".to_string()),
content: None,
},
format: Some("wav".to_string()),
sample_rate: Some(16000),
language: Some("zh".to_string()),
};
match client
.ai
.speech_to_text
.file_recognize(speech_request, None)
.await
{
Ok(response) => println!("✓ 语音文件识别成功: {:?}", response.data),
Err(e) => println!("✗ 语音文件识别失败: {e:?}"),
}
Ok(())
}
async fn demonstrate_translation(client: &LarkClient) -> Result<(), Box<dyn std::error::Error>> {
println!("测试机器翻译服务...");
let detect_request = LanguageDetectRequest {
text: "Hello, how are you?".to_string(),
};
match client.ai.translation.detect(detect_request, None).await {
Ok(response) => println!("✓ 语种检测成功: {:?}", response.data),
Err(e) => println!("✗ 语种检测失败: {e:?}"),
}
let translate_request = TranslateRequest {
source_language: Some("en".to_string()),
target_language: "zh".to_string(),
text: "Hello, how are you?".to_string(),
};
match client
.ai
.translation
.translate(translate_request, None)
.await
{
Ok(response) => println!("✓ 文本翻译成功: {:?}", response.data),
Err(e) => println!("✗ 文本翻译失败: {e:?}"),
}
Ok(())
}