使用Ruff的录音和播放功能


(yangbigarm) #1

好消息,Ruff 最新版已经加入和音频设备的支持,下面我们就来演示一下如何使用

准备工作

  1. Ruff开发板一个,确保最新的Ruff固件和SDK版本都刷到了1.5.0或更高的版本
  2. USB声卡一个,如图1所示。特别注意,有的USB声卡比较宽,而Ruff的USB接口和电源靠的比较近,这种情况下,需要一个USB-Hub或者延长线的帮助。推荐使用USB-Hub(图2),因为插声卡的同时,将来还可以插U盘设备。
  3. 麦克风一个(3.5mm接口),录音的时候使用
  4. 耳机一个(3.5mm接口),播放的时候使用

安装USB声卡驱动

新建一个目录,然后在该目录下用rap init新建项目,然后rap install安装usb声卡的驱动.因为 USB 设备的差异性,这里采用模块安装的方式,而不是通常的 rap device add

rap init
rap install ruff-v1-usb-audio-manager --save

注意 如果你希望在旧应用上使用 USB,请在 package.json 中,将 ruff-mbd-v1 的版本升级到4.1.1,再执行 rap install。

开始录音

在你的 index.js 文件中写如下代码。我们这里示例代码指定的录音文件的位置在tmp文件夹下,这个是Ruff开发板上的空间,空间比较小,录音时间不要超过30s。

'use strict';

var fs = require('fs');
var AudioCapturerManager = require('ruff-v1-usb-audio-manager').CapturerManager;

$.ready(function (error) {
    if (error) {
        console.log(error);
        return;
    }

    console.log('create manager');

    var capturerManager = new AudioCapturerManager();
    // 把capturerManager注册到系统里,当系统扫描到usb声卡设备的时候,
    // 会自动调用capturerManager创建出capturer对象实例
    $('#usb').install(capturerManager);
    // 录音文件
    var sampleFile = '/tmp/voice.mono.pcm';

    capturerManager.on('mount', function (capturer) {
        console.log('AudioCard Capturer mount');
        // capturer对象实例创建好了之后,按K-2按钮就可以开始录音了
        $('#button-k2').on('push', function () {
            console.log('button-k2 push');

            var fd = fs.openSync(sampleFile, 'w');
            var offset = 0;

            capturer.on('data', function (buffer) {
                fs.writeSync(fd, buffer, 0, buffer.length, offset);
                offset += buffer.length;
            });

            // 我们的录音设备支持的参数
            capturer.start({
                rate: 44100,
                channels: 1,
                bits: 16
            });

            // 录制5秒之后,就停止
            setTimeout(function () {
                capturer.stop();
                fs.closeSync(fd);
                console.log('capture finished, record '+ offset + ' Bytes');
            }, 5000);
        });
    });

    captureManager.on('unmount', function (device) {
        // device is unmounted
    });

    $('#led-r').turnOn();
});

$.end(function () {
    $('#led-r').turnOff();
});

按下K-2按钮就开始录音了,录音的效果与你说话时离麦克风的距离,还有麦克风的价格有关。

代码里设定了5秒的录音时间,你可以根据自己的需要修改,如果需要录比较长时间的音频,建议可以通过网络模块,把录音的结果发送到指定的服务器去存储。

录音的结果是原始的pcm数据,数据量非常地大,如果你有兴趣,完全可以加一个编码器,把数据转成更小的格式便于存储。

播放刚才的录音

在你的 index.js 文件中写如下代码。Ruff目前的播放功能还比较简单,只能支持wav格式的音频文件。音频文件的编码格式支持单、双声道,8KHz,16KHz,44KHz,48KHz,16bit采样。

下面上代码,这一段代码跟上面的录音部分很多是重合的,你可以很容易把两段代码合在一起。

'use strict';

var fs = require('fs');
var AudioPlayerManager = require('ruff-v1-usb-audio-manager').PlayerManager;

$.ready(function (error) {
    if (error) {
        console.log(error);
        return;
    }

    console.log('create manager');

    var playerManager = new AudioPlayerManager();

    $('#usb').install(playerManager);
	
	 // 要播放的文件
    var sampleFile = '/tmp/voice.mono.pcm';

    playerManager.on('mount', function (player) {
        console.log('AudioCard Player mount');

        $('#button-k3').on('push', function () {
            console.log('button-k3 push');
            // 读文件,然后把数据feed给player
            var fileReadStream = fs.createReadStream(sampleFile, { highWaterMark: 1024 * 8 });
            fileReadStream.on('data', function (data) {
                player.feed(data);
            });

            // 播放没有时间限制,可以一直播到文件结束
            fileReadStream.on('close', function () {
                player.close();
                console.log('play finish');
            });

            player.on('full', function () {
                fileReadStream.pause();
            });

            player.on('drain', function () {
                fileReadStream.resume();
            });

            // 设置播放音频的参数
            player.start({
                rate: 44100,
                channels: 1,
                bits: 16
            });
        });
    });

    playerManager.on('unmount', function (device) {
        // device is unmounted
    });

    $('#led-r').turnOn();
});

$.end(function () {
    $('#led-r').turnOff();
});

部署你的应用

执行如下命令,将应用部署在开发板上

rap deploy -s

好,插好设备,开始你的测试吧!如果一切正常的话,你讲会通过 rap log 看到这样的日志。

带上耳机,按下K-3按钮,你就能听到刚才你自己对着麦克风说的内容了。

这仅仅是第一步,Ruff的多媒体功能还在不断开发中,本系列的下一集,我们将为大家带来Ruff播放MP3的功能介绍。


[HACKxFDU]语音实时遥控硬件
Ruff有语音识别的硬件模块和语音合成输出的硬件模块吗?
请教关于Ruff开发板网络连接的第4种使用场景?
(yubhbh) #2

hi, ruff-v1-usb-audio-manager 这个支持淘宝网上买的所有的usb 声卡是么?还是对应固定参数设备的?


(rickypan) #3

一般免驱的声卡基本上都可以支持。


(linonetwo) #4

我买了 这个声卡这个话筒 ,等到了我试试能不能用 Ruff 向电脑传语音流。 到时来更新。


(jing) #5

期待成果~:smile:


(vikingsailor) #6

这个声卡能用吗