TIMIT语音库下载以及语音库WAV转换相关问题

TIMIT语音库下载以及语音库WAV转换相关问题

综合整理了很多大佬的东西,将自己遇到的一些问题以及解决方法写在下面,如有错误请大家指正。

TIMIT语音库的下载

找了很多方法,600多m的没有下载下来,但找到了一个400多m的,看了下里面内容基本够用,下面是下载链接,目前还可用。
http://academictorrents.com/details/34e2b78745138186976cbc27939b1b34d18bd5b3
总共有400多m。

下载好的语音库中的WAV读取不了?看这里

下好语音库后,有的小伙伴可能会发现,MATLAB读取不了WAV后缀的语音文件,那就需要这位博主的方法了wbglearn。但是经我测试,如果完全copy该博主的代码,似乎MATLAB没有什么反应,后来我发现,只需要将原代码中find_wav.m的elseif strfind(path_files(k).name, ‘.wav’)这一句改成elseif strfind(path_files(k).name, ‘.WAV’)就可以啦。修改后的代码如下,代码属于原作者,我这里只是简单修改。
第一段代码:find_wav.m,这个文件主要讲语音库中所有后缀为WAV的文件遍历一遍。

function [ wav_files ] = find_wav( path )
%FIND_WAV, find all wav file recursively
wav_files = [];
if(isdir(path) == 0)
    return;
end
path_files = dir(path);
fileNum = length(path_files);
for k= 3:fileNum
    file = [path,'\', path_files(k).name];
    if (path_files(k).isdir == 1)
        ret = find_wav(file);
        if(isempty(ret) ~= 1)
            if(isempty(wav_files))
                wav_files = char(ret);
            else
                wav_files = char(wav_files, ret);
            end
        end
    elseif strfind(path_files(k).name, '.WAV')
        if(isempty(wav_files))
            wav_files = char(file);
        else
            wav_files = char(wav_files, file);
        end
    end
end
end

第二段代码:conver_wav.m,这个函数主要用来转换WAV文件

%SPHERE 文件转换为wav文件
clear all;
fs = 16000;
files = find_wav('E:\TIMIT');
for fileIdx = 1:size(files,1)  
    file = files(fileIdx,:);
    fileID = fopen(file);
    
    %判断文件头,防止误操作
    head = fread(fileID, 1024, 'char*1'); 
    headStr = sprintf('%s',head(1:7));
    if(~strcmp(headStr,'NIST_1A'))
        fclose(fileID);
        continue;
    end    
    frewind(fileID);
    
    allData = fread(fileID, inf, 'short');
    fclose(fileID);
    delete(file);
    wavwrite(allData(513:end)./32768, fs, file);    %SPHERE 文件头1024字节    
end

第三段代码:check_wav.m,这个函数主要用来检查所有文件是否已经正确转换完成。

clear all;
files = find_wav('E:\TIMIT');
for fileIdx = 1:size(files,1)
    file = files(fileIdx,:);
    [y, fs, nbits] = wavread(file);%不是wav文件就会报错
    if(fs~=16000)
        fprintf('%s: fs~=16000\n', file);
    end
    if(nbits ~= 16)
        fprintf('%s: nbits ~= 16\n', file);
    end
end

我这边通过上述代码已经完全能够实现,很谢谢原作者提供的代码。

猜你喜欢

转载自blog.csdn.net/xiaoyec1/article/details/106844194