科大讯飞语音转写demo go语言版

上传了一个语音文件,识别效果。
在这里插入图片描述

package audioimport ("bytes""crypto/hmac""crypto/md5""crypto/sha1""encoding/base64""encoding/json""fmt""io/ioutil""net/http""net/url""os""strconv""time"
)const (lfasrHost    = "https://raasr.xfyun.cn/v2/api"apiUpload    = "/upload"apiGetResult = "/getResult"
)type RequestApi struct {AppID          stringSecretKey      stringUploadFilePath stringTimestamp      stringSigna          string
}// SpeechResult 代表整个识别结果的结构
type SpeechResult struct {Code     string        `json:"code"`Content  SpeechContent `json:"content"`DescInfo string        `json:"descInfo"`
}// SpeechContent 代表 result 部分的结构
type SpeechContent struct {OrderInfo   OrderInfo `json:"orderInfo"`OrderResult string    `json:"orderResult"`
}// OrderInfo 代表 orderInfo 部分的结构
type OrderInfo struct {ExpireTime       float64 `json:"expireTime"`FailType         int     `json:"failType"`OrderID          string  `json:"orderId"`OriginalDuration int     `json:"originalDuration"`RealDuration     int     `json:"realDuration"`Status           int     `json:"status"`
}// SpeechResultData 代表 orderResult 中的数据结构
type SpeechResultData struct {Lattice  []LatticeItem  `json:"lattice"`Lattice2 []Lattice2Item `json:"lattice2"`
}// LatticeItem 代表 lattice 部分的结构
type LatticeItem struct {Json1Best string `json:"json_1best"`
}// Lattice2Item 代表 lattice2 部分的结构
type Lattice2Item struct {Lid       string       `json:"lid"`End       string       `json:"end"`Begin     string       `json:"begin"`Json1Best Lattice2Best `json:"json_1best"`
}// Lattice2Best 代表 lattice2 中 json_1best 部分的结构
type Lattice2Best struct {St SpeechText `json:"st"`
}// SpeechText 代表语音识别的详细文本结构
type SpeechText struct {Sc string     `json:"sc"`Pa string     `json:"pa"`Rt []SpeechRT `json:"rt"`
}// SpeechRT 代表 rt 部分的结构
type SpeechRT struct {Ws []SpeechWS `json:"ws"`
}// SpeechWS 代表 ws 部分的结构
type SpeechWS struct {Cw []SpeechCW `json:"cw"`
}// SpeechCW 代表 cw 部分的结构
type SpeechCW struct {W  string `json:"w"`Wp string `json:"wp"`Wc string `json:"wc"`
}func extractTextFromResult(orderResult string) (string, error) {var result SpeechResultDataerr := json.Unmarshal([]byte(orderResult), &result)if err != nil {return "", err}var text string// 从 lattice2 中提取文本for _, lattice2 := range result.Lattice2 {st := lattice2.Json1Best.Stfor _, rtItem := range st.Rt {for _, wsItem := range rtItem.Ws {for _, cwItem := range wsItem.Cw {text += cwItem.W}}}}return text, nil
}func (api *RequestApi) getSigna() string {appid := api.AppIDsecretKey := api.SecretKeyts := api.Timestamp// 1. 获取 baseStringbaseString := appid + ts// 2. 对 baseString 进行 MD5md5Hash := md5.Sum([]byte(baseString))md5HashString := fmt.Sprintf("%x", md5Hash)// 3. 使用 secretKey 对 MD5 结果进行 HMAC-SHA1 加密hmacHash := hmac.New(sha1.New, []byte(secretKey))hmacHash.Write([]byte(md5HashString))signa := base64.StdEncoding.EncodeToString(hmacHash.Sum(nil))return signa
}func (api *RequestApi) upload() (map[string]interface{}, error) {fmt.Println("上传部分:")filePath := api.UploadFilePathfile, err := os.Open(filePath)if err != nil {return nil, err}defer file.Close()fileInfo, err := file.Stat()if err != nil {return nil, err}fileLen := fileInfo.Size()fileName := fileInfo.Name()param := url.Values{}param.Add("appId", api.AppID)param.Add("signa", api.Signa)param.Add("ts", api.Timestamp)param.Add("fileSize", strconv.FormatInt(fileLen, 10))param.Add("fileName", fileName)param.Add("duration", "200")url := lfasrHost + apiUpload + "?" + param.Encode()fmt.Println("upload参数:", param)fmt.Println("upload_url:", url)data, err := ioutil.ReadFile(filePath)if err != nil {return nil, err}resp, err := http.Post(url, "application/json", bytes.NewReader(data))if err != nil {return nil, err}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {return nil, err}result := make(map[string]interface{})err = json.Unmarshal(body, &result)if err != nil {return nil, err}fmt.Println("upload resp:", result)return result, nil
}func (api *RequestApi) getResult() (*SpeechResult, error) {uploadResp, err := api.upload()if err != nil {return nil, err}orderId := uploadResp["content"].(map[string]interface{})["orderId"].(string)param := url.Values{}param.Add("appId", api.AppID)param.Add("signa", api.Signa)param.Add("ts", api.Timestamp)param.Add("orderId", orderId)param.Add("resultType", "transfer,predict")url := lfasrHost + apiGetResult + "?" + param.Encode()fmt.Println("查询部分:")fmt.Println("get result参数:", param)//var result map[string]interface{}var result SpeechResultstatus := 3for status == 3 {resp, err := http.Post(url, "application/json", nil)if err != nil {return nil, err}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {return nil, err}err = json.Unmarshal(body, &result)if err != nil {return nil, err}fmt.Println(result)status = result.Content.OrderInfo.Statusif status == 4 {break}time.Sleep(5 * time.Second)}fmt.Println("get_result resp:", result)return &result, nil
}func XunfeiMain() {ts := strconv.FormatInt(time.Now().Unix(), 10)api := RequestApi{AppID:          "xxx",SecretKey:      "xxx",UploadFilePath: "XXX",Timestamp:      ts,Signa:          "",}api.Signa = api.getSigna()maps, err := api.getResult()if err != nil {fmt.Println("Error:", err)}str := maps.Content.OrderResulttext, err := extractTextFromResult(str)if err != nil {fmt.Println("Error:", err)return}fmt.Println("Extracted Text:", text)
}

