使用 libsox 对 wav 文件进行降采样

2024-01-17

我正在尝试使用 Sox 库 C 程序将 16KHZ 16 位签名 PCM 编码波形文件转换为 8KHz 8 位 mu 编码 wav 文件(http://sox.sourceforge.net/ http://sox.sourceforge.net/)。从 PCM 到 mu 的转换工作正常。但是当我应用下采样效果时,输出文件持续时间只是 i/p 文件的一半(见下文)。我使用了帖子中提到的技术sox C库进行格式转换时如何改变采样率? https://stackoverflow.com/questions/16806592/how-to-change-the-samples-rates-when-do-the-format-conversion-by-sox-c-libraries/25061482#25061482但这对我没有帮助。

当我执行以下代码时,我看到一条警告

wav: Premature EOF on .wav input file

Output:

Input File     : 'text2speech_0.wav'
Channels       : 1
Sample Rate    : 16000
Precision      : 16-bit
**Duration       : 00:00:06.24 = 99777 samples ~ 467.705 CDDA sectors**
File Size      : 200k
Bit Rate       : 256k
Sample Encoding: 16-bit Signed Integer PCM


Input File     : 'out_8k.wav'
Channels       : 1
Sample Rate    : 8000
Precision      : 14-bit
**Duration       : 00:00:03.12 = 24945 samples ~ 233.859 CDDA sectors**
File Size      : 49.9k
Bit Rate       : 128k
Sample Encoding: 8bit u-law

Code:

int main(int argc, char * argv[])
{
    static sox_format_t * in, * out; /* input and output files */
    sox_effects_chain_t * chain;
    sox_effect_t * e;
    char * args[10];
    assert(argc == 3);
    assert(sox_init() == SOX_SUCCESS);
    assert(in = sox_open_read(argv[1], NULL, NULL, NULL));

    assert(out = sox_open_write(argv[2], &in->signal, NULL, NULL, NULL, NULL));

    chain = sox_create_effects_chain(&in->encoding, &out->encoding);

    e = sox_create_effect(sox_find_effect("input"));
    args[0] = (char *)in, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
    assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
    free(e);

    out->signal.rate = 8000;
    in->signal.rate = 16000;

   if (in->signal.rate != out->signal.rate) {
        e = sox_create_effect(sox_find_effect("rate"));
        args[0] = "16000", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
        assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS);
        free(e);
    }

    if (in->signal.channels != out->signal.channels) {
        e = sox_create_effect(sox_find_effect("channels"));
        assert(sox_effect_options(e, 0, NULL) == SOX_SUCCESS);
        assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS);
        free(e);
    }

    e = sox_create_effect(sox_find_effect("output"));
    args[0] = (char *)out, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
    assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS);
    free(e);

    sox_flow_effects(chain, NULL, NULL);

    sox_delete_effects_chain(chain);
    sox_close(out);
    sox_close(in);
    sox_quit();

    return 0;
}

编译与执行:

gcc -g -o example3 example3.c `pkg-config --cflags --libs sox`
./example3 text2speech_0.wav out_8k.wav

波纹管是工作代码的差异。 我认为犯的主要错误是“输出”结构必须在打开它进行写入之前设置。

