当前位置: 首页 > article >正文

[AIGC]使用阿里云Paraformer语音识别录音识别 API 进行音频处理 —— 完整流程及代码示例

文章目录

    • 一、前提准备
      • 1. 阿里云账号
      • 2. 开通录音识别服务
      • 3. 获取 API Key 和 Access Token
    • 二、阿里云录音识别 API 的主要功能介绍
    • 三、通过HTTP调用接口实现异步转写音视频文件
      • 1. 开始
      • 2. 设置环境变量
      • 3. 生成 Token
      • 4. 上传文件并发起识别请求
        • 4.1 请求
        • 4.2 请将'{api-key}'替换为你的apikey,'{task_id}'为提交任务成功后获得的task_id。
      • 5. 解析识别结果
    • 四、Java SDK代码
      • 1. 配置Maven
      • 2. 代码
      • 3. 响应格式处理
      • 4. 响应格式
      • 5.请求参数
    • 五、结果处理与应用
    • 六、错误处理和优化建议
    • 总结

近年来,随着语音识别技术的进步和应用场景的增多,越来越多的开发者希望将自动化录音识别功能集成到自己的项目中。阿里云录音识别 API(Paraformer)是一款功能强大、精度高的服务,能够帮助开发者轻松实现录音转文字、语音分析等需求。本文将从 API 调用到实际项目集成,详细介绍阿里云录音识别的使用方法。

一、前提准备

1. 阿里云账号

确保拥有阿里云账号,若没有,可以在 阿里云官网注册。需要完成实名认证,确保可以访问 API 服务。

2. 开通录音识别服务

在阿里云控制台搜索“录音识别”或“SenceVoice”,找到相关服务,并根据项目需求选择合适的计费方式。

3. 获取 API Key 和 Access Token

访问阿里云的 访问控制管理(RAM),创建一个用户或角色以生成 Access Key IDAccess Key Secret。这是访问 API 的必要凭证。

二、阿里云录音识别 API 的主要功能介绍

阿里云录音识别 API 提供了丰富的语音处理能力,主要功能包括:

  • 实时识别:对实时音频流进行识别,适用于实时对话场景。
  • 文件识别:上传音频文件,并将其转换为文本,适用于电话录音、会议记录等场景。
  • 语音增强:优化音频质量,减少背景噪音。

我们本文将重点介绍“文件识别”功能,使用阿里云录音识别 API 将上传的音频文件转换成文字。

三、通过HTTP调用接口实现异步转写音视频文件

1. 开始

文件转写是异步任务,开发者可以通过HTTP提交接口提交任务,并且在循环中通过查询接口确认任务状态。在文件转写完成后获得语音识别结果。

2. 设置环境变量

// 替换为实际的 Access Key ID 和 Access Key Secret
String accessKeyId = "your-access-key-id";
String accessKeySecret = "your-access-key-secret";

3. 生成 Token

阿里云 API 请求需要 Access KeyAccess Token 认证。为了保证请求的安全性,建议将生成的 Token 存储在安全的环境中,避免硬编码。

// 使用阿里云 SDK 或手动生成 Token,请参阅官方文档。
String token = "your-access-token";  // 请根据文档生成

获取APIkey:
阿里apikey获取

4. 上传文件并发起识别请求

我们可以通过 API 将音频文件上传到阿里云的服务器并请求识别。以 HTTP POST 请求的方式上传音频文件,API 会返回任务 ID,用于获取识别结果。

文件转写是异步任务,开发者可以通过HTTP提交接口提交任务,并且在循环中通过查询接口确认任务状态。在文件转写完成后获得语音识别结果。

4.1 请求
curl -X POST \
    -H 'Authorization: Bearer {api-key}' \
    -H 'Content-Type: application/json' \
    -H 'X-DashScope-Async: enable' \
    -d '{"model":"paraformer-v2","input":{"file_urls":["https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
        "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav"]},"parameters":{"channel_id":[0],"language_hints":["zh", "en"]}}' \
    https://dashscope.aliyuncs.com/api/v1/services/audio/asr/transcription

返回

{
  "output": {
    "task_status": "PENDING",
    "task_id": "c2e5d63b-96e1-4607-bb91-************"
  },
  "request_id": "77ae55ae-be17-97b8-9942--************""
}
4.2 请将’{api-key}‘替换为你的apikey,’{task_id}'为提交任务成功后获得的task_id。
curl -X POST -i 'https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}' --header 'Authorization: Bearer {api-key}'

返回