需要修改XunfeiMain 函数里的 appid 和Secret 和UploadFilePath

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

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

相关文章

【图文详解】Spring是如何解决循环依赖的?

Spring是如何解决循环依赖的呢? 很多小伙伴在面试时都被问到过这个问题,刷到过这个题的同学马上就能回答出来:“利用三级缓存”。面试官接着追问:“哪三级缓存呢?用两级行不行呢?” 这时候如果没有深入研究…

Vs2022+QT+Opencv 一些需要注意的地方

要在vs2022创建QT项目,先要安装一个插件Qt Visual Studio Tools,根据个人经验选择LEGACY Qt Visual Studio Tools好一些,看以下内容之前建议先在vs2022中配置好opencv,配置方式建议以属性表的形式保存在硬盘上。 设置QT路径 打开v…

清华计算几何-算法LowBound和ConvexHull(凸包)-GrahamScan

算法复杂度最低界限LowBound 算法求解复杂度是否存在一个最低界限,有时候想尽一切办法优化一个算法,去优化其复杂度,比如 清华计算几何-ConvexHull(凸包)-求极点InTriangle/ToLeft Test-CSDN博客 清华计算几何-ConvexHull(凸包)-求极边_计…

DeFi革命:揭秘去中心化金融的核心技术与实操指南

目录 DeFi(去中心化金融)综述 基本特点 第一,DeFi 是无许可的金融 第二,DeFi 是无门槛的金融 第三,DeFi 是无人驾驶的金融 典型商业模式 闪电贷 MakerDAO 面临的挑战 DeFi技术要点 椭圆曲线签名 EIP-712:…

模拟依赖关系和 AI 是Vue.js测试的下一个前沿领域

Vue.js 是一个流行的 JavaScript 框架,因此,确保其组件按预期工作至关重要:有效,更重要的是,可靠。模拟依赖项是最有效的测试方法之一,我们将在本文中发现。 模拟依赖项的必要性 模拟依赖项是一种对测试施加…

个人定制化形象生成,FaceChain最新模型部署

FaceChain是阿里巴巴达摩院推出的一个开源的人物写真和个人数字形象的AI生成框架。 FaceChain利用了Stable Diffusion模型的文生图功能,并结合人像风格化LoRA模型训练及人脸相关感知理解模型,将输入的图片进行训练后推理输出生成个人写真图像。 FaceCh…

