跳转至

单USB方案*

GX8008/GX8008C 支持 USB 输出,对外可以包装为一个标准的 USB 声卡,支持 capture 和 play 功能。

协议上支持 UAC1.0 和 UAC2.0。linux, mac系统免驱使用。

UAC1.0 linux, mac,win10, win7, winXP等系统免驱使用,即插即用。

UAC2.0 win10 2017年3月以前的,UAC2.0需要安装驱动,以后的免驱。win7, winXP等需要安装驱动。linux, mac免驱使用。

对于主控有 USB 接口,可以做主设备,支持 USB 声卡的系统,比如 linux, Android等,可以使用上面的接法。

如果主控需要播放声音的话,可以把两路回采拉回,做回声消除。

做回声消除拉回采的方式有多种,这个主要和硬件选型有关。这里重点讨论应用软件上的开发,就不多说回采的事情了。

GX8008/Gx8008C 对外有两类数据输出:

  • 通过 USB 输出降噪后的音频,格式为 16K 16bit 单声道 PCM
  • 通过 USB 虚拟的串口 ttyACM 输出唤醒的事件

另外,如果需要 GX8008/GX8008C 播放音频的话,比如一些唤醒后的简单应答,可以通过 USB 传回音频。相当于一个支持播放的USB声卡。

如果不考虑回采的话,该方案只需要通过一根USB线和其它设备连接,就提供了AI语音唤醒和提高降噪音频的功能,非常简单方便。

1. USB 音频传输*

在 linux 平台上,打开 Alsa 设备,通过标准的API接口,即可获取 GX8008/GX8008C 的输出音频。

在linux kerenl中开启USB声卡的配置参考:

注意要开启 USB sound devices

录制音频简单示例如下(完整的代码见 章节3):

lvp_tws/app/sample/lvp_app_sample.c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void *thr_fn(void *arg)
{
    int err;
    snd_pcm_t *handlep;
    snd_pcm_t *handlec;
    snd_pcm_sframes_t frames;

    if ((err = snd_pcm_open(&handlec, device, SND_PCM_STREAM_CAPTURE, 0)) < 0)
    {
        printf("Capture open error: %s\n", snd_strerror(err));
        exit(EXIT_FAILURE);
    }

    if ((err = snd_pcm_set_params(handlec,
                                  SND_PCM_FORMAT_S16_LE,
                                  SND_PCM_ACCESS_RW_INTERLEAVED,
                                  1,
                                  16000,
                                  1,
                                  500000)) < 0)
    { // 0.5sec
        printf("Capture open error: %s\n", snd_strerror(err));
        exit(EXIT_FAILURE);
    }

    snd_pcm_readi(handlec, buffer, buffer_size/2);
    printf("OK, I am working\n");

    while(1)
    {
        snd_pcm_readi(handlec, buffer, 320);
        //printf("read\n");
    }
}

2. ttyACM 串口传输*

可以把 GX8008/8008C 的USB暴露为一个标准的串口设备,在linux下,一般名称为 ttyACM。

linux 平台都支持。需要在内核里配置,开启该功能。

需要具体了解如何配置的话,推荐咨询下对应方案的原厂。

另外,给出个参考资料:https://blog.csdn.net/xhoufei2010/article/details/43966889

使用我们开发板,通过 USB 接 linux PC,然后查看 /dev/ 目录下,会出现个 ttyACM 设备。使用串口工具,打开该设备,选择波特率115200。然后唤醒,就可以看到有对应的打印输出。

下面给出读取ttyACM的参考代码示例(完整的代码见 章节3):

lvp_tws/app/sample/lvp_app_sample.c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    uart_config((char*)"/dev/ttyACM0", 115200, 8, 1, 'N');
    while(1)
    {
        usleep(1000*1); // 10ms

        unsigned char buffer[4096] = {0};
        int size = sizeof(buffer);
        int len = uart_try_read(buffer, size);
        if(len > 0)
        {
            printf("I get Gx8008/GX8008C message\n");
        }
    }

3. 参考代码*

miss_active_record.zip (https://yunpan.360.cn/surl_yv2Cstd6pYV)

该代码在 PC ubuntu 16.04上验证过

4. ACM串口Windows驱动*

针对win10前的系统,如果不安装驱动,可能无法识别ACM串口。因此想在windows上使用的话,在无法识别的情况下需要安装下面的驱动

GX80XX-CDC-ACM串口Windows驱动.zip (https://yunpan.360.cn/surl_yvIwq8bSgIy)