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

文章目录

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

java 复制代码
// 替换为实际的 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 存储在安全的环境中,避免硬编码。

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

获取APIkey:
阿里apikey获取

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

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

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

4.1 请求
bash 复制代码
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

返回

bash 复制代码
{
  "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。
bash 复制代码
curl -X POST -i 'https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}' --header 'Authorization: Bearer {api-key}'

返回

bash 复制代码
{
  "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 响应:

bash 复制代码
        "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

bash 复制代码
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dashscope-sdk-java</artifactId>
            <version>2.16.8</version>
        </dependency>

2. 代码

bash 复制代码
    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. 响应格式处理

bash 复制代码
 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. 响应格式

java 复制代码
{
    "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 的完整流程,从前提准备到代码实现,为开发者提供了便捷的音频识别方案。通过将该功能集成到应用中,可以显著提升项目的智能化程度,更好地服务于用户。

相关推荐
DREAM依旧14 分钟前
隐马尔科夫模型|前向算法|Viterbi 算法
人工智能
GocNeverGiveUp27 分钟前
机器学习2-NumPy
人工智能·机器学习·numpy
智慧老师44 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
B站计算机毕业设计超人1 小时前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
学术头条1 小时前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
18号房客2 小时前
一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·sklearn
feifeikon2 小时前
机器学习DAY3 : 线性回归与最小二乘法与sklearn实现 (线性回归完)
人工智能·机器学习·线性回归
游客5202 小时前
opencv中的常用的100个API
图像处理·人工智能·python·opencv·计算机视觉
古希腊掌管学习的神2 小时前
[机器学习]sklearn入门指南(2)
人工智能·机器学习·sklearn
凡人的AI工具箱2 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite