在android

时间:2017-08-20 21:08:24

标签: android audio ibm-cloud text-to-speech wav

Prolouge

我有一个使用IBM Bluemix Watson Text to Speech创建的.wav文件,我使用一个带有该文件特定密钥的servlet通过互联网发送它。
我还有一个使用

创建的媒体播放器
MediaPlayer player = new MediaPlayer();

问题

我使用它来播放从服务器下载的曲目。
起初我将它下载到我的内部存储器,但后来意识到它导致了一个问题,因为播放器由于访问限制而无法访问该文件(该文件因媒体播放器无法读取,因为它需要文件是世界可读的。) 无论玩家做什么都无法工作,总是写作:

08-20 22:57:51.092 20507-20973/com.bikebeacon E/MediaPlayer-JNI: QCMediaPlayer mediaplayer NOT present
08-20 22:57:51.321 20507-20523/com.bikebeacon E/MediaPlayer: error (1, -2147483648)

或者

08-20 22:57:51.321 20507-20523/com.bikebeacon E/MediaPlayer: error (38,0)
08-20 22:57:51.321 20507-20523/com.bikebeacon E/MediaPlayer: error (-38,0)

现在我的应用程序首先检查是否有可用的外部存储器,如果有,则将从Internet下载的文件保存到外部存储器中的文件(我检查过,文件确实存在,但我可以'因某种原因在我的手机中播放。) 实现方式如下:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
    AudioAttributes attr = new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_SPEECH).build();
    mediaPlayer.setAudioAttributes(attr);
} else 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(new FileInputStream(trackFile).getFD());
mediaPlayer.prepare();
mediaPlayer.start();
response.close();

请注意mediaPlayer = new MediaPlayer();

如果没有外部存储,应用会尝试从服务器流式传输应用,实现方式如下:

 MediaPlayer mediaPlayer = new MediaPlayer();
                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                        AudioAttributes attr = new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_SPEECH).build();
                        mediaPlayer.setAudioAttributes(attr);
                    } else
                        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.setDataSource(NetworkDispatcher.URL_TYPES.FILE.toString());
                    mediaPlayer.prepare();
                    mediaPlayer.start();

在查看并浏览整个日志之后,我看到很多尝试FFMPEG试图弄清楚****是什么文件,最后它吐了出来:

D/FFmpegExtractor: ffmpeg detected media content as 'audio/x-wav' with confidence 0.08
......
E/GenericSource: Failed to init from data source!

我不知道该做什么或如何修复它,我发生的事情的范围从腐败的WAV文件到特定的手机问题。

到目前为止我所知道的:

  • " QCMediaPlayer媒体播放器不存在"是在根设备上发生的问题,或者特别是在OnePlus设备上发生的问题(倾向于前者)。

  • 问题"错误(1,-2147483648)"在这个线程中给出了一个解决方案(Android MediaPlayer throwing "Prepare failed.: status=0x1" on 2.1, works on 2.2),但是,他们给出的答案是路径不正确(路径正确,三重检查),缺少权限(在清单和运行时请求互联网和read \ write external)存储),或者它是不兼容的媒体类型,这可能是原因。


我的实际理论: 我发现一篇帖子说IBM提供的格式(用于Text To Speech服务的合成方法)在android中无法播放(如下所示:https://developer.ibm.com/answers/questions/180732/seems-watson-text-to-speech-service-returns-a-wav.html)。我看过很多关于这个不适用于人们的帖子(媒体播放器本身),而且没有一个(甚至不是Why MediaPlayer throws NOT present error when creating instance of it?有一个奇怪的模糊答案)实际上回答了手头的问题。

我该怎么办? 我完全不知道。我唯一的想法是编辑wav文件的标题(或wav文件的数据),以增强FFMPEG的可信度,使其可以作为wav文件播放。
另一方面,我可能完全错了,在这种情况下,如果有人能够纠正我的实际问题,我会很高兴。

2 个答案:

答案 0 :(得分:0)

尝试使用此库: https://github.com/brianwernick/ExoMedia 这个库包装了exoplayer,易于用于音频和视频播放。

答案 1 :(得分:0)

为什么要使用MediaPlayer播放IBM文本到语音?

为什么不使用他们简单的命令?

类似的东西:

TextToSpeech.sharedInstance().initWithContext(this.getHost(TTS_URL));

您还可以在以下位置找到更多信息: https://github.com/watson-developer-cloud/speech-android-sdk