讯飞语音转写WebApi 【JS语言】

news2024/11/29 23:03:57

讯飞语音转写 API 文档

文档地址:https://www.xfyun.cn/doc/asr/ifasr_new/API.html

看到没有 js 版本的 demo(音频流模式),所以就搞了一个分享出来

在 React Native 运行环境下测试有效。

在这里插入图片描述

1、生成 signa

import axios from 'axios';
import { Buffer } from 'buffer'; // 导入 Buffer
import * as CryptoJS from 'crypto-js';

const APP_ID = ''; 		// 替换为您的 appId
const SECRET_KEY = ''; 	// 替换为您的 secretKey

// 生成 signa
const generateSigna = (ts: number) => {
	const baseString = `${APP_ID}${ts}`;
	const md5Hash = CryptoJS.MD5(baseString).toString();
	const hmac = CryptoJS.HmacSHA1(md5Hash, SECRET_KEY);
	return CryptoJS.enc.Base64.stringify(hmac);
};

2、上传音频文件

// 上传音频文件
export const uploadAudio = async (file: { path: string, base64: string, name: any; size: any; duration: number; }) => {
	const ts = Math.floor(Date.now() / 1000); // 当前时间戳
	const signa = generateSigna(ts);

	// 读取音频文件为二进制数据
	// const fileData = await RNFS.readFile(filePath, 'base64'); // 读取文件为 base64 编码
	const fileData = file.base64; 									// 假设您有音频文件的 base64 编码数据
	const buffer = Buffer.from(fileData, 'base64'); // 将 base64 转换为 Buffer
	console.log("🚀 ~ uploadAudio ~ buffer:", buffer)

	// 拼接请求参数到 URL
	const url = `https://raasr.xfyun.cn/v2/api/upload
			?fileName=${encodeURIComponent(file.name)}
			&fileSize=${buffer.length}
			&duration=${Math.floor(10)}
			&standardWav=${1}
			&appId=${APP_ID}
			&ts=${ts}
			&signa=${encodeURIComponent(signa)
		}`;

	try {
		const response = await axios.post(
			url,
			buffer,
			{
				headers: {
					'Content-Type': 'application/octet-stream',
					'Content-Length': buffer.length,
				},
			});
		return response.data; // 返回响应数据
	} catch (error) {
		console.error('上传音频文件失败:', error);
	}
};

上传音频文件 使用示例

// 使用示例
 try {
 	const result = await uploadAudio(file);
 	console.log('上传成功,订单 ID:', result.content.orderId);
 } catch (error) {
 	console.error('上传失败:', error);
 }

3、查询转写结果

// 查询转写结果
export const getResult = async (orderId: string, resultType = 'transfer') => {
	const ts = `${Math.floor(Date.now() / 1000)}`; // 当前时间戳
	const signa = generateSigna(Number(ts));

	// 构建请求 URL
	const url = `https://raasr.xfyun.cn/v2/api/getResult
			?orderId=${encodeURIComponent(orderId)}
			&resultType=${encodeURIComponent(resultType)}
			&appId=${encodeURIComponent(APP_ID)}
			&ts=${ts}
			&signa=${encodeURIComponent(signa)
		}`;

	try {
		const response: any = await axios.get(url); // 使用 GET 请求
		// 检查响应状态码
		if (response.data.code !== '000000') {
			console.log(response.data.descInfo);
			return;
		}

		// 处理响应数据
		// lattice	List	做顺滑功能的识别结果
		const resultLattice = extractTranscriptionResults(JSON.parse(response.data.content.orderResult))

		// lattice2	List	未做顺滑功能的识别结果,当开启顺滑和后语规整后 orderResult 才返回 lattice2 字段(需要开通权限)
		const resultLattice2 = extractTranscriptionResults2(JSON.parse(response.data.content.orderResult))

		return resultLattice2; // 返回响应数据
	} catch (error) {
		console.error('查询转写结果失败:', error);
	}
};
// 使用示例
const orderId = ''; // 替换为实际的订单 ID
getResult(orderId)
	.then(result => {
		console.log('查询结果:', result);
	})
	.catch(error => {
		console.error('查询失败:', error);
	});

4、处理响应数据

