在创业公司,我靠它续命 ...

不知不觉就在新公司工作了一周,没有想象中那么难受。创业公司里没有复杂的人际关系,也没有无聊的会议,更没有复杂的流程。每天上班第一件事就是开个小会,可能是站着开,也可能是连麦开。大家简单过一下前一天的进度,以及今天的安排,然后就是各忙各的。

创业公司因为人比较少,不像大公司分工那么细,所以对个人综合能力要求比较高一些,因为碰到一些问题,不能像大公司那样互相推诿。进公司一周的时间,还没有来得及梳理代码,就忙着解决各种 BUG。

我已经很久都没有做 Windows 下的开发,之前也没有用过 QT,要快速修复或实现一些新功能,确实有点难。好在我使用了一款新工具: Cursor,一款针对程序员的 AI 辅助工具。Cursor 功能很强大,但我目前只用了对话功能。

Cursor 运行后,主界面如下:

83e11dbfee7f974d49b78b689da15f7d.png

右上角往输入框输入文字,就可以问问题。

效果怎么样?试试看。

我现在有一个需求,语音转文字,通常都是通过麦克风或录音笔之类的设备,但我希望模拟硬件输入,通过读取文件的方式。看了一下代码,发现 QT 中有一个 QAudioInput 类用于从系统声音设备读取数据,于是我提出了第一个问题:

写一段代码模拟QAudioInput的实现,从一个音频源文件读取

Cursor 很快给了一个答案:

以下是一个简单的Python代码示例,使用pyaudio库模拟QAudioInput的实现,从一个音频源文件读取:

import pyaudio
import waveclass AudioInput:def __init__(self, file_path):self.file_path = file_pathself.wf = wave.open(self.file_path, 'rb')self.p = pyaudio.PyAudio()def start(self):stream = self.p.open(format=self.p.get_format_from_width(self.wf.getsampwidth()),channels=self.wf.getnchannels(),rate=self.wf.getframerate(),output=True)data = self.wf.readframes(1024)while data != '':stream.write(data)data = self.wf.readframes(1024)stream.stop_stream()stream.close()self.p.terminate()# 使用
audio_input = AudioInput('your_audio_file.wav')
audio_input.start()

这段代码首先打开一个音频文件,然后创建一个pyaudio.PyAudio对象。然后,它使用音频文件的参数(如采样宽度、通道数和帧率)来打开一个音频流。最后,它读取音频文件的帧并写入音频流,直到音频文件读取完毕。

请注意,这只是一个基本的实现,可能需要根据你的具体需求进行修改。

忘记限定语言了,接着提问:

请使用C++,完全模拟QAudioInput的各接口

这回结果还比较靠谱:

在Qt中,你可以使用QBuffer类来模拟音频设备。QBuffer类提供了一个接口,使得你可以从内存中的字节数组读取和写入数据,就像它是一个设备一样。以下是一个使用QBuffer和QAudioOutput的例子:

#include <QAudioOutput>
#include <QBuffer>
#include <QFile>class MyAudioInput {
private:QAudioOutput* audio; // QAudioOutput对象QBuffer audioBuffer; // 音频缓冲区public:MyAudioInput() {// 初始化QAudioFormat对象QAudioFormat format;format.setSampleRate(8000);format.setChannelCount(1);format.setSampleSize(8);format.setCodec("audio/pcm");format.setByteOrder(QAudioFormat::LittleEndian);format.setSampleType(QAudioFormat::UnSignedInt);QAudioDeviceInfo info = QAudioDeviceInfo::defaultOutputDevice();if (!info.isFormatSupported(format)) {qWarning() << "Default format not supported, trying to use the nearest.";format = info.nearestFormat(format);}audio = new QAudioOutput(format, this);}void start() {QFile sourceFile;   // 选择你的.raw文件sourceFile.setFileName("/tmp/test.raw");sourceFile.open(QIODevice::ReadOnly);audioBuffer.setData(sourceFile.readAll()); // 读取文件内容到缓冲区audioBuffer.open(QIODevice::ReadOnly); // 打开缓冲区audio->start(&audioBuffer); // 开始播放}void stop() {audio->stop();audioBuffer.close();delete audio;}
};

在这个例子中,我们首先从一个.raw文件中读取数据,然后将这些数据写入QBuffer对象。然后,我们使用QAudioOutput对象来播放这些数据,就像它们是从音频设备读取的一样。

我们还可以进一步细化自己的需求,让 Cursor 给出的代码更加完善,由于篇幅的原因,就不过多展示了。

