【问题标题】:Transliteration from Hindi to English on Android without using Google API在不使用 Google API 的情况下在 Android 上从印地语音译成英语
【发布时间】:2013-10-30 22:45:19
【问题描述】:

我想通过以下方式将印地语文本音译成英文

印地语 - “आपका स्वागत है

英语 - “aapka swagat hain

我不想使用 Google 的翻译 API 或任何其他翻译 API。如果我使用它们,它最终会给我印地语文本的翻译版本,即“Welcome”。

有没有可以在我的 Android 代码中使用的音译库?

我听说过ICU,但没有找到在我的代码中使用它的过程。

【问题讨论】:

  • 你找到什么了吗?因为我有同样的问题

标签: android localization icu language-translation


【解决方案1】:

解决问题的一种潜在方法是将其分成两部分 可解决的,并与两者结婚。

有些印地语读者可以阅读印地文梵文脚本。

还有听写引擎以英语进行语音转录。

例如当有人在我位于古吉拉特语的 Vonage 电话线上留言时,它会记录音频、生成英文文本并将 wav 文件和文本通过电子邮件发送给我。请注意,阅读短信时有时会非常有趣,因为 Vonage 假设它应该是英文的,我希望短信是英文的,但在阅读短信后我意识到它是古吉拉特语。

Google 'hindi reader for android' 和 'phonetic transcript' 了解更多信息。如果印地语阅读器可以输出可用作转录片段输入的 wav 文件,那么它可能是您的问题的解决方案。

