科大讯飞语音转写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…

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、文件上传监…

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

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

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

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

qt--做一个拷贝文件器

一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位(自适应) 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类,直接使用静态…

Redis缓存数据库进阶——Redis与分布式锁(6)

分布式锁简介 1. 什么是分布式锁 分布式锁是一种在分布式系统环境下,通过多个节点对共享资源进行访问控制的一种同步机制。它的主要目的是防止多个节点同时操作同一份数据,从而避免数据的不一致性。 线程锁: 也被称为互斥锁(Mu…

Robot Operating System——内部审查(Introspection)Service

大纲 introspection_service检验Parameter值和类型修改内部审查(Introspection)功能的状态完整代码 introspection_client完整代码 测试参考资料 在ROS 2(Robot Operating System 2)中,内部审查(Introspect…

【中项】系统集成项目管理工程师-第7章 软硬件系统集成-7.3软件集成

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

python 裁剪图片

情况: 有时候看视频,看到一个漂亮的妹子,按下 Alt PrintScreen 进行截图之后,会把整个屏幕都截图。 需要适当剪裁一下。 每次打开 PS , 也太慢了。 所以写个代码, 快速处理。 效果对比: 原始…

【2025留学】德国留学真的很难毕业吗?为什么大家不来德国留学?

大家好!我是德国Viviane,一句话讲自己的背景:本科211,硕士在德国读的电子信息工程。 之前网上一句热梗:“德国留学三年将是你人生五年中最难忘的七年。”确实,德国大学的宽进严出机制,延毕、休…

OOP知识整合----集合

目录 一、定义 1、集合: ( 不限制长度,存多少是多少) 2、集合框架: 二、List集合中常用的方法 1、Boolean add(Object o) 2、void add(int index,Object o) 3、Boolean remove(Object o) 4、Object remove(int index) 5、int size() 6、Boolean conta…

Code Effective学习笔记--第8章防御式编程

这一章聚焦如何通过断言和Java的异常处理机制这些防御式编程的方法来提高程序的健壮性和安全性,这是防御式编程技术的方面。但是健壮性和安全性到了一定的程度其实是矛盾的,健壮性意味着对于任何的输入,程序都不会终止而且都能给出返回&#…

Tftp服务器环境搭建

1、什么是Tftp TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种基于UDP(User Datagram Protocol)的文件传输协议,它被设计为一个非常简单的文件传输机制,特别适用于那些对复杂性有…