baresip android 编译、运行教程3 :sip客户端的voip 语音识别 (讯飞实时语音转写)

前面分别实现了baresip android 语音、视频 参考地址https://blog.csdn.net/Java_lilin/article/details/100039464

本文对接通后获取双方的语音用讯飞实时语音转写来识别

(如果觉得麻烦可以去https://item.taobao.com/item.htm?id=606696026272购买个维护好的)

1.获取通话数据 参考sndfile模块  录音模块

https://github.com/alfredh/baresip/tree/master/modules/sndfile

主要用到aufilt_register(baresip_aufiltl(), &sndfile); 我们不用编译它 只需要其中一部分代码 

在原来注册  vidsrc_register()和 baresip_vidispl();的地方加上这个

sndfile结构体也需要拷贝过来 

struct sndfile_enc {
    struct aufilt_enc_st af;  /* base class */
    enum aufmt fmt;
};

struct sndfile_dec {
    struct aufilt_dec_st af;  /* base class */
    enum aufmt fmt;
    FILE *file = NULL; //保存pcm文件
};
static struct aufilt sndfile = {  LE_INIT, "sndfile", encodeaudio_update, encodeaudio, decodeaudio_update, decodeaudio };

上面的主要方法 编码的一样 主要现实现保存为pcm的 我通话的编码是pcmu的也就是16bit  8000hz 单声道 

static int decodeaudio_update(struct aufilt_dec_st **stp, void **ctx,
                         const struct aufilt *af, struct aufilt_prm *prm,
                         const struct audio *au)
{
    //解码初始化
    struct sndfile_dec *st;
    int err = 0;
    (void)ctx;
    (void)af;
    (void)au;

    if (!stp || !prm)
        return EINVAL;

    st = static_cast<sndfile_dec *>(mem_zalloc(sizeof(*st), dec_destructor));
    if (!st)
        return EINVAL;

    st->file=fopen("/data/data/lilin.com/files/1.pcm","wb");

    st->fmt = static_cast<aufmt>(prm->fmt);
    if(st->fmt==AUFMT_S16LE ){
        LOGE( "====ok  频率和声道=%d=%d",prm->srate , prm->ch);
    }

    *stp = (struct aufilt_dec_st *)st;

    return err;
}
static int decodeaudio(struct aufilt_dec_st *st, void *sampv, size_t *sampc)
{
    //解码pcm数据
    struct sndfile_dec *sf = (struct sndfile_dec *)st;
    size_t num_bytes;

    if (!st || !sampv || !sampc)
        return EINVAL;

    //num_bytes = *sampc * aufmt_sample_size(sf->fmt);
    LOGE("解码写");
    fwrite(sampv, *sampc, aufmt_sample_size(sf->fmt) ,sf->file); //写入pcm的文件
    //LOGE("decodeaudio=%d",  num_bytes);

    return 0;
}
static void dec_destructor(void *arg)
{
    struct sndfile_dec *st = static_cast<sndfile_dec *>(arg);
    fclose(st->file);LOGE("关闭文件");
    list_unlink(&st->af.le);
}

好了拨打一个通话解码的声音就会在/data/data/lilin.com/files/1.pcm 保存了

2.导出pcm 用audacity-win-2.3.0播放下

播放声音是对方的  很ok

3.使用讯飞的语音转写来识别 https://www.xfyun.cn/doc/asr/rtasr/API.html#接口说明

在后台创建一个运用获取appid和key 下载java的demo 例子导入eclipse

导入eclipse 修改项目的编码为utf-8后运行结果如下

 

 

好了声音的识别就可以了 挺简单的

 

接下来你你要吧它加到android项目里就可以了  把编解码的pcm数据通过jni传到java层按照讯飞数据发送要求发送 结果就会输出 你可以把它显示到界面  一个实时通讯翻译就可以了

 

后面我们在到视频的帧上加上人脸识别 表请制作等等特效 

 

更多交流群:261074724

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章