【办公自动化】如何使用Python脚本自动化处理音频?

在日常办公和内容创作中,音频处理是一项常见需求。无论是处理会议录音、制作播客、编辑音乐背景,还是进行语音识别,Python都能帮助我们高效地完成这些任务。本文将介绍如何使用Python实现音频处理自动化,包括格式转换、音频拼接、音量调整和语音识别等功能。

音频处理库简介

在Python中,有多个强大的库可用于音频处理:

  1. pydub:简单易用的高级音频处理库,适合大多数日常音频处理任务
  2. librosa:专为音乐分析设计的库,提供丰富的音频特征提取功能
  3. SpeechRecognition:用于语音识别的库,支持多种语音识别引擎
  4. PyAudio:用于录制和播放音频的库
  5. ffmpeg-python:ffmpeg命令行工具的Python封装,用于复杂的音视频处理

音频格式转换

使用pydub进行格式转换

from pydub import AudioSegment
import osdef convert_audio_format(input_path, output_format):"""将音频文件转换为指定格式Args:input_path: 输入音频文件路径output_format: 目标格式(如'mp3', 'wav', 'ogg', 'flac'等)Returns:输出文件路径"""try:# 获取文件名和扩展名file_name, file_extension = os.path.splitext(input_path)file_extension = file_extension.lower().replace('.', '')# 构建输出路径output_path = f"{file_name}.{output_format}"# 加载音频文件audio = AudioSegment.from_file(input_path, format=file_extension)# 导出为目标格式audio.export(output_path, format=output_format)print(f"已将 {input_path} 转换为 {output_path}")return output_pathexcept Exception as e:print(f"转换音频格式时出错: {e}")return None# 使用示例
# convert_audio_format("meeting.mp3", "wav")

批量转换音频格式

import os
from pydub import AudioSegmentdef batch_convert_audio(input_folder, output_folder, target_format):"""批量转换文件夹中的音频文件格式Args:input_folder: 输入文件夹路径output_folder: 输出文件夹路径target_format: 目标格式(如'mp3', 'wav', 'ogg', 'flac'等)"""# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 支持的音频格式supported_formats = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a', '.wma']# 遍历输入文件夹中的所有文件converted_count = 0for filename in os.listdir(input_folder):input_path = os.path.join(input_folder, filename)# 检查是否为文件且扩展名在支持列表中if os.path.isfile(input_path):file_ext = os.path.splitext(filename)[1].lower()if file_ext in supported_formats:# 构建输出路径output_filename = os.path.splitext(filename)[0] + '.' + target_formatoutput_path = os.path.join(output_folder, output_filename)try:# 加载音频文件audio = AudioSegment.from_file(input_path, format=file_ext[1:])# 导出为目标格式audio.export(output_path, format=target_format)print(f"已转换: {filename} -> {output_filename}")converted_count += 1except Exception as e:print(f"转换 {filename} 时出错: {e}")print(f"批量转换完成,共转换 {converted_count} 个文件")# 使用示例
# batch_convert_audio("audio_files", "converted_files", "mp3")

音频拼接与剪辑

拼接多个音频文件

from pydub import AudioSegmentdef concatenate_audio_files(audio_paths, output_path):"""将多个音频文件拼接成一个Args:audio_paths: 音频文件路径列表output_path: 输出文件路径"""try:# 检查输入列表是否为空if not audio_paths:print("输入文件列表为空")return False# 加载第一个音频文件combined = AudioSegment.from_file(audio_paths[0])# 依次拼接其他文件for audio_path in audio_paths[1:]:next_segment = AudioSegment.from_file(audio_path)combined += next_segment# 导出拼接后的文件combined.export(output_path, format=output_path.split('.')[-1])print(f"已将 {len(audio_paths)} 个音频文件拼接为 {output_path}")return Trueexcept Exception as e:print(f"拼接音频文件时出错: {e}")return False# 使用示例
# concatenate_audio_files(["intro.mp3", "main_content.mp3", "outro.mp3"], "full_episode.mp3")

