基于WASAPI的录音播音系统

最近写了一个小的系统,在VS2022平台上做的,主要是通过调用Windows的API接口实现录音(PCM格式),播音(PCM、WAV、Mp3格式),PCM格式转WAV格式、遍历指定文件夹下的所有音频文件并播放。废话不多说,直接上演示功能截图和代码,其他的不懂的随便一查都很多。
菜单界面菜单1功能,输入相关信息。

录音前设备相关信息录音结束菜单2的功能菜单2的功能菜单3的功能在这里插入代码片
#record.h
#include<Windows.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"mmsystem.h"
#pragma comment(lib, “winmm.lib”)

/*
int audioSec = 3;
int inputDevice = 0;
int inputChannel = 2;
int inputBits = 16;
unsigned long inputSample = 16000;
static char bufferOne[1024];
static char bufferTwo[1024];
char generateAudioFileName1[100] = “mic.pcm”;
char generateAudioFileName2[100] = “ref.pcm”;
int count;
int i;
HWAVEIN phwi;
WAVEFORMATEX pwfx;
WAVEINCAPS waveincaps;
WAVEHDR pwhOne;
WAVEHDR pwhTwo;
FILE* f = NULL;
FILE* f2 = NULL;
/
int audioSec;
int inputDevice;
int inputChannel;
int inputBits;
unsigned long inputSample;
static char bufferOne[1024];
static char bufferTwo[1024];
char generateAudioFileName1[100];
char generateAudioFileName2[100];
int count;
int i;
HWAVEIN phwi;
WAVEFORMATEX pwfx;
WAVEINCAPS waveincaps;
WAVEHDR pwhOne;
WAVEHDR pwhTwo;
FILE
f = NULL;
FILE* f2 = NULL;
void inputSec()
{
/*
* int inputDevice, inputChannel, inputBits;
unsigned long inputSample;
*/
printf(“请输入预录音的文件名1:”);
scanf(“%s”, generateAudioFileName1);
printf(“\n”);
printf(“请输入预录音的文件名2:”);
scanf(“%s”, generateAudioFileName2);
printf(“\n”);
printf(“请输入要录音的设备:”);
scanf(“%d”, &inputDevice);
printf(“\n”);
printf(“请输入录音通道数:”);
scanf(“%d”, &inputChannel);
printf(“\n”);
printf(“请输入录音的采样率:”);
scanf(“%ld”, &inputSample);
printf(“\n”);
printf(“请输入录音的采样位数:”);
scanf(“%d”, &inputBits);
printf(“\n”);
printf(“请输入你要录制该音频的时长(单位/s):”);
int second;
scanf(“%d”, &second);
while (true)
{
if (second <= 0 || second > 100)
{
printf(“请按要求重新输入:”);
getchar();
scanf(“%d”, &second);
}
else {
break;
}
}
audioSec = second;
}

void stop()
{
MMRESULT mResult = waveInStop(phwi);
printf(“waveInStop value is: %d\n”, mResult);
//getchar();
system(“EXIT”);
mResult = waveInReset(phwi);
printf(“waveInReset value is: %d\n”, mResult);
//Sleep(1000);

mResult = waveInUnprepareHeader(phwi, &pwhOne, sizeof(WAVEHDR));
printf("waveInUnprepareHeader value is: %d", mResult);mResult = waveInUnprepareHeader(phwi, &pwhTwo, sizeof(WAVEHDR));
printf("waveInUnprepareHeader value is: %d", mResult);mResult = waveInClose(phwi);
//Sleep(1000);
printf("录音结束,返回值%d", mResult);
system("exit");

}
void PrintSign()
{
for (i = 0; i < audioSec; i++)
{
Sleep(1000);
count++;
system(“CLS”);
printf(“正在录音,%ds…\n”, i + 1);
}

if (count == audioSec)
{Sleep(1000);MMRESULT mResult;printf("时间已到,已停止录音,文件已保存到当前路径下!\n");stop();//printf("STOP函数已经运行!");//system("PAUSE");
}

}
void WaveForMatexInit(LPWAVEFORMATEX myWaveFormate, WORD nch, DWORD nSampleRate, WORD BitsPerSample, char* getFileName, char* filename2)
{

//printf("1\n");
f = fopen(getFileName, "wb");
//f = fopen("mic0.pcm", "wb");
//f2 = fopen("ref0.pcm", "wb");

#if 1
//printf(“2\n”);
if (f == NULL)
{
perror(“fopen”);

	//return 1;
}
else
{f2 = fopen(filename2, "wb");
}

#endif
myWaveFormate->wFormatTag = WAVE_FORMAT_PCM;
//myWaveFormate->wFormatTag = WAVE_FORMAT_2M16;
//myWaveFormate->wFormatTag = 0x0006;
myWaveFormate->nChannels = nch;
myWaveFormate->nSamplesPerSec = nSampleRate;
myWaveFormate->wBitsPerSample = BitsPerSample;
myWaveFormate->cbSize = sizeof(WAVEFORMATEX);
//myWaveFormate->cbSize = 0;
myWaveFormate->nAvgBytesPerSec = nSampleRate * nch * BitsPerSample / 8;
myWaveFormate->nBlockAlign = myWaveFormate->nChannels * BitsPerSample / 8;
}