基于深度学习的文本自监督学习

基于深度学习的文本自监督学习(Self-Supervised Learning, SSL)是一种利用未标注文本数据通过预任务进行训练,以学习有用的文本表示的方法。自监督学习在自然语言处理(NLP)领域中取得了显著的成果,如BERT、…

Live555源码阅读笔记:哈希表的实现(C++)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

算法日记day 20(中序后序遍历序列构造二叉树|最大、合并、搜索二叉树)

一、中序后序序列构造二叉树 题目: 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,…

使用SpringEvent解决WebUploader大文件上传解耦问题

目录 前言 一、SpringEvent涉及的相关组件 1、 事件(Event) 2、事件监听器 3、事件发布器 二、WebUploader大文件处理的相关事件分析 1、事件发布的时机 2、事件发布的代码 三、事件监听器及实际的业务处理 1、文件上传处理枚举 2、文件上传监…

pthread多线程

pthread库是linux系统的多线程库。上次写完longjmp和多线程的例子。就想用系统的真线程库改写一下读写线程的例子来和大家分享。真线程库应该比自己写的功能更完善,代码也更容易写吧!… … 说到这里。我不知道接下来说什么了… …。也许是自己对多线程库…

ConstraintLayout实现原理分析

ConstraintLayout 是 Android 支持库中提供的一个非常强大的布局管理器,它允许开发者创建复杂的界面布局,并提供了比传统布局更多的灵活性。在 ConstraintLayout 中,视图之间可以通过约束来定义其位置关系,从而使得布局更加动态和…

Python+selenium web自动化测试知识点合集2

选择元素 对于百度搜索页面,如果我们想自动化输入“selenium”,怎么做呢? 这就是在网页中,操控界面元素。 web界面自动化,要操控元素,首先需要 选择 界面元素 ,或者说 定位 界面元素 就是 先…

OD C卷 - 电脑病毒感染

电脑病毒感染 (200) 一个局域网内有n台电脑,编号为 1 -> n,电脑之间病毒感染时间用 t 表示;现在网络内已有一台电脑被病毒感染,求其感染所有其他电脑最少的时间,若最后有电脑不会被感染&…

URL重写

目录 步骤1 规则语法 Nginx URL重写规则语法 Apache URL重写规则语法 步骤2 规则配置 Apache URL重写规则配置 启用mod_rewrite模块 配置.htaccess文件 编写重写规则 测试重写规则 Nginx URL重写规则配置 配置server或location块 测试重写规则 步骤1 规则语法 Ngin…

如何使用Redis实现一个缓存策略

使用Redis实现一个缓存策略,主要涉及到数据的存储、读取、更新以及失效处理等方面。下面我将详细介绍如何使用Redis来设计和实现一个基本的缓存策略。 1. 确定缓存的数据结构和键命名规则 首先,你需要决定使用Redis中的哪种数据结构来存储缓存数据&…

解决在from pyhdf.SD import SD,SDC时No module named “hdfext“

文章内容仅用于自己知识学习和分享,如有侵权,还请联系并删除 :) 1. 错误原因: 参考了多个博主的解决办法,结合自己的尝试,发现造成这个问题的主要原因是numpy版本太高 2. 解决方法 方法1&…

Day.31 | 1049.最后一块石头的重量II 494.目标和 474.一和零

1049.最后一块石头的重量II 要点&#xff1a;思路与分割等和子集很类似&#xff0c;把总数分成和最接近的两堆&#xff0c;然后用01背包的套路解答 class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum 0;for (int i : stones)sum i;i…

C++客户端Qt开发——界面优化(QSS)

1.QSS 如果通过QSS设置的样式和通过C代码设置的样式冲突&#xff0c;则QSS优先级更高 ①基本语法 选择器{属性名&#xff1a;属性值; } 例如&#xff1a; QPushButton {color: red; } 1>指定控件设置样式 #include "widget.h" #include "ui_widget.h&qu…

Unity Editor免登录启动 无需UnityHub

Unity Editor免登录启动项目无需UnityHub&#xff0c;命令行启动项目。需要开发Unity项目&#xff0c;就必须使用 Unity Hub来管理你的项目&#xff0c;还必须要申请一个免费许可&#xff0c;确实有点麻烦&#xff0c;官方已经提供了相关命令行&#xff0c;来直接使用Unity Edi…