剪切音频片段

from pydub import AudioSegmentdef trim_audio(input_path, output_path, start_ms, end_ms):"""剪切音频文件的指定片段Args:input_path: 输入音频文件路径output_path: 输出文件路径start_ms: 开始时间(毫秒)end_ms: 结束时间(毫秒)"""try:# 加载音频文件audio = AudioSegment.from_file(input_path)# 检查时间范围是否有效if start_ms < 0:start_ms = 0if end_ms > len(audio):end_ms = len(audio)if start_ms >= end_ms:print("无效的时间范围")return False# 剪切指定片段trimmed_audio = audio[start_ms:end_ms]# 导出剪切后的文件trimmed_audio.export(output_path, format=output_path.split('.')[-1])print(f"已剪切 {input_path}{start_ms}ms 到 {end_ms}ms 的片段")return Trueexcept Exception as e:print(f"剪切音频时出错: {e}")return False# 使用示例
# trim_audio("long_recording.mp3", "important_segment.mp3", 60000, 120000)  # 剪切1分钟到2分钟的片段

添加淡入淡出效果

from pydub import AudioSegmentdef add_fade_effects(input_path, output_path, fade_in_ms=1000, fade_out_ms=1000):"""为音频添加淡入淡出效果Args:input_path: 输入音频文件路径output_path: 输出文件路径fade_in_ms: 淡入时长(毫秒)fade_out_ms: 淡出时长(毫秒)"""try:# 加载音频文件audio = AudioSegment.from_file(input_path)# 应用淡入淡出效果audio = audio.fade_in(fade_in_ms).fade_out(fade_out_ms)# 导出处理后的文件audio.export(output_path, format=output_path.split('.')[-1])print(f"已为 {input_path} 添加淡入淡出效果")return Trueexcept Exception as e:print(f"添加淡入淡出效果时出错: {e}")return False# 使用示例
# add_fade_effects("music.mp3", "music_with_fade.mp3", 2000, 3000)  # 2秒淡入,3秒淡出

音量调整

调整音频音量

from pydub import AudioSegmentdef adjust_volume(input_path, output_path, volume_change_db):"""调整音频文件的音量Args:input_path: 输入音频文件路径output_path: 输出文件路径volume_change_db: 音量变化(分贝),正值增加音量,负值降低音量"""try:# 加载音频文件audio = AudioSegment.from_file(input_path)# 调整音量adjusted_audio = audio + volume_change_db  # 简单的加减操作即可调整分贝# 导出处理后的文件adjusted_audio.export(output_path, format=output_path.split('.')[-1])print(f"已调整 {input_path} 的音量 {volume_change_db}dB")return Trueexcept Exception as e:print(f"调整音量时出错: {e}")return False# 使用示例
# adjust_volume("quiet_audio.mp3", "louder_audio.mp3", 6)  # 增加6dB音量
# adjust_volume("loud_audio.mp3", "quieter_audio.mp3", -6)  # 降低6dB音量

音量标准化

from pydub import AudioSegment
import numpy as npdef normalize_audio(input_path, output_path, target_dBFS=-20):"""将音频标准化到指定的分贝全刻度值Args:input_path: 输入音频文件路径output_path: 输出文件路径target_dBFS: 目标分贝全刻度值,通常为负值,如-20dBFS"""try:# 加载音频文件audio = AudioSegment.from_file(input_path)# 计算当前音频与目标音量的差值change_in_dBFS = target_dBFS - audio.dBFS# 应用音量变化normalized_audio = audio.apply_gain(change_in_dBFS)# 导出处理后的文件normalized_audio.export(output_path, format=output_path.split('.')[-1])print(f"已将 {input_path} 标准化到 {target_dBFS}dBFS")return Trueexcept Exception as e:print(f"标准化音频时出错: {e}")return False# 使用示例
# normalize_audio("varying_volume.mp3", "normalized_audio.mp3")