static short mic0[256] = { 0 };
static short ref0[256] = { 0 };

DWORD CALLBACK MicCallback(HWAVEIN hwavein, UINT uMsg, DWORD dwInstance, DWORD dwParamOne, DWORD dwParamTwo)
{
short* p_data = NULL;
switch (uMsg)
{
case WIM_OPEN:
printf(“The Device is already open!\n”);
break;
case WIM_DATA:
//fwrite((void*)((WAVEHDR*)dwParamOne)->lpData, 2 * i, 1, f);
//fwrite((void*)((WAVEHDR*)dwParamOne)->lpData, 2 * i + 1, 1, f2);
// short* p_data = (short )buffer[1024 bytes];
p_data = (short
)(((WAVEHDR*)dwParamOne)->lpData);
//printf(“1:%p\n”, p_data);
//printf(“2:%p\n”, ((WAVEHDR*)dwParamOne)->lpData);
for (int j = 0; j < 256; j++) {
mic0[j] = p_data[2 * j];
ref0[j] = p_data[2 * j + 1];
}
fwrite(mic0, 256, 2, f);
fwrite(ref0, 256, 2, f2);

	//fwrite((void*)((WAVEHDR*)dwParamOne)->lpData, 1024, 1, f2);waveInAddBuffer(hwavein, (LPWAVEHDR)dwParamOne, sizeof(WAVEHDR));break;
case WIM_CLOSE:printf("The Device is already close!\n");break;
default:break;
}
return 0;

}
void AudioControl()
{
inputSec();
//获得系统中就绪的波形声音输入设备的数量
int num = waveInGetNumDevs();
printf(“系统声音输入设备数量:%d\n”, num);

MMRESULT mResult = waveInGetDevCaps(inputDevice, &waveincaps, sizeof(WAVEINCAPS));if (mResult == MMSYSERR_NOERROR)
{printf("音频输入设备PID:%d\n", waveincaps.wPid);printf("音频输入设备wMID:%d\n", waveincaps.wMid);printf("该设备支持的声道数(waveincaps.wChannels):%d\n", waveincaps.wChannels);printf("音频输入设备支持的格式:%d\n", waveincaps.dwFormats);WaveForMatexInit(&pwfx, inputChannel, inputSample, inputBits, generateAudioFileName1, generateAudioFileName2);mResult = waveInOpen(&phwi, WAVE_MAPPER, &pwfx, (DWORD_PTR)(MicCallback), NULL, CALLBACK_FUNCTION);if (mResult == MMSYSERR_NOERROR){pwhOne.lpData = bufferOne;pwhOne.dwBufferLength = 1024;pwhOne.dwUser = 1;//用户数据pwhOne.dwFlags = 0;//提供缓冲区标示//为音频输入设备准备一个缓冲区mResult = waveInPrepareHeader(phwi, &pwhOne, sizeof(WAVEHDR));if (mResult == MMSYSERR_NOERROR){pwhTwo.lpData = bufferTwo;pwhTwo.dwBufferLength = 1024;pwhTwo.dwUser = 1;pwhTwo.dwFlags = 0;mResult = waveInPrepareHeader(phwi, &pwhTwo, sizeof(WAVEHDR));if (mResult == MMSYSERR_NOERROR){mResult = waveInAddBuffer(phwi, &pwhOne, sizeof(WAVEHDR));if (mResult == MMSYSERR_NOERROR){mResult = waveInAddBuffer(phwi, &pwhTwo, sizeof(WAVEHDR));if (mResult == MMSYSERR_NOERROR){printf("1秒后开始录音!\n", audioSec);//Sleep(1000);mResult = waveInStart(phwi);PrintSign();}}}}}
}
else
{system("CLS");printf("!!!!输入的设备有误,无法打开!!!!");Sleep(2000);return;
}

}

#playPCM.h

#include <stdio.h>
#include <conio.h>
#include <Windows.h>
#include"record.h"
#pragma comment(lib, “winmm.lib”)

#define DATASIZE 102432
FILE
pcmfile;
HWAVEOUT hwo;
int cnt;
WAVEHDR wh1;
//WAVEHDR wh2;
WAVEFORMATEX wfx = { 0 };
int outSec = 0;
int outCount = 0;

void CALLBACK WaveCallback(HWAVEOUT hWave, UINT uMsg, DWORD dwInstance, DWORD paramOne, DWORD paramTwo)//回调函数
{
switch (uMsg)
{
case WOM_OPEN:
printf(“开始播放…\n”);
break;
case WOM_DONE:
{
LPWAVEHDR pWaveHeader = (LPWAVEHDR)paramOne;
pWaveHeader->dwBufferLength = fread(pWaveHeader->lpData, 1, DATASIZE, pcmfile);
if (pWaveHeader->dwBufferLength == 0)
{
break;
}
printf(“WOM_DONE %d\n”, pWaveHeader->dwBufferLength);
waveOutPrepareHeader(hwo, pWaveHeader, sizeof(WAVEHDR));
waveOutWrite(hwo, pWaveHeader, sizeof(WAVEHDR));

	printf("WOM_DONE\n");break;
}
case WOM_CLOSE:printf("播放已完成!\n");
}

}

void play(char* filename)
{
//printf(“请输入你要播放的时间(单位/s):”);
//scanf(“%d”, &outSec);
//FILE* pcmfile;
char pathName[100] = “D:\Workspace_VS\2022\audioAPI\pcmfile\”;
//char finallyName[100];
strcat(pathName, filename);
Sleep(1000);
printf(“当前文件路径为:%s\n”, pathName);
pcmfile = fopen(pathName, “rb”);
if (pcmfile == NULL)
{
printf(“%s文件打开失败!\n”, filename);
//Sleep(1000);
system(“PAUSE”);
return;

}
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 2;
wfx.nSamplesPerSec = 16000;
wfx.wBitsPerSample = 16;
wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;
wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
wfx.cbSize = 0;
waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (DWORD)WaveCallback, 0L, CALLBACK_FUNCTION);wh1.dwLoops = 0L;
wh1.lpData = new char[DATASIZE];
wh1.dwBufferLength = DATASIZE;
fread(wh1.lpData, 1, DATASIZE, pcmfile);
wh1.dwFlags = 0L;
MMRESULT mResult;
mResult = waveOutPrepareHeader(hwo, &wh1, sizeof(WAVEHDR));
if (mResult == MMSYSERR_NOERROR)
{//printf("mResult=%d!", mResult);mResult = waveOutWrite(hwo, &wh1, sizeof(WAVEHDR));//AudioControl();//printf("mResult=%d!", mResult);while (wh1.dwBufferLength != 0){Sleep(500);}//Sleep(2000);mResult = waveOutUnprepareHeader(hwo, &wh1, sizeof(WAVEHDR));//printf("mResult=%d!", mResult);mResult = waveOutClose(hwo);//printf("mResult=%d!", mResult);delete[]wh1.lpData;fclose(pcmfile);//printf("OVER!");//_getch();Sleep(2000);//udgeOutTime();
}
//waveOutWrite(hwo, &wh1, sizeof(WAVEHDR));
return;

}

