python实现语音识别(讯飞开放平台)

news2024/11/24 20:07:02

文章目录

  • 讯飞平台使用
  • python实现讯飞接口的语音识别
    • 第一步:导入需要的依赖库
    • 第二步:初始化讯飞接口对象
    • 第三步:收到websocket建立连接后的处理函数
    • 第四步:收到websocket消息的处理函数
    • 第五步:整合运行各函数

讯飞平台使用

1.注册讯飞平台账号讯飞官网网址。
2.打开讯飞控制台。
3.点击“创建新应用”。
在这里插入图片描述
4.输入“应用名称”,“应用分类”,“应用功能描述”(这些都是自定义的)。
5.创建成功后,记住“APPID”,“APISecret”,“APIKey”这三个关键。
在这里插入图片描述

python实现讯飞接口的语音识别

第一步:导入需要的依赖库

import websocket
import hashlib
import base64
import hmac
import json
from urllib.parse import urlencode
import time
import ssl
from wsgiref.handlers import format_date_time
from datetime import datetime
from time import mktime
import _thread as thread
import pyaudio

如果有没有的依赖库,通过pip在Anaconda的配置虚拟环境进行依赖库的下载。
例如:

pip install pyaudio

第二步:初始化讯飞接口对象

class Ws_Param(object):
    # 初始化接口对象
    def __init__(self,APPID,APIKey,APISecret):
        # 初始化讯飞接口的ID,Key,Secret
        self.APPID=APPID
        self.APIKey=APIKey
        self.APISecret=APISecret
        # 公共参数(common)
        self.CommonArgs={"app_id":self.APPID}
        # 业务参数(business)
        self.BusinessArgs={"domain":"iat","language":"zh_cn",
                           "accent":"mandarin","vinfo":1,"vad_eos":1000}

    def create_url(self):
        # 生成url
        url='wss://ws-api.xfyun.cn/v2/iat'
        now=datetime.now()
        date=format_date_time(mktime(now.timetuple()))
        # 生成RFC1123格式的时间戳
        signature_origin = "host: " + "ws-api.xfyun.cn" + "\n"
        signature_origin += "date: " + date + "\n"
        signature_origin += "GET " + "/v2/iat " + "HTTP/1.1"
        # 拼接字符串
        signature_sha = hmac.new(self.APISecret.encode('utf-8'),
                                 signature_origin.encode('utf-8'),
                                 digestmod=hashlib.sha256).digest()
        signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')
        # 进行hmac_sha256进行加密
        authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", " \
                               "signature=\"%s\"" % (self.APIKey, "hmac-sha256",
                                                     "host date request-line", signature_sha)
        authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
        v={
            "authorization": authorization,
            "date": date,
            "host": "ws-api.xfyun.cn"
        }
        # 将请求的鉴权参数组合为字典
        url=url+'?'+urlencode(v)
        # 拼接鉴权参数,生成url
        return url

第三步:收到websocket建立连接后的处理函数

def on_open(ws):
    # 收到websocket连接建立的处理
    def run(*args):
        # 在线音频处理并发送到讯飞
        status=STATUS_FIRST_FRAME
        # 音频的状态信息,标识音频是第一帧,还是中间帧、最后一帧
        CHUNK = 520  # 定义数据流块
        FORMAT = pyaudio.paInt16  # 16bit编码格式
        CHANNELS = 1  # 单声道
        RATE = 16000  # 16000采样频率
        p=pyaudio.PyAudio()  # 录音
        # 实例化pyaudio对象
        stream = p.open(format=FORMAT,  # 音频流wav格式
                        channels=CHANNELS,  # 单声道
                        rate=RATE,  # 采样率16000
                        input=True,
                        frames_per_buffer=CHUNK)
        # 创建音频流,使用这个对象去打开声卡,设置采样深度、通道数、采样率、输入和采样点缓存数量
        print("---------------开始录音-----------------")
        # 开始录音
        global text
        for i in range(0,int(RATE/CHUNK*60)):
            # 录制特定时间的音频
            buf=stream.read(CHUNK)
            # 读出声卡缓冲区的音频数据
            if not buf:
                status=STATUS_LAST_FRAME
            if status==STATUS_FIRST_FRAME:
                # 首帧处理
                d = {"common": wsParam.CommonArgs,
                     "business": wsParam.BusinessArgs,
                     "data": {"status": 0, "format": "audio/L16;rate=16000",
                              "audio": str(base64.b64encode(buf), 'utf-8'),
                              "encoding": "raw"}}
                d = json.dumps(d)
                # 将拼接的字符串d数据结构转换为json
                ws.send(d)
                status=STATUS_CONTINUE_FRAME
            elif status==STATUS_CONTINUE_FRAME:
                # 中间帧处理
                d = {"data": {"status": 1, "format": "audio/L16;rate=16000",
                              "audio": str(base64.b64encode(buf), 'utf-8'),
                              "encoding": "raw"}}
                ws.send(json.dumps(d))
            elif status==STATUS_LAST_FRAME:
                # 最后一帧处理
                d = {"data": {"status": 2, "format": "audio/L16;rate=16000",
                              "audio": str(base64.b64encode(buf), 'utf-8'),
                              "encoding": "raw"}}
                ws.send(json.dumps(d))
                time.sleep(1)
                break
    thread.start_new_thread(run,())

