当前位置: 首页 > news >正文

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
  • timequeue:用于处理时间和线程安全的队列。
  • 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&#xf…...

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&#xff1f…...

微信小程序-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进行字段的自动填充 需求场景 当我们往数据库里面插入一条数据&#xff0c;或者是更新一条数据时&#xff0c;一般都需要标记创建时间create_time和更新时间update_time的值&#xff0c;但是如果我们每张表的每个请求&#xff0c;在执行sql语句的时候我们都手…...

python爬虫之aiohttp多任务异步爬虫

python爬虫之aiohttp多任务异步爬虫 爬取的flash服务如下&#xff1a; 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 小程序 在线学习管理系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架uniapp和VUE完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;…...

【前端项目笔记】3 用户管理

用户管理相关功能实现 涉及表单、对话框、Ajax数据请求 基本页面 用户列表开发 在router.js中导入Users.vue 解决用户列表小问题 选中&#xff08;激活&#xff09;子菜单后刷新不显示高亮 给二级菜单绑定单击事件&#xff0c;点击链接时把对应的地址保存到sessionSto…...

【文献及模型、制图分享】基于SSP-RCP不同情景的京津冀地区土地覆被变化模拟

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...

Python打卡训练营学习记录Day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

开源 vGPU 方案:HAMi,实现细粒度 GPU 切分

本文主要分享一个开源的 GPU 虚拟化方案&#xff1a;HAMi&#xff0c;包括如何安装、配置以及使用。 相比于上一篇分享的 TimeSlicing 方案&#xff0c;HAMi 除了 GPU 共享之外还可以实现 GPU core、memory 得限制&#xff0c;保证共享同一 GPU 的各个 Pod 都能拿到足够的资源。…...

Prompt工程学习之思维树(TOT)

思维树 定义&#xff1a;思维树&#xff08;Tree of Thoughts, ToT&#xff09; 是一种先进的推理框架&#xff0c;它通过同时探索多条推理路径对思维链&#xff08;Chain of Thought&#xff09;** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤…...

SpringBoot3中使用虚拟线程的详细过程

在 Spring Boot 3 中使用 Java 21 的虚拟线程&#xff08;Virtual Threads&#xff09;可以显著提升 I/O 密集型应用的并发能力。以下是详细实现步骤&#xff1a; 1. 环境准备 JDK 21&#xff1a;确保安装 JDK 21 或更高版本Spring Boot 3.2&#xff1a;最低要求&#xff08;p…...