#findPCM.h
#include <stdio.h>
#include<io.h>

void findPcm()
{
/struct _finddata_t{
unsigned int attrib; //记录文件属性(隐藏、文件夹、只读等)
time_t time_create; //文件创建时间
time_t time_access; //文件最后被访问时间
time_t time_write; //文件最后被修改时间
_fsile_t size; //文件大小
char name[_MAX_FNAME]; //文件名
};
/

//文件存信息结构体 
struct _finddata_t file;
//保存文件句柄 
long handl;
int count = 0;//long _findfirst(char * filespec , struct _finddata_t * fileinfo);
if ((handl = _findfirst("D:\\Workspace_VS\\2022\\audioAPI\\pcmfile\\*.pcm", &file)) == -1)
{printf("当前目录没有PCM文件\n");
}
else {do {count++;printf("*********************************\n");printf("第%d个文件:%s,文件大小:%d\n",count, file.name, file.size);Sleep(1000);play(file.name);printf("第%d个文件:%s播放结束!\n", count, file.name);Sleep(1000);} while (_findnext(handl, &file) == 0);//int _findnext( long handle, struct _finddata_t *fileinfo );
}
_findclose(handl);
printf("\n播放结束,该目录下共有%d文件!\n", count);
//stop();

}

主函数(audioAdmin.cpp)
#include<Windows.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<mmsystem.h>
#include “mmsystem.h”
#include “playPCM.h”
#include “findPCM.h”
#pragma comment(lib, “winmm.lib”)