// 做顺滑功能的识别结果
function extractTranscriptionResults(data: { lattice: any[]; }) {
	// 检查输入数据的有效性
	if (!data || !data.lattice || !data.lattice.length) {
		return [];
	}

	const transcriptions: string[] = [];

	// 遍历每个 json_1best
	data.lattice.forEach((item: { json_1best: string; }) => {
		const result = JSON.parse(item.json_1best).st;

		// 检查结果对象的有效性
		if (!result || !result.rt || !result.rt.length) {
			return;
		}

		// 提取识别结果
		let transcription = '';
		result.rt.forEach((rtItem: { ws: any[]; }) => {
			rtItem.ws.forEach((word: { cw: any; }) => {
				// 获取词语候选识别结果
				const candidates = word.cw;
				if (candidates && candidates.length) {
					// 取第一个候选词作为识别结果
					transcription += candidates[0].w;
				}
			});
		});

		// 将提取的结果添加到数组中
		transcriptions.push(transcription);
	});

	console.log("🚀 ~ extractTranscriptionResults ~ transcriptions:", transcriptions)
	return transcriptions;
}

// 未做顺滑功能的识别结果
function extractTranscriptionResults2(data: { lattice2: { json_1best: { st: any; }; }[]; }) {
	// 检查输入数据的有效性
	if (!data || !data.lattice2 || !data.lattice2.length) {
		return [];
	}

	const transcriptions: string[] = [];

	// 遍历每个 json_1best
	data.lattice2.forEach((item: { json_1best: { st: any; }; }) => {
		const result = item.json_1best.st;

		// 检查结果对象的有效性
		if (!result || !result.rt || !result.rt.length) {
			return;
		}

		// 提取识别结果
		let transcription = '';
		result.rt.forEach((rtItem: { ws: any[]; }) => {
			rtItem.ws.forEach((word: { cw: any; }) => {
				// 获取词语候选识别结果
				const candidates = word.cw;
				if (candidates && candidates.length) {
					// 取第一个候选词作为识别结果
					transcription += candidates[0].w;
				}
			});
		});

		// 将提取的结果添加到数组中
		transcriptions.push(transcription);
	});

	return transcriptions;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++基础开发环境vscode+mingw-w64

c开发需要的基础有两个:编译环境,开发环境。 最简单的编译环境可以用gcc,cl,clongllvm; 开发环境最简单直接用文本编辑器就可以。 但是实际开发都会用ide来做,现代的ide即有开发环境可以写代码,自动补全&am…

DBA面试题-1

面临失业,整理一下面试题,找下家继续搬砖 主要参考:https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1, 整形 tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节…

LSTM卫星轨道预测(一)

一.多文件预测 代码详细解析 1. 文件读取与数据处理 功能 从 .sp3 文件中读取卫星轨迹数据。提取包括 Satellite_ID, X, Y, Z 等字段的信息。计算派生特征(如速度和加速度),便于后续建模使用。 主要函数:extract_sp3_data(fil…

如何通过智能生成PPT,让演示文稿更高效、更精彩?

在快节奏的工作和生活中,我们总是追求更高效、更精准的解决方案。而在准备演示文稿时,PPT的制作往往成为许多人头疼的问题。如何让这项工作变得轻松且富有创意?答案或许就在于“AI生成PPT”这一智能工具的广泛应用。我们就来聊聊如何通过这些…

格网法计算平面点云面积(matlab版本)

1、原理介绍 格网法计算平面点云面积,其思想类似高中油膜法计算面积。其将点云投影到水平面,再将点云划分成尺寸相同的格网。最后,统计格网内包含点的数量number,那么可利用如下公式计算得到点云的面积: Aeranumber*L…

无代码实现可视化GIS+模型+三维

现在的工具是越来越方便了,本来不是做前端的。可以节省很多的人力和时间,更快的搭建自己想要的可视化大屏,看例子 主要由三维的gis地图和模型加上二维的数据表格分析来实现这个可视化界面。 gis地图的设置 每一个gis都要设置世界远点&#x…

Jmeter中的监听器

3)监听器 1--查看结果树 用途 调试测试计划:查看每个请求的详细信息,帮助调试和修正测试计划。分析响应数据:查看服务器返回的响应数据,验证请求是否成功。检查错误:识别和分析请求失败的原因。 配置步骤…

kafka进阶_3.消费消息

文章目录 一、消费消息概览1.1、消费示例代码1.2、消费过程 二、消费者组2.1、push & pull2.2、消费者组 三、调度器Coordinator四、消费者分配策略4.1、引言4.2、分配基本流程4.3、分配策略4.3.1、轮询分配策略4.3.2、轮询分配策略 五、消费偏移量5.1、起始偏移量5.2、指定…

用VC2019+MFC 创建一个DLL封装MD工业相机库然后用EXE调用这个相机库采图并且显示

主要描述: 用VC2019MFC 创建一个DLL封装MD工业相机库,再建一个EXE调用这个相机库采图并且显示。 先创建库工程: 新建一个库工程, 创建完成,添加一个DllFunction.h头文件,一个DllFunction.cpp 源文件 拷贝…

ODB 框架

目录 概述 基本工作原理 映射C对象到数据库表 从数据库中加载对象 持久化C对象到数据库 ODB常用接口 表创建预处理 #pragma db Object table 数据表属性 id auto column(“xxx”) type("xxx") unique index null default&…

ModuleNotFoundError: No module named ‘_ssl‘ centos中的Python报错

1、检查系统有没有openssl,有的话,就是python安装时没有指定openssl openssl version,有输出版本号就有,没有的话,需要手动安装 下载地址 参见https://www.openssl.org/,包括以下版本: https:/…

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

linux高级系统编程之进程

进程 一个正在进行的程序 并行与并发 并行:执行的程序在不同CPU上同时执行 并发:一个CPU,多个进程交替执行,因为交替速度很快,所以从宏观上来看是同时执行的,但是从围观的角度是交替执行的 单道与多道 单道程序设计:所有进程一个一个排队执行,若A阻塞,B只能等待,,即使CPU处于空…

GitHub Copilot革命性更新:整合顶尖AI模型,如何重塑开发体验?

在技术快速发展的今天,代码辅助工具已成为提升开发效率的利器。今天,我们带来了一个激动人心的消息——GitHub Copilot宣布引入多模型选择功能,这不仅是技术上的一次飞跃,更是对开发者工作流程的一次革新。 多模型选择&#xff1a…

AppFlow:支持飞书机器人调用百炼应用

AppFlow:支持飞书机器人调用百炼应用 简介: 本文介绍了如何创建并配置飞书应用及机器人,包括登录飞书开发者后台创建应用、添加应用能力和API权限,以及通过AppFlow连接流集成阿里云百炼服务,最后详细说明了如何将机器…

华为E9000刀箱(HWE9000V2)服务器硬件监控指标解读

随着数据中心规模的不断扩大,服务器的稳定性和可靠性变得尤为重要。华为E9000刀箱(HWE9000V2)作为一款高性能的服务器设备,其硬件状态的实时监控对于保障业务的连续性和系统的稳定运行至关重要。 监控易作为一款专业的IT基础设施监…

GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解

GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解 目录 GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GWO-SVMD灰狼算法优化逐次变分模态分解 内有15种用以优化svmd的适应度函数&#…

景联文科技:高质量数据采集标注服务引领AI革新

在当今这个数字化时代,数据已经成为推动社会进步和产业升级的关键资源。特别是在人工智能领域,高质量的数据是训练出高效、精准的AI模型的基础。景联文科技是一家专业的数据采集与标注公司,致力于为客户提供高质量的数据处理服务,…

pycharm添加gitee插件

一、拉取gitee上托管的代码到本地,用pycharm运行 前置条件 1.安装python运行环境 2.安装pycharm 安装:https://blog.csdn.net/m0_65482549/article/details/141394352 1.3.安装git git config --global user.name “" git config --global user.em…

Echarts 绘制地图

一、Apache Echarts 官网地址:https://echarts.apache.org/ npm install echarts --save 二、获取地图的GeoJSON 地址:DataV.GeoAtlas地理小工具系列 左侧是地图,右侧是JSON数据路径,点击你想要生成的地图省市、地级&#xff0…