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

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