{
  "request_id": "f9e1afad-94d3-997e-a83b-************",
  "output": {
    "task_id": "f86ec806-4d73-485f-a24f-************",
    "task_status": "SUCCEEDED",
    "submit_time": "2024-09-12 15:11:40.041",
    "scheduled_time": "2024-09-12 15:11:40.071",
    "end_time": "2024-09-12 15:11:40.903",
    "results": [
      {
        "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav",
        "transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/pre/filetrans-16k/20240912/15%3A11/3bdf7689-b598-409d-806a-121cff5e4a31-1.json?Expires=1726211500&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4****&Signature=Fj%2BaF%2FH0Kayj3w3My2ECBeP****%3D",
        "subtask_status": "SUCCEEDED"
      },
      {
        "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
        "transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/pre/filetrans-16k/20240912/15%3A11/409a4b92-445b-4dd8-8c1d-f110954d82d8-1.json?Expires=1726211500&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4****&Signature=v5Owy5qoAfT7mzGmQgH0g8C****%3D",
        "subtask_status": "SUCCEEDED"
      }
    ],
    "task_metrics": {
      "TOTAL": 2,
      "SUCCEEDED": 2,
      "FAILED": 0
    }
  },
  "usage": {
    "duration": 9
  }
}

5. 解析识别结果

API 会返回一个包含转录的url(transcription_url) 的 JSON 响应:

        "transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/pre/filetrans-16k/20240912/15%3A11/409a4b92-445b-4dd8-8c1d-f110954d82d8-1.json?Expires=1726211500&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4****&Signature=v5Owy5qoAfT7mzGmQgH0g8C****%3D",

四、Java SDK代码

1. 配置Maven

  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dashscope-sdk-java</artifactId>
            <version>2.16.8</version>
        </dependency>

