使用 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 文件进行降采样 的相关文章

  • 在 MVC 类上创建主键字段

    我是 MVC 和 C 新手 我只是偶然发现它并发现它很有趣 我遇到了一个不允许我继续的问题 这是我的代码 using System using System Collections Generic using System Linq usi
  • 可选参数“必须是编译时常量”

    我有一个类分为两个部分文件 如下所示 public partial class PersonRepository BaseRepository
  • 浏览器收集哪些值作为回发数据?

    当页面被发送回服务器时 浏览器收集每个控件的当前值并将其粘贴到一个字符串中 然后 该回发数据通过 HTTP POST 发送回服务器 Q1 除了控件的 Text 属性和 SelectedIndexchanged 因此除了用户输入数据 之外 控
  • 如何检查 .NET 4.0 中的泛型参数是否是动态的

    我有课ObjectMapper
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • 未定义异常变量时通过引用捕获

    捕获异常时 标准指导是按值抛出 按引用捕获 据我了解 这有两个原因 如果由于内存不足异常而引发异常 我们将不会调用可能终止程序的复制构造函数 如果异常是继承层次结构的一部分 我们可能会对异常进行对象切片 如果我们有一个场景 我们没有在 ca
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • 首先EntityFramework数据库 - 类型映射 - 将binary(8)从SQL映射到C#中的int

    在 SQL 内部 我有一个主键为二进制 8 的表 当我使用该表添加到我的模型中时Update Model from Database我可以看到该列有 type Binary 在 C 中 我将该列设为byte 我可以将该列映射到 int 吗
  • Type_traits *_v 变量模板实用程序顺序无法编译

    看过了这个答案 https stackoverflow com a 31763111 7151494 我试图想出一个变量模板从中获取代码的实用程序 template
  • IClaimsTransformation 未触发

    我尝试过实施一个IClaimsTransformation我在 ASP NET CORE 3 1 Web 应用程序中找到的类 public class ClaimsTransformer IClaimsTransformation publ
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • AspNetCore.SignalR:无法启动未处于初始状态的连接

    我无法让 ASP NET Core SignalR 应用程序正常运行 我有这个服务器端代码 public class PopcornHub Hub private int Users public async Task BroadcastN
  • 从存储过程返回 int 值并在 ASP.NET 代码中检查它以验证登录表单

    当我多次尝试但没有得到有效结果时 使此代码运行的真实顺序是什么 SQL存储过程的代码 set ANSI NULLS ON set QUOTED IDENTIFIER ON GO ALTER PROC dbo login proc usern
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一
  • 为什么 GCC 6.3 在没有显式 C++11 支持的情况下编译此 Braced-Init-List 代码?

    我有一个问题大括号括起来的列表的不同含义 https stackoverflow com q 37682392 2642059 我知道C 03不支持C 11initializer list 然而 即使没有 std c 11编译器标志 gcc
  • IEnumerable.比带中断的 for 循环更快吗?

    我们的代码打开表单时遇到了一些缓慢的情况 这可能是由于for循环与break这需要很长时间才能执行 我把它切换到IEnumerable Any 并看到表格很快打开 我现在试图弄清楚是否单独进行此更改会提高性能 或者是否正在访问Product
  • Unity 2.0 和处理 IDisposable 类型(特别是使用 PerThreadLifetimeManager)

    我知道类似的问题被问过好几次 例如 here https stackoverflow com questions 987761 how do you reconcile idisposable and ioc here https stac
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal
  • XmlDocument Save 使文件保持打开状态

    我有一个简单的 C 函数 可以创建一个基本的 XML 文件并保存 private void CreateXMlFile string Filename string Name string Company XmlDocument doc n

随机推荐

  • 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 从