如何在 Linux 上用 C++ 播放或录制音频(以 .WAV 格式)?

2024-04-06

你好,我一直在寻找一种方法play and recordLinux(最好是 Ubuntu)系统上的音频。我目前正在开发一个前端语音识别工具包 https://www.launchpad.net/cmusphinx-train这将自动执行调整语音模型所需的几个步骤PocketSphinx and Julius.

音频输入/输出替代方式的建议是welcome,以及修复错误如下所示.

这是我迄今为止用来播放的当前代码.WAV file:

void Engine::sayText ( const string OutputText ) {
    string audioUri = "temp.wav";
    string requestUri = this->getRequestUri( OPENMARY_PROCESS , OutputText.c_str( ) );
    int error , audioStream;
    pa_simple *pulseConnection;
    pa_sample_spec simpleSpecs;
    simpleSpecs.format = PA_SAMPLE_S16LE;
    simpleSpecs.rate = 44100;
    simpleSpecs.channels = 2;

    eprintf( E_MESSAGE , "Generating audio for '%s' from '%s'..." , OutputText.c_str( ) , requestUri.c_str( ) );
    FILE* audio = this->getHttpFile( requestUri , audioUri );
    fclose(audio);
    eprintf( E_MESSAGE , "Generated audio.");

    if ( ( audioStream = open( audioUri.c_str( ) , O_RDONLY ) ) < 0 ) {
        fprintf( stderr , __FILE__": open() failed: %s\n" , strerror( errno ) );
        goto finish;
    }

    if ( dup2( audioStream , STDIN_FILENO ) < 0 ) {
        fprintf( stderr , __FILE__": dup2() failed: %s\n" , strerror( errno ) );
        goto finish;
    }

    close( audioStream );

    pulseConnection = pa_simple_new( NULL , "AudioPush" , PA_STREAM_PLAYBACK , NULL , "openMary C++" , &simpleSpecs , NULL , NULL , &error );

    for (int i = 0;;i++ ) {
        const int bufferSize = 1024;
        uint8_t audioBuffer[bufferSize];
        ssize_t r;
        eprintf( E_MESSAGE , "Buffering %d..",i);
        /* Read some data ... */
        if ( ( r = read( STDIN_FILENO , audioBuffer , sizeof (audioBuffer ) ) ) <= 0 ) {
            if ( r == 0 ) /* EOF */
                break;

            eprintf( E_ERROR , __FILE__": read() failed: %s\n" , strerror( errno ) );
    if ( pulseConnection )
        pa_simple_free( pulseConnection );

        }

        /* ... and play it */
        if ( pa_simple_write( pulseConnection , audioBuffer , ( size_t ) r , &error ) < 0 ) {
            fprintf( stderr , __FILE__": pa_simple_write() failed: %s\n" , pa_strerror( error ) );
    if ( pulseConnection )
        pa_simple_free( pulseConnection );

        }

        usleep(2);

    }
    /* Make sure that every single sample was played */
    if ( pa_simple_drain( pulseConnection , &error ) < 0 ) {
        fprintf( stderr , __FILE__": pa_simple_drain() failed: %s\n" , pa_strerror( error ) );
    if ( pulseConnection )
        pa_simple_free( pulseConnection );
    }    
}

注意:如果您想要此文件的其余代码,您可以下载它here http://launchpad.net/libopenmary-c++/trunk/0.3a/+download/libopenmary_0%2Bbzr20110123%2B4.tar.gz直接从启动板。

更新:我尝试使用GStreamermm,这行不通:

    Glib::RefPtr<Pipeline> pipeline;
    Glib::RefPtr<Element> sink, filter, source;
    Glib::RefPtr<Gio::File> audioSrc = Gio::File::create_for_path(uri);

    pipeline = Pipeline::create("audio-playback");
    source = ElementFactory::create_element("alsasrc","source");
    filter = ElementFactory::create_element("identity","filter");
    sink = ElementFactory::create_element("alsasink","sink");
    //sink->get_property("file",audioSrc);
    if (!source || !filter || !sink){
        showErrorDialog("Houston!","We got a problem.");
        return;
    }
    pipeline->add(source)->add(filter)->add(sink);
    source->link(sink);

    pipeline->set_state(Gst::STATE_PLAYING);
    showInformation("Close this to stop recording");
    pipeline->set_state(Gst::STATE_PAUSED);

