首页
关于
Search
1
windows访问WSL出现\\wsl.localhost 无法访问
1,375 阅读
2
cmake配置cuda12.4+libtorch开发环境
743 阅读
3
[HYGUI开发] emoji绘制问题的解决
517 阅读
4
快速安装带有vnc的docker
492 阅读
5
基于ProtoAudio的语音录制/静音检测
485 阅读
默认分类
技术
杂谈
嵌入式开发
人工智能
HYGUI
记录
其他
登录
Search
回忆
累计撰写
16
篇文章
累计收到
4
条评论
首页
栏目
默认分类
技术
杂谈
嵌入式开发
人工智能
HYGUI
记录
其他
页面
关于
搜索到
5
篇与
的结果
2024-06-19
windows访问WSL出现\\wsl.localhost 无法访问
\\wsl.localhost 无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。系统资源不足,无法完成请求的服务。打开注册表找到以下两项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\HwOrder将ProviderOrder的值从cbfs6,P9NP,RDPNP,LanmanWorkstation,webclient改为P9NP,RDPNP,LanmanWorkstation,webclient懒人方案我写了一个小工具Huiyicc/wsl_repair加入到快捷启动直接运行就是
2024年06月19日
1,375 阅读
2 评论
0 点赞
2024-05-27
快速安装带有vnc的docker
拉取镜像docker pull dorowu/ubuntu-desktop-lxde-vnc:latest运行容器docker run -d -p 6080:80 --name lxde-vnc dorowu/ubuntu-desktop-lxde-vnc现在进入服务器IP:6080就能访问了~
2024年05月27日
492 阅读
0 评论
0 点赞
2024-05-16
基于ProtoAudio的语音录制/静音检测
以下代码全都开源在github: ai_client概览原定目标是创建一个智能录音模块,它能够自动检测静音并在没有实际音频输入时暂停录制,从而避免不必要的资源消耗。整个系统围绕Proto框架构建,包括了音频流管理、静音识别逻辑及数据处理等核心部分。最终成为AI助手的后端。静音检测原理能量分析: 通过计算每帧音频样本的能量总和,即其绝对值的平均,来评估当前的音量水平。阈值判定:设定一个能量阈值m_flitterSize,当连续几帧能量均值超过此阈值时,认为有声音,反之则视为静音。滤波处理:引入flitterFunc函数,基于能量序列判断是否连续超过静音阈值,考虑了容错率,防止因瞬间噪声触发录音。int OnStreamCallBack(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *sysData)获取数据// framesPerBuffer是本次采样数据地址,channelCount是通道数,双通道就是左右声道交错排列 auto fNum = framesPerBuffer * _this->m_params->channelCount; 均化振幅// 最终的v也就是本次的振幅了 float total = 0; float v = 0; for (size_t i = 0; i < fNum; ++i) { auto tt = rprt[i]; if (rprt[i] > middle) { v = static_cast<float>(rprt[i]) / static_cast<float>(maxPcm); } else { v = (static_cast<float>(fabs(rprt[i])) / static_cast<float>(fabs(minPcm))); } total += v; } v = total / static_cast<float>(fNum);处理波动// 本次均化之后的数据加入时间轮 _this->m_energyBuffer.push(v); if (_this->m_energyBuffer.isFull()) { if (_this->m_records) { // 正在录音,滤波不通过取消录音 if (!flitterFunc(_this->m_energyBuffer.getOrdered(), _this->m_flitterSize, _this->m_flitterFiltration)) { auto now = Timer::GetCurrentTimeMillis(); if (now - _this->m_lastTime > _this->m_flitterTime) { bool r = true; if (_this->m_muteCallback) { r = _this->m_muteCallback(_this, _user); } _this->m_lastTime = now; // 防止爆闪 _this->m_records = false; _this->m_insert = false; } } } else { // 没开始录音,超过阈值 if (v > _this->m_flitterSize) { // 滤波,防止瞬时噪音 if (flitterFunc(_this->m_energyBuffer.getOrdered(), _this->m_flitterSize, 0.5)) { bool r = true; if (_this->m_StartCallback) { r = _this->m_StartCallback(_this, _user); } if (r) { _this->m_records = true; _this->m_insert = true; } } }else { // 因为过滤了短暂的爆音,但是这种过滤会导致丢掉说话开始时的一秒左右数据,所以要一个预存 // 保留前reNum次采样的数据 uint32_t reNum = 3; // 最大预存尺寸 uint32_t maxIndex = reNum * fNum; if (_this->m_scanIndex >= maxIndex) { std::vector<short> tempV(maxIndex); tempV.clear(); tempV.insert(tempV.end(), _this->m_pcmData.begin() + fNum, _this->m_pcmData.end()); _this->m_scanIndex = tempV.size(); _this->m_pcmData.clear(); _this->m_pcmData.insert(_this->m_pcmData.end(), tempV.begin(), tempV.end()); _this->m_insert = true; } else { _this->m_insert = true; } } } } 插入录制的数据if (_this->m_insert || _this->m_records) { _this->m_pcmData.insert(_this->m_pcmData.end(), rprt, rprt + framesPerBuffer * _this->m_params->channelCount); if (_this->m_pcmData.size() >= 10000) { _this->m_scanIndex += static_cast<int32_t>(framesPerBuffer * _this->m_params->channelCount); if (_this->m_pcmData.size() >= _this->m_maxSize) { _this->m_scanIndex = 0; _this->m_pcmData.clear(); } } }使用#include "audio/AudioClient.h" #include "utils/extend/Logger.h" #include <iostream> #include <thread> int main() { auto cli = AC::AudioClient::GetInstance(); auto dev = AC::AudioClient::GetDefaultInputDevice(); PrintDebug("default input device: {}", dev.Name.c_str()); auto s = cli->OpenStream(dev); s.SetMuteCallback([](AC::AudioStream *stream, void *userData)->bool { stream->SaveData("re.wav", true); PrintInfo("saved"); return true; }); s.SetStartCallback([](AC::AudioStream *stream, void *userData)->bool { PrintInfo("start"); return true; }); std::thread a([&]() { s.Start(0.02,0.05,3000); }); std::this_thread::sleep_for(std::chrono::seconds(5)); while (true) { std::string cmd; std::cin >> cmd; if (cmd == "exit") { s.Stop(); a.join(); break; } } return 0; }
2024年05月16日
485 阅读
1 评论
0 点赞
2024-05-12
编译SKIA
环境准备visualstudiopython (3.6.9+)llvm (我下载的是LLVM-18.1.5-win64.exe)编译前准备以下命令需要确保网络通畅(科学上网)git设置代理git config --global https.proxy http://127.0.0.1:10809 git config --global http.proxy http://127.0.0.1:10809 git config --global http.sslVerify false克隆代码git clone https://skia.googlesource.com/skia.git cd skia初始化依赖库python tools/git-sync-deps下载 ninjapython bin/fetch-ninja修改gn\BUILDCONFIG.gn(129行左右)if (target_os == "win") { # By default we look for 2017 (Enterprise, Pro, and Community), then 2015. If MSVC is installed in a # non-default location, you can set win_vc to inform us where it is. if (win_vc == "") { # 找到你的vs安装目录对着填 win_vc = "D:/Dev/VisualStudio/2022/Community/VC" } assert(win_vc != "") # Could not find VC installation. Set win_vc to your VC # directory. } if (target_os == "win") { if (win_toolchain_version == "") { # win_vc下Tools\MSVC内的文件夹名称,vs工具链版本 win_toolchain_version = "14.39.33519" } if (win_sdk_version == "") { # win sdk安装目录下10/include下的文件名,sdk版本 win_sdk_version = "10.0.22621.0" } if (clang_win != "" && clang_win_version == "") { # llvm安装路径下lib/clang下的文件名,clang版本 clang_win_version = "18" } }如果下面编译有问题修改gn\toolchain\BUILD.gn 45行dlsymutil_pool_depth=20 # 你的cpu核心数编译下面的clang_win换成自己的LLVM安装目录Debug x64静态库bin/gn gen out/debug_x64_static --args='clang_win=\"D:\SDK\LLVM\" cc=\"clang\" cxx=\"clang++\" extra_cflags=[\"/MTd\"] is_official_build=true is_debug=false skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_system_harfbuzz=false skia_use_icu=false' ninja -C out/debug_x64_staticRelease x64静态库bin/gn gen out/release_x64_static --args='clang_win=\"D:\SDK\LLVM\" cc=\"clang\" cxx=\"clang++\" extra_cflags=[\"/MT\"] is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_system_harfbuzz=false skia_use_icu=false skia_use_angle=true' ninja -C out/release_x64_staticlinux与mac下流程大体一致ubuntu需要设置skia\_use\_system\_harfbuzz=false,skia_enable_fontmgr_empty=truebin/gn gen out/debug_x64_static --args='skia\_use\_system\_harfbuzz=false skia_enable_fontmgr_empty=true'如果是mac则使用下面的命名生成(is_trivial_abi设置false)bin/gn gen out/debug_x64_static --args='is_debug=true is_trivial_abi=false'
2024年05月12日
271 阅读
0 评论
0 点赞
2024-04-09
香橙派长时间开机wifi自动掉线问题
香橙派挂机开发的时候发现隔一段时间wifi自动掉线,不会重连查看网卡状态# sudo iwconfig wlan0 huiyi@orangepizeroplus2h5:~$ sudo iwconfig wlan0 [sudo] password for huiyi: wlan0 IEEE 802.11 ESSID:"Huiyicc" Mode:Managed Frequency:2.452 GHz Access Point: 44:32:62:0E:DF:24 Bit Rate=43.3 Mb/s Tx-Power=31 dBm Retry short limit:7 RTS thr:off Fragment thr:off Encryption key:off Power Management:on Link Quality=70/70 Signal level=-17 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0说明:Power Management是电源管理模式,on是开off是关这里是开启了临时关闭#关闭节能模式 sudo iwconfig wlan0 power off检查huiyi@orangepizeroplus2h5:~$ sudo iwconfig wlan0 wlan0 IEEE 802.11 ESSID:"Huiyicc" Mode:Managed Frequency:2.452 GHz Access Point: 44:32:62:0E:DF:24 Bit Rate=21.6 Mb/s Tx-Power=31 dBm Retry short limit:7 RTS thr:off Fragment thr:off Encryption key:off Power Management:off Link Quality=70/70 Signal level=-15 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0永久关闭vim /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf将wifi.powersave改为2保存然后reboot
2024年04月09日
304 阅读
0 评论
0 点赞