语音识别

使用SpeechRecognition库进行语音识别

import speech_recognition as srdef speech_to_text(audio_path, language='zh-CN'):"""将语音文件转换为文本Args:audio_path: 音频文件路径(最好是WAV格式)language: 语言代码,默认为中文Returns:识别出的文本,失败则返回None"""try:# 初始化识别器recognizer = sr.Recognizer()# 加载音频文件with sr.AudioFile(audio_path) as source:# 读取音频数据audio_data = recognizer.record(source)# 使用Google语音识别APItext = recognizer.recognize_google(audio_data, language=language)print(f"识别结果: {text}")return textexcept sr.UnknownValueError:print("无法识别语音")return Noneexcept sr.RequestError as e:print(f"无法请求Google语音识别服务; {e}")return Noneexcept Exception as e:print(f"语音识别时出错: {e}")return None# 使用示例
# text = speech_to_text("recording.wav", "zh-CN")
# if text:
#     with open("transcript.txt", "w", encoding="utf-8") as f:
#         f.write(text)

批量处理音频文件进行语音识别

import os
import speech_recognition as srdef batch_speech_to_text(input_folder, output_folder, language='zh-CN'):"""批量处理文件夹中的音频文件,将语音转换为文本Args:input_folder: 输入文件夹路径output_folder: 输出文件夹路径(存放文本文件)language: 语言代码,默认为中文"""# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 支持的音频格式supported_formats = ['.wav']  # SpeechRecognition主要支持WAV格式# 初始化识别器recognizer = sr.Recognizer()# 遍历输入文件夹中的所有文件processed_count = 0for filename in os.listdir(input_folder):input_path = os.path.join(input_folder, filename)# 检查是否为文件且扩展名在支持列表中if os.path.isfile(input_path):file_ext = os.path.splitext(filename)[1].lower()if file_ext in supported_formats:# 构建输出路径output_filename = os.path.splitext(filename)[0] + '.txt'output_path = os.path.join(output_folder, output_filename)try:# 加载音频文件with sr.AudioFile(input_path) as source:audio_data = recognizer.record(source)# 使用Google语音识别APItext = recognizer.recognize_google(audio_data, language=language)# 将识别结果写入文本文件with open(output_path, 'w', encoding='utf-8') as f:f.write(text)print(f"已处理: {filename} -> {output_filename}")processed_count += 1except Exception as e:print(f"处理 {filename} 时出错: {e}")print(f"批量处理完成,共处理 {processed_count} 个文件")# 使用示例
# batch_speech_to_text("recordings", "transcripts", "zh-CN")

实际应用场景

场景一:会议录音处理

