1.准备工作
1.1 开通讯飞开放平台账号
https://www.xfyun.cn/
可以领取免费套餐:https://www.xfyun.cn/free
1.2 下载语音处理类库TarsosDSP
https://0110.be/releases/TarsosDSP/TarsosDSP-2.4/TarsosDSP-2.4.jar
建议发布到maven仓库,便于集成。参考命令(本地安装):
mvn install:install-file -Dfile=F:\tarsosdsp\TarsosDSP-2.4.jar -DgroupId=be.tarsos -DartifactId=dsp -Dversion=2.4 -Dpackaging=jar |
POM文件添加依赖:
<dependency> <groupId>be.tarsos</groupId> <artifactId>dsp</artifactId> <version>2.4</version> </dependency> |
1.3 下载媒体处理软件ffmpeg
科大讯飞的接口不支持AMR等格式的音频文件,需要转换为PCM格式,因此需要使用功能强大的ffmpeg进行转码。为简化ffmpeg的使用,我们将利用TarsosDSP类库。TarsosDSP类库会在指定位置启动ffmpeg命令,我们预先下载好,可以避免TarsosDSP类库动态下载ffmpeg导致的长时间等待。
ffmpeg下载地址:
https://0110.be/releases/TarsosDSP/TarsosDSP-static-ffmpeg/linux_64_bits_ffmpeg
https://0110.be/releases/TarsosDSP/TarsosDSP-static-ffmpeg/windows_64_bits_ffmpeg.exe
win7下的存储路径:
C:\Users\<你的用户名>\AppData\Local\Temp\windows_64_bits_ffmpeg.exe
linux下的存储路径:
/tmp/linux_64_bits_ffmpeg
-------------------------------------------------------- 华丽的分割线 ------------------------------------------------------------
下面都是干(yuan)货(ma)。
2. 定义一个音频转换处理工具类
我们首先定义一个音频转换处理的工具类,用于将任意格式的音频文件转换为科大讯飞接口支持的PCM格式。
工具类主体代码:
@Slf4j public class AudioTransformUtil { /** * 将任意的音频文件转换为PCM格式的文件 */ public static void convertAudioFileToPCM(String originalFile, String targetFile) { try { double speedFactor = 1; // 变速率 (0,2) 大于1为加快语速,小于1为放慢语速 double rateFactor = 1; // 音调变化率 (0,2) 大于1为降低音调(深沉),小于1为提升音调(尖锐) // 变声处理器(似乎不是必要的功能,但具有令人惊奇的效果) WaveformSimilarityBasedOverlapAdd waveformSimilarityBasedOverlapAdd = new WaveformSimilarityBasedOverlapAdd( WaveformSimilarityBasedOverlapAdd.Parameters.speechDefaults(speedFactor, 8000)); // 8000是采样率,不懂啥意思,但也没影响 AudioDispatcher dispatcher = AudioDispatcherFactory.fromPipe(originalFile, 8000, // fromPipe是关键。这里会启动ffmpeg命令进行转码,并使用管道(pipe)与ffmpeg命令通信 waveformSimilarityBasedOverlapAdd.getInputBufferSize(), waveformSimilarityBasedOverlapAdd.getOverlap()); waveformSimilarityBasedOverlapAdd.setDispatcher(dispatcher); AudioOutputToFile out = new AudioOutputToFile(targetFile); // AudioOutputToFile是我们自定义的文件输出工具类,代码在后面 dispatcher.addAudioProcessor(waveformSimilarityBasedOverlapAdd); dispatcher.addAudioProcessor(new RateTransposer(rateFactor)); // 变声处理器(似乎不是必要的功能,但具有令人惊奇的效果) dispatcher.addAudioProcessor(out); dispatcher.run(); // TarsosDSP类库会启动一个线程异步处理音频文件 // 等待文件输出结束 out.waitUntilDone(); if (log.isDebugEnabled()) { log.debug( "[convertAudioFileToPCM] ok. originalFile : " + originalFile + ", targetFile : " + targetFile); } } catch (Exception e) { String errMsg = "convertAudioFileToPCM failed. originalFile : " + originalFile; log.error(errMsg, e); } } |
文件输出工具类代码:
public class AudioOutputToFile implements AudioProcessor { FileOutputStream target; String targetFile; boolean isDone = false; AudioOutputToFile(String targetFile) { try { this.targetFile = targetFile; target = new FileOut |