Java调用百度云语音识别【音频转写】

百度云文档  ttps://ai.baidu.com/ai-doc/SPEECH/Bk5difx01

依赖:
<!--JSONObject-->
<dependency>
	<groupId>org.json</groupId>
	<artifactId>json</artifactId>
	<version>20210307</version>
</dependency>

示例代码: 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.json.JSONObject;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

/**
 * 语音识别
 */
@Slf4j
@Component
public class AasrUtils {


    public static final String API_KEY = "U92RRV****ag9xZv";
    public static final String SECRET_KEY = "SU05xD****0ziDkM";


    static final OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder()
            .connectTimeout(60, TimeUnit.SECONDS) // Set the connection timeout
            .readTimeout(300, TimeUnit.SECONDS)    // Set the read timeout
            .build();


    /**
     * 音频转写
     *
     * @param speechUrl  音频url, 音频大小不超过500MB
     * @return
     * @throws IOException
     */
    public static String createAasr(String speechUrl) throws IOException {
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, "{\n" +
                "    \"speech_url\": \"" + speechUrl + "\",\n" +
                "    \"format\": \"mp3\",\n" +
                "    \"pid\": 80001,\n" +
                "    \"rate\": 16000\n" +
                "}");

        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rpc/2.0/aasr/v1/create?access_token=" + getAccessToken())
                .post(body)
                .addHeader("Content-Type", "application/json")
                .addHeader("Accept", "application/json")
                .build();

        try (Response response = HTTP_CLIENT.newCall(request).execute()) {
            if (response.isSuccessful()) {
                String responseBody = response.body().string();
                log.info("创建AACR任务响应: {}", responseBody);

                String taskId = JSON.parseObject(responseBody).getString("task_id");
                return taskId;
            } else {
                log.info("创建AACR任务失败: {}", response.code());
                return null;
            }
        }
    }


    public static String checkASRStatus(String taskId) throws IOException {
        if (StringUtils.isEmpty(taskId)) {
            return "";
        }

        String taskStatus = "";

        while (!("Success".equals(taskStatus) || "Failed".equals(taskStatus))) {
            // Add a delay before the next query
            try {
                Thread.sleep(1000); // Sleep for 1 seconds (adjust as needed)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            HashMap<String, Object> map = new HashMap<>();
            ArrayList<Object> list = new ArrayList<>();
            list.add(taskId);
            map.put("task_ids", list);

            JSONObject jsonObject = new JSONObject(map);
            String toJSON = jsonObject.toString();

            MediaType mediaType = MediaType.parse("application/json");
            RequestBody body = RequestBody.create(mediaType, toJSON);
            Request request = new Request.Builder()
                    .url("https://aip.baidubce.com/rpc/2.0/aasr/v1/query?access_token=" + getAccessToken())
                    .method("POST", body)
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Accept", "application/json")
                    .build();

            try (Response response = HTTP_CLIENT.newCall(request).execute()) {
                if (response.isSuccessful()) {
                    String responseBody = response.body().string();
                    log.info("创建AACR任务响应: {}", responseBody);

                    JSONArray tasksInfo = JSON.parseObject(responseBody).getJSONArray("tasks_info");

                    if (tasksInfo.size() > 0) {
                        com.alibaba.fastjson.JSONObject taskInfo = tasksInfo.getJSONObject(0);
                        taskStatus = taskInfo.getString("task_status");

                        if ("Success".equals(taskStatus)) {
                            String resultText = taskInfo.getJSONObject("task_result").getString("result");
                            // 使用正则表达式替换[""]
                            resultText = resultText.replaceAll("\\[\"|\"\\]", "");
                            log.info("语音转文字: {}", resultText);
                            return resultText;
                        } else if ("Failed".equals(taskStatus)) {
                            log.info("任务失败: {}", taskStatus);
                        }
                    } else {
                        log.info("未找到任务信息");
                    }
                } else {
                    log.info("检查任务状态失败: {}", response.code());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "";
    }


    /**
     * 从用户的AK,SK生成鉴权签名(Access Token)
     *
     * @return 鉴权签名(Access Token)
     * @throws IOException IO异常
     */
    static String getAccessToken() throws IOException {
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
                + "&client_secret=" + SECRET_KEY);
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token")
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        String access_token = new JSONObject(response.body().string()).getString("access_token");
        return access_token;
    }


    public static void main(String[] args) throws IOException {
        checkASRStatus(createAasr("https://openai-demo-1319322874.cos.na-siliconvalley.myqcloud.com/audio/2023-12-05/1701764504763878.mp3"));
        checkASRStatus(createAasr("https://aipe-speech.bj.bcebos.com/text_to_speech/2024-01-04/65966e5370172800014d6524/speech/0.mp3?authorization=bce-auth-v1%2F8a6ca9b78c124d89bb6bca18c6fc5944%2F2024-01-04T08%3A38%3A04Z%2F259200%2F%2F7ca69d814bacad356114a0ff7573734c5ceb20b363dee6c2e971b16617787ac4"));
    }

}

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java调用科大讯飞语音转写功能需要进行以下几个步骤: 1. 首先,需要获取科大讯飞语音转写API的接入凭证。可以在科大讯飞的官方网站上注册并创建应用,获得AppID、API Key和API Secret。 2. 在Java中引入科大讯飞提供的SDK包。可以通过Maven或手动引入jar包的方式将SDK包添加到Java项目中。 3. 进行SDK的初始化配置。在Java代码中,使用获得的AppID、API Key和API Secret进行初始化配置,以便调用讯飞接口。 4. 提供需要转写的语音文件。将需要转写的语音文件存储到本地或云端,并获取其本地路径或URL地址。 5. 通过调用讯飞SDK提供的相关接口,传入语音文件路径或URL地址,以及其他必要的参数(如语音格式、语言等),进行语音转写操作。 6. 处理结果。讯飞语音转写接口通常会返回转写结果的回调函数或回调地址,我们需要在回调函数中对转写结果进行处理或在回调地址中获取转写结果。 7. 可选的后续处理。根据需要,可以对转写结果进行进一步处理,如文本分析、语义理解等。 需要注意的是,前述的步骤是一个简单的概述,具体的实现细节还需根据具体的开发环境和项目需要进行调整。可以参考科大讯飞提供的官方文档和示例代码,以及进行必要的调试和优化工作。通过以上步骤,我们可以在Java中成功调用科大讯飞的语音转写功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yixian123.com

谢谢打赏,祝老板心想事成

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值