- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用“fvad”库来检测音频静音部分,但我有 QByteArray 而不是 SNDFILE。我怎样才能做到这一点?
sf_read_double(infile, buf0, framelen)
#define _POSIX_C_SOURCE 200809L
#include <fvad.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sndfile.h>
static bool process_sf(SNDFILE *infile, Fvad *vad,
size_t framelen, SNDFILE *outfiles[2], FILE *listfile)
{
bool success = false;
double *buf0 = NULL;
int16_t *buf1 = NULL;
int vadres, prev = -1;
long frames[2] = {0, 0};
long segments[2] = {0, 0};
if (framelen > SIZE_MAX / sizeof (double)
|| !(buf0 = malloc(framelen * sizeof *buf0))
|| !(buf1 = malloc(framelen * sizeof *buf1))) {
fprintf(stderr, "failed to allocate buffers\n");
goto end;
}
while (sf_read_double(infile, buf0, framelen) == (sf_count_t)framelen) {
// Convert the read samples to int16
for (size_t i = 0; i < framelen; i++)
buf1[i] = buf0[i] * INT16_MAX;
vadres = fvad_process(vad, buf1, framelen);
if (vadres < 0) {
fprintf(stderr, "VAD processing failed\n");
goto end;
}
if (listfile) {
fprintf(listfile, "%d\n", vadres);
}
vadres = !!vadres; // make sure it is 0 or 1
if (outfiles[vadres]) {
sf_write_double(outfiles[!!vadres], buf0, framelen);
}
frames[vadres]++;
if (prev != vadres) segments[vadres]++;
prev = vadres;
}
printf("voice detected in %ld of %ld frames (%.2f%%)\n",
frames[1], frames[0] + frames[1],
frames[0] + frames[1] ?
100.0 * ((double)frames[1] / (frames[0] + frames[1])) : 0.0);
printf("%ld voice segments, average length %.2f frames\n",
segments[1], segments[1] ? (double)frames[1] / segments[1] : 0.0);
printf("%ld non-voice segments, average length %.2f frames\n",
segments[0], segments[0] ? (double)frames[0] / segments[0] : 0.0);
success = true;
end:
if (buf0) free(buf0);
if (buf1) free(buf1);
return success;
}
static bool parse_int(int *dest, const char *s, int min, int max)
{
char *endp;
long val;
errno = 0;
val = strtol(s, &endp, 10);
if (!errno && !*endp && val >= min && val <= max) {
*dest = val;
return true;
} else {
return false;
}
}
int main(int argc, char *argv[])
{
int retval;
const char *in_fname, *out_fname[2] = {NULL, NULL}, *list_fname = NULL;
SNDFILE *in_sf = NULL, *out_sf[2] = {NULL, NULL};
SF_INFO in_info = {0}, out_info[2];
FILE *list_file = NULL;
int mode, frame_ms = 10;
Fvad *vad = NULL;
/*
* create fvad instance
*/
vad = fvad_new();
if (!vad) {
fprintf(stderr, "out of memory\n");
goto fail;
}
/*
* parse arguments
*/
for (int ch; (ch = getopt(argc, argv, "m:f:o:n:l:h")) != -1;) {
switch (ch) {
case 'm':
if (!parse_int(&mode, optarg, 0, 3) || fvad_set_mode(vad, mode) < 0) {
fprintf(stderr, "invalid mode '%s'\n", optarg);
goto argfail;
}
break;
case 'f':
if (!parse_int(&frame_ms, optarg, 10, 30) || frame_ms % 10 != 0) {
fprintf(stderr, "invalid frame length '%s'\n", optarg);
goto argfail;
}
break;
case 'o':
out_fname[1] = optarg;
break;
case 'n':
out_fname[0] = optarg;
break;
case 'l':
list_fname = optarg;
break;
case 'h':
printf(
"Usage: %s [OPTION]... FILE\n"
"Reads FILE in wav format and performs voice activity detection (VAD).\n"
"Options:\n"
" -m MODE set VAD operating mode (aggressiveness) (0-3, default 0)\n"
" -f DURATION set frame length in ms (10, 20, 30; default 10)\n"
" -o FILE write detected voice frames to FILE in wav format\n"
" -n FILE write detected non-voice frames to FILE in wav format\n"
" -l FILE write list of per-frame detection results to FILE\n"
" -h display this help and exit\n",
argv[0]);
goto success;
default: goto argfail;
}
}
if (optind >= argc) {
fprintf(stderr, "input file expected\n");
goto argfail;
}
in_fname = argv[optind++];
if (optind < argc) {
fprintf(stderr, "unexpected argument '%s'; only one input file expected\n", argv[optind]);
goto argfail;
}
/*
* open and check input file
*/
in_sf = sf_open(in_fname, SFM_READ, &in_info);
if (!in_sf) {
fprintf(stderr, "Cannot open input file '%s': %s\n", in_fname, sf_strerror(NULL));
goto fail;
}
if (in_info.channels != 1) {
fprintf(stderr, "only single-channel wav files supported; input file has %d channels\n", in_info.channels);
goto fail;
}
if (fvad_set_sample_rate(vad, in_info.samplerate) < 0) {
fprintf(stderr, "invalid sample rate: %d Hz\n", in_info.samplerate);
goto fail;
}
/*
* open required output files
*/
for (int i = 0; i < 2; i++) {
if (out_fname[i]) {
out_info[i] = (SF_INFO){
.samplerate = in_info.samplerate,
.channels = 1,
.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16
};
out_sf[i] = sf_open(out_fname[i], SFM_WRITE, &out_info[i]);
if (!out_sf[i]) {
fprintf(stderr, "Cannot open output file '%s': %s\n", out_fname[i], sf_strerror(NULL));
goto fail;
}
}
}
if (list_fname) {
list_file = fopen(list_fname, "w");
if (!list_file) {
fprintf(stderr, "Cannot open output file '%s': %s\n", list_fname, strerror(errno));
goto fail;
}
}
/*
* run main loop
*/
if (!process_sf(in_sf, vad,
(size_t)in_info.samplerate / 1000 * frame_ms, out_sf, list_file))
goto fail;
/*
* cleanup
*/
success:
retval = EXIT_SUCCESS;
goto end;
argfail:
fprintf(stderr, "Try '%s -h' for more information.\n", argv[0]);
fail:
retval = EXIT_FAILURE;
goto end;
end:
if (in_sf) sf_close(in_sf);
for (int i = 0; i < 2; i++)
if (out_sf[i]) sf_close(out_sf[i]);
if (list_file) fclose(list_file);
if (vad) fvad_free(vad);
return retval;
}
最佳答案
您应该使用 sf_open_virtual而不是 sf_open
创建 SNDFILE
实例。
因此,根据文档,您应该通过 SF_VIRTUAL_IO*
至sf_open_virtual .
必须实现该结构的每个成员的定义以反射(reflect)您的 QBuffer。因此,您需要创建一个辅助类,它接受对 QBuffer 的引用并实现具有相同占用空间的方法,如下所示。
typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ;
typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ;
typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ;
typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ;
typedef sf_count_t (*sf_vio_tell) (void *user_data) ;
static sf_count_t
qbuffer_get_filelen (void *user_data)
{ QBuffer *buff = (QBuffer *) user_data ;
return buff->size();
}
static sf_count_t
qbuffer_seek (sf_count_t offset, int whence, void *user_data)
{
QBuffer *buff = (QBuffer *) user_data ;
switch (whence)
{ case SEEK_SET :
buff->seek(offset);
break ;
case SEEK_CUR :
buff->seek(buff->pos()+offset);
break ;
case SEEK_END :
buff->seek(buff->size()+offset);
break ;
default :
break ;
} ;
return buff->pos();
}
static sf_count_t
qbuffer_read (void *ptr, sf_count_t count, void *user_data)
{
QBuffer *buff = (QBuffer *) user_data ;
return buff->read((char*)ptr,count);
}
static sf_count_t
qbuffer_write (const void *ptr, sf_count_t count, void *user_data)
{
QBuffer *buff = (QBuffer *) user_data ;
return buff->write((const char*)ptr,count);
}
static sf_count_t
qbuffer_tell (void *user_data)
{
QBuffer *buff = (QBuffer *) user_data ;
return buff->pos() ;
}
SF_VIRTUAL_IO qbuffer_virtualio ;
qbuffer_virtualio.get_filelen = qbuffer_get_filelen ;
qbuffer_virtualio.seek = qbuffer_seek ;
qbuffer_virtualio.read = qbuffer_read ;
qbuffer_virtualio.write = qbuffer_write ;
qbuffer_virtualio.tell = qbuffer_tell ;
sf_open_virtual
QBuffer buffer(&yourArray);
buffer.open(QIODevice::ReadWrite);
sf_open_virtual (&qbuffer_virtualio , mode, sfinfo, (void *)(&buffer));
// doing whatever
// you may want to close the buffer
buffer.close();
QBuffer_SFVIRTUAL_Interface
的类并像这样引用它们:
qbuffer_virtualio.get_filelen = QBuffer_SFVIRTUAL_Interface::qbuffer_get_filelen ;
qbuffer_virtualio.seek = QBuffer_SFVIRTUAL_Interface::qbuffer_seek ;
qbuffer_virtualio.read = QBuffer_SFVIRTUAL_Interface::qbuffer_read ;
qbuffer_virtualio.write = QBuffer_SFVIRTUAL_Interface::qbuffer_write ;
qbuffer_virtualio.tell = QBuffer_SFVIRTUAL_Interface::qbuffer_tell ;
关于c++ - 如何使用 QByteArray 而不是 SNDFILE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59233615/
我正在尝试将 Nyquist(一种音乐编程平台,参见:https://www.cs.cmu.edu/~music/nyquist/ 或 https://www.audacityteam.org/abo
我想使用“fvad”库来检测音频静音部分,但我有 QByteArray 而不是 SNDFILE。我怎样才能做到这一点? sf_read_double(infile, buf0, framelen) [
我正在尝试从 .wav 中读取数据并将其放入 fft。要读取 wav 文件,我正在使用 sndfile 库。 SNDFILE* infile; SF_INFO sfinfo ; mems
“#include ”是什么意思? (对不起,我是 c\c++ nub) 顺便说一句,我了解 ActionScript 和 HTML。 最佳答案 这是一个预处理器指令,用于包含名为“sndfile.h
我编写了一个小程序来播放 PCM 音频文件,使用来自 github 的引用,并对我的应用程序稍作修改。该程序编译良好,但我在依赖项和 ALSA 设备方面遇到了一些运行时问题。 我收到的错误是: ERR
这个问题已经有答案了: What mean file with extension "h.in"? (3 个回答) 已关闭 8 年前。 我在 Linux 上使用 gcc 进行编译因为 sndfile.
我想使用 textPad 读取 8 位 wav 文件的数据,我知道数据位于第 44/46 字节,但我无法读取它。 我有那个代码: 52 49 46 46 F8 37 01 00 57 41 56 45
我有一个关于语音识别的项目。虽然我使用了库“sndfile.h”,但我仍然停留在读取输入声音上。我有一个疑问:sf_readf_float()函数读取的数据是时域信号,对吧?如果不是,那是什么?有什么
我正在 Windows 7(64 位)上开发 CodeBlocks 12.11。我正在用 C 编程,我正在使用库:libsndfile (http://www.mega-nerd.com/libsnd
我已经编写了一个函数来使用 portaudio 和 sndfile 播放声音文件。不幸的是,音质很糟糕。声音更像是嘶嘶声。以下是我正在使用的函数的源代码。 #define _GLIBCXX_USE_C
我有一个用 SF_FORMAT_WAV|SF_FORMAT_FLOAT 打开的文件,但有 24 位格式的样本。Sndfile 文档说调用程序使用的数据类型和文件的数据格式不需要相同所以使用 sf_wr
我正在托管一个 python Flask 服务,它使用声音文件库进行音频计算。它在我的本地运行良好,但当我在 Redhat 上托管它时,我看到以下问题。任何建议 - from soundfile i
我正在尝试将 TensorFlow Lite 用于使用 Jupyter 笔记本的语音识别项目,但是当我尝试执行“导入 librosa”(使用此处找到的命令:https://github.com/Sha
我正在尝试部署一个使用 TensorFlow 和 Librosa 的 flask 应用程序。因此,作为 Librosa 的依赖项,我需要 sndfile 包。 当我运行我的 Flask 应用程序时,出
我正在尝试为一个小型 python web 项目编写 Dockerfile,但依赖项有问题。我一直在互联网上进行一些搜索,它说 Librosa 库需要 libsndfile 才能正常工作,所以我尝试使
我一直在编写一些代码来使用 PortAudio 和 sndfile 在 C++ 中播放立体声 .wav 文件,但是输出声音是模糊的并且向下倾斜(向下倾斜对我来说不是问题,但它可能是问题的一部分) .看
首先,我是 Go 和低级编程领域的新手,所以请多多包涵...:) 所以我要做的是这个;使用 libsndfile 读取 .wav 文件binding去和玩portaudio . 我找不到这方面的任何例
我在 Windows 10 Pro 机器上使用 Docker(Linux 容器)。我创建了一个 docker 容器来运行我的 flask 应用程序,并在 requirements.txt 文件中提到了
我目前使用的是 Fedora 20 x86_64。我使用以下命令构建了 libsndfile: sudo ./configure BASE_FLAGS=-32 sudo make sudo make
目标是在 Heroku 上部署音频预测 ML 模型,该模型使用 Python 中的 librosa 库。 app.py 文件使用 librosa 库从音频中提取特征。 当我尝试在 Heroku 上部署
我是一名优秀的程序员,十分优秀!