首先conda新建环境,由于speech比较早,而且后期更新较少,因此官方的版本维护的建议使用python310,不要太新的环境
conda create -n pdspeech python=3.10
pip install paddlepaddle==2.4.1 -i https://mirror.baidu.com/pypi/simple
pip install pytest-runner
pip install paddlespeech
示例代码
from paddlespeech.cli.asr.infer import ASRExecutor
from paddlespeech.cli.text.infer import TextExecutor
from pydub import AudioSegment
import os
import time
def split_audio(audio_path, segment_length_ms):
"""
将音频切分为指定时长的片段。
Args:
audio_path (str): 音频文件路径。
segment_length_ms (int): 每个片段的长度(以毫秒为单位)。
Returns:
list: 切分后的音频片段列表。
"""
audio = AudioSegment.from_file(audio_path)
segments = [audio[i:i + segment_length_ms] for i in range(0, len(audio), segment_length_ms)]
return segments
def save_temp_audio(segment, index):
"""
将音频片段保存为临时文件。
Args:
segment (AudioSegment): 音频片段。
index (int): 当前片段索引。
Returns:
str: 临时音频文件路径。
"""
temp_audio_path = f"temp_segment_{index}.wav"
segment.export(temp_audio_path, format="wav")
return temp_audio_path
def save_text_to_file(text, file_path):
"""
保存文本到文件。
Args:
text (str): 要保存的文本。
file_path (str): 输出的文件路径。
"""
with open(file_path, 'w', encoding='utf-8') as f:
f.write(text)
def main(audio_file, output_txt_file):
# 初始化 ASR 和文本处理器
asr = ASRExecutor()
text_punc = TextExecutor()
# 切分音频(每段最长 45 秒,以适配 50 秒的限制)
segment_length_ms = 45 * 1000 # 45 秒
segments = split_audio(audio_file, segment_length_ms)
result_text = []
start_time = time.time()
# 对每个片段进行 ASR 处理
for idx, segment in enumerate(segments):
temp_audio_path = save_temp_audio(segment, idx)
print(f"Processing segment {idx + 1}/{len(segments)}...")
try:
# 执行语音识别
asr_result = asr(audio_file=temp_audio_path, model='conformer_wenetspeech')
# 检查识别结果是否有效
if not asr_result:
print(f"Segment {idx + 1} returned empty result.")
continue
# 加标点
processed_text = text_punc(text=asr_result, model='ernie_linear_p3_wudao_fast')
result_text.append(processed_text)
except Exception as e:
print(f"Error processing segment {idx + 1}: {e}")
finally:
# 清理临时文件
if os.path.exists(temp_audio_path):
os.remove(temp_audio_path)
# 拼接所有识别结果
final_text = " ".join(result_text)
end_time = time.time()
# 保存最终结果到 txt 文件
save_text_to_file(final_text, output_txt_file)
print(f"Final Text: {final_text}")
print(f"Processing Time: {end_time - start_time} seconds")
print(f"Text saved to: {output_txt_file}")
return final_text
if __name__ == "__main__":
input_audio_path = "example.mp3" # 输入音频文件路径
output_txt_path = "recognized_text.txt" # 输出文本文件路径
main(input_audio_path, output_txt_path)