百度语音合成API调用
背景
将文本内容合成语音,通过网页扬声器播放出来。
方法
使用Baidu的SDK
添加依赖
<dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>${version}</version>
</dependency>
注意点:
添加SDK工具包aip-java-sdk-version.jar和第三方依赖工具包json-20160810.jar log4j-1.2.17.jar
详细代码:
public static void synthesizeAndSaveQuestions(List<String> questions) throws IOException {// 设置请求参数HashMap<String, Object> options = new HashMap<>();options.put("spd", 5); // 语速,取值0 - 9,默认为5中语速options.put("pit", 5); // 音调,取值0 - 9,默认为5中语调options.put("vol", 9); // 音量,取值0 - 9,默认为5中音量options.put("per", 0); // 发音人选择, 0为度小美,1为度小宇,3为度逍遥,4为度丫丫,默认为度小美String basePath = "D:";for (int i = 0; i < questions.size(); i++) {String question = questions.get(i);String sanitizedQuestion = question.replaceAll("[\\/*?:\"<>|]", "_");String relativePath = "/upload/questionAudio/question_" + (i + 1) + "_" + sanitizedQuestion + ".mp3";String fullPath = basePath + relativePath;TtsResponse res = client.synthesis(question, "zh", 1, options);byte[] data = res.getData();org.json.JSONObject res1 = res.getResult();if (data != null) {File file = new File(fullPath);File parentDir = file.getParentFile();if (!parentDir.exists()) {if (!parentDir.mkdirs()) {throw new IOException("无法创建目录: " + parentDir.getAbsolutePath());}}try (FileOutputStream fos = new FileOutputStream(file)) {fos.write(data);} catch (IOException e) {throw new IOException("音频文件写入失败", e);}}if (res1 != null) {System.out.println(res1.toString(2));}}}public static String recognizeAudioFilesInDirectory(String directoryPath) {StringBuilder combinedResult = new StringBuilder();File audioDir = new File(directoryPath);for (File partFile : audioDir.listFiles()) {if (partFile.isFile() && partFile.getName().endsWith(".wav")) {try {byte[] audioData = Files.readAllBytes(partFile.toPath());org.json.JSONObject res = client.asr(audioData, "wav", 8000, null);if (res.has("result")) {combinedResult.append(res.getJSONArray("result").getString(0));} else {System.out.println("文件 " + partFile.getName() + " 识别失败,错误信息: " + res);}} catch (IOException e) {e.printStackTrace();}}}return combinedResult.toString();}public static String splitAndRecognizeAudio(File audioFile) {System.out.println("audioFile.getAbsolutePath(): " + audioFile.getAbsolutePath());File longAudioFile = audioFile;// 检查文件是否存在if (!longAudioFile.exists()) {System.err.println("文件不存在: " + longAudioFile.getAbsolutePath());return "";}int segmentLength = 60;AudioSplitter.splitAudioFile(longAudioFile, segmentLength);System.out.println("split complete...");String splitAudioDirectory = longAudioFile.getParent();System.out.println("splitAudioDirectory: " + splitAudioDirectory);String recognitionResult = recognizeAudioFilesInDirectory(splitAudioDirectory);System.out.println("拼接后的识别结果: " + recognitionResult);return recognitionResult;}