前面分别实现了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层按照讯飞数据发送要求发送 结果就会输出 你可以把它显示到界面 一个实时通讯翻译就可以了
后面我们在到视频的帧上加上人脸识别 表请制作等等特效