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