第四步:收到websocket消息的处理函数

def on_message(ws,message):
    # 收到websocket消息的正常处理
    try:
        # print(json.loads(message))
        code = json.loads(message)["code"]
        # 解码返回的message的json数据中的code
        sid = json.loads(message)["sid"]
        if code != 0:
            errMsg = json.loads(message)["message"]
            # 解码message中错误信息
            print("sid:%s call error:%s code is:%s" % (sid, errMsg, code))
        else:
            data = json.loads(message)["data"]["result"]["ws"]
            # 解码message中ws数据
            result = ""
            for i in data:
                for w in i["cw"]:
                    result += w["w"]

            if result == '。' or result == '.。' or result == ' .。' or result == ' 。':
                pass
            else:
                # t.insert(END, result)  # 把上边的标点插入到result的最后
                print("翻译结果: %s。" % (result))
                global recording_results
                recording_results=result
    except Exception as e:
        # 异常处理,参数异常
        print("receive msg,but parse exception:", e)

def on_error(ws,error):
    # 收到websocket后错误的处理
    print("### error ### : ",error)
    run()
    # 重新启动监听

def on_close(ws):
    # 收到websocket关闭的处理
    pass

第五步:整合运行各函数

在这里面有三个关键的地方:“APPID”,“APIKey”,“APISecret”。
将上面讯飞控制台应用项目中的“APPID”,“APIKey”,“APISecret”粘贴到代码中。

def run():
    global wsParam
    wsParam=Ws_Param(APPID='5d27db6',
                    APIKey='d61163a9bdb5d0508f98dee66e0383',
                    APISecret='ZTQ5NTAwZTk05MDdhNWViZjcyYjVh')
    # 初始化讯飞接口编码
    
    websocket.enableTrace(False)
    # True表示默认在控制台打印连接和信息发送接收情况
    
    wsUrl=wsParam.create_url()
    # 生成讯飞的url进行连接
    
    ws=websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close)
    ws.on_open=on_open  # 进行websocket连接
    
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE}, ping_timeout=2)
    # 无限循环,只要这个websocket连接未断开,这个循环就会一直进行下去

开始运行。

if __name__ == '__main__':
	run()

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

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

相关文章

linux内核TCP源码浅析

目录 数据接收流程驱动层网络层ip_local_deliverip_local_deliver_finish 传输层tcp_v4_rcvtcp_v4_do_rcvtcp_rcv_establishedtcp_recvmsg linux内核源码下载:https://cdn.kernel.org/pub/linux/kernel/ 我下载的是:linux-5.11.1.tar.gz 数据接收流程 …

服务器数据库被360后缀勒索病毒攻击怎么办?360勒索病毒的加密形式

近日,我们收到很多企业的求助,企业服务器内的多种数据库被.360后缀的勒索病毒加密,导致企业许多工作无法正常运转,也给企业带来了严重的经济损失。360后缀勒索病毒是一种恶意软件,它属于BeijingCrypt勒索病毒家族&…

Server - 通过 AutoSSH 建立服务器端口转发用于访问网页

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131536508 AutoSSH 是一款用于创建和维护持久的SSH隧道的工具,可以自动检测和恢复断开的连接,从而保证隧道的稳定性。Auto…

VS2022集成代码规范组件StyleCop.Analyzers应用于解决方案

背景 项目团队刚刚组件,每个人的代码编写习惯都不一样,希望用一款代码规范的检查插件来规范团队成员编写代码的习惯,在网上找了一遍之后,感觉StyleCop.Analyzers比较适用。 集成方法 1.NuGet搜索StyleCop.Analyzers进行安装到指…

docker-compose启动redis:Can‘t open the append-only file: permission deined

一、问题 docker-compose启动redis:Can‘t open the append-only file: permission deined //1-进入docker文件夹下 cd /docker//2-使用docker-comopse启动Mysql和redis docker-compose up -d mysql redisCan‘t open the append-only file: permission deined这里…

教你实现图片的点击缩放和移动

教你实现图片的点击缩放和移动 为了方案的通用性&#xff0c;这回使用基本的htmljs进行操作&#xff0c;vue和react使用方法类似&#xff0c;几乎不需要进行什么语法转换操作&#xff0c;注意一下点击事件在自己框架里的写法即可 随便来写一个简单的页面&#xff1a; <ht…

如何在Windows 10和Linux上安装nvm

在Windows 10上安装nvm&#xff1a; 访问nvm的GitHub页面&#xff08;https://github.com/coreybutler/nvm-windows/releases &#xff09;&#xff0c;下载最新的安装程序。运行下载的安装程序&#xff0c;按照提示进行安装。选择合适的安装路径。完成安装后&#xff0c;打开…