2. 代码

    public static void main(String[] args) {
        TranscriptionParam param =
                TranscriptionParam.builder()
                        // 如您未将API Key配置到环境变量中,可带上下面这行代码并将your-dashscope-api-key替换成您自己的API Key
                        .apiKey("你的apikey")
                        .model("paraformer-v2")
                        .fileUrls(
                                Collections.singletonList(
                                        "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav"))
                        // “language_hints”只支持paraformer-v2和paraformer-realtime-v2模型
                        .parameter("language_hints", new String[]{"zh", "en"})
                        .channelId(Arrays.asList(1,2))
//                        .speakerCount(2)
//                        .diarizationEnabled(true)
                        .timestampAlignmentEnabled(true)
                        .build();
        try {
            final Transcription transcription = new Transcription();
            // 提交转写请求
            TranscriptionResult result = transcription.asyncCall(param);
            // 打印TaskId
            System.out.println("TaskId: " + result.getTaskId());
            // 等待转写完成
            result =
                    transcription.wait(
                            TranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
            // 获取转写结果
            List<TranscriptionTaskResult> taskResultList = result.getResults();
            if (taskResultList != null && taskResultList.size() > 0) {
                TranscriptionTaskResult taskResult = taskResultList.get(0);
                // 获取转写结果的url
                String transcriptionUrl = taskResult.getTranscriptionUrl();
                // 通过Http获取url内对应的结果
                HttpURLConnection connection =
                        (HttpURLConnection) new URL(transcriptionUrl).openConnection();
                connection.setRequestMethod("GET");
                connection.connect();
                BufferedReader reader =
                        new BufferedReader(new InputStreamReader(connection.getInputStream()));
                // 格式化输出json结果
                Gson gson = new GsonBuilder().setPrettyPrinting().create();
                JsonObject json = gson.fromJson(reader, JsonObject.class);

                String text = formattedText(json);
                System.out.println("text = " + text);

//                System.out.println(gson.toJson(gson.fromJson(reader, JsonObject.class)));
            }
        } catch (Exception e) {
            System.out.println("error: " + e);
        }
        System.exit(0);
    }

3. 响应格式处理

 public static String formattedText(JsonObject json ){
        StringBuilder formattedText = new StringBuilder();
        JsonElement fileUrl = json.get("file_url");
        JsonArray transcripts = json.has("transcripts") && !json.get("transcripts").isJsonNull() ? json.getAsJsonArray("transcripts") : new JsonArray();

        for (JsonElement transcript : transcripts) {
            JsonArray sentences = transcript.getAsJsonObject().has("sentences") ?
                    transcript.getAsJsonObject().getAsJsonArray("sentences") : new JsonArray();

            for (JsonElement sentence : sentences) {
                JsonObject sentenceObj = sentence.getAsJsonObject();

                int speakerId = sentenceObj.has("speaker_id") && !sentenceObj.get("speaker_id").isJsonNull()
                        ? sentenceObj.get("speaker_id").getAsInt() : 0;
                String text = sentenceObj.has("text") && !sentenceObj.get("text").isJsonNull()
                        ? sentenceObj.get("text").getAsString() : "[]";

                formattedText.append("角色")
                        .append(speakerId + 1)
                        .append(":")
                        .append(text)
                        .append("\n");
            }
        }
        return formattedText.toString();

    }

4. 响应格式

{
    "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav",
    "properties": {
        "audio_format": "pcm_s16le",
        "channels": [
            0
        ],
        "original_sampling_rate": 16000,
        "original_duration_in_milliseconds": 4726
    },
    "transcripts": [
        {
            "channel_id": 0,
            "content_duration_in_milliseconds": 4570,
            "text": "Hello world, 这里是阿里巴巴语音实验室。",
            "sentences": [
                {
                    "begin_time": 140,
                    "end_time": 4710,
                    "text": "Hello world, 这里是阿里巴巴语音实验室。",
                    "words": [
                        {
                            "begin_time": 140,
                            "end_time": 597,
                            "text": "Hello ",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 597,
                            "end_time": 1054,
                            "text": "world",
                            "punctuation": ", "
                        },
                        {
                            "begin_time": 1054,
                            "end_time": 1663,
                            "text": "这里",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 1663,
                            "end_time": 2272,
                            "text": "是阿",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 2272,
                            "end_time": 2881,
                            "text": "里巴",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 2881,
                            "end_time": 3490,
                            "text": "巴语",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 3490,
                            "end_time": 4099,
                            "text": "音实",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 4099,
                            "end_time": 4710,
                            "text": "验室",
                            "punctuation": "。"
                        }
                    ]
                }
            ]
        }
    ]
}
{
    "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
    "properties": {
        "audio_format": "pcm_s16le",
        "channels": [
            0
        ],
        "original_sampling_rate": 16000,
        "original_duration_in_milliseconds": 3834
    },
    "transcripts": [
        {
            "channel_id": 0,
            "content_duration_in_milliseconds": 3530,
            "text": "Hello world, 这里是阿里巴巴语音实验室。",
            "sentences": [
                {
                    "begin_time": 280,
                    "end_time": 3810,
                    "text": "Hello world, 这里是阿里巴巴语音实验室。",
                    "words": [
                        {
                            "begin_time": 280,
                            "end_time": 633,
                            "text": "Hello ",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 633,
                            "end_time": 986,
                            "text": "world",
                            "punctuation": ", "
                        },
                        {
                            "begin_time": 986,
                            "end_time": 1456,
                            "text": "这里",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 1456,
                            "end_time": 1926,
                            "text": "是阿",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 1926,
                            "end_time": 2396,
                            "text": "里巴",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 2396,
                            "end_time": 2866,
                            "text": "巴语",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 2866,
                            "end_time": 3336,
                            "text": "音实",
                            "punctuation": ""
                        },
                        {
                            "begin_time": 3336,
                            "end_time": 3810,
                            "text": "验室",
                            "punctuation": "。"
                        }
                    ]
                }
            ]
        }
    ]
}

5.请求参数

在这里插入图片描述

五、结果处理与应用

在接收到录音识别的结果后,可以将文本内容用于:

  • 实时字幕生成:适用于直播、会议等场景。
  • 录音内容分析:通过自然语言处理技术进一步分析录音内容,例如情绪分析、关键词提取等。

六、错误处理和优化建议

在开发过程中,建议对以下可能出现的错误进行处理:

  • 鉴权失败:检查 Access Key、Access Token 是否有效。
  • 请求超时:通过重试机制提升请求的可靠性。
  • 任务未完成:如果任务处于处理中,可以设置轮询或异步回调机制,提高响应速度。

总结

本文介绍了使用阿里云录音识别 API 的完整流程,从前提准备到代码实现,为开发者提供了便捷的音频识别方案。通过将该功能集成到应用中,可以显著提升项目的智能化程度,更好地服务于用户。


http://www.kler.cn/a/395459.html

相关文章:

  • JavaScript 自动化软件:AutoX.js
  • 云原生周刊:Istio 1.24.0 正式发布
  • 《鸿蒙生态:开发者的机遇与挑战》
  • 在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5
  • 【NLP】医学搜索Query相关性判断【阿里云:天池比赛】
  • MFC工控项目实例三十实现一个简单的流程
  • 后仿真中的GLS测试用例的选取规则
  • 2024自动驾驶线控底盘行业研究报告
  • postgresql.conf与postgresql.auto.conf区别
  • 【postman】怎么通过curl看请求报什么错
  • 入侵排查之Linux
  • 自监督对比学习奠基之作CPC
  • mysql字符串、数学、日期和时间、类型转换、逻辑函数函数的说明用法
  • 安全见闻8
  • MATLAB蒙特卡洛仿真计算投资组合的VaR(Value at Risk )
  • LeetCode Hot 100 题解[java版本,冲大厂]
  • 使用Markmap从链接生成脑图并下载为交互式HTML文件
  • 大数据技术之Hadoop :我是恁爹
  • JVM详解:类的加载过程
  • LeetCode 491-非递减子序列
  • inpainting 语言驱动
  • 免费申请 Let‘s Encrypt SSL 证书
  • MongoDB分布式集群搭建----副本集----PSS/PSA
  • 28-一些常见的内存问题
  • 【SQL】E-R模型(实体-联系模型)
  • 【eNSP】路由基础与路由来源——静态路由实验