音频处理
(
self, indata: np.ndarray, outdata: np.ndarray, frames, times, status
)
| 665 | printt("ENDing VC") |
| 666 | |
| 667 | def audio_callback( |
| 668 | self, indata: np.ndarray, outdata: np.ndarray, frames, times, status |
| 669 | ): |
| 670 | """ |
| 671 | 音频处理 |
| 672 | """ |
| 673 | start_time = time.perf_counter() |
| 674 | indata = librosa.to_mono(indata.T) |
| 675 | if self.gui_config.threhold > -60: |
| 676 | rms = librosa.feature.rms( |
| 677 | y=indata, frame_length=4 * self.zc, hop_length=self.zc |
| 678 | ) |
| 679 | db_threhold = ( |
| 680 | librosa.amplitude_to_db(rms, ref=1.0)[0] < self.gui_config.threhold |
| 681 | ) |
| 682 | for i in range(db_threhold.shape[0]): |
| 683 | if db_threhold[i]: |
| 684 | indata[i * self.zc : (i + 1) * self.zc] = 0 |
| 685 | self.input_wav[: -self.block_frame] = self.input_wav[ |
| 686 | self.block_frame : |
| 687 | ].clone() |
| 688 | self.input_wav[-self.block_frame :] = torch.from_numpy(indata).to( |
| 689 | self.config.device |
| 690 | ) |
| 691 | self.input_wav_res[: -self.block_frame_16k] = self.input_wav_res[ |
| 692 | self.block_frame_16k : |
| 693 | ].clone() |
| 694 | # input noise reduction and resampling |
| 695 | if self.gui_config.I_noise_reduce and self.function == "vc": |
| 696 | input_wav = self.input_wav[ |
| 697 | -self.crossfade_frame - self.block_frame - 2 * self.zc : |
| 698 | ] |
| 699 | input_wav = self.tg( |
| 700 | input_wav.unsqueeze(0), self.input_wav.unsqueeze(0) |
| 701 | )[0, 2 * self.zc :] |
| 702 | input_wav[: self.crossfade_frame] *= self.fade_in_window |
| 703 | input_wav[: self.crossfade_frame] += ( |
| 704 | self.nr_buffer * self.fade_out_window |
| 705 | ) |
| 706 | self.nr_buffer[:] = input_wav[-self.crossfade_frame :] |
| 707 | input_wav = torch.cat( |
| 708 | (self.res_buffer[:], input_wav[: self.block_frame]) |
| 709 | ) |
| 710 | self.res_buffer[:] = input_wav[-2 * self.zc :] |
| 711 | self.input_wav_res[-self.block_frame_16k - 160 :] = self.resampler( |
| 712 | input_wav |
| 713 | )[160:] |
| 714 | else: |
| 715 | self.input_wav_res[-self.block_frame_16k - 160 :] = self.resampler( |
| 716 | self.input_wav[-self.block_frame - 2 * self.zc :] |
| 717 | )[160:] |
| 718 | # infer |
| 719 | if self.function == "vc": |
| 720 | f0_extractor_frame = self.block_frame_16k + 800 |
| 721 | if self.gui_config.f0method == "rmvpe": |
| 722 | f0_extractor_frame = ( |
| 723 | 5120 * ((f0_extractor_frame - 1) // 5120 + 1) - 160 |
| 724 | ) |