from pydub import AudioSegment
import speech_recognition as sr
import osdef process_meeting_recording(audio_path, output_folder):"""处理会议录音:转换格式、分割长录音、生成文字记录Args:audio_path: 会议录音文件路径output_folder: 输出文件夹路径"""# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 获取文件名(不含扩展名)base_name = os.path.splitext(os.path.basename(audio_path))[0]try:# 1. 加载音频文件print("正在加载音频文件...")meeting_audio = AudioSegment.from_file(audio_path)# 2. 标准化音量print("正在标准化音量...")normalized_audio = meeting_audio.apply_gain((-20) - meeting_audio.dBFS)# 3. 转换为WAV格式(便于语音识别)wav_path = os.path.join(output_folder, f"{base_name}.wav")print(f"正在转换为WAV格式: {wav_path}")normalized_audio.export(wav_path, format="wav")# 4. 将长录音分割成10分钟的片段(便于处理)segment_length_ms = 10 * 60 * 1000  # 10分钟segments_folder = os.path.join(output_folder, "segments")if not os.path.exists(segments_folder):os.makedirs(segments_folder)print("正在分割录音...")for i, start_ms in enumerate(range(0, len(normalized_audio), segment_length_ms)):# 计算结束时间end_ms = min(start_ms + segment_length_ms, len(normalized_audio))# 提取片段segment = normalized_audio[start_ms:end_ms]# 保存片段segment_path = os.path.join(segments_folder, f"{base_name}_segment_{i+1}.wav")segment.export(segment_path, format="wav")print(f"已保存片段 {i+1}: {segment_path}")# 5. 对每个片段进行语音识别transcripts_folder = os.path.join(output_folder, "transcripts")if not os.path.exists(transcripts_folder):os.makedirs(transcripts_folder)print("正在进行语音识别...")recognizer = sr.Recognizer()full_transcript = ""for i, segment_file in enumerate(sorted(os.listdir(segments_folder))):if segment_file.endswith(".wav"):segment_path = os.path.join(segments_folder, segment_file)try:# 加载音频片段with sr.AudioFile(segment_path) as source:audio_data = recognizer.record(source)# 识别语音text = recognizer.recognize_google(audio_data, language="zh-CN")# 添加到完整记录segment_header = f"\n--- 片段 {i+1} ---\n"full_transcript += segment_header + text + "\n"print(f"已完成片段 {i+1} 的语音识别")except Exception as e:print(f"处理片段 {segment_file} 时出错: {e}")full_transcript += f"\n--- 片段 {i+1} (识别失败) ---\n"# 6. 保存完整文字记录transcript_path = os.path.join(output_folder, f"{base_name}_transcript.txt")with open(transcript_path, "w", encoding="utf-8") as f:f.write(full_transcript)print(f"会议录音处理完成,文字记录已保存至: {transcript_path}")return Trueexcept Exception as e:print(f"处理会议录音时出错: {e}")return False# 使用示例
# process_meeting_recording("weekly_meeting.mp3", "meeting_output")

场景二:播客制作助手

from pydub import AudioSegment
from pydub.effects import normalize
import osdef podcast_production_assistant(intro_path, main_content_path, outro_path, background_music_path, output_path):"""播客制作助手:合并片段、添加背景音乐、标准化音量Args:intro_path: 片头音频路径main_content_path: 主要内容音频路径outro_path: 片尾音频路径background_music_path: 背景音乐路径output_path: 输出文件路径"""try:print("正在加载音频文件...")# 加载所有音频片段intro = AudioSegment.from_file(intro_path)main_content = AudioSegment.from_file(main_content_path)outro = AudioSegment.from_file(outro_path)background_music = AudioSegment.from_file(background_music_path)# 计算总时长total_length_ms = len(intro) + len(main_content) + len(outro)# 如果背景音乐不够长,则循环播放if len(background_music) < total_length_ms:repeats = int(total_length_ms / len(background_music)) + 1background_music = background_music * repeats# 截取所需长度的背景音乐background_music = background_music[:total_length_ms]# 降低背景音乐音量(-20dB)background_music = background_music - 20print("正在处理音频...")# 为片头添加淡入效果intro = intro.fade_in(2000)# 为片尾添加淡出效果outro = outro.fade_out(3000)# 合并所有片段podcast = intro + main_content + outro# 混合背景音乐podcast = podcast.overlay(background_music)# 标准化音量podcast = normalize(podcast)# 导出最终播客print(f"正在导出播客: {output_path}")podcast.export(output_path, format=output_path.split('.')[-1])print("播客制作完成!")return Trueexcept Exception as e:print(f"制作播客时出错: {e}")return False# 使用示例
# podcast_production_assistant(
#     "podcast_intro.mp3", 
#     "podcast_content.mp3", 
#     "podcast_outro.mp3", 
#     "background_music.mp3", 
#     "final_podcast.mp3"
# )

场景三:音频批量处理工具

