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 实例,一个用于麦克风,一个用于扬声器。然后开始录音和处理音频数据。

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

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

相关文章

vue关闭页面时执行事件

在vue中,可以通过监听浏览器的 beforeunload 事件在关闭页面时执行你想要的操作。 具体代码如下 created() {// 监听beforeunload事件window.addEventListener(beforeunload, this.handleBeforeUnload); }, destroyed() {// 组件销毁前移除事件监听window.removeE…

Java中如何优雅地处理BufferUnderflowException异常?

Java中如何优雅地处理BufferUnderflowException异常? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,BufferUnderflowEx…

Java高手的30k之路|面试宝典|精通Netty(二)

实践应用 构建服务器和客户端&#xff1a; 掌握如何使用Netty构建TCP/UDP服务器和客户端&#xff0c;包括初始化、监听和连接。如何处理心跳机制&#xff0c;保持长连接的活跃。 TCP 服务器 1. 引入依赖 在pom.xml文件中添加Netty依赖&#xff1a; <dependency><…

KANO模型概述

理解KANO模型 要理解和应用KANO模型&#xff0c;我们需要更详细地探讨其每个组成部分&#xff0c;以及如何在实际设计过程中有效切入和实施这个模型。 KANO模型的详细分类 1. 基本需求&#xff08;Must-be Requirements&#xff09; 描述: 这些需求是产品的基础功能&#x…

Bootstrap和Bagging算法以及衍生算法

1. Bootstrap算法 实际上就是一种针对小样本的无放回式的抽样方法&#xff0c;通过方差的估计可以构造置信区间。 其核心思想和基本步骤如下&#xff1a;   &#xff08;1&#xff09; 采用重抽样技术从原始样本中抽取一定数量&#xff08;自己给定&#xff09;的样本&#…

Android集成高德地图SDK(2)

1.解压下载的压缩包&#xff0c;找到AMap_Android_SDK_All\AMap3DMap_DemoDocs\AMap_Android_API_3DMap_Demo\AMap3DDemo\app\libs&#xff0c;复制libs里的所有文件&#xff0c;将其粘贴到Android工程的libs目录下&#xff0c;如图所示。 2.打开app下的build.gradle&#xff0…

记录react实现选择框一二级联动出现的问题

需求&#xff1a;用户在选择第一个选择框的选项后&#xff0c;第二个选择框的选项会根据第一个选择框的选择动态更新。如图所示 出现的问题 一级分类选择之后二级分类没有数据&#xff0c;第二次重新选择一级分类的时候&#xff0c;二级分类就会有值。 第一次点击截图&#x…

024.两两交换链表中的节点,用递归和 while 循环

题意 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 难度 中等 示例 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[…

什么是车载测试?车载测试怎么学!

1、车载测试是什么&#xff1f; 车载测试分很多种&#xff0c;有软件测试、硬件测试、性能测试、功能测试等等&#xff0c;每一项测试的内容都不一样&#xff0c;我们所说的车载测试主要指的是汽车软件的功能测试&#xff0c;也就是针对汽车实现的某一个功能&#xff0c;而进行…

vue3 vxe-grid列中绑定vxe-switch实现数据更新

1、先上一张图&#xff1a; <template #valueSlot"{ row }"><vxe-switch :value"getV(row.svalue)" change"changeSwitch(row)" /></template>function getV(value){return value 1;};function changeSwitch(row) {console.l…

Trilium windows上修改笔记目录,创建多个笔记空间方法

一开始使用trilium会非常的不舒服&#xff0c;不像是obsidian可以创建多个笔记空间&#xff0c;指定多个笔记目录。这里摸索到了解决方案 修改目录的方法一 ——修改系统环境变量 打开控制面板-系统-高级系统设置 新增如上条目 修改目录的方法二——直接写bat脚本运行 新建位…

深入理解Kubernetes:CNI源码解析

在容器化环境中&#xff0c;有效管理网络是至关重要的。容器网络接口&#xff08;CNI&#xff09;是一个标准&#xff0c;定义了容器应如何配置网络。本文将深入探讨 CNI 的基础知识&#xff0c;并带你了解 CNI 与 CRI 的关系。 什么是 CNI&#xff1f; CNI&#xff08;容器网…

Redis哨兵集群搭建

一、安装Redis 1.安装依赖 yum install -y gcc tcl2.将Redis压缩包解压到对应的目录 tar -zxvf redis-2.8.0.tar.gz mv redis-2.8.0 /usr/local3.编译 cd /usr/local/redis-2.8.0 make && make install4.配置redis.conf # 任意ip都可以访问 bind 0.0.0.0 # 关闭保…

网安大咖说·镜鉴(下)| 把握安全新脉搏:企业CSO的领航之道

网安大咖说镜鉴栏目通过对网安大咖说嘉宾访谈内容的深度提炼&#xff0c;撷取群英论道之精髓&#xff0c;汇聚众智谋策之高远&#xff0c;为从业者提供宝贵的经验和启迪。集思广益、博采众长&#xff0c;意在以镜为鉴&#xff0c;观网安之百态&#xff0c;立防范之策略&#xf…

Linux 内核缓存一致性相关机制和接口梳理

From 程序员秘书 缓存一致性是一个非常关键的问题&#xff0c;特别是在多核处理器和直接内存访问&#xff08;DMA&#xff09;场景下。原因如下&#xff1a; 多核CPU与cache的缓存一致性问题&#xff1a;每个CPU core都有自己的cache&#xff0c;由于cache的写回机制&#xf…

AI助力科研:自动化科学构思生成系统初探

科学研究作为推动创新和知识进步的关键活动&#xff0c;在解决复杂问题和提升人类生活水平方面发挥着至关重要的作用。然而&#xff0c;科学研究的固有复杂性、缓慢的进展速度以及对专业专家的需求&#xff0c;限制了其生产力的提升。为了增强科研效率&#xff0c;本文提出了一…

力扣78 子集

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2],[3],…

Linux使用pthread多线程时cmake新增语句

https://cmake.org/cmake/help/latest/module/FindThreads.html 在子文件夹中的CMakeList.txt&#xff1a; aux_source_directory(. DIR_SUB_SRCS) add_library(echatlib SHARED ${DIR_SUB_SRCS}) # STATIC SHARED# 方法一 find_package(Threads REQUIRED) target_link_librar…

鸿蒙开发Ability Kit(程序框架服务):【FA模型绑定Stage模型ServiceExtensionAbility】

FA模型绑定Stage模型ServiceExtensionAbility 本文介绍FA模型的三种应用组件如何绑定Stage模型的ServiceExtensionAbility组件。 PageAbility关联访问ServiceExtensionAbility PageAbility关联访问ServiceExtensionAbility和PageAbility关联访问ServiceAbility的方式完全相同…

重学java 84.Java枚举

那些你暗自努力的时光&#xff0c;终究会照亮你前行的路 —— 24.6.24 一、枚举介绍&#xff08;开发中表示状态&#xff09; 1.概述&#xff1a; 五大引用数据类型&#xff1a;类型、数组、接口、注解、枚举 2.定义&#xff1a; public enum 枚举类名{} 所有的枚举类父类…