除了帮助写代码,还可以像 Cursor 问一些技术上的问题,比如:

Q: 可以传一个模拟设备给QAudioInput吗?

A: 不幸的是,QAudioInput类的设计是直接与音频硬件设备进行交互的,它没有提供一个接口来接受一个模拟的音频设备。你不能直接将一个模拟设备(如一个文件或一个缓冲区)传递给QAudioInput。

然而,你可以创建一个自定义的类来模拟QAudioInput的行为,如我之前所示的那样。你可以从一个文件或一个缓冲区读取数据,然后提供类似于QAudioInput的API,如start(), stop(), read(), stateChanged信号等。这样,你的应用程序可以像使用QAudioInput一样使用你的模拟类,而不需要知道数据实际上是从一个模拟设备而不是一个真实的音频设备读取的。

Q: 我希望上层调用者不用关心是实际设备还是模拟设备,可以从QAudioInput继承吗?

A: 在C++中,你可以从QAudioInput类继承来创建你自己的类。然而,QAudioInput类并没有设计为一个可以被继承和重写的类。它的大部分方法都不是虚函数,这意味着你不能在子类中重写它们。此外,QAudioInput类的构造函数需要一个QAudioFormat对象和一个QAudioDevice对象,这使得在子类中模拟音频设备变得困难。

因此,虽然从技术上讲,你可以从QAudioInput类继承,但这并不是一个好的选择。相反,你应该创建一个新的类,提供与QAudioInput类相同的API,但在内部使用你自己的模拟音频设备。这样,你的上层调用者可以像使用QAudioInput一样使用你的类,而不需要知道它实际上是一个模拟的音频设备。

Cursor 后台连接的是 OpenAI 的 ChatGPT 4.0,我们可以使用非常自然的语言将问题描述出来,返回的也是中文解答,相当友好。更神奇的是,写出的代码还有注释,代码后面还有对这段代码的说明,真的是贴心到家了。

在工作中,借助一些 AI 工具,无疑能大大提供我们工作的效率。但要说 AI 能取代程序员,还为时尚早。不信你提一个需求,写一个微信,看看 ChatGPT 能不能帮你搞定?

你在工作中使用到 AI 了吗?

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

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

相关文章

vue-cli创建项目、vue项目目录结(运行vue项目)、ES6导入导出语法、vue项目编写规范

vue-cli创建项目、vue项目目录结构、 ES6导入导出语法、vue项目编写规范 1 vue-cli创建项目 1.1 vue-cli 命令行创建项目 1.2 使用vue-cli-ui创建 2 vue项目目录结构 2.1 运行vue项目 2.2 vue项目的目录结构 3 es6导入导出语法 4 vue项目编写规范 4.1 修改项目 4.2 以后…

LabVIEW崩溃后所产生的错误日志文件的位置

LabVIEW崩溃后所产生的错误日志文件的位置 LabVIEW开发环境刚刚崩溃&#xff0c;请问我如何访问崩溃后自动生成的日志文件&#xff1f; LabVIEW崩溃后产生的转储文件位于何处&#xff1f; 代码导致了LabVIEW崩溃&#xff0c;请问哪些文件可以帮助NI技术支持了解具体原因&…

腾讯mini项目-【指标监控服务重构】2023-08-24

今日已办 Jeager 功能 监控分布式工作流程并排除故障识别性能瓶颈追踪根本原因分析服务依赖关系 部署 部署 Deployment — Jaeger documentation (jaegertracing.io) 支持 clickhouse jaegertracing/jaeger-clickhouse: Jaeger ClickHouse storage plugin implementation …

Python之列表

标题 列表什么是列表列表的创建列表的删除列表的访问 列表的常用方法append()、insert()、extend()pop()、remove()、clear()count()、index()list()、 filter()、 reduce()、lambda() 列表支持的运算加法运算符乘法运算符*成员测试运算符in 内置函数对列表的操作列表推导式列表…

Python 逢七拍手小游戏2.0