import os
import argparse
from pydub import AudioSegmentdef batch_audio_processor():"""命令行音频批量处理工具"""# 创建命令行参数解析器parser = argparse.ArgumentParser(description='音频批量处理工具')parser.add_argument('--input', '-i', required=True, help='输入文件夹路径')parser.add_argument('--output', '-o', required=True, help='输出文件夹路径')parser.add_argument('--format', '-f', default='mp3', help='目标格式 (mp3, wav, ogg, etc.)')parser.add_argument('--normalize', '-n', action='store_true', help='是否标准化音量')parser.add_argument('--volume', '-v', type=float, default=0, help='音量调整(dB)')parser.add_argument('--fade-in', type=int, default=0, help='淡入时长(毫秒)')parser.add_argument('--fade-out', type=int, default=0, help='淡出时长(毫秒)')# 解析命令行参数args = parser.parse_args()# 确保输出文件夹存在if not os.path.exists(args.output):os.makedirs(args.output)# 支持的音频格式supported_formats = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a', '.wma']# 遍历输入文件夹中的所有文件processed_count = 0for filename in os.listdir(args.input):input_path = os.path.join(args.input, filename)# 检查是否为文件且扩展名在支持列表中if os.path.isfile(input_path):file_ext = os.path.splitext(filename)[1].lower()if file_ext in supported_formats:# 构建输出路径output_filename = os.path.splitext(filename)[0] + '.' + args.formatoutput_path = os.path.join(args.output, output_filename)try:print(f"处理: {filename}")# 加载音频文件audio = AudioSegment.from_file(input_path)# 应用处理if args.normalize:# 标准化音量到-20dBFSchange_in_dBFS = -20 - audio.dBFSaudio = audio.apply_gain(change_in_dBFS)print("  - 已标准化音量")if args.volume != 0:# 调整音量audio = audio + args.volumeprint(f"  - 已调整音量: {args.volume}dB")if args.fade_in > 0:# 添加淡入效果audio = audio.fade_in(args.fade_in)print(f"  - 已添加淡入效果: {args.fade_in}ms")if args.fade_out > 0:# 添加淡出效果audio = audio.fade_out(args.fade_out)print(f"  - 已添加淡出效果: {args.fade_out}ms")# 导出处理后的文件audio.export(output_path, format=args.format)print(f"  - 已保存为: {output_filename}")processed_count += 1except Exception as e:print(f"处理 {filename} 时出错: {e}")print(f"批量处理完成,共处理 {processed_count} 个文件")# 如果作为主程序运行
if __name__ == "__main__":batch_audio_processor()

小结

通过本文介绍的Python音频处理自动化技术,我们可以轻松实现音频格式转换、拼接剪辑、音量调整和语音识别等功能。这些技术可以广泛应用于会议记录、播客制作、音频编辑等场景,大大提高工作效率。

要使用本文中的代码,需要安装以下Python库:

pip install pydub librosa SpeechRecognition PyAudio ffmpeg-python

注意:某些功能(如格式转换)可能需要安装额外的系统依赖,如ffmpeg。在Windows上,可以下载ffmpeg并将其添加到系统PATH;在Linux上,可以使用包管理器安装;在macOS上,可以使用Homebrew安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96515.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony AVSession深度解析(二):从本地会话到分布式跨设备协同的完整生命周期管理

1. 系统概述 AVSession是OpenHarmony多媒体框架中的核心组件,负责管理音视频会话的生命周期、状态同步和跨设备协同。它提供了统一的接口供应用创建会话、设置元数据、控制播放状态,并支持分布式场景下的会话迁移。 2. 架构设计 2.1 核心类结构 #mermaid-svg-QwwujBwB3Wo6…

架构思维:在复杂系统中寻找秩序的底层逻辑

在商业世界中&#xff0c;架构师常被视为神秘的存在。懂架构不一定是大师&#xff0c;但&#xff0c;大师一定善于架构&#xff0c;善于拨开迷雾&#xff0c;看透全局。他们穿梭于代码与流程之间&#xff0c;用看不见的线条编织着数字世界的经纬。 架构天然的使命就是面对复杂…

