将Base64字符串转换为.wav文件

3

我有一个webservice,返回一个音频(.wav)文件的base64编码字符串。我尝试了以下代码:

 private String base64StringToFile(String base64AudioData) {

        String fullPath = null;

        byte[] decoded = Base64.decode(base64AudioData,1);
        //byte[] decoded = Base64.decode(encoded, 0);
        Log.e("~~~~~~~~ Decoded: ", Arrays.toString(decoded));

        try {
            fullPath = FileManger.getttsSavePath()+"/"+("fTts.wav");
            File file2 = new File(fullPath);
            //File file2 = new File(Environment.getExternalStorageDirectory() + "/hello-5.wav");
            FileOutputStream os = new FileOutputStream(file2, true);
            os.write(decoded);
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fullPath;
    }

这段代码创建了一个文件,但是该文件无法正常工作。如果我将 wav 文件转换为 base64 然后使用此代码,则可以正常工作。但它在我从 api 响应中获取的字符串上无法正常工作。这个字符串没有问题,因为相同的字符串在 iOS 版本中可以正常工作。所以请有经验的人帮助我解决这个问题。这是我从 Web 服务响应中获取的字符串:

PGh0bWw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIvPgo8dGl0bGU+RXJyb3IgNDA2IHgtbnVhbmNlLXNlc3Npb25pZDE4ZWM1ZTQ3LTE4OGEtNGEyMS1hNWVjLWM3YjBjMWNlNjYyOApSZWNlaXZlZCBRdWVyeUVycm9yOiA1MTEgVm9pY2Ugbm90IGF2YWlsYWJsZS4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgdm9pY2VzLCBwbGVhc2Ugc2VlIHRoZSBEcmFnb24gTW9iaWxlIFNESyB3ZWJzaXRlLjwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+PGgyPkhUVFAgRVJST1IgNDA2PC9oMj4KPHA+UHJvYmxlbSBhY2Nlc3NpbmcgL05NRFBUVFNDbWRTZXJ2bGV0L3R0cy4gUmVhc29uOgo8cHJlPiAgICB4LW51YW5jZS1zZXNzaW9uaWQxOGVjNWU0Ny0xODhhLTRhMjEtYTVlYy1jN2IwYzFjZTY2MjgKUmVjZWl2ZWQgUXVlcnlFcnJvcjogNTExIFZvaWNlIG5vdCBhdmFpbGFibGUuIEZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIHZvaWNlcywgcGxlYXNlIHNlZSB0aGUgRHJhZ29uIE1vYmlsZSBTREsgd2Vic2l0ZS48L3ByZT48L3A+CjwvYm9keT4KPC9odG1sPgo=

2个回答

1
解码您的响应数据,我们可以看到它实际上是一个错误消息:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Error 406 x-nuance-sessionid18ec5e47-188a-4a21-a5ec-c7b0c1ce6628
Received QueryError: 511 Voice not available. For a list of available voices, please see the Dragon Mobile SDK website.</title>
</head>
<body><h2>HTTP ERROR 406</h2>
<p>Problem accessing /NMDPTTSCmdServlet/tts. Reason:
<pre>    x-nuance-sessionid18ec5e47-188a-4a21-a5ec-c7b0c1ce6628
Received QueryError: 511 Voice not available. For a list of available voices, please see the Dragon Mobile SDK website.</pre></p>
</body>
</html>
所以您的问题不是写入.wav文件,而是与服务器通信(或服务器本身出现问题)。

我的IOS同事说这是一个NS数据,你知道它的意思吗?我可能错了,它可能不是base64。你能告诉我如何将其作为音频播放吗?请帮帮我。 - Nitish
我保证这个base64字符串在你的iOS应用程序中不起作用。你拥有的数据字符串是服务器的错误响应--它不是有效的WAV数据。 "NSData"只是iOS中的一个字节缓冲区类,但它与你的问题无关。是的,输入的字符串是*一个有效的base64字符串--它只是不包含你认为它包含的数据。 - Snild Dolkow
说实话,让我尽可能清楚地表达:你的问题不在你发布的代码中base64AudioData输入参数包含来自服务器的错误消息,而不是任何.WAV数据。 - Snild Dolkow
好的,现在我确认这是base64数据,我的ISO同事将其转换为NS数据并播放了,但在Android上我该如何播放它,请帮助我。 - Nitish
您的数据不正确。您的同事有不同的数据。 - Snild Dolkow
感谢您的贡献,我的问题已经解决了。您是正确的,我的字符串有问题,现在我从服务器得到了正确的响应。非常感谢,Snild。 - Nitish

0
尝试一下这个,这是将 base64 转换为 .wav 和相反的示例。
File file = new File(Environment.getExternalStorageDirectory() + "/hello-4.wav");
byte[] bytes = FileUtils.readFileToByteArray(file);

String encoded = Base64.encodeToString(bytes, 0);                                       
Utilities.log("~~~~~~~~ Encoded: ", encoded);

byte[] decoded = Base64.decode(encoded, 0);
Utilities.log("~~~~~~~~ Decoded: ", Arrays.toString(decoded));

try
{
    File file2 = new File(Environment.getExternalStorageDirectory() + "/hello-5.wav");
    FileOutputStream os = new FileOutputStream(file2, true);
    os.write(decoded);
    os.close();
}
catch (Exception e)
{
    e.printStackTrace();
}

非常感谢您的回复Joy。我已经在使用这段代码了,请查看我在问题中提出的代码,我只是修改了您发布的代码。 - Nitish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接