用户一边朗读文字稿 texttxt 文件一边录音得到 audiomp3 文件文字稿一行就是一句话不使用 SpeechRecognition如何通过 python 第三方库不用在线语音识别服务获得文字稿每行文字在录音中的起始时间起始时间逐行 放在 timetxt中
要实现这个需求,可以使用 Python 中的 librosa 库,它可以处理音频文件,并提供一些音频处理的功能。
首先,我们需要将音频文件读入到 Python 中,可以使用 librosa.load() 函数来实现:
import librosa
audio_path = 'audio.mp3'
y, sr = librosa.load(audio_path)
其中,y 是音频数据,sr 是音频采样率。
接下来,我们可以使用 librosa 库提供的函数来分析音频,获得每一句话的起始时间。具体步骤如下:
- 将音频数据转换为短时傅里叶变换(STFT)表示。可以使用 librosa.stft() 函数来实现。
- 计算每一帧的能量值,并计算出整个音频的能量阈值。可以使用 librosa.feature.rms() 函数来实现。
- 根据能量阈值判断每一句话的起始位置。具体方法是:在每一帧中,如果能量值超过了阈值,并且前面的帧能量值都小于阈值,则认为该帧是一句话的起始位置。可以使用 numpy 库来实现。
下面是具体的代码实现:
import librosa
import numpy as np
# 读入音频文件
audio_path = 'audio.mp3'
y, sr = librosa.load(audio_path)
# 计算短时傅里叶变换
hop_length = 512
n_fft = 2048
stft = librosa.stft(y, hop_length=hop_length, n_fft=n_fft)
# 计算能量值
rms = librosa.feature.rms(S=stft, frame_length=n_fft, hop_length=hop_length)
# 计算能量阈值
energy_threshold = np.mean(rms) * 1.5
# 判断每一句话的起始位置
start_times = []
for i in range(rms.shape[1]):
if rms[0, i] > energy_threshold and np.all(rms[0, :i] < energy_threshold):
start_time = librosa.frames_to_time(i, sr=sr, hop_length=hop_length)
start_times.append(start_time)
# 将起始时间写入文件
with open('time.txt', 'w') as f:
for start_time in start_times:
f.write(str(start_time) + '\n')
其中,hop_length 和 n_fft 是 STFT 做短时傅里叶变换时的参数,可以根据具体情况调整。energy_threshold 是能量阈值,可以根据具体情况调整。start_times 是每一句话的起始时间列表。最后,将起始时间写入 time.txt 文件中。
原文地址: http://www.cveoy.top/t/topic/GCB 著作权归作者所有。请勿转载和采集!