国产凝思debian系Linux离线安装rabbitmq教程步骤

系统环境 由于国内访问debian的apt源太慢了&#xff0c;花了很多很多时间后&#xff0c;反而超时报错。所以采用离线安装方式。 uname -a Linux bogon 4.19.0-11-linx-security-amd64 #1 SMP Linx 4.19.146-1linx10 (2023-05-30) x86_64 GNU/Linux下载安装包 在有网络的电脑…

开发避坑指南(48):Java Stream 判断List元素的属性是否包含指定的值

需求 Java Stream 判断List元素的属性是否包含指定的值该怎么实现&#xff1f; 代码实现 直接上代码 public class OrderInfo {private BigDecimal fee;private String orderStatus; }public class ListTest2 {public static void main(String[] args) {OrderInfo orderInfo n…

Arbess V2.0.7版本发布,支持Docker/主机蓝绿部署任务,支持Gradle构建、Agent运行策略

Arbess 是一款国产开源免费的 CI/CD 工具&#xff0c;产品开源免费&#xff0c;简洁易用。本周Arbess V2.0.7版本发布&#xff0c;新增Docker/主机蓝绿部署策略&#xff0c;Gradle构建任务&#xff0c;新增Agent执行策略。 1、版本更新日志 新增 ➢ 支持Docker蓝绿部署、主机…

万物皆可PID:深入理解控制算法在OpenBMC风扇调速中的应用

引言&#xff1a;智能散热&#xff0c;不仅仅是“开”和“关” 想象一下服务器中的风扇管理。最简单的策略是“bang-bang”控制&#xff08;双位控制&#xff09;&#xff1a;温度超过阈值&#xff0c;风扇全速运转&#xff1b;温度低于阈值&#xff0c;风扇低速或停止。这种策…

CH347应用 USB转I2C功能之:开源项目i2c-tools工具的使用(2)

目录前言开源地址使用说明i2cdetecti2cdumpi2cset前言 上一篇博客中介绍了CH347配合i2c-tools在Linux下的使用&#xff0c;但我们能不能在Windows中也是用i2c-tools进行I2C设备的调试呢。这里我将i2cdetect、i2cdump、i2cset三个常用的工具移植至Windows平台&#xff0c;并进行…

代码随想录算法训练营第50天 | 图论理论基础、深搜理论基础、98. 所有可达路径、广搜理论基础

图论理论基础 题目链接/文章讲解&#xff1a;https://www.programmercarl.com/kamacoder/%E5%9B%BE%E8%AE%BA%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 了解图的基本概念&#xff0c;连通性&#xff0c;图的构造&#xff0c;图的遍历方式 深搜理论基础 题目链接/文章讲解&…

华为HCIE-云计算培训课程有哪些?

华为HCIE云计算认证是华为公司推出的高级别认证&#xff0c;对于想要在云计算领域发展&#xff0c;提高专业技能和竞争力的人来说具备极高的价值。接下里就来聊聊华为HCIE云计算的培训课程都有哪些&#xff1f;如何高效备考呢&#xff1f;一&#xff0c;HCIE云计算培训课程1、理…

DCS控制回路优化:基于WebSocket的实时参数远程调校方法论

说起来&#xff0c;我前段时间刚啃完一个化工厂DCS控制回路优化的硬骨头&#xff0c;用WebSocket搞成了实时参数远程调校&#xff0c;现在回想起来&#xff0c;满是能跟大家唠的实操经验&#xff0c;说不定你们以后碰到类似情况&#xff0c;能少走些冤枉路。先跟大家交代下背景…

《JVM如何排查OOM》

