Baidu-AIP / speech-vad-demo

集成Webrtc的VAD,用于切分音频文件

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

怎么样可以将pcm中的所有音频都自动切割好?

Bonnerz opened this issue · comments

你好,请问一下,如何把pcm文件夹中的所有音频都按照10s左右的时长切割好?运行后只是把16k_1的pcm程序切割完毕了

把common.h中的FILE_CUT_MAX_MS (10*1000)就是10秒我记得,因为在src/main.c中把16k_1.pcm写死了,改filename这个变量就好了。

把common.h中的FILE_CUT_MAX_MS (10*1000)就是10秒我记得,因为在src/main.c中把16k_1.pcm写死了,改filename这个变量就好了。

对的,我后来也看到了,但是想批量读取文件夹中的pcm文件,你知道怎么修改吗?

把common.h中的FILE_CUT_MAX_MS (10*1000)就是10秒我记得,因为在src/main.c中把16k_1.pcm写死了,改filename这个变量就好了。

对的,我后来也看到了,但是想批量读取文件夹中的pcm文件,你知道怎么修改吗?

我在邮件给您回复了

把common.h中的FILE_CUT_MAX_MS (10*1000)就是10秒我记得,因为在src/main.c中把16k_1.pcm写死了,改filename这个变量就好了。

对的,我后来也看到了,但是想批量读取文件夹中的pcm文件,你知道怎么修改吗?

我在邮件给您回复了

嗯嗯,收到了

在src的main.c文件中改成下面的程序即可:

    DIR *dirp; 
    struct dirent *dp;
    dirp = opendir("pcm"); //打开目录指针
    int res = 0;
    while ((dp = readdir(dirp)) != NULL) { //通过目录指针读目录

        if(strstr(dp->d_name,".pcm"))
        {
            char filename[100] = "pcm/";
	    
            strcat(filename,dp->d_name);
	    printf("%s\n", filename);  
        
	//const char filename[] = "pcm/16k_1.pcm"; // 读取的文件
 
	    //const char output_filename_prefix[] = dp->d_name; // 保存的文件名

            char output_filename_prefix[20] = "";
            strcat(output_filename_prefix,dp->d_name);



	    const char output_dir[] = "output_pcm"; // 保存的目录
	    FILE *fp = fopen(filename, "rb");
	    if (fp == NULL) {
		fprintf(stderr, "%s does not exist\n", filename);
		return 3;
	    }
	    simple_vad *vad = simple_vad_create();
	    if (vad == NULL) {
		return 4;
	    }
	    FILE *fp2 = fopen(filename, "rb");
	    struct cut_info *cut = cut_info_create(fp2);
	    snprintf(cut->output_filename_prefix, sizeof(cut->output_filename_prefix), "%s",
		     output_filename_prefix);
	    snprintf(cut->output_file_dir, sizeof(cut->output_file_dir), "%s",
		     output_dir);
	    res = run(fp, vad, cut);

	    fclose(fp);
	    fclose(fp2);
	    simple_vad_free(vad);
	    cut_info_free(cut);
	    //printf("PROGRAM FINISH\n");
     
       } 
    }
    (void) closedir(dirp); //关闭目录
    printf("PROGRAM FINISH\n");
    return res;

然后如果是要对切割好的音频语音识别按顺序保存的话,可以在src文件夹中的file_cut.c中修改这一部分:

snprintf(cut->result_filename,sizeof(cut->result_filename), "%s/%s_%08ld-%08ld_%s.pcm",cut->output_file_dir,cut->output_filename_prefix, CAL_FRAME_BY_FRAME(cut->cut_begin_frame),CAL_FRAME_BY_FRAME(last_frame) - 1, cut->is_contain_active ? "A" : "I");

在src的main.c文件中改成下面的程序即可:

    DIR *dirp; 
    struct dirent *dp;
    dirp = opendir("pcm"); //打开目录指针
    int res = 0;
    while ((dp = readdir(dirp)) != NULL) { //通过目录指针读目录

        if(strstr(dp->d_name,".pcm"))
        {
            char filename[100] = "pcm/";
	    
            strcat(filename,dp->d_name);
	    printf("%s\n", filename);  
        
	//const char filename[] = "pcm/16k_1.pcm"; // 读取的文件
 
	    //const char output_filename_prefix[] = dp->d_name; // 保存的文件名

            char output_filename_prefix[20] = "";
            strcat(output_filename_prefix,dp->d_name);



	    const char output_dir[] = "output_pcm"; // 保存的目录
	    FILE *fp = fopen(filename, "rb");
	    if (fp == NULL) {
		fprintf(stderr, "%s does not exist\n", filename);
		return 3;
	    }
	    simple_vad *vad = simple_vad_create();
	    if (vad == NULL) {
		return 4;
	    }
	    FILE *fp2 = fopen(filename, "rb");
	    struct cut_info *cut = cut_info_create(fp2);
	    snprintf(cut->output_filename_prefix, sizeof(cut->output_filename_prefix), "%s",
		     output_filename_prefix);
	    snprintf(cut->output_file_dir, sizeof(cut->output_file_dir), "%s",
		     output_dir);
	    res = run(fp, vad, cut);

	    fclose(fp);
	    fclose(fp2);
	    simple_vad_free(vad);
	    cut_info_free(cut);
	    //printf("PROGRAM FINISH\n");
     
       } 
    }
    (void) closedir(dirp); //关闭目录
    printf("PROGRAM FINISH\n");
    return res;

然后如果是要对切割好的音频语音识别按顺序保存的话,可以在src文件夹中的file_cut.c中修改这一部分:

snprintf(cut->result_filename,sizeof(cut->result_filename), "%s/%s_%08ld-%08ld_%s.pcm",cut->output_file_dir,cut->output_filename_prefix, CAL_FRAME_BY_FRAME(cut->cut_begin_frame),CAL_FRAME_BY_FRAME(last_frame) - 1, cut->is_contain_active ? "A" : "I");

请问能不能给我修改后的完整代码