利用AudioSegment库抽出音轨,肯定时间段距离采样音频的dBFS,如果小于阈值(个别认为小于-50为静音),当然还存在负无穷的景象须要判断。

def audio_silence_check_service(video_location):    download_video_to_local(location=video_location, video_filename=video_filename)    extract_audio_result = extract_audio_from_video(video_filename, audio_filename)    is_exist_silence = False    silence_desc = ''    silence_detect_result = []    if extract_audio_result:        silence_detect_result = silence_detect(audio_filename)        for silence_chunk in silence_detect_result.get('silence_result'):            if int(silence_chunk[1]) - int(silence_chunk[0]) > int(                            int(silence_detect_result.get('audio_duration')) / 3):                silence_desc += f'{silence_chunk[0]}~{silence_chunk[1]},'    if silence_desc:        silence_desc += 'ms存在静音'        is_exist_silence = True    else:        is_exist_silence = True        silence_desc = f'{qipuid}未获取到音轨'        logger_error(silence_desc)        return is_exist_silence, silence_desc, silence_detect_result        def silence_detect(audio_file, silence_threshold=-50, chunk_size=10):    sound = AudioSegment.from_file(audio_file, format="wav")    assert chunk_size > 0    silence_chunks = list()    silence_chunks_start_ms = -1    sound_duration = len(sound)    for current_ms in range(0, sound_duration, chunk_size):        current_ms_chunks_dBFS = sound[current_ms: current_ms + chunk_size].dBFS        if current_ms_chunks_dBFS < silence_threshold or current_ms_chunks_dBFS == -inf:            if silence_chunks_start_ms == -1:                silence_chunks_start_ms = current_ms            else:                if current_ms <= sound_duration <= current_ms + chunk_size:                    silence_chunks.append([silence_chunks_start_ms, sound_duration])                    silence_chunks_start_ms = -1        else:            if silence_chunks_start_ms != -1:                silence_chunks.append([silence_chunks_start_ms, current_ms])                silence_chunks_start_ms = -1    return {'audio_duration': sound_duration, 'silence_result': silence_chunks}    def download_video_to_local(location, video_filename):    res = get(location)    with open(video_filename, r'wb') as f:        f.write(res.content)