目录 一、什么是OOM&#xff1f; 二、OOM排查的整体思路 三、OOM排查工具大全 四、实战&#xff1a;不同OOM场景的排查方法 场景1&#xff1a;Java heap space 场景2&#xff1a;Metaspace 场景3&#xff1a;GC overhead limit exceeded 五、高级排查技巧 1. 使用Arth…

ubuntu22.04 安装Docker

一、更新系统包索引sudo apt update && sudo apt upgrade -y二、安装必要依赖安装 curl、gnupg等工具&#xff0c;用于添加 Docker 官方 GPG 密钥和仓库&#xff1a;sudo apt install -y ca-certificates curl gnupg三、添加 Docker 官方 GPG 密钥sudo install -m 0755…

高低压隔离器的技术演进与行业赋能

电力电子系统的安全架构与效率升级&#xff0c;始终依赖高低压电路间的可靠隔离。高低压隔离器作为能量传输与信号控制的核心媒介&#xff0c;通过持续迭代的绝缘技术与结构创新&#xff0c;为新能源装备、工业驱动系统提供底层安全屏障。其阻断电位差传导、抑制电磁干扰的能力…

嵌入式 - ARM5

一、led点灯代码优化1. 配置寄存器volatile1.​​禁止优化​​不对该变量的读写操作进行任何优化&#xff08;如删除“冗余”读取或延迟写入&#xff09;。2.​​强制内存访问​​每次访问该变量时&#xff0c;必须直接从内存&#xff08;或硬件寄存器&#xff09;中读取或写入…

SSH登录管理

两种配置方法-密码 -密钥&#xff08;免密&#xff09;ansible 默认 rhel9 禁止 root 用密码登陆&#xff0c;不禁止用密钥登陆 ---修改方式----vim /etc/ssh/sshd_config 修改此文件#PermitRootLogin prohibit-passwordPermitRootLogin yes 改为允许systemctl res…

远程连接--向日葵

下载安装卸载 向日葵语言设置 点击下面的图标,点击"设置": 问题解决 向日葵被连接之后自动黑屏 取消下面的勾选框: 向日葵连接之后黑屏 检查系统的协议: echo $XDG_SESSION_TYPE 如果是: wayland 需要切换为x11. 设置永久默认使用 X11: sudo vi /etc/gdm3/custom…

Liunx执行source /etc/profile 报错, -bash: HISTTIMEFORMAT: readonly variable

今天在配置java环境变量时&#xff0c;执行source /etc/profile报错&#xff0c;系统是统信OS&#xff0c;花了好长时间才解决&#xff0c;在这记录一下&#xff0c;希望能帮助到大家问题截图提示HISTTIMEFORMAT和PROMPT_COMMAND变量时只读变量&#xff0c;不能设置属性值解决办…

什么是达林顿管?

简单来说&#xff0c;达林顿管是一个“电流放大器中的大力士”。它的核心目的是用非常小的输入电流&#xff08;基极电流&#xff09;去控制一个非常大的输出电流&#xff08;集电极电流&#xff09;。达林顿管是由两个三极管串联而成&#xff0c;放大倍数是两个三极管的放大倍…

嵌入式Linux学习_rk3588移植无线网卡驱动

记录移植无线网卡驱动遇到的各种问题&#xff1a; 从官网上下载8821的驱动源码复制一份上面的CONFIG_PLATFORM_ARM_RK2818&#xff0c;改成3588&#xff0c;然后选项改成y&#xff0c;并把autodetect关掉。 找到CONFIG_PLATFORM_ARM_RK2818&#xff0c;复制一份&#xff0c;改成…

MCP专题五、MCP 的未来趋势与展望

MCP专题五:MCP 的未来趋势与展望 5.1 引言 本专题前四章我们系统性地学习了 MCP(Model Context Protocol)的 发展背景、核心机制、Python 实战方法以及典型应用场景。可以看到,MCP 并不仅仅是一个技术标准,它更像是 大模型与外部世界沟通的桥梁,推动了 AI 应用从“实验…