递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库

类似Win自带麦克风测试的音频监听实现?

查看数: 2089 | 评论数: 6 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2024-3-21 17:56

正文摘要:

搜了下 麦克风音频监听 实现起来没那么容易, 火山的摄像头操作库仅可获取到音频设备名称,还无法监听麦克风声音大小, 要实现如win系统自带的麦克风测试效果,一开始说话就能检测到声音大小, 有没有大佬懂得哪个库 ...

回复

99101617 发表于 2024-3-23 09:16:06
两个办法,一个用封装的库,一个用JS(第二个网站的JS可以下载到本地使用)
https://bbs.voldp.com/forum.php? ... &highlight=BASS
https://themictest.com/zh/
承易 发表于 2024-3-21 22:04:46
99101617 发表于 2024-3-21 21:36
你发的这些是AI生成的吧,不会用,我找到一个在线测试麦克风的网站,完全本地化的,实测可用,我正在将没 ...

现在的时代就是问AI 在修改下 就成了
99101617 发表于 2024-3-21 21:37:37
火山的BASS音频库看着能够实现,但对这个库功能不了解怎么用。
99101617 发表于 2024-3-21 21:36:09

你发的这些是AI生成的吧,不会用,我找到一个在线测试麦克风的网站,完全本地化的,实测可用,我正在将没用的部分主键删除,找出主要功能实现代码,要是解决了就贴出来。
承易 发表于 2024-3-21 20:38:55
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <mmsystem.h>
  4. #pragma comment(lib, "winmm.lib")

  5. void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
  6.     if (uMsg == WIM_DATA) {
  7.         WAVEHDR* header = (WAVEHDR*)dwParam1;
  8.         short* buffer = (short*)header->lpData;
  9.         int volume = 0;

  10.         for (int i = 0; i < header->dwBytesRecorded / sizeof(short); i++) {
  11.             volume += abs(buffer[i]);
  12.         }

  13.         volume /= (header->dwBytesRecorded / sizeof(short));
  14.         std::cout << "音量: " << volume << std::endl;

  15.         waveInAddBuffer(hwi, header, sizeof(WAVEHDR));
  16.     }
  17. }

  18. int main() {
  19.     WAVEFORMATEX format;
  20.     format.wFormatTag = WAVE_FORMAT_PCM;
  21.     format.nChannels = 1;
  22.     format.nSamplesPerSec = 44100;
  23.     format.wBitsPerSample = 16;
  24.     format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8;
  25.     format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
  26.     format.cbSize = 0;

  27.     HWAVEIN hwi;
  28.     MMRESULT result = waveInOpen(&hwi, WAVE_MAPPER, &format, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION);

  29.     if (result != MMSYSERR_NOERROR) {
  30.         std::cerr << "无法打开音频输入设备" << std::endl;
  31.         return 1;
  32.     }

  33.     WAVEHDR header;
  34.     ZeroMemory(&header, sizeof(WAVEHDR));
  35.     header.lpData = new char[format.nBlockAlign];
  36.     header.dwBufferLength = format.nBlockAlign;
  37.     header.dwFlags = WHDR_DONE;

  38.     result = waveInPrepareHeader(hwi, &header, sizeof(WAVEHDR));
  39.     if (result != MMSYSERR_NOERROR) {
  40.         std::cerr << "无法准备音频输入头" << std::endl;
  41.         return 1;
  42.     }

  43.     result = waveInAddBuffer(hwi, &header, sizeof(WAVEHDR));
  44.     if (result != MMSYSERR_NOERROR) {
  45.         std::cerr << "无法添加音频输入缓冲区" << std::endl;
  46.         return 1;
  47.     }

  48.     result = waveInStart(hwi);
  49.     if (result != MMSYSERR_NOERROR) {
  50.         std::cerr << "无法开始音频输入" << std::endl;
  51.         return 1;
  52.     }

  53.     MSG msg;
  54.     while (GetMessage(&msg, NULL, 0, 0)) {
  55.         TranslateMessage(&msg);
  56.         DispatchMessage(&msg);
  57.     }

  58.     waveInUnprepareHeader(hwi, &header, sizeof(WAVEHDR));
  59.     delete[] header.lpData;
  60.     waveInClose(hwi);

  61.     return 0;
  62. }
复制代码
承易 发表于 2024-3-21 20:37:13
  1. import pyaudio
  2. import numpy as np

  3. # 定义回调函数
  4. def callback(in_data, frame_count, time_info, status):
  5.     audio_data = np.frombuffer(in_data, dtype=np.int16)
  6.     volume = np.linalg.norm(audio_data) / frame_count
  7.     print("音量:", volume)
  8.     return (in_data, pyaudio.paContinue)

  9. # 初始化PyAudio对象
  10. p = pyaudio.PyAudio()

  11. # 打开麦克风流
  12. stream = p.open(format=pyaudio.paInt16,
  13.                 channels=1,
  14.                 rate=44100,
  15.                 input=True,
  16.                 frames_per_buffer=1024,
  17.                 stream_callback=callback)

  18. # 开始监听
  19. stream.start_stream()

  20. # 保持监听状态,按任意键退出
  21. try:
  22.     while stream.is_active():
  23.         input("按任意键退出...")
  24. except KeyboardInterrupt:
  25.     pass

  26. # 停止监听并关闭流
  27. stream.stop_stream()
  28. stream.close()

  29. # 终止PyAudio对象
  30. p.terminate()
复制代码

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-23 19:48 , Processed in 0.080289 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表