【讨论】:

    【解决方案2】:

    我发现的一个可能且可能简单的解决方案是字符映射。因此,我需要将印地语单词音译为英文字符,与您的情况完全相同,但您也可以使用这种方法处理其他音译。您只需要更改特定语言的 unicode。

    理论:- 因此,将印地语或任何其他语言的字符转换为英文字符(反之亦然),您首先需要了解要转换为英文字符的语言的每个字符的 Unicode 范围。

    例如:要将印地语 Unicode 转换为英语 ASCII 值,Unicode 的范围是 0900-097F,这个范围会随着语言的变化而变化。因此,通过使用此 unicode,您可以映射“特定 unicode(印地语字符)的发音方式”,例如 ह 将映射到英文字母表中的 h。所以,这是理论部分。

    实用方法:我需要创建一个应用程序来获取用户的印地语语音输入并将其转换为英文字母。因此,我使用了 STT(语音转文本)库并获得了印地语 unicode,并从该印地语 unicode 中将其映射为英文字符。

    代码:-

    MainActivity.java

    package android.example.com.conversion;
    
    import android.content.ActivityNotFoundException;
    import android.content.Intent;
    import android.os.Bundle;
    import android.speech.RecognizerIntent;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.AppCompatButton;
    import android.view.View;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        //  Record Button
        AppCompatButton RecordBtn;
    
        //  TextView to show Original and recognized Text
        TextView Original,result;
    
        // Request Code for STT
        private final int SST_REQUEST_CODE = 101;
    
        //  Conversion Table Object...
        ConversionTable conversionTable;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Original = findViewById(R.id.Original_Text);
            RecordBtn = findViewById(R.id.RecordBtn);
            result = findViewById(R.id.Recognized_Text);
    
            RecordBtn.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.RecordBtn:
                    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    
                    //  Use Off line Recognition Engine only...
                    intent.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, false);
    
                    //  Use Hindi Speech Recognition Model...
                    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "hi-IN");
    
                    try {
                        startActivityForResult(intent, SST_REQUEST_CODE);
                    } catch (ActivityNotFoundException a) {
                        Toast.makeText(getApplicationContext(),
                                getString(R.string.error),
                                Toast.LENGTH_SHORT).show();
                    }
    
                    break;
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case SST_REQUEST_CODE:
                    if (resultCode == RESULT_OK && null != data) {
                        ArrayList<String> getResult = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                        Original.setText(getResult.get(0));
                        conversionTable = new ConversionTable();
                        String Transformed_String = conversionTable.transform(getResult.get(0));
                        result.setText(Transformed_String);
                    }
                    break;
            }
        }
    }
    

    我的 ConversationTable.java 类:这会将值映射为英文字母。

    package android.example.com.conversion;
    
    import android.util.Log;
    
    import java.util.ArrayList;
    import java.util.Hashtable;
    
    public class ConversionTable
    {
        private String TAG = "Conversation Table";
    
        private Hashtable<String,String> unicode;
    
        private void populateHashTable()
        {
            unicode = new Hashtable<>();
    
            // unicode
            unicode.put("\u0901","rha"); // anunAsika - cchandra bindu, using ~ to // *
            unicode.put("\u0902","n"); // anusvara
            unicode.put("\u0903","ah"); // visarga
    
            unicode.put("\u0940","ee");
            unicode.put("\u0941","u");
            unicode.put("\u0942","oo");
            unicode.put("\u0943","rhi");
            unicode.put("\u0944","rhee");   //  * = Doubtful Case
            unicode.put("\u0945","e");
            unicode.put("\u0946","e");
            unicode.put("\u0947","e");
            unicode.put("\u0948","ai");
            unicode.put("\u0949","o");
            unicode.put("\u094a","o");
            unicode.put("\u094b","o");
            unicode.put("\u094c","au");
    
            unicode.put("\u094d","");
            unicode.put("\u0950","om");
    
            unicode.put("\u0958","k");
            unicode.put("\u0959","kh");
            unicode.put("\u095a","gh");
            unicode.put("\u095b","z");
            unicode.put("\u095c","dh");    // *
            unicode.put("\u095d","rh");
            unicode.put("\u095e","f");
    
            unicode.put("\u095f","y");
            unicode.put("\u0960","ri");
            unicode.put("\u0961","lri");
            unicode.put("\u0962","lr");       //  *
            unicode.put("\u0963","lree");     //  *
    
            unicode.put("\u093E","aa");
            unicode.put("\u093F","i");
    
            //  Vowels and Consonants...
            unicode.put("\u0905","a");
            unicode.put("\u0906","a");
            unicode.put("\u0907","i");
            unicode.put("\u0908","ee");
            unicode.put("\u0909","u");
            unicode.put("\u090a","oo");
            unicode.put("\u090b","ri");
            unicode.put("\u090c","lri"); // *
            unicode.put("\u090d","e"); // *
            unicode.put("\u090e","e"); // *
            unicode.put("\u090f","e");
            unicode.put("\u0910","ai");
            unicode.put("\u0911","o");
            unicode.put("\u0912","o");
            unicode.put("\u0913","o");
            unicode.put("\u0914","au");
    
            unicode.put("\u0915","k");
            unicode.put("\u0916","kh");
            unicode.put("\u0917","g");
            unicode.put("\u0918","gh");
            unicode.put("\u0919","ng");
            unicode.put("\u091a","ch");
            unicode.put("\u091b","chh");
            unicode.put("\u091c","j");
            unicode.put("\u091d","jh");
            unicode.put("\u091e","ny");
            unicode.put("\u091f","t"); // Ta as in Tom
            unicode.put("\u0920","th");
            unicode.put("\u0921","d"); // Da as in David
            unicode.put("\u0922","dh");
            unicode.put("\u0923","n");
            unicode.put("\u0924","t"); // ta as in tamasha
            unicode.put("\u0925","th"); // tha as in thanks
            unicode.put("\u0926","d"); // da as in darvaaza
            unicode.put("\u0927","dh"); // dha as in dhanusha
            unicode.put("\u0928","n");
            unicode.put("\u0929","nn");
            unicode.put("\u092a","p");
            unicode.put("\u092b","ph");
            unicode.put("\u092c","b");
            unicode.put("\u092d","bh");
            unicode.put("\u092e","m");
            unicode.put("\u092f","y");
            unicode.put("\u0930","r");
            unicode.put("\u0931","rr");
            unicode.put("\u0932","l");
            unicode.put("\u0933","ll"); // the Marathi and Vedic 'L'
            unicode.put("\u0934","lll"); // the Marathi and Vedic 'L'
            unicode.put("\u0935","v");
            unicode.put("\u0936","sh");
            unicode.put("\u0937","ss");
            unicode.put("\u0938","s");
            unicode.put("\u0939","h");
    
            // represent it\
            //  unicode.put("\u093c","'"); // avagraha using "'"
            //  unicode.put("\u093d","'"); // avagraha using "'"
            unicode.put("\u0969","3"); // 3 equals to pluta
            unicode.put("\u014F","Z");// Z equals to upadhamaniya
            unicode.put("\u0CF1","V");// V equals to jihvamuliya....but what character have u settled for jihvamuliya
         /*   unicode.put("\u0950","Ω"); // aum
            unicode.put("\u0958","κ"); // Urdu qaif
            unicode.put("\u0959","Κ"); //Urdu qhe
            unicode.put("\u095A","γ"); // Urdu gain
            unicode.put("\u095B","ζ"); //Urdu zal, ze, zoe
            unicode.put("\u095E","φ"); // Urdu f
            unicode.put("\u095C","δ"); // Hindi 'dh' as in padh
            unicode.put("\u095D","Δ"); // hindi dhh*/
            unicode.put("\u0926\u093C","τ"); // Urdu dwad
            unicode.put("\u0924\u093C","θ"); // Urdu toe
            unicode.put("\u0938\u093C","σ"); // Urdu swad, se
        }
    
        ConversionTable()
        {
            populateHashTable();
        }
    
        public String transform(String s1)
        {
    
            StringBuilder transformed = new StringBuilder();
    
            int strLen = s1.length();
            ArrayList<String> shabda = new ArrayList<>();
            String lastEntry = "";
    
            for (int i = 0; i < strLen; i++)
            {
                char c = s1.charAt(i);
                String varna = String.valueOf(c);
    
                Log.d(TAG, "transform: " + varna + "\n");
    
                String halant = "0x0951";
    
                if (VowelUtil.isConsonant(varna))
                {
                    Log.d(TAG, "transform: " + unicode.get(varna));
                    shabda.add(unicode.get(varna));
                    shabda.add(halant); //halant
                    lastEntry = halant;
                }
    
                else if (VowelUtil.isVowel(varna))
                {
                    Log.d(TAG, "transform: " + "Vowel Detected...");
                    if (halant.equals(lastEntry))
                    {
                        if (varna.equals("a"))
                        {
                            shabda.set(shabda.size() - 1,"");
                        }
                        else
                        {
                            shabda.set(shabda.size() - 1, unicode.get(varna));
                        }
                    }
    
                    else
                    {
                        shabda.add(unicode.get(varna));
                    }
                    lastEntry = unicode.get(varna);
                } // end of else if is-Vowel
    
                else if (unicode.containsKey(varna))
                {
                    shabda.add(unicode.get(varna));
                    lastEntry = unicode.get(varna);
                }
                else
                {
                    shabda.add(varna);
                    lastEntry = varna;
                }
    
            } // end of for
    
            for (String string: shabda)
            {
                transformed.append(string);
            }
    
            //Discard the shabda array
            shabda = null;
            return transformed.toString(); // return transformed;
        }
    
    }
    

    My VowelUtil.class :这将检查元音和辅音,尽管它不是必须检查的。

    package android.example.com.conversion;
    
    public class VowelUtil {
    
        protected static boolean isVowel(String strVowel) {
            // Log.logInfo("came in is_Vowel: Checking whether string is a Vowel");
            return strVowel.equals("a") || strVowel.equals("aa") || strVowel.equals("i") || strVowel.equals("ee") ||
                    strVowel.equals("u") || strVowel.equals("oo") || strVowel.equals("ri") || strVowel.equals("lri") || strVowel.equals("e")
                    || strVowel.equals("ai") || strVowel.equals("o") || strVowel.equals("au") || strVowel.equals("om");
        }
    
        protected static boolean isConsonant(String strConsonant) {
            // Log.logInfo("came in is_consonant: Checking whether string is a
            // consonant");
            return strConsonant.equals("k") || strConsonant.equals("kh") || strConsonant.equals("g")
                    || strConsonant.equals("gh") || strConsonant.equals("ng") || strConsonant.equals("ch") || strConsonant.equals("chh") || strConsonant.equals("j")
                    || strConsonant.equals("jh") || strConsonant.equals("ny") || strConsonant.equals("t") || strConsonant.equals("th") ||
                    strConsonant.equals("d") || strConsonant.equals("dh") || strConsonant.equals("n") || strConsonant.equals("nn") || strConsonant.equals("p") ||
                    strConsonant.equals("ph") || strConsonant.equals("b") || strConsonant.equals("bh") || strConsonant.equals("m") || strConsonant.equals("y") ||
                    strConsonant.equals("r") || strConsonant.equals("rr") || strConsonant.equals("l") || strConsonant.equals("ll") || strConsonant.equals("lll") ||
                    strConsonant.equals("v") || strConsonant.equals("sh") || strConsonant.equals("ss") || strConsonant.equals("s") || strConsonant.equals("h") ||
                    strConsonant.equals("3") || strConsonant.equals("z") || strConsonant.equals("v") || strConsonant.equals("Ω") ||
                    strConsonant.equals("κ") || strConsonant.equals("K") || strConsonant.equals("γ") || strConsonant.equals("ζ") || strConsonant.equals("φ") ||
                    strConsonant.equals("δ") || strConsonant.equals("Δ") || strConsonant.equals("τ") || strConsonant.equals("θ") || strConsonant.equals("σ");
        }
    }
    

    这是您可以进行音译的最简单方法,也是通用方法,您可以将任何语言翻译为任何其他语言的音译。您只需要提供完美的 unicode 以映射到其他语言的 unicode。

    结果:

    【讨论】:

    • 能否请您与我分享“古吉拉特语”语言的链接或代码提前谢谢
    • @fullError,您可以将此jrgraphix.net/r/Unicode/0A80-0AFF 用于古吉拉特语 unicode,并在 ConversationTable 文件中更改英文字符到古吉拉特语的映射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多