你对未来Android 车载开发市场怎么看?

前阵子看到一个新闻说&#xff1a;“中国进口车销量创10年来新低 “产业变革效应”正在显现”&#xff0c;于是我的好奇心让我点开看了一下 原来是国产的新能源汽车的崛起&#xff0c;受到了不少国内外客户的欢迎&#xff0c;使得订单量暴涨&#xff0c;出口的数量反超进口车数…

【python】jupyter notebook的快捷键

Jupyter Notebook 提供了许多快捷键以方便操作。这些快捷键分为两类&#xff1a;命令模式快捷键和编辑模式快捷键。 命令模式快捷键&#xff1a; 在命令模式下&#xff0c;细胞边框是蓝色的。这些快捷键主要用于操作单元格。 Enter&#xff1a;进入编辑模式Shift Enter&…

MBD开发 STM32 ADC

在cubemx配置好adc&#xff0c;和串口(阻塞) function [nbChar,buff] convert(u)if coder.target(Sfun)buff uint32(0);nbChar uint16(0); elsecoder.cinclude(stdio.h);coder.cinclude(main.h);coder.cinclude(getBuffPtr.h);string char(zeros(1,20));stringSize uint16…

3F倾听模型

3F倾听模型 3F倾听模型|苏格拉底说&#xff1a;“上天赐给每个人两只耳朵&#xff0c;而只有一张嘴巴&#xff0c;就是要求人们多听&#xff0c;少说话。” 模型介绍 运用心得 到底听什么&#xff1f; 倾听听事实&#xff0b;感受情绪&#xff0b;理解对方意图 1、分清事实…

48 # 单向链表

上一节讲了可读流&#xff0c;在讲可写流之前得了解一下链表。 比如&#xff1a;并发往文件中写入数据 write("1"); write("2"); write("3");每次写都会开个线程&#xff0c;上面的写入可能出现 123&#xff0c;321&#xff0c;213… node 中…

EMQX在Windows系统下的开机自启与异常自动重启脚本

0.前言 由于为某万年老项目做运维&#xff0c;但源码遗失以及项目遗留问题导致emqx经常崩溃&#xff0c;故无法追根溯源&#xff0c;迫于无奈才不得已出此下策&#xff0c;以定时监测并自动重启EXMQ为临时解决方案&#xff0c;若能一劳永逸当然再好不过&#xff0c;各位友友们自…

GS DynamicMeshActor

GS DynamicMeshActor GeometryScript DynamicMeshActor。 ADynamicMeshActor与AStaticMeshActor类似之处在于&#xff0c;它主要是UDynamicMeshComponent的容器。但是&#xff0c;DynamicMeshActor确实为想要基于UDynamicMesh实现程序化网格体生成的Actor蓝图提供了一些特定支…

【C语言】图文解析,深入浅出汉诺塔问题

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,这里是君兮_&#xff0c;今天更新一篇我一直想更但是一直没空写的博客——汉诺塔问题&#xff0c;在所有有关递归的问题中&#xff0c;汉诺塔问题是最经典的问题之一&#xff0c;可以说&#xff0c;如果你能真正理…

GitGithub 上手就是这么简单!

Git 和 Github 对程序员或计算机爱好者来说肯定都不陌生&#xff0c;这个不多说&#xff01;下面要做的就是带你光速掌握 git 和 github 的日常操作&#xff0c;让你做到心中有数。 我们为什么要学习Git&Github&#xff1f;嗯… 相信你是带着目的学习的&#xff01; 不过…

Nginx三大核心功能

一、反向代理&#x1f349; (1)什么是正向代理&#x1f95d; 概念 正向代理是一个位于客户端和目标服务器之间的代理服务器&#xff08;中间服务器&#xff09;。为了从目标服务器取得内容&#xff0c;客户端向代理服务器发送一个请求&#xff0c;并且指定目标服务器&#xf…

Lion:闭源大语言模型的对抗蒸馏

Lion&#xff1a;闭源大语言模型的对抗蒸馏 Lion&#xff0c;由香港科技大学提出的针对闭源大语言模型的对抗蒸馏框架&#xff0c;成功将 ChatGPT 的知识转移到了参数量 7B的 LLaMA 模型&#xff08;命名为 Lion&#xff09;&#xff0c;在只有 70k训练数据的情况下&#xff0…

白嫖一份小白到进阶网络安全学习宝典【建议收藏】

前言 想学网络安全但是无从下手的小白看过来&#xff0c;非常系统的学习资料&#xff0c;无数小白看了这份资料都已经成功入门&#xff0c;涵盖多个网络安全知识点&#xff0c;我愿称之为网络安全自学宝典。 一、概念性知识 1、了解什么是网络安全 2、清楚法律法规 3、网络安…

【ElatsticSearch】ES索引库与文档的增删改查

文章目录 一、操作索引库1、mapping映射属性2、索引库的CRUD 二、文档操作1、新增文档2、查询文档3、删除文档4、修改文档5、注意点 一、操作索引库 1、mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数…