Android tts synthesizeToFile不起作用

时间:2014-04-25 17:36:11

标签: android file-io text-to-speech

我试图将语音保存到wav输出文件。没有任何作用。它返回-1。 我试图检查存储是否可写:

    public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

它返回True。

我尝试使用MODE_WORLD_WRITEABLE预设创建目录,然后向它发誓.-无法正常工作

我试图在清单中给出WRITEABLE预设 - 没有工作

<uses-permission
 android:name="android.permission.WRITE_EXTERNAL_STORAGE"
 android:maxSdkVersion="18" />

请帮帮我 我该怎么办? 非常感谢

P.s Play方法有效

3 个答案:

答案 0 :(得分:0)

TextToSpeech.synthesizeToFile返回的int是什么?

您确定Environment.getExternalStorageDirectory给出的路径吗?您可以尝试通过/storage/sdcard0/myTts.wav之类的方式手动设置路径,并使用文件管理器应用程序搜索该文件。由于android保存文件到外部SD卡的奇怪行为,我在手机上找到合成文件时也遇到了麻烦。

我使用Tts遇到的另一个问题是对最多4000个字符的字符串的限制。但只要您的.speak方法正常运行,这应该不是问题。

答案 1 :(得分:0)

1)首先创建路径

boolean file = new File("give your path here").mkdirs();

2)您的文件名

String destination_file_name = {"gave your path"}+"Your_file_name";

3)让String Converting_Sting作为您要转换的字符串

String Converting_Sting;

4)让文本到语音引擎的最大容量

TextToSpeech tts;

int max_capacity_tts = tts.getMaxSpeechInputLength();

5)如果您转换的字符串长度大于最大容量,则必须减小长度

    if(Converting_Sting.length()>max_capacity_tts())
      {
       Converting_Sting.substring(0,max_capacity_tts);
      }

4)然后,您可以将精简的字符串放在tts引擎中

 HashMap<String, String> params = new HashMap();
                    params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, parsedText);
                    tts.synthesizeToFile(Converting_Sting,params,destinationFileName+".wav");

不要欺骗清单上的写权限

祝你好运

答案 2 :(得分:0)

当您使用 targetsdkversion 29 synthesizeToFile 方法,但是当您具有

(-1)错误时,< strong> targetsdkversion 小于或等于 28 ,效果很好,请检查最新更新

   private void makeRingtoneFilename(String texttoconvertIntoAudiFile) {

    File saveFilePath = null;
    try {
        String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/media/audio/ringtones/";
        File root = new File(rootPath);
        if (!root.exists()) {
            root.mkdirs();
        }
        saveFilePath = new File(rootPath + "niceSong.m4a");
        if (saveFilePath.exists()) {
            saveFilePath.delete();
        }
        saveFilePath.createNewFile();

        FileOutputStream out = new FileOutputStream(saveFilePath);

        out.flush();
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }



    int i1;
    if (Build.VERSION.SDK_INT >= 21) {
        //texttoconvertIntoAudiFile is the text you want to convrt into mp3
        i1 = textToSpeech.synthesizeToFile( texttoconvertIntoAudiFile, null,saveFilePath, null );
    } else {
        i1 = textToSpeech.synthesizeToFile( texttoconvertIntoAudiFile, null, String.valueOf( saveFilePath.getAbsoluteFile() ) );
    }
    Log.e( "i1", i1 + "" );


    String outPath=saveFilePath.getAbsolutePath();
    String mimeType;
    if (outPath.endsWith(".m4a")) {
        mimeType = "audio/mp4a-latm";
    } else if (outPath.endsWith(".wav")) {
        mimeType = "audio/wav";
    } else {
        // This should never happen.
        mimeType = "audio/mpeg";
    }

    String artist = "hum h yum";
    ContentValues values = new ContentValues();
    values.put( MediaStore.MediaColumns.DATA, outPath);
    values.put( MediaStore.MediaColumns.TITLE, "niceSong.m4a");
    values.put( MediaStore.MediaColumns.MIME_TYPE, mimeType);
    values.put( MediaStore.Audio.Media.ARTIST, artist);
    values.put( MediaStore.Audio.Media.IS_RINGTONE,FILE_KIND_RINGTONE);
    // Insert it into the database
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(outPath);
    final Uri newUri = getContentResolver().insert(uri, values);
    setResult(RESULT_OK, new Intent().setData(newUri));
}