+#include <sox.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+ int main(int argc, char * argv[])
+ {
+     static sox_format_t * in, * out; /* input and output files */
+@@ -7,9 +13,15 @@
 assert(argc == 3);
 assert(sox_init() == SOX_SUCCESS);
 assert(in = sox_open_read(argv[1], NULL, NULL, NULL));
 +    out= (sox_format_t *) malloc(sizeof (sox_format_t));
 +    memcpy(out, in, sizeof (sox_format_t));
 +    out->encoding.encoding = SOX_ENCODING_ULAW;
 +    out->encoding.bits_per_sample=8;
 +    out->signal.rate = 8000;
 +    out->signal.precision = 8;
 +    out->signal.length = SOX_UNSPEC;
 +    assert(out = sox_open_write(argv[2], &out->signal, &out->encoding, NULL, NULL, NULL));

 -    assert(out = sox_open_write(argv[2-    assert(out = sox_open_write(argv[2],  &in->signal, NULL, NULL, NULL, NULL));
 -
 chain = sox_create_effects_chain(&in->encoding, &out->encoding);

 e = sox_create_effect(sox_find_effect("input"));
 @@ -17,16 +29,14 @@
 assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
 free(e);

 -    out->signal.rate = 8000;
 -    in->signal.rate = 16000;
 if (in->signal.rate != out->signal.rate) {
     e = sox_create_effect(sox_find_effect("rate"));
 -        args[0] = "16000", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
 +        assert(sox_effect_options(e, 0, NULL) == SOX_SUCCESS);
 +         e->handler.flags |= SOX_EFF_LENGTH;
 +  
     assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS);
     free(e);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 libsox 对 wav 文件进行降采样 的相关文章

  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • InstanceDouble(session) (匿名)> 收到意外消息 :[]= with

    我对 rspec 行为有疑问 我尝试为我使用的服务编写测试session 用于读取一些值并覆盖该值 例如我想测试什么 class CurrentCartService attr reader user session def initial
  • Android:CollapsingToolbarLayout 中的 MapView

    我目前正在尝试放置一个Map View 或包含地图的片段 内CollapsingToolbarLayout 我想在它上有视差效果RecyclerView卷轴 不幸的是 它根本没有出现 连灰色网格都没有 不过 折叠动画正在发挥作用 我到处寻找
  • 来自队列的大对象堆和字符串对象

    我有一个 Windows 控制台应用程序 应该可以运行数天和数月而无需重新启动 该应用程序从 MSMQ 检索 工作 并对其进行处理 有 30 个线程同时处理一个工作块 来自 MSMQ 的每个工作块大约为 200kb 其中大部分分配在单个 S
  • C# - 迭代谓词的模式

    我做了一个我不太喜欢的图案 如下 List
  • Javafx css按钮图形调整大小[重复]

    这个问题在这里已经有答案了 我想更改按钮内图标的大小 图像的尺寸为 512 x 512 我想调整为 16x16 那么 使用 javaFX CSS 实现此目的的最佳方法是什么 这是我到目前为止所做的 btnCancel button fx g
  • 将数据文件添加到 cmake 生成的项目中

    我有一个项目 其中源文件位于 source 中 一些着色器文件位于 data 中 这些文件未编译 而是由代码加载 我希望这些文件显示在我的 CMake 生成的 VS2010 项目文件中 以便我可以轻松地编辑它们 有什么好的方法可以做到这一点
  • 在 XNA 中使用 HTML/CSS 作为 UI?

    有没有办法使用 HTML CSS 来做 XNA 游戏的用户界面 我需要以编程方式更新 HTML 以及处理事件 或者我应该使用另一个框架 该线程看起来很有希望 XNA 的 UI 库 https stackoverflow com questi
  • 将 int 列表传递给 HttpGet 请求

    我有一个结构与此类似的函数 HttpGet public HttpResponseMessage GetValuesForList List
  • java.io.IOException:无效的 Http 响应

    现在 在你说有这样的问题之前 我想指出我已经浏览了其中的大多数问题 但没有任何运气 另外 我是第一次来这里 所以要温柔 我现在在当前的程序中遇到了这个烦恼 基本上我的程序的这一部分使用搜索引擎来查找 torrent 文件 public st
  • 如何建立自己的PEAR频道?

    我正在寻找有关如何为我们的项目设置 PEAR 通道的说明 以便我们可以使用 pear 安装程序来部署它 我在网上搜索了一段时间 找不到任何简单的信息 我跟着本教程 http greg chiaraquartet net archives 1
  • 隐藏或显示子报表

    我有一个要求 需要显示或隐藏子报告基于用户选择 假设我有一个主报告和两个子报告 sub1 and sub2 用户选择仅显示sub1 布尔值将通过Java 我需要显示主要报告sub1并隐藏在其中sub2 I tried
  • java中合并排序的问题

    我是 stackoverflow 的新手 我需要一些帮助来编写一个程序来对可比数组列表进行合并排序 我已经在这段代码上工作了几个小时 但没有成功 该程序需要正确运行 因为我正在为计算机科学课程做它 而下一个作业要求我们测试不同类型的效率 这
  • 发送自定义 IQ 时来自服务器的服务不可用响应

    我正在尝试从 android 发送带有 IQ 的自定义信息 所以我使用下面的代码来发送自定义 IQ 消息 public void onClick View arg0 CustomIQ req new CustomIQ req myData
  • Firefox 中的“您的证书”存储在哪里?

    我应该在 Firefox 的 我的证书 部分安装一些证书 但那里没有 如果我能找出存储的位置 也许在我的配置文件目录中的某个地方 那么我可以尝试从备份中恢复 这将是一个更好的问题http superuser com http superus
  • 核心数据 - 无法将空字符串设置为属性的默认值

    我的数据模型中有一个实体 其字符串属性当前是可选的 我想将其转换为默认值为空字符串的必需属性 正如其他人发现的那样 在 Xcode Core Data 数据建模器中将默认值留空会导致验证错误 因为设计者将其解释为 NULL 但尝试将 或 作
  • Dagger 2 注入两个改造对象

    我在使用 MVP 时将 Dagger 2 与 Retrofit2 库结合使用 一切都很顺利 直到我尝试集成另一个服务 基本上我尝试将另一个改造对象初始化到另一个服务 我跟着这个answer https stackoverflow com q
  • NuxtJS - 在布局或组件中使用 asyncData 方法

    我如何使用asyncData在布局或组件中 显然被禁止 因为我的侧边栏组件是在默认布局中使用的 所以我需要使用asyncData显示来自后端的数据 如果我使用 Vuex 来获取数据 我不知道如何在每个页面上使用全局来获取数据 我的布局组件注
  • 将 DIV 更改为“position:fixed”,然后将其更改回“static”并显示其余的 DIV

    我有几个 div 经过一些滚动后 第二个 div 将是 position fixed 再次滚动后 它将回到 position static 但问题是 接下来是第四个 div 而不是第三个 因为当我们在第二个 div 时它已经通过滚动过去了
  • YouTube API v3.0:如何确定视频是否“按次付费”?

    我正在使用YouTube Python API v3 0 使用特定视频 ID 查询 YouTube 我想知道结果中列出的哪些视频是付费内容 其中有一些电视节目 我已经浏览了 视频 对象参数 https developers google c
  • 使用 libsox 对 wav 文件进行降采样

    我正在尝试使用 Sox 库 C 程序将 16KHZ 16 位签名 PCM 编码波形文件转换为 8KHz 8 位 mu 编码 wav 文件 http sox sourceforge net http sox sourceforge net 从