GStreamer 文档中的“Hello World”应用程序 http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-helloworld.html#section-helloworld显示如何播放 Ogg/Vorbis 文件。要使其适用于 WAV 文件,您只需将“oggdemux”替换为“wavparse”,并将“vorbisdec”替换为“identity”(identity 插件不执行任何操作 - 它只是一个占位符)。

要安装 GStreamer 的开发支持(在 Ubuntu 上)...

sudo apt-get install libgstreamer0.10-dev

您需要在 gcc 命令行上执行以下操作才能使用 GStreamer 库...

$(pkg-config --cflags --libs gstreamer-0.10)

顺便说一句,您可能会发现在编写代码之前使用“gst-launch”对 GStreamer 管道进行原型设计很有用。

## recording
gst-launch-0.10 autoaudiosrc ! wavenc ! filesink location=temp.wav

## playback
gst-launch-0.10 filesrc location=temp.wav ! wavparse ! autoaudiosink

GStreamer 的一个可能对语音识别有用的功能是,可以轻松地将音频质量过滤器插入到管道中,这样您就可以减少录音中可能存在的噪音。指向 GStreamer“好”插件列表的指针是here http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/.

同样有趣的是,“PocketSphinx”(似乎与您的项目相关)已经有一些 GStreamer 集成。看将 PocketSphinx 与 GStreamer 和 Python 结合使用 http://cmusphinx.sourceforge.net/wiki/gstreamer

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Linux 上用 C++ 播放或录制音频(以 .WAV 格式)? 的相关文章

  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐

  • 我们需要将 cordova_plugin.js 上传到 PhoneGap 构建服务器吗?

    我对 Phonegap 很陌生 我正在尝试构建一个需要 InApBrowser 插件的应用程序 我知道我们不应该将 cordova js 上传到 PhoneGap 构建服务器 但我不确定是否需要上传 cordova plugin js 到构
  • Java中静态字段的确切含义是什么?

    我想在同一类对象的各个实例之间共享一个对象 从概念上讲 当我的程序运行时 A 类的所有对象都访问 B 类的同一个对象 我见过那个static是系统范围的 并且不鼓励使用它 这是否意味着如果我有另一个程序在实例化 A 类对象的同一个 JVM
  • TCP 服务器的 GCP 计算引擎防火墙规则

    我创建了一个具有静态外部 IP 地址的 GCP 计算引擎实例 机器类型 n1 standard 2 2 个 vCPU 7 5 GB 内存 操作系统是Linux Debian 我的目的是在机器上创建一个普通的 Node js TCP 服务器
  • 如何在 Jenkinsfile 中设置 github pull request 构建?

    所以 我已经使用 Jenkins 有一段时间了 我已经使用 Github Pull Request Builder 插件设置了许多项目 以便在有人打开拉取请求时运行测试 然后在拉取请求实际合并到 master 时触发一些其他作业 构建 推送
  • Atomikos 事务日志 com.atomikos.icatch.enable_logging=false

    我想了解如果我设置分布式事务功能是否适用于我的应用程序com atomikos icatch enable logging false 我是否正确理解事务恢复与发生崩溃的情况相关 并且我们希望完全重新启动同一事务 恢复是否在同一个分布式事务
  • 直接执行自定义SQL时django-mssql中查询超时过期

    我正在查询一个视图 该视图将返回大量数据 并且需要 1 分钟以上才能完成 我正在使用 django db connection cursor 执行查询 因为这不是我的默认数据库 30 秒后 我收到异常 查询超时已过期 我认为 30 秒是 d
  • ARC 中的系统对象委托是否需要设置为 nil?

    应用程序有时会因错误而崩溃objc object release 苹果开发者技术支持提到了这一点 请记住 您应该始终执行类似 tableView delegate 的操作 零 在你的 dealloc 方法中 即使你使用的是 ARC 出于兼容
  • 使用 Http/2 从 javascript 进行 api 调用

    我知道大多数浏览器支持 http 2 来加载页面 但这是否意味着我在使用 XmlHttpRequest 进行 api 调用时可以利用它 更具体地说 我的问题是 如果我使用 XmlHttpRequest 进行 2 次调用来获取数据 是否可以确
  • Flutter 中 GridView.count 与 GridView.builder 的区别

    有什么区别gridview builder and gridview count在颤振中 和其他任何人一样 builder GridView builder https api flutter dev flutter widgets Gri
  • React Select:传入自定义渲染使用的额外数据

    我正在使用反应选择 目前我正在从elasticsearch中获取数据并将其设置为 var new titles body hits hits forEach function obj looping through elasticsearc
  • Silverlight 4.0 的最佳 Jpeg 编码器

    我想将 Writablebitmap 转换为 Jpeg 流 看起来没有平台支持 而且我在网上看到了一堆开源编码器库 我想听听您的意见 就性能和性能而言 推荐哪个可靠性 我取得了很好的经验FJCore http code google com
  • 汇集估算数据集的 glmers

    问题 我有一个数据集 其中缺少一些预测变量值 我想要池glmer已应用于这些插补集的模型一起 我正在使用mice包来创建插补 我也使用过amelia and mi也没有成功 我想主要提取固定效应 使用pool mouse 包中的函数返回错误
  • 如何在本机反应中显示隐藏的导航栏

    我在本机反应中使用 NavigatorIOS 时遇到麻烦
  • 如何使用带有响应式 UI 的 Xamarin Android 将数据绑定到自定义 ListView

    我正在使用带有响应式 UI 的 Xamarin Android 而不是使用 Xamarin Forms 我有一个自定义 ListView 我已将其布局定义为 xaml 我不知道如何将此控件绑定到 ViewModel 中的 observabl
  • 哪些平台不在 type_info op== 中使用字符串比较?

    这是一个典型的实现type info operator if PLATFORM SUPPORTS UNIQUE TYPEINFO bool operator const type info rhs const return mangled
  • 在应用程序购买中验证

    我正在构建一个 iPhone 应用程序 该应用程序应该通过应用程序内购买处理订阅 当我在应用程序中从 Apple 收到收据时 我想将收据保存在我自己的服务器上 并且在我的服务器上我还想通过 Apple 服务器验证收据 与我的服务器建立连接非
  • 将整数变量传递给任务而不丢失整数类型

    我有一个我不拥有的任务 实际上是一个角色 但在这里使用任务是为了使示例更容易 它对变量进行一些操作 它假设变量是整数 我需要以某种方式向它传递一个变量并将其作为 int 传递 但我没有任何运气 这是我不拥有的任务的超级简化版本 frob y
  • 信息堆大小

    我可以从以下网站获得哪些信息performance memoryChrome 中的对象 这些数字意味着什么 它们是kb还是字符 我可以从这些数字中了解到什么 示例值performance memory MemoryInfo jsHeapSi
  • 为什么这个正则表达式在 Java 中不能按预期工作?

    简单的正则表达式问题 答案很可能是 Java 特定的 This is a comment in a file matches 这会返回 false 据我所知 意味着它总是意味着什么 没有什么特殊意义 所以我就翻译一下 作为 字符串开头的 哪
  • 如何在 Linux 上用 C++ 播放或录制音频(以 .WAV 格式)?

    你好 我一直在寻找一种方法play and recordLinux 最好是 Ubuntu 系统上的音频 我目前正在开发一个前端语音识别工具包 https www launchpad net cmusphinx train这将自动执行调整语音