"""逢七拍手游戏介绍&#xff1a;逢七拍手游戏的规则是&#xff1a;从1开始顺序数数&#xff0c;数到有7&#xff0c;或者是7的倍数时&#xff0c;就拍一手。例如&#xff1a;7、14、17......70......知识点&#xff1a;1、循环语句for2、嵌套条件语句if/elif/e…

tensorrt获取输入输出

利用Netron打开onnx&#xff0c;右边名字&#xff1a; int input_index engine->getBindingIndex("inout1.1");int output_index engine->getBindingIndex("191");

010_第一代软件开发(二)

第一代软件开发(二) 文章目录 第一代软件开发(二)项目介绍界面布局功能完善快照功能获取可用串口播放按键提示音 关键字&#xff1a; Qt、 Qml、 QSerialPort、 QPixmap、 QSoundEffect 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff…

Java基础(一)——Hello World,8种数据类型,键盘录入

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

C++项目:仿muduo库实现高性能高并发服务器

文章目录 一、实现目标二、前置知识&#xff08;一&#xff09;HTTP服务器1.概念 &#xff08;二&#xff09;Reactor模型&#xff1a;1.概念2.分类&#xff08;1&#xff09;单Reactor单线程&#xff1a;单I/O多路复用业务处理。&#xff08;2&#xff09;单Reactor多线程&…

ElementUI之登陆+注册

一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 导依赖 建立登录和注册页面 ​编辑 配置样式 编写登录页面&#xff08;Login&#xff09; 编写注册页面&#xff08;reginter&#xff09; …

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

Elasticsearch&#xff08;三&#xff09;——Es搜索&#xff08;简单使用、全文查询、复合查询&#xff09;、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的&#xff0c;为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

三子棋小游戏(简单详细)

设计总体思路 实现游戏可以一直玩&#xff0c;先打印棋盘&#xff0c;玩家和电脑下棋&#xff0c;最后分出胜负。 如果编写较大的程序&#xff0c;我们可以分不同模块 例如这个三子棋&#xff0c;我们可以创建三个文件 分别为&#xff1a; game.h 函数的声明game.c 函数…

MySQL简介以及安装和部署(Linux)

MySQL简介 MySQL是一个小型关系数据库管理系统&#xff0c;开发者为瑞典MySQL AB公司。在2008年1月16号被sun公司10亿美金收购。2009年&#xff0c;SUN又被Oracle以74亿美金收购。 目前MySQL被广泛地应用在Internet上的中小型网站中。由于体积小、速度快、总体拥有成本低&…

java微服务项目整合skywalking链路追踪框架

skywalking官网网址&#xff1a;Apache SkyWalking 目录 1、安装skywalking 2、微服务接入skywalking 3、skywalking数据持久化 1、安装skywalking 下载skywalking&#xff0c;本篇文章使用的skywalking版本是8.5.0 Index of /dist/skywalkinghttps://archive.apache.org/…

网站整站优化-网站整站优化工具

您是否曾为您的网站在搜索引擎中的排名而感到焦虑&#xff1f;是否苦苦思考如何提高流量、吸引更多用户&#xff1f; 什么是整站优化。简而言之&#xff0c;它是一项用于提升网站在搜索引擎中排名的策略和技巧。通过对网站的内容、结构、速度等方面进行优化&#xff0c;可以使…

腾讯mini项目-【指标监控服务重构】2023-08-27

今日已办 Docker Monitoring with cAdvisor, Prometheus and Grafana Docker Monitoring with cAdvisor, Prometheus and Grafana | by Mertcan Simsek | MediumMonitoring Docker container metrics using cAdvisor | Prometheus prometheus.yml global:scrape_interval: …

电子信息工程专业课复习知识点总结:(五)通信原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 第一章通信系统概述——通信系统的构成、各部分性质、性能指标1.通信系统的组成&#xff1f;2.通信系统的分类&#xff1f;3.调制、解调是什么&#xff1f;有什么用…

牛客java训练题 day1

9.24 day1 Q 1. this 指针是用来干什么的&#xff1f; 2.基类和派生类分别是指什么&#xff1f; 3.为什么方法中不能写静态变量 4. 解释一下ASCII码和ANSI码和两者的区别 5.简述j ava.io java.sql java.awt java.rmi 分别是什么类型的包 6. 看下面一段代码&#xff1a;…

自定义数据类型

前言&#xff1a;小伙伴们又见面啦&#xff0c;今天这篇文章&#xff0c;我们来谈谈几种自定义数据类型。 目录 一.都有哪些自定义数据类型 二.结构体 结构体内存对齐 1.如何对齐 2.为什么要对齐 3.节省空间和提升效率的方法 &#xff08;1&#xff09;让占用空间小的成员…

SD-MTSP:萤火虫算法(FA)求解单仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、萤火虫算法&#xff08;FA&#xff09;简介 萤火虫算法(Firefly Algorithm&#xff0c;FA)是Yang等人于2009年提出的一种仿生优化算法。 参考文献&#xff1a;田梦楚, 薄煜明, 陈志敏, et al. 萤火虫算法智能优化粒子滤波[J]. 自动化学报, 2016, 42(001):89-97. 二、单仓…