如何将文本到语音输出存储为WAV文件?

Cha*_*har 3 android text-to-speech android-mediaplayer

我使用以下代码将Text to Speech输出存储为我的应用程序中的wav文件.我不确定错误在哪里,你能看一下并建议我吗?

public class MainActivity extends Activity {

Button store, play;
EditText input;
String speakTextTxt;
TextToSpeech mTts;
HashMap<String, String> myHashRender = new HashMap<String, String>();
String tempDestFile ;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    store = (Button) findViewById(R.id.button1);
    play = (Button) findViewById(R.id.button2);
    input = (EditText) findViewById(R.id.editText1);
    store.setOnClickListener(new OnClickListener()  {

        public void onClick(View v) {
            speakTextTxt = "Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world";
            HashMap<String, String> myHashRender = new HashMap<String, String>();
            myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, speakTextTxt);

            String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();

            File appTmpPath = new File(exStoragePath + "/sounds/");
            appTmpPath.mkdirs();

            String tempFilename = "hello.mp3";

            tempDestFile = appTmpPath.getAbsolutePath() + "/" + tempFilename;

            new MySpeech(speakTextTxt);


        }
    });
}

class MySpeech implements OnInitListener
{

            String tts;

    public MySpeech(String tts)
    {
        this.tts = tts;
        mTts = new TextToSpeech(MainActivity.this, this);
    }

    @Override
    public void onInit(int status) 
    {
        Log.v("log", "initi");
        int i = mTts.synthesizeToFile(speakTextTxt, myHashRender, tempDestFile);
        if(i == TextToSpeech.SUCCESS)
        {

          Toast toast = Toast.makeText(MainActivity.this, "Saved "+i,
                Toast.LENGTH_SHORT);
          toast.show();   
        }
        System.out.println("Result : " + i);
    }
  }

 }
Run Code Online (Sandbox Code Playgroud)

Hou*_*ine 9

在这篇文章中提到Ted Hopp的答案:

重要的方法是synthesizeToFile.它会将音频写入您指定的设备上的文件.然后,您可以使用MediaPlayer播放该文件,或者使用adb命令行工具使用命令将其从设备上移到开发系统上

编辑:

尝试此代码,然后检查路径sdcard/是否包含该文件:test.wav

HashMap<String, String> myHashRender = new HashMap();
String textToConvert = "this is a demo for saving a WAV file";
String destinationFileName = "/sdcard/test.wav";
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, textToConvert);
mTts.synthesizeToFile(textToConvert, myHashRender, destinationFileName);
Run Code Online (Sandbox Code Playgroud)

编辑2:

如果您尝试将wave文件保存到内部存储器(而不是/sdcard/文件夹),那么实现此目的的唯一方法是在内部存储器中创建一个全局可写目录,如下所示:

context.getDir("soundfiles", Context.MODE_WORLD_WRITEABLE);
Run Code Online (Sandbox Code Playgroud)

然后写信给这个目录.

编辑3:

在查看代码之后,您只需要创建目录和文件的一些问题:代码应该是这样的:

speakTextTxt = "Hello world";
HashMap<String, String> myHashRender = new HashMap<String, String>();
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, speakTextTxt);

String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
Log.d("MainActivity", "exStoragePath : "+exStoragePath);
File appTmpPath = new File(exStoragePath + "/sounds/");
boolean isDirectoryCreated = appTmpPath.mkdirs();
Log.d("MainActivity", "directory "+appTmpPath+" is created : "+isDirectoryCreated);
String tempFilename = "tmpaudio.wav";
tempDestFile = appTmpPath.getAbsolutePath() + File.separator + tempFilename;
Log.d("MainActivity", "tempDestFile : "+tempDestFile);
new MySpeech(speakTextTxt);
Run Code Online (Sandbox Code Playgroud)

我已经在Android模拟器上测试了它,它工作正常,但你需要使用设备管理器指定模拟器的sdCard的大小,编辑eumlator,并指定你的SD卡的大小:例如512 Mb.然后你会发现在路的wav文件:mnt/sdcard/sounds/tmpaudio.wav 测试它,只需打开DDMS perspective,File Explorer和然后将文件导出到电脑上.