python调用麦克风和扬声器,并调用阿里云实时语音转文字
import time
import queue
import sounddevice as sd
import numpy as np
import nls
import sys# 阿里云配置信息
URL = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"
TOKEN = "XXXX" # 参考https://help.aliyun.com/document_detail/450255.html获取token
APPKEY = "XXXX" # 获取Appkey请前往控制台:https://nls-portal.console.aliyun.com/applist# Queue to hold the recorded audio data
audio_queue = queue.Queue()
speaker_queue = queue.Queue()# Callback function to capture audio data from microphone
def audio_callback(indata, frames, time, status):if status:print(status, file=sys.stderr)audio_queue.put(indata.copy())# Callback function to capture audio data from speaker
def speaker_callback(indata, frames, time, status):if status:print(status, file=sys.stderr)speaker_queue.put(indata.copy())class RealTimeSpeechRecognizer:def __init__(self, url, token, appkey, name):self.url = urlself.token = tokenself.appkey = appkeyself.name = nameself.transcriber = Noneself.__initialize_transcriber()def __initialize_transcriber(self):self.transcriber = nls.NlsSpeechTranscriber(url=self.url,token=self.token,appkey=self.appkey,on_sentence_begin=self.on_sentence_begin,on_sentence_end=self.on_sentence_end,on_start=self.on_start,on_result_changed=self.on_result_changed,on_completed=self.on_completed,on_error=self.on_error,on_close=self.on_close,callback_args=[self.name])self.transcriber.start(aformat="pcm", enable_intermediate_result=True,enable_punctuation_prediction=True, enable_inverse_text_normalization=True)def send_audio(self, audio_data):if self.transcriber:self.transcriber.send_audio(audio_data)def stop_transcription(self):if self.transcriber:self.transcriber.stop()def on_sentence_begin(self, message, *args):print(f"{self.name} 过程中的对话: {message}")def on_sentence_end(self, message, *args):print(f"{self.name} 完整的对话: {message}")def on_start(self, message, *args):print(f"{self.name} Start: {message}")def on_result_changed(self, message, *args):print(f"{self.name} Result changed: {message}")def on_completed(self, message, *args):print(f"{self.name} Completed: {message}")def on_error(self, message, *args):print(f"{self.name} Error: {message}")def on_close(self, *args):print(f"{self.name} Closed: {args}")# 调用阿里云的语音转文字的接口
def recognize_speech(audio_data, recognizer):audio_data = np.concatenate(audio_data)recognizer.send_audio(audio_data.tobytes())# Start the audio stream and process audio data
def start_audio_stream(mic_recognizer, speaker_recognizer, speaker_device_index):with sd.InputStream(callback=audio_callback, channels=1, samplerate=16000, dtype='int16') as mic_stream, \sd.InputStream(callback=speaker_callback, channels=1, samplerate=16000, dtype='int16',device=speaker_device_index) as spk_stream:print("Recording audio... Press Ctrl+C to stop.")mic_audio_buffer = []speaker_audio_buffer = []try:while True:while not audio_queue.empty():mic_audio_buffer.append(audio_queue.get())while not speaker_queue.empty():speaker_audio_buffer.append(speaker_queue.get())if len(mic_audio_buffer) >= 10:recognize_speech(mic_audio_buffer, mic_recognizer)mic_audio_buffer = [] # Clear buffer after sendingif len(speaker_audio_buffer) >= 10:recognize_speech(speaker_audio_buffer, speaker_recognizer)speaker_audio_buffer = [] # Clear buffer after sendingtime.sleep(0.1)except KeyboardInterrupt:print("Stopping audio recording.")mic_recognizer.stop_transcription()speaker_recognizer.stop_transcription()if __name__ == "__main__":speaker_device_index = 8 # 使用 pulse 设备(索引 8)来捕获扬声器输出mic_recognizer = RealTimeSpeechRecognizer(URL, TOKEN, APPKEY, "调解人员说:")speaker_recognizer = RealTimeSpeechRecognizer(URL, TOKEN, APPKEY, "当事人说:")start_audio_stream(mic_recognizer, speaker_recognizer, speaker_device_index)
这段代码的主要功能是从麦克风和扬声器捕获音频数据,并实时将这些音频数据发送到阿里云进行语音转文字处理。以下是代码的详细解释:
导入模块
import time
import queue
import sounddevice as sd
import numpy as np
import nls
import sys
- time 和 queue:用于处理时间和线程安全的队列。
- sounddevice (sd):用于从麦克风和扬声器捕获音频数据。
- numpy (np):用于处理音频数据数组。
- nls:阿里云的语音服务库。
- sys:用于处理系统相关的操作,如错误输出。
阿里云配置信息
URL = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"
TOKEN = "016ca1620aff421da8fac81b9fb52dc5"
APPKEY = "ahS8ZDaimkpWALHi"
这些变量存储了阿里云语音服务的配置信息,包括服务的 URL、令牌(TOKEN)和应用密钥(APPKEY)。
音频数据队列
audio_queue = queue.Queue()
speaker_queue = queue.Queue()
用于存储从麦克风和扬声器捕获的音频数据。
回调函数
音频数据回调函数
def audio_callback(indata, frames, time, status):if status:print(status, file=sys.stderr)audio_queue.put(indata.copy())
这个回调函数会在音频数据可用时被调用,将捕获到的麦克风音频数据复制到 audio_queue 队列中。
扬声器数据回调函数
def speaker_callback(indata, frames, time, status):if status:print(status, file=sys.stderr)speaker_queue.put(indata.copy())
这个回调函数会在音频数据可用时被调用,将捕获到的扬声器音频数据复制到 speaker_queue 队列中。
RealTimeSpeechRecognizer 类
class RealTimeSpeechRecognizer:def __init__(self, url, token, appkey, name):self.url = urlself.token = tokenself.appkey = appkeyself.name = nameself.transcriber = Noneself.__initialize_transcriber()
初始化函数,接收 URL、TOKEN 和 APPKEY,并调用内部函数 __initialize_transcriber 初始化语音转文字服务。
def __initialize_transcriber(self):self.transcriber = nls.NlsSpeechTranscriber(url=self.url,token=self.token,appkey=self.appkey,on_sentence_begin=self.on_sentence_begin,on_sentence_end=self.on_sentence_end,on_start=self.on_start,on_result_changed=self.on_result_changed,on_completed=self.on_completed,on_error=self.on_error,on_close=self.on_close,callback_args=[self.name])self.transcriber.start(aformat="pcm", enable_intermediate_result=True,enable_punctuation_prediction=True, enable_inverse_text_normalization=True)
初始化语音转文字服务并配置相关回调函数。
def send_audio(self, audio_data):if self.transcriber:self.transcriber.send_audio(audio_data)def stop_transcription(self):if self.transcriber:self.transcriber.stop()
用于发送音频数据到阿里云并停止转录。
回调函数
def on_sentence_begin(self, message, *args):print(f"{self.name} 过程中的对话: {message}")def on_sentence_end(self, message, *args):print(f"{self.name} 完整的对话: {message}")def on_start(self, message, *args):print(f"{self.name} Start: {message}")def on_result_changed(self, message, *args):print(f"{self.name} Result changed: {message}")def on_completed(self, message, *args):print(f"{self.name} Completed: {message}")def on_error(self, message, *args):print(f"{self.name} Error: {message}")def on_close(self, *args):print(f"{self.name} Closed: {args}")
这些函数在语音转文字服务的不同事件发生时被调用,打印相关信息。
处理音频数据
def recognize_speech(audio_data, recognizer):audio_data = np.concatenate(audio_data)recognizer.send_audio(audio_data.tobytes())
将音频数据连接成一个数组并发送给阿里云语音转文字服务。
开始音频流并处理音频数据
def start_audio_stream(mic_recognizer, speaker_recognizer, speaker_device_index):with sd.InputStream(callback=audio_callback, channels=1, samplerate=16000, dtype='int16') as mic_stream, \sd.InputStream(callback=speaker_callback, channels=1, samplerate=16000, dtype='int16',device=speaker_device_index) as spk_stream:print("Recording audio... Press Ctrl+C to stop.")mic_audio_buffer = []speaker_audio_buffer = []try:while True:while not audio_queue.empty():mic_audio_buffer.append(audio_queue.get())while not speaker_queue.empty():speaker_audio_buffer.append(speaker_queue.get())if len(mic_audio_buffer) >= 10:recognize_speech(mic_audio_buffer, mic_recognizer)mic_audio_buffer = [] # Clear buffer after sendingif len(speaker_audio_buffer) >= 10:recognize_speech(speaker_audio_buffer, speaker_recognizer)speaker_audio_buffer = [] # Clear buffer after sendingtime.sleep(0.1)except KeyboardInterrupt:print("Stopping audio recording.")mic_recognizer.stop_transcription()speaker_recognizer.stop_transcription()
这个函数打开音频输入流,开始录音并处理音频数据,将其发送到阿里云进行转录。当用户按下 Ctrl+C 时,停止录音并结束转录。
主程序入口
if __name__ == "__main__":speaker_device_index = 8 # 使用 pulse 设备(索引 8)来捕获扬声器输出mic_recognizer = RealTimeSpeechRecognizer(URL, TOKEN, APPKEY, "调解人员说:")speaker_recognizer = RealTimeSpeechRecognizer(URL, TOKEN, APPKEY, "当事人说:")start_audio_stream(mic_recognizer, speaker_recognizer, speaker_device_index)
创建两个 RealTimeSpeechRecognizer 实例,一个用于麦克风,一个用于扬声器。然后开始录音和处理音频数据。
相关文章:
python调用麦克风和扬声器,并调用阿里云实时语音转文字
import time import queue import sounddevice as sd import numpy as np import nls import sys# 阿里云配置信息 URL "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1" TOKEN "XXXX" # 参考https://help.aliyun.com/document_detail/450255.html获…...
描述在React中集成第三方库(如Redux或React Router)的常见模式。
在React中集成第三方库,如状态管理库Redux或路由库React Router,通常遵循一些常见的模式和最佳实践。下面是一些集成这些库的步骤和模式: 集成Redux 安装Redux及相关包: 安装Redux及其中间件(如redux-thunk或redux-saga…...
JavaScript语法特性篇-空值合并运算符(??)
1、基本使用 空值合并运算符(??)英文名称为 Nullish coalescing operator,是一个逻辑运算符。 特性:当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。 const foo nul…...
rancher快照备份至S3
巧用rancher的S3快照备份功能,快速实现集群复制、集群转移、完全崩溃后的极限修复 1.进入集群管理,在对应的集群菜单后,点击编辑配置 2.选择ETCD,启用,Backup Snapshots to S3选项 并填入你的minio 3 配置成功后 手…...
ChatGPT API教程在线对接OpenAI APIKey技术教程
一、OpenAI基本库介绍 您可以通过 HTTP 请求与 API 进行交互,这可以通过任何编程语言实现。我们提供官方的 Python 绑定、官方的 Node.js 库,以及由社区维护的库。 要安装官方的 Python 绑定,请运行以下命令: pip install open…...
随心而遇,跟着感觉走
分数限制下,选好专业还是选好学校? 24年高考结束,很多学生犹豫选择专业还是好学校,我的建议是,选择好学校。 本人体验来说,电子,工地,计科,数学,工科相关的…...
LeetCode题练习与总结:只出现一次的数字--136
一、题目描述 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : …...
常见的中间件都在解决什么问题?
常见的中间件都在解决什么问题 RocketMQ RocketMQ 是一款功能强大的分布式消息系统。 RocketMQ 源码地址:https://github.com/apache/rocketmq(opens new window) RocketMQ 官方网站:https://rocketmq.apache.org 什么场景下用 RocketMQ?…...
微信小程序-scroll-view实现上拉加载和下拉刷新
一.scroll-view实现上拉加载 scroll-view组件通过自身一些属性实现上拉加载的功能。 lower-threshold“100"属性表示距离底部多少px就会实现触发下拉加载的事件。 类似于在.json文件里面配置"onReachBottomDistance”: 100 bindscrolltolower"getMore"属…...
TS中interface和type的区别
在 TypeScript 中,interface 和 type 都可以用来定义对象的类型,但它们之间存在一些差异。 以下是 interface 和 type 的主要区别: 扩展(Extending): interface 可以通过 extends 关键字来扩展其他 interface。interfa…...
Hightec编译器系列之高级调试技巧精华总结
Hightec编译器系列之高级调试技巧精华总结 小T为了便于大家理解,本文的思维导图大纲如下: 之前可能很多小伙伴没有使用过Hightec编译器,大家可以参考小T之前的文章《Hightec编译器系列之白嫖就是爽》可以下载一年试用版本。 小T使用过适配英…...
【论文笔记】LoRA LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
题目:LoRA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 来源: ICLR 2022 模型名称: LoRA 论文链接: https://arxiv.org/abs/2106.09685 项目链接: https://github.com/microsoft/LoRA 文章目录 摘要引言问题定义现有方法的问题方法将 LORA 应用于 Transformer 实…...
【Sa-Token|4】Sa-Token微服务项目应用
若微服务数量多,如果每个服务都改动,工作量大,则可以只在网关和用户中心进行改动,也是可以实现服务之间的跳转。 这种方式可以通过在网关服务中生成和验证 Sa-Token,并将其与现有的 Token关联存储在 Redis 中。用户中心…...
鸿蒙开发系统基础能力:【@ohos.hilog (日志打印)】
日志打印 hilog日志系统,使应用/服务可以按照指定级别、标识和格式字符串输出日志内容,帮助开发者了解应用/服务的运行状态,更好地调试程序。 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用…...
SpringMVC系列十: 中文乱码处理与JSON处理
文章目录 中文乱码处理自定义中文乱码过滤器Spring提供的过滤器处理中文 处理json和HttpMessageConverter<T>处理JSON-ResponseBody处理JSON-RequestBody处理JSON-注意事项和细节HttpMessageConverter<T\>文件下载-ResponseEntity<T\>作业布置 上一讲, 我们学…...
使用MyBatisPlus进行字段的自动填充
使用MyBatisPlus进行字段的自动填充 需求场景 当我们往数据库里面插入一条数据,或者是更新一条数据时,一般都需要标记创建时间create_time和更新时间update_time的值,但是如果我们每张表的每个请求,在执行sql语句的时候我们都手…...
python爬虫之aiohttp多任务异步爬虫
python爬虫之aiohttp多任务异步爬虫 爬取的flash服务如下: from flask import Flask import timeapp Flask(__name__)app.route(/bobo) def index_bobo():time.sleep(2)return Hello boboapp.route(/jay) def index_jay():time.sleep(2)return Hello jayapp.rout…...
1964springboot VUE小程序在线学习管理系统开发mysql数据库uniapp开发java编程计算机网页源码maven项目
一、源码特点 springboot VUE uniapp 小程序 在线学习管理系统是一套完善的完整信息管理类型系统,结合springboot框架uniapp和VUE完成本系统,对理解vue java编程开发语言有帮助系统采用springboot框架(MVC模式开发),…...
【前端项目笔记】3 用户管理
用户管理相关功能实现 涉及表单、对话框、Ajax数据请求 基本页面 用户列表开发 在router.js中导入Users.vue 解决用户列表小问题 选中(激活)子菜单后刷新不显示高亮 给二级菜单绑定单击事件,点击链接时把对应的地址保存到sessionSto…...
【文献及模型、制图分享】基于SSP-RCP不同情景的京津冀地区土地覆被变化模拟
公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
