如何在 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 格式)? 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 重载<<的返回值

    include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 我们需要将 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这将自动执行调整语音