3

次のコードを使用して、アプリケーションにwavファイルText to Speechとして出力を保存しています。エラーがどこにあるのかわからないので、それを調べて提案してもらえますか?

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);
    }
  }

 }
4

2 に答える 2

10

この投稿の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);

編集2:

また、wave ファイルを内部メモリ (/sdcard/フォルダではなく) に保存しようとしている場合、これを達成する唯一の方法は、次のように内部メモリに誰でも書き込み可能なディレクトリを作成することです。

context.getDir("soundfiles", Context.MODE_WORLD_WRITEABLE);

そして、このディレクトリに書き込みます。

編集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);

Androidエミュレーターでテストしましたが、正常に動作しますが、デバイスマネージャーを使用してエミュレーターのsdCardのサイズを指定し、eulatorを編集して、sdcardのサイズを指定する必要があります:例: 512 Mb. wav ファイルがパスにあります。mnt/sdcard/sounds/tmpaudio.wav それをテストするには、..ファイルを開いてDDMS perspectiveFile Explorerファイルを PC にエクスポートします。

于 2013-02-04T09:35:52.943 に答える
2

使用できますsynthesizeToFile()

アンドロイドから

HashMap<String, String> myHashRender = new HashMap();
String wakeUpText = "Are you up yet?";
String destFileName = "/sdcard/myAppCache/wakeUp.wav";
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText);
mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);

合成の完了が通知されたら、他のオーディオ リソースと同じように出力ファイルを再生できます。android.media.MediaPlayer.

そしてこのためにあなたはそれを使うことができます

mMediaPlayer = new MediaPlayer();
mMediaPlayer = MediaPlayer.create(this,R.raw.button);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {                   
    @Override
    public void onCompletion(MediaPlayer mp) {
        mMediaPlayer.stop();
    }
});

これで完了です

于 2013-02-04T06:01:58.097 に答える