//FILE* f = NULL;
//int count = 0;
char filename[50];
//Wav格式说明RIFF、FORMATE、DATA
//https://blog.csdn.net/weixin_48680270/article/details/123523517?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165830013416782425193967%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165830013416782425193967&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~times_rank-3-123523517-null-null.142v32pc_search_v2,185v2control&utm_term=wav%E6%A0%BC%E5%BC%8F&spm=1018.2226.3001.4187
typedef struct {
char id[4];
unsigned long size;
char type[4];
}MYWAVERIFF;

typedef struct {
char id[4];
unsigned long size;
unsigned short audioFormat;
unsigned short numChannels;
unsigned long sampleRate;
unsigned long byteRate;
unsigned short blockAlign;
unsigned short bitsPerSample;
}MYWAVEFORMATE;

typedef struct {
char id[4];
unsigned long size;
}MYWAVEDATA;

long getSize()
{
FILE* f;
long size;
f = fopen(“audio.pcm”, “r”);
if (f == NULL)
{
printf(“文件打开失败!”);
}
fseek(f, 0, SEEK_END);
size = ftell(f);
printf(“源文件长度为:%d\n”, size);
fclose(f);
return size;
}

void convertWav(int channels, unsigned long sampleRate, int sampleBit)
{
MYWAVERIFF pcmRIFF;
MYWAVEFORMATE pcmFORMATE;
MYWAVEDATA pcmDATA;
FILE* f, * fpout;
long fileSize;
f = fopen(“audio.pcm”, “rb”);
if (f == NULL)
{
printf(“源文件打开失败!”);
return;
}
fpout = fopen(“audio.wav”, “wb”);
if (fpout == NULL)
{
printf(“文件打开错误!”);
return;
}
fileSize = getSize();
/*函数原型
void memcpy(void destin, void source, unsigned n);
参数
destin-- 指向用于存储复制内容的目标数组,类型强制转换为 void
指针。
source-- 指向要复制的数据源,类型强制转换为 void
指针。
n-- 要被复制的字节数。
/
memcpy(pcmRIFF.id, “RIFF”, strlen(“RIFF”));
pcmRIFF.size = 36 + fileSize;
memcpy(pcmRIFF.type, “WAVE”, strlen(“WAVE”));

//fseek(fpout, sizeof(MYWAVERIFF), SEEK_CUR);int nriff = fwrite(&pcmRIFF, sizeof(pcmRIFF), 1, fpout);
printf("NRIFF: %d\n", nriff);pcmFORMATE.numChannels = inputChannel;
pcmFORMATE.sampleRate = inputSample;
pcmFORMATE.bitsPerSample = inputBits;
pcmFORMATE.byteRate = inputSample * inputChannel * inputBits / 8;
pcmFORMATE.blockAlign = inputChannel * inputBits / 8;
pcmFORMATE.size = 16;
pcmFORMATE.audioFormat = WAVE_FORMAT_PCM; //the value is 1
memcpy(pcmFORMATE.id, "fmt", strlen("fmt "));int nFormate = fwrite(&pcmFORMATE, sizeof(pcmFORMATE), 1, fpout);
printf("FORMATE: %d\n", nFormate);memcpy(pcmDATA.id, "data", strlen("data"));
pcmDATA.size = fileSize;
int nData = fwrite(&pcmDATA, sizeof(pcmDATA), 1, fpout);
printf("DATA: %d\n", nData);
//system("PAUSE");char* buffer = (char*)malloc(1024);
int ret;
while ((ret = fread(buffer, sizeof(char), 1024, f)) != 0)
{fwrite(buffer, sizeof(char), ret, fpout);printf("reading......\n");
}
free(buffer);fclose(f);
fclose(fpout);
printf("转换完成!\n");

}

/*
void inputSec()
{

 int inputDevice, inputChannel, inputBits;
unsigned long inputSample;printf("请输入预录音的文件名(需加后缀名):");
scanf("%s", generateAudioFileName);
printf("\n");
printf("请输入要录音的设备:");
scanf("%d", &inputDevice);
printf("\n");
printf("请输入录音通道数:");
scanf("%d", &inputChannel);
printf("\n");
printf("请输入录音的采样率:");
scanf("%ld", &inputSample);
printf("\n");
printf("请输入录音的采样位数:");
scanf("%d", &inputBits);
printf("\n");
printf("请输入你要录制该音频的时长(单位/s):");
int second;
scanf("%d", &second);
while (true)
{if (second <= 0 || second > 100){printf("请按要求重新输入:");getchar();scanf("%d", &second);}else {break;}
}
audioSec = second;

}
*/
void playAudio()
{
//mciSendString()函数只能播放wav或mp3格式的音频
MMRESULT m = mciSendString(TEXT(“open yjm.mp3 alias bgm”), 0, 0, 0);
if (m == 0) {
printf(“正在播放Mp3的音频,按“p”暂停播放,“y”继续播放,“n”退出播放\n”);
m = mciSendString(TEXT(“play bgm”), NULL, 0, NULL);

	//m = mciSendString(TEXT("pause bgm"), NULL, 0, NULL);char isResume;char s;//s = getchar();//printf("已暂停播放, 继续播放请按“y”,退出请按“n”:");while (true){scanf("%c", &isResume);switch (isResume){case 'y':m = mciSendString(TEXT("resume bgm"), 0, 0, 0);printf("继续播放!\n");break;case 'p':mciSendString(TEXT("pause bgm"), 0, 0, 0);printf("暂停播放!\n");break;case 'n':mciSendString(TEXT("close bgm"), 0, 0, 0);break;//system("EXIT");default:break;}if (isResume == 'n'){break;}}
}
else
{printf("打开文件失败,错误码:%x", m);Sleep(2000);
}
system("CLS");
getchar();

}

void menu()
{
printf(“基于WASAPI的音频系统\n”);
printf(“\n”);
printf(“1、录制音频\n”);
printf(“\n”);
printf(“2、播放PCM音频\n”);
printf(“\n”);
printf(“3、播放Mp3音频\n”);
printf(“\n”);
printf(“****4、文件格式转换\n”);
printf(“\n”);
printf("***5、多PCM文件播放\n");
printf(“\n”);
printf(“6、退出系统\n”);
//printf(“\n注(按“a”开始录音,“t”退出系统,“s”播放Mp3音频,“p”播放PCM音频,“c”格式转换)\n”);
}
void main(int argc, const char
argv[])
{

/*
printf("argc:%d\n", argc);
printf("argv:%s\n", argv[1]);//拿到播放列表的文件名char* play_list = (char *)argv[1];
FILE* fp_play = fopen(play_list, "rb");
char buf[32];//获取这列表要播放的音频文件
fgets(buf, 32, fp_play);//readline
printf("读取的第一个文件为:%s\n", buf);
char str_pilt[4];
int ste_len = strlen(buf);//7
int fileLen = ste_len - 6;
strncpy(str_pilt, buf + fileLen + 1, 3);
//strncpy(audioName, buffer, fileLen);
str_pilt[3] = '\0';
printf("提取后的字符为:%s\n", str_pilt);if (strcmp(str_pilt, "wav") == 0) {//调用wav播放接口
}
else if (strcmp(str_pilt, "pcm") == 0) {//调用pcm播放接口
}
else if (strcmp(str_pilt, "mp3") == 0) {//调用mp3播放接口
}
*/int a, b;
bool flag = FALSE;while (1)
{menu();scanf("%d", &a);switch (int(a)){case 1:system("CLS");Sleep(250);printf("开始录制音频!\n");AudioControl();Sleep(2000);system("CLS");break;case 4:system("CLS");printf("正在将pcm格式音频转为wav格式!\n");convertWav(inputChannel, inputSample, inputBits);Sleep(1000);system("CLS");break;case 6:system("CLS");printf("退出系统!\n");break;case 3:system("CLS");playAudio();system("CLS");break;case 2:system("CLS");printf("请输入要播放的文件名:");scanf("%s", filename);play(filename);printf("播放结束!");system("CLS");break;case 5:system("CLS");findPcm();Sleep(2000);system("CLS");break;default:printf("输入有误,请按要求重新输入!");Sleep(1000);getchar();system("CLS");break;}if ((int)a == 6){break;flag = true;}
}
if (flag == true)
{system("EXIT");
}

}

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

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

相关文章

播音计算机论文,广播中计算机的应用论文

广播中计算机的应用论文 引言 随着社会的发展&#xff0c;人们的物质生活水平也在提高。而在这种发展趋势下&#xff0c;人们对精神生活水平也提出了新的要求。面对这些要求&#xff0c;传统的广播电视技术的应用已经无法满足广播事业的发展需要。而计算机技术的应用&#xff0…

学校的校园广播是如何设置的

9月开学季&#xff0c;各个校园的广播也开始播音了&#xff0c;随着互联网的发展&#xff0c;现在很多校园使用的都是播音软件&#xff0c;通过软件来操作可以节省人力&#xff0c;可以设置一次性、每天、每周、每月定时播放&#xff0c;支持开机自动运行。学校可自动定时广播打…

chatgpt赋能python:Python抄股票的秘诀

Python 抄股票的秘诀 在股票市场中&#xff0c;抄股票是许多投资者都会尝试的一种方式。然而&#xff0c;随着市场变化和行情的波动&#xff0c;抄股票并不是一件容易的事情。但是&#xff0c;有了 Python&#xff0c;我们可以利用其强大的数据处理和可视化功能来进行股票分析…

chatgpt赋能python:学Python炒股:聪明投资策略

学Python炒股&#xff1a;聪明投资策略 在金融市场中&#xff0c;投资者要获取财务知识并实际操作从而创造财富。多年来&#xff0c;投资者一直在寻找有效的技术分析手段&#xff0c;并逐步将其用于各种产品。Python在这方面提供了先进的技术&#xff0c;其跨平台的特性和Pyth…

chatgpt赋能python:利用Python炒股:一篇详细的指南

利用Python炒股&#xff1a;一篇详细的指南 炒股是许多人致富的途径。随着技术的发展&#xff0c;现在在线炒股已经变得越来越普及。在这个数字时代&#xff0c;Python提供了一个强大的数据分析和编程工具&#xff0c;可以帮助投资者更好地研究股市行情和制定更好的交易策略。…

chatgpt赋能python:用Python炒股效益如何?

用Python炒股效益如何&#xff1f; 介绍 随着互联网的不断发展&#xff0c;越来越多的人开始尝试使用Python来炒股。Python作为一种强大的编程语言&#xff0c;其在数据分析和机器学习领域拥有广泛的应用。而在股票投资领域&#xff0c;Python的优势也逐渐显现。 Python在股…

chatgpt赋能python:Python对炒股有用吗?

Python对炒股有用吗&#xff1f; 随着互联网的快速发展&#xff0c;炒股已经成为越来越多人的投资选择。而Python作为一种流行的编程语言&#xff0c;也逐渐被越来越多的投资者应用在炒股分析中。那么&#xff0c;Python对炒股有用吗&#xff1f;这是本文要探讨的问题。 Pyth…

飞书发送消息

import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSON; import cn.hutool.json.JSONUtil;import java.util.HashMap; import java.util.Map;/*** 飞书工具* author: czy* date: 2022-9-14*/ p…

​华为回应出售手机业务传闻:假消息;微软将ChatGPT整合到更多工具中:不用写代码就能开发应用;苹果更新Mac产品线|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

狂飙!GPT-4最新20+个应用案例集锦,附视频

编者按&#xff1a;自OpenAI于3月15日重磅推出GPT-4,一石激起千层浪&#xff0c;全球开发者、创业者们迅速尝试了各种形形色色的场景应用&#xff0c;来体验它的极限&#xff0c;游戏、编程、客户关系、营销、财务、家庭生活、饮食、文学艺术创作等等不一而足。笔者从中筛选了2…

狂团KtAdmin框架正式免费开源发布,助力独立版SAAS系统快速开发

狂团&#xff08;kt8.cn&#xff09;旗下[ KtAdmin ]是为独立版SAAS系统而生的快速开发框架&#xff01; KtAdmin 基于当前流行的ThinkPHP6.xVue3ElementuiVite 开发 , 是一款免费开源的多用户&#xff0c;多应用的独立版SAAS系统开发框架。 【注】[KtAdmin]遵循较为宽松的Ap…

Visual ChatGPT原理解读——大模型论文阅读笔记四

论文&#xff1a;https://arxiv.org/abs/2303.04671 代码&#xff1a;https://github.com/microsoft/TaskMatrix 一. 整体框架 如图所示&#xff0c;用户上传一张黄花的图像并输入一个复杂的语言指令“请根据该图像的预测深度生成一朵红花&#xff0c;然后逐步使其像卡通一样”…

探索 SolidJS,一起体验开源项目(solidjs-use)的乐趣

大厂技术 高级前端 Node进阶 点击上方 程序员成长指北&#xff0c;关注公众号 回复1&#xff0c;加入高级Node交流群 前言 如果你是 React 技术栈&#xff0c;就会发现其对新手其实是不太友好的&#xff0c;会导致新人写出很多重复渲染的组件和 BUG&#xff0c;而且排查难度高…

【人话版】关于“AI替代程序员“的7点碎碎念

都说AI替代这个替代那个&#xff0c;不用浪费时间为这种问题焦虑&#xff0c;因为答案已经越来越明显了... 关键是&#xff0c;什么时候&#xff1f;怎么替&#xff1f;。 1) 设想一个场景&#xff0c;有个需求要用某个技术或某个框架实现&#xff0c;有两个程序员对这些都不是…

未来几年GPT/大模型如何影响软件研发?

具有强大能力的GPT-4横空出世&#xff0c;让我们眼前一亮、惊讶于它能够执行一系列复杂的任务&#xff0c;如代码生成、错误检测、软件设计等&#xff0c;所以我们有必要来探讨一下GPT-4这类多模态语言模型会给软件研发带来怎样的影响&#xff1f;它会重新定义软件开发的新范式…

chatgpt赋能python:Python编程入门指南:Python花钱吗?

Python编程入门指南&#xff1a;Python花钱吗&#xff1f; Python是一个开源、免费的编程语言&#xff0c;当然&#xff0c;这是大家最常听到的关于Python的优点之一。但也有些开发者在使用Python时&#xff0c;会遇到一些需要花费资金的情况。那么&#xff0c;Python到底花钱…

1.2万Star!无差体验GPT-4识图能力,MiniGPT-4看图聊天、还能草图建网站

©作者 | 机器之心编辑部 来源 | 机器之心 GPT-4 已经发布一个多月了&#xff0c;但识图功能还是体验不了。来自阿卜杜拉国王科技大学的研究者推出了类似产品——MiniGPT-4&#xff0c;大家可以上手体验了。 对人类来说&#xff0c;理解一张图的信息&#xff0c;不过是一件…

闻达(Wenda):基于Chatglm6b的知识库+大语言模型融合项目

背景&#xff1a; 随着ChatGPT模型的一炮而红&#xff0c;大语言模型已然风靡全球&#xff0c;成为了全世界闪烁的焦点。目前&#xff0c;越来越多的研发人员投入到大语言模型的扩展开发中&#xff0c;闻达&#xff08;Wenda&#xff09;便是其中一项重要成果。 闻达源于清华大…

提示工程L1:关键原则

提示工程指南&#xff1a;关键原则 一、 环境配置 chatgpt使用有诸多限制&#xff0c;所以采用国产模型来代替&#xff0c;加载开源的chatGLM模型&#xff0c;使用ChatGLM-6b的INT8版本。 chatGLM6b在LLM匿名竞技场中的排名&#xff1a; import os import torch import war…

玩转系统|初遇ChatGPT,我和TA的第一次约会

最近互联网圈子有一个非常火爆的话题ChatGPT&#xff0c;短短一周的时间就有上百万的用户&#xff0c;如果你不是程序员&#xff0c;也许会问这到底是个什么玩意&#xff1f; ChatGPT是什么&#xff1f; ChatGPT&#xff0c;美国“开放人工智能研究中心”研发的聊天机器人程序 …