摘要:項(xiàng)目中需要用到對(duì)人聲音頻數(shù)據(jù)進(jìn)行變聲處理。具體工具類(lèi)代碼變聲原始數(shù)據(jù)輸入流變速率大于為加快語(yǔ)速,小于為放慢語(yǔ)速音調(diào)變化率大于為降低音調(diào)深沉,小于為提升音調(diào)尖銳變聲后的數(shù)據(jù)輸入流這里根據(jù)自己格式修改對(duì)應(yīng)參數(shù)。
項(xiàng)目中需要用到對(duì)PCM人聲音頻數(shù)據(jù)進(jìn)行變聲處理。苦苦掙扎了一周終于找到了純Java實(shí)現(xiàn)的一套框架——TarsosDSP。功能非常強(qiáng)大!可以實(shí)時(shí)音頻處理!當(dāng)然我只用到了對(duì)文件處理。實(shí)際上邏輯是一樣的
TarsosDSP的GitHub地址:https://github.com/JorenSix/T...。將它整合至自己的項(xiàng)目工程。
具體Java工具類(lèi)代碼:
/** * 變聲 * @param rawPcmInputStream 原始PCM數(shù)據(jù)輸入流 * @param speedFactor 變速率 (0,2) 大于1為加快語(yǔ)速,小于1為放慢語(yǔ)速 * @param rateFactor 音調(diào)變化率 (0,2) 大于1為降低音調(diào)(深沉),小于1為提升音調(diào)(尖銳) * @return 變聲后的PCM數(shù)據(jù)輸入流 */ public static InputStream speechPitchShift(final InputStream rawPcmInputStream,double speedFactor,double rateFactor) { // 這里根據(jù)自己PCM格式修改對(duì)應(yīng)參數(shù)。我們項(xiàng)目里音頻格式是固定的,所以寫(xiě)死 TarsosDSPAudioFormat format = new TarsosDSPAudioFormat(16000,16,1,true,false); AudioInputStream inputStream = new AudioInputStream(rawPcmInputStream, JVMAudioInputStream.toAudioFormat(format),AudioSystem.NOT_SPECIFIED); JVMAudioInputStream stream = new JVMAudioInputStream(inputStream); WaveformSimilarityBasedOverlapAdd w = new WaveformSimilarityBasedOverlapAdd(WaveformSimilarityBasedOverlapAdd.Parameters.speechDefaults(speedFactor, 16000)); int inputBufferSize = w.getInputBufferSize(); int overlap = w.getOverlap(); AudioDispatcher dispatcher = new AudioDispatcher(stream, inputBufferSize ,overlap); w.setDispatcher(dispatcher); AudioOutputToByteArray out = new AudioOutputToByteArray(); dispatcher.addAudioProcessor(w); dispatcher.addAudioProcessor(new RateTransposer(rateFactor)); dispatcher.addAudioProcessor(out); dispatcher.run(); return new ByteArrayInputStream(out.getData()); }
其中數(shù)據(jù)轉(zhuǎn)錄器(AudioOutputToByteArray)代碼如下:
public class AudioOutputToByteArray implements AudioProcessor { private boolean isDone = false; private byte[] out = null; private ByteArrayOutputStream bos; public AudioOutputToByteArray() { bos = new ByteArrayOutputStream(); } public byte[] getData() { while (!isDone && out == null) { try { Thread.sleep(10); } catch (InterruptedException ignored) {} } return out; } @Override public boolean process(AudioEvent audioEvent) { bos.write(audioEvent.getByteBuffer(),0,audioEvent.getByteBuffer().length); return true; } @Override public void processingFinished() { out = bos.toByteArray().clone(); bos = null; isDone = true; } }
可以通過(guò)這個(gè)工具方法播放音頻:
/** * 播放PCM * * 不要在非桌面環(huán)境調(diào)用。。。鬼知道會(huì)發(fā)生什么 * @param rawPcmInputStream 原始PCM數(shù)據(jù)輸入流 * @throws LineUnavailableException */ public static void play(final InputStream rawPcmInputStream) throws LineUnavailableException { // 這里根據(jù)自己PCM格式修改對(duì)應(yīng)參數(shù)。我們項(xiàng)目里音頻格式是固定的,所以寫(xiě)死 TarsosDSPAudioFormat format = new TarsosDSPAudioFormat(16000,16,1,true,false); AudioInputStream inputStream = new AudioInputStream(rawPcmInputStream, JVMAudioInputStream.toAudioFormat(format),AudioSystem.NOT_SPECIFIED); JVMAudioInputStream stream = new JVMAudioInputStream(inputStream); AudioDispatcher dispatcher = new AudioDispatcher(stream, 1024 ,0); dispatcher.addAudioProcessor(new AudioPlayer(format,1024)); dispatcher.run(); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/68217.html
摘要:前言本文翻譯自上的利用,這是中的的一個(gè)入門(mén)教程。原文是英文,但有日本同志翻譯的日文版。這是為了提供一個(gè)基本的低音増幅效果在這個(gè)例子中可以設(shè)定過(guò)濾器的種類(lèi),周波數(shù),甚至的值。如果是過(guò)濾器的話(huà),可以提供一個(gè)比指定周波數(shù)低的低音増幅。 前言 本文翻譯自MDN上的《Web Audio APIの利用》,這是HTML5中的Web Audio API的一個(gè)入門(mén)教程。原文是英文,但有日本同志翻譯的日文...
摘要:格式文件中不包含頭部信息,播放器無(wú)法知道采樣率,聲道數(shù),采樣位數(shù),音頻數(shù)據(jù)大小等信息,導(dǎo)致無(wú)法播放。 本文記錄一點(diǎn)工作經(jīng)歷,探討音頻文件的格式更多訪(fǎng)問(wèn)我的博客 前言 最近在整理音視頻編程的知識(shí),回憶起半年多,有一次需求是在后臺(tái)播放某來(lái)源的 pcm 文件,當(dāng)時(shí)處理方法用了點(diǎn)技巧,記錄下來(lái) 背景:業(yè)務(wù)需求,在web后臺(tái)里播放 pcm 文件,文件不大(約300KB,已知 pcm 的參數(shù)采樣...
摘要:不多說(shuō)直接貼代碼獲取文件的音頻流,的格式將音頻轉(zhuǎn)化為的格式保存下來(lái)代碼忘記借鑒了哪位大神的不好意思好像是綜合了部分代碼下面的是依賴(lài)小程序錄音格式上傳服務(wù)器轉(zhuǎn)化為格式后通過(guò)百度語(yǔ)音識(shí)別結(jié)果 不多說(shuō)直接貼代碼 import com.baidu.aip.speech.AipSpeech; import javazoom.spi.mpeg.sampled.file.MpegAudioFileR...
閱讀 1160·2023-04-26 03:02
閱讀 1196·2023-04-25 19:18
閱讀 2596·2021-11-23 09:51
閱讀 2579·2021-11-11 16:55
閱讀 2634·2021-10-21 09:39
閱讀 1711·2021-10-09 09:59
閱讀 2007·2021-09-26 09:55
閱讀 3535·2021-09-26 09:55