disp('正在计算参考模板的参数...')
for i=1:10
fname = sprintf('..\\录音\\%da.wav',i-1);%备注:该部分就是您要录制的语音样本(0-9的数字录音)该例程中用了20个.wav格式的录音:0a.wav,1a.wav....,9a.wav,0b.wav,1b.wav......,9b.wav,分别保存了0到9的发音前10个用于参考训练,后10个作为测试。
x = wavread(frame);
[x1 x2] = vad(x);
m = mfcc(x);
m = m(x1-2:x2-2,:);
ref(i).mfcc = m;
enddisp('正在计算测试模板的参数...')
for i=1:10
fname = sprintf('..\\录音\\%db.wav',i-1);
x = wavread(frame);
[x1 x2] = vad(x);
m = mfcc(x);
m = m(x1-2:x2-2,:);
test(i).mfcc = m;
enddisp('正在进行模板匹配...')
dist = zeros(10,10);
for i=1:10
for j=1:10
dist(i,j) = dtw(test(i).mfcc, ref(j).mfcc);
end
enddisp('正在计算匹配结果...')
for i=1:10
[d,j] = min(dist(i,:));
fprintf('测试模板 %d 的识别结果为:%d\n', i, j);
end错误显示为??? Error using ==> wavread at 67
Cannot open file.
当我把fname = sprintf('..\\录音\\%da.wav',i-1);注释掉,下一句改为x = wavread('0a.wav');就可以识别0这个数字,可是我想识别0-9这十个数字,要怎么改呢
求指教啊!!!

解决方案 »

  1.   

    仔细看一下 fname = sprintf("..\\录音\\%da.wav",i-1);
      

  2.   

    应该是
    char fname[128] = { 0 };
    sprintf(fname,"..\\录音\\%da.wav",i-1);
      

  3.   

    既然wavread('0a.wav');成功, 你把0a.wav改名, 包含中文字符, 看还能不能打开, 如果失败, 则断定是不支持中文字符的。 wavread这个函数有没有帮助文档, 其中对于字符串的编码有什么要求吗?
      

  4.   


    可以的,我刚刚试了一下,将0a.wav改为包含中文字符的,还是可以识别一个数字
      

  5.   

    我理解你的意思,看文档的时候也是说sprintf函数有三个参数,可是,
    改完以后老是出现??? Undefined function or variable 'fname'.,但char fname[128]这样不是定义过吗
      

  6.   


    还是不行,出现的是同样的问题??? Undefined function or variable 'fname'.
      

  7.   

    fname定义的作用域的问题, 你要把char fname[128]定义到循环的外面
      

  8.   


    是这样子吗?
    char fname[128] = {0};
    disp('正在计算参考模板的参数...')
    for i=1:10
        %fname = sprintf('..\\录音\\%da.wav',i-1);
        %char fname[128] = {0};
        sprintf(fname,'..\\luyin\\%da.wav',i-1);
    x = wavread(fname);
    [x1 x2] = vad(x);
    m = mfcc(x);
    我将定义放在循环外面,运行以后还是出现这个
    正在计算参考模板的参数...
    ??? Undefined function or variable 'fname'.
    这是好纠结啊!!
    麻烦大家了
      

  9.   

    看了半天没太看明白,但是lz函数调用里都用单引号而不用双引号赋值字串,居然也能成功?是我out?
      

  10.   

    不清楚你的具体情况,但我自己写赋值语句是这样的格式:
    fname = sprintf("..\\录音\\%da.wav",i-1);
    而你的是:
    fname = sprintf('..\\录音\\%da.wav',i-1);
    考到你源文件里看区别
      

  11.   


    我试过将单引号改为双引号,可是运行后报错如下
    fname = sprintf("..\\录音\\%da.wav",i-1);                     |
    Error: The input character is not valid in MATLAB statements or expressions.
      

  12.   

    大家被你搞糊涂了。
    sprintf(fname , "..\\录音\\%da.wav",i-1); 
    int sprintf( char *buffer, const char *format [, argument] ... );
      

  13.   

    Org,唉,是我错了,没仔细看清楚你的源代码,你还是转回单引号吧。你原来的写法应该没错
    不过楼主你是不是也没看清问问题的场所,这是VC板块,你却问MATLAB的问题。
      

  14.   


    那应该是我弄错场所了吧,不好意思啊!我是之前goole的时候看到有人在上面问matlab的问题,我就直接在这里问了
      

  15.   

    唉,对MATLAB不熟,不过从程序结构看有个疑问你看一下(感觉你也不熟似的)。第一:
    fname = sprintf('..\\录音\\%db.wav',i-1);
    这句赋值语句格式上是没什么问题,但你要知道其意义,
    不知道你真实程序中是否写具体了,比如你所有录音文件都存储在C:\\mydir\\录音\\        之下,
    那么就要写成fname = sprintf('C:\\mydir\\录音\\%db.wav',i-1);第二:从程序看,你的fname这个赋值变量从来就没被调用过。结合你的原代码,是否是
    其后面的语句参量调用错误造成的错误提示,即:
    x = wavread(frame);这句中的frame就是fname,你抄写错误了。
      

  16.   


    这一句的含义应该是将0-9这十个语音格式转换,然后放到fname中,我觉得
    那应该是我抄写错误了,谢谢提醒啊,可能一直改最后都混乱了
    将路径改为绝对路径以后就可以运行没有错误了
    谢谢大家不厌其烦的帮我纠错啊,无比感激