Java 将文本与语音匹配为文本阿拉伯语

Java 将文本与语音匹配为文本阿拉伯语,java,arrays,string-matching,speech-to-text,jaro-winkler,Java,Arrays,String Matching,Speech To Text,Jaro Winkler,我向文本应用程序发表了演讲。语音文本的结果将与数组中的现有文本进行比较。带字符串算法的macthing Jaro-Winkler距离 我一直在用数组中的文本计算手动输入的所有文本,结果是1.0。但当应用程序运行时,根据比较的结果是不计算的 此文本数组包含以下数据: int [] soal={R.raw.alikhlas,R.raw.alfalaq,R.raw.alkafirun}; String [] jawaban={"لم يلدولم يولد","ومن شرغاسق اذاوقب","

我向文本应用程序发表了演讲。语音文本的结果将与数组中的现有文本进行比较。带字符串算法的macthing Jaro-Winkler距离 我一直在用数组中的文本计算手动输入的所有文本,结果是1.0。但当应用程序运行时,根据比较的结果是不计算的

此文本数组包含以下数据:

int [] soal={R.raw.alikhlas,R.raw.alfalaq,R.raw.alkafirun};
String [] jawaban={"لم يلدولم يولد","ومن شرغاسق اذاوقب","ولاانتم عبدون مااعبد"};
数组的获取和语音到文本的输入

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {

                ArrayList<String> result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
         String hasil = result.get(0);
                JaroWinkler jw = new JaroWinkler();
            String angka = String.valueOf(jw.similarity(hasil,jawaban[0]));

             txtSpeechInput.setText(result.get(0) + "\n"+angka);

            }
activityresult上受保护的void(int-requestCode、int-resultCode、Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
开关(请求代码){
案例请求代码语音输入:{
if(resultCode==RESULT\u OK&&null!=数据){
ArrayList结果=数据
.getStringArrayListExtra(识别器意图.额外结果);
字符串hasil=result.get(0);
JaroWinkler jw=新的JaroWinkler();
String angka=String.valueOf(jw.similarity(hasil,jawaban[0]);
txtSpeechInput.setText(result.get(0)+“\n”+angka);
}
该算法基于Jaro-Winkler距离

public final double similarity(final String s1, final String s2) {
    if (s1 == null) {
        throw new NullPointerException("s1 must not be null");
    }

    if (s2 == null) {
        throw new NullPointerException("s2 must not be null");
    }

    if (s1.equals(s2)) {
        return 1;
    }

    int[] mtp = matches(s1, s2);
    float m = mtp[0];
    if (m == 0) {
        return 0f;
    }
    double j = ((m /  s1.length() + m / s2.length() + (m - mtp[1]) / m))
            / THREE;

    AppLog.logString("Nilai m = " +m);
    AppLog.logString("Nilai s1 = " +s1.length());
    AppLog.logString("Nilai s2 = " +s2.length());
    AppLog.logString("Nilai mtp = " +mtp[1]);
    AppLog.logString("Nilai J = " +j);

    double jw = j;

    if (j > getThreshold()) {
        jw = j + Math.min(JW_COEF, 1.0 / mtp[THREE]) * mtp[2] * (1 - j);

        AppLog.logString("Nilai mtp = " +mtp[THREE]);
        AppLog.logString("Nilai mtp2 = " +mtp[2]);
        AppLog.logString("Nilai Jw = " +jw);
    }
    return jw;
}
public final double distance(final String s1, final String s2) {
    return 1.0 - similarity(s1, s2);
}

private int[] matches(final String s1, final String s2) {
    String max, min;
    if (s1.length() > s2.length()) {
        max = s1;
        min = s2;
    } else {
        max = s2;
        min = s1;
    }
    int range = Math.max(max.length() / 2 - 1, 0);

    int[] matchIndexes = new int[min.length()];
    Arrays.fill(matchIndexes, -1);
    boolean[] matchFlags = new boolean[max.length()];
    int matches = 0;
    for (int mi = 0; mi < min.length(); mi++) {
        char c1 = min.charAt(mi); //ntuk mengambil karakter pada sebuah String sesuai index
        for (int xi = Math.max(mi - range, 0),
             xn = Math.min(mi + range + 1, max.length()); xi < xn; xi++) {
            if (!matchFlags[xi] && c1 == max.charAt(xi)) {
                matchIndexes[mi] = xi;
                matchFlags[xi] = true;
                matches++;
                break;
            }
        }
    }
    char[] ms1 = new char[matches];
    char[] ms2 = new char[matches];
    for (int i = 0, si = 0; i < min.length(); i++) {
        if (matchIndexes[i] != -1) {
            ms1[si] = min.charAt(i);
            si++;
        }
    }
    for (int i = 0, si = 0; i < max.length(); i++) {
        if (matchFlags[i]) {
            ms2[si] = max.charAt(i);
            si++;
        }
    }
    int transpositions = 0;
    for (int mi = 0; mi < ms1.length; mi++) {
        if (ms1[mi] != ms2[mi]) {
            transpositions++;
        }
    }
    int prefix = 0;
    for (int mi = 0; mi < min.length(); mi++) {
        if (s1.charAt(mi) == s2.charAt(mi)) {
            prefix++;
        } else {
            break;
        }
    }
    return new int[]{matches, transpositions / 2, prefix, max.length()};
}
公共最终双重相似性(最终字符串s1,最终字符串s2){
如果(s1==null){
抛出新的NullPointerException(“s1不能为null”);
}
if(s2==null){
抛出新的NullPointerException(“s2不能为null”);
}
如果(s1等于(s2)){
返回1;
}
int[]mtp=匹配项(s1,s2);
浮动m=mtp[0];
如果(m==0){
返回0f;
}
双j=((m/s1.length()+m/s2.length()+(m-mtp[1])/m))
/三,;
AppLog.logString(“Nilai m=“+m”);
AppLog.logString(“Nilai s1=“+s1.length());
AppLog.logString(“Nilai s2=“+s2.length());
AppLog.logString(“Nilai mtp=“+mtp[1]);
AppLog.logString(“Nilai J=“+J”);
双jw=j;
如果(j>getThreshold()){
jw=j+Math.min(jw_COEF,1.0/mtp[3])*mtp[2]*(1-j);
AppLog.logString(“Nilai mtp=“+mtp[THREE]);
AppLog.logString(“Nilai mtp2=“+mtp[2]);
AppLog.logString(“Nilai Jw=“+Jw”);
}
返回jw;
}
公共最终双距离(最终串s1、最终串s2){
返回1.0-相似性(s1,s2);
}
私有int[]匹配(最终字符串s1,最终字符串s2){
字符串最大值,最小值;
如果(s1.length()>s2.length()){
max=s1;
min=s2;
}否则{
max=s2;
min=s1;
}
int range=Math.max(max.length()/2-1,0);
int[]matchIndexes=新int[min.length()];
fill(matchindex,-1);
布尔[]匹配标志=新布尔值[最大长度()];
int匹配=0;
对于(int mi=0;mi