|  |  |  | @ -0,0 +1,152 @@ | 
			
		
	
		
			
				
					|  |  |  |  | import sys | 
			
		
	
		
			
				
					|  |  |  |  | import os | 
			
		
	
		
			
				
					|  |  |  |  | import subprocess | 
			
		
	
		
			
				
					|  |  |  |  | import time | 
			
		
	
		
			
				
					|  |  |  |  | import logging | 
			
		
	
		
			
				
					|  |  |  |  | import glob | 
			
		
	
		
			
				
					|  |  |  |  | # 设置日志配置,将日志输出到log.txt文件中,并附加运行的时间 | 
			
		
	
		
			
				
					|  |  |  |  | logging.basicConfig(level=logging.INFO, | 
			
		
	
		
			
				
					|  |  |  |  |                     format='%(asctime)s - %(levelname)s - %(message)s', | 
			
		
	
		
			
				
					|  |  |  |  |                     filename='/home/pi/Desktop/al/run/log.txt', | 
			
		
	
		
			
				
					|  |  |  |  |                     filemode='a') | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # 添加其他文件夹的路径到sys.path | 
			
		
	
		
			
				
					|  |  |  |  | sys.path.append('/home/pi/Desktop/voice_assistant') | 
			
		
	
		
			
				
					|  |  |  |  | sys.path.append('/home/pi/Desktop/Guide_stick_system') | 
			
		
	
		
			
				
					|  |  |  |  | sys.path.append('/home/pi/Desktop/manage/itt') | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import New  | 
			
		
	
		
			
				
					|  |  |  |  | import wenzi | 
			
		
	
		
			
				
					|  |  |  |  | import main | 
			
		
	
		
			
				
					|  |  |  |  | # 设置文件路径 | 
			
		
	
		
			
				
					|  |  |  |  | text_file = "/home/pi/Desktop/manage/demo.txt" | 
			
		
	
		
			
				
					|  |  |  |  | output_file = "/home/pi/Desktop/Guide_stick_system/run/output.mp3" | 
			
		
	
		
			
				
					|  |  |  |  | vlc_path = 'vlc' | 
			
		
	
		
			
				
					|  |  |  |  | remind_path = 'remind.wav' | 
			
		
	
		
			
				
					|  |  |  |  | error_path = 'error.wav' | 
			
		
	
		
			
				
					|  |  |  |  | directory = '/home/pi/Desktop/manage/*.txt' | 
			
		
	
		
			
				
					|  |  |  |  | img_path = '/home/pi/Desktop/manage/img' | 
			
		
	
		
			
				
					|  |  |  |  | marker = 0  | 
			
		
	
		
			
				
					|  |  |  |  | consecutive_errors = 0  | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def get_latest_message(file_path, marker): | 
			
		
	
		
			
				
					|  |  |  |  |     try: | 
			
		
	
		
			
				
					|  |  |  |  |         with open(file_path, "r", encoding="utf-8") as f: | 
			
		
	
		
			
				
					|  |  |  |  |             f.seek(marker)  # 移动到上次读取的位置 | 
			
		
	
		
			
				
					|  |  |  |  |             latest_message = f.read() | 
			
		
	
		
			
				
					|  |  |  |  |             new_marker = f.tell()  # 获取新的位置标记 | 
			
		
	
		
			
				
					|  |  |  |  |         return latest_message, new_marker | 
			
		
	
		
			
				
					|  |  |  |  |     except FileNotFoundError: | 
			
		
	
		
			
				
					|  |  |  |  |         logging.error(f"文件未找到: {file_path}") | 
			
		
	
		
			
				
					|  |  |  |  |         return "", 0 | 
			
		
	
		
			
				
					|  |  |  |  |     except PermissionError: | 
			
		
	
		
			
				
					|  |  |  |  |         logging.error(f"没有权限读取文件: {file_path}") | 
			
		
	
		
			
				
					|  |  |  |  |         return "", 0 | 
			
		
	
		
			
				
					|  |  |  |  |     except Exception as e: | 
			
		
	
		
			
				
					|  |  |  |  |         logging.error(f"读取文件时发生错误: {e}") | 
			
		
	
		
			
				
					|  |  |  |  |         return "", 0 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def log_demo_text(): | 
			
		
	
		
			
				
					|  |  |  |  |     if os.path.isfile(text_file): | 
			
		
	
		
			
				
					|  |  |  |  |         with open(text_file, 'r') as file: | 
			
		
	
		
			
				
					|  |  |  |  |             text = file.read() | 
			
		
	
		
			
				
					|  |  |  |  |             logging.info(text) | 
			
		
	
		
			
				
					|  |  |  |  |     else: | 
			
		
	
		
			
				
					|  |  |  |  |         logging.error('txt文件不存在') | 
			
		
	
		
			
				
					|  |  |  |  |          | 
			
		
	
		
			
				
					|  |  |  |  | def is_file_empty(file_path): | 
			
		
	
		
			
				
					|  |  |  |  |     return os.path.getsize(file_path) == 0 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def is_new_message(file_path, marker): | 
			
		
	
		
			
				
					|  |  |  |  |     with open(file_path, "r", encoding="utf-8") as f: | 
			
		
	
		
			
				
					|  |  |  |  |         f.seek(0)  | 
			
		
	
		
			
				
					|  |  |  |  |         current_message = f.read() | 
			
		
	
		
			
				
					|  |  |  |  |         current_marker = f.tell()   | 
			
		
	
		
			
				
					|  |  |  |  |     return current_message != "" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def clear_text_content(file_path): | 
			
		
	
		
			
				
					|  |  |  |  |     with open(file_path, "w") as file: | 
			
		
	
		
			
				
					|  |  |  |  |         file.truncate() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def get_latest_txt_filename(directory_path): | 
			
		
	
		
			
				
					|  |  |  |  |     # 获取目录下所有的 .txt 文件 | 
			
		
	
		
			
				
					|  |  |  |  |     file_list = glob.glob(os.path.join(directory_path, '*.txt')) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     # 如果文件列表不为空 | 
			
		
	
		
			
				
					|  |  |  |  |     if file_list: | 
			
		
	
		
			
				
					|  |  |  |  |         # 按修改时间排序,获取最新的文件 | 
			
		
	
		
			
				
					|  |  |  |  |         latest_file = max(file_list, key=os.path.getmtime) | 
			
		
	
		
			
				
					|  |  |  |  |         return latest_file | 
			
		
	
		
			
				
					|  |  |  |  |     else: | 
			
		
	
		
			
				
					|  |  |  |  |         logging.error("没有找到 .txt 文件") | 
			
		
	
		
			
				
					|  |  |  |  |         return None | 
			
		
	
		
			
				
					|  |  |  |  |      | 
			
		
	
		
			
				
					|  |  |  |  | def main(): | 
			
		
	
		
			
				
					|  |  |  |  |     wenzi.ensure_pytesseract_installed()   | 
			
		
	
		
			
				
					|  |  |  |  |     wenzi.ensure_tesseract_executable_configured() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     while True: | 
			
		
	
		
			
				
					|  |  |  |  |         try: | 
			
		
	
		
			
				
					|  |  |  |  |             # 初始化检测器 | 
			
		
	
		
			
				
					|  |  |  |  |             config = main.load_config() | 
			
		
	
		
			
				
					|  |  |  |  |             detector = main.initialize_detector(config) | 
			
		
	
		
			
				
					|  |  |  |  |             if detector is None: | 
			
		
	
		
			
				
					|  |  |  |  |                 return | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             # 检测图像中的对象 | 
			
		
	
		
			
				
					|  |  |  |  |             img_path = main.config['img_path'] | 
			
		
	
		
			
				
					|  |  |  |  |             detections = main.detect_objects(detector, img_path) | 
			
		
	
		
			
				
					|  |  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |  |             # 可视化结果 | 
			
		
	
		
			
				
					|  |  |  |  |             main.visualize_results(img_path, detections) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             #图像转文本 | 
			
		
	
		
			
				
					|  |  |  |  |             if not os.path.exists(img_path):   | 
			
		
	
		
			
				
					|  |  |  |  |                 logging.error(f"图片 {img_path} 不存在,等待下一张...")   | 
			
		
	
		
			
				
					|  |  |  |  |                 time.sleep(1)   | 
			
		
	
		
			
				
					|  |  |  |  |                 continue   | 
			
		
	
		
			
				
					|  |  |  |  |             text = wenzi.image_to_text(img_path)   | 
			
		
	
		
			
				
					|  |  |  |  |             if text:   | 
			
		
	
		
			
				
					|  |  |  |  |                 with open(text_file, 'w', encoding='utf-8') as file:   | 
			
		
	
		
			
				
					|  |  |  |  |                     file.write(text)   | 
			
		
	
		
			
				
					|  |  |  |  |                 logging.info(f"图片的识别结果已保存到 {text_file}")   | 
			
		
	
		
			
				
					|  |  |  |  |             else:   | 
			
		
	
		
			
				
					|  |  |  |  |                 logging.info(f"无法识别图片中的文字。")   | 
			
		
	
		
			
				
					|  |  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |  |             #读取文本信息 | 
			
		
	
		
			
				
					|  |  |  |  |             content =  get_latest_txt_filename(directory) | 
			
		
	
		
			
				
					|  |  |  |  |             if content: | 
			
		
	
		
			
				
					|  |  |  |  |                 logging.info(content) | 
			
		
	
		
			
				
					|  |  |  |  |             latest_message, marker = get_latest_message(content, marker) | 
			
		
	
		
			
				
					|  |  |  |  |             if is_file_empty(text_file): | 
			
		
	
		
			
				
					|  |  |  |  |                 time.sleep(2) | 
			
		
	
		
			
				
					|  |  |  |  |                 continue | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             #文本转语音 | 
			
		
	
		
			
				
					|  |  |  |  |             log_demo_text() | 
			
		
	
		
			
				
					|  |  |  |  |             logging.info(f"转换文本到语音: {text_file}") | 
			
		
	
		
			
				
					|  |  |  |  |             New.text_to_speech(latest_message, output_file) | 
			
		
	
		
			
				
					|  |  |  |  |             logging.info(f"语音文件已生成: {output_file}") | 
			
		
	
		
			
				
					|  |  |  |  |             clear_text_content(text_file) | 
			
		
	
		
			
				
					|  |  |  |  |             logging.info(f"播放音频文件: {remind_path}") | 
			
		
	
		
			
				
					|  |  |  |  |             subprocess.call([vlc_path, '--play-and-exit', remind_path]) | 
			
		
	
		
			
				
					|  |  |  |  |             time.sleep(1) | 
			
		
	
		
			
				
					|  |  |  |  |             logging.info(f"播放音频文件: {output_file}") | 
			
		
	
		
			
				
					|  |  |  |  |             subprocess.call([vlc_path, '--play-and-exit', output_file]) | 
			
		
	
		
			
				
					|  |  |  |  |             time.sleep(1) | 
			
		
	
		
			
				
					|  |  |  |  |             marker = 0   | 
			
		
	
		
			
				
					|  |  |  |  |             consecutive_errors = 0 | 
			
		
	
		
			
				
					|  |  |  |  |             pass | 
			
		
	
		
			
				
					|  |  |  |  |              | 
			
		
	
		
			
				
					|  |  |  |  |         except Exception as e: | 
			
		
	
		
			
				
					|  |  |  |  |             logging.error(f"发生错误: {e}") | 
			
		
	
		
			
				
					|  |  |  |  |             time.sleep(1) | 
			
		
	
		
			
				
					|  |  |  |  |             consecutive_errors += 1 | 
			
		
	
		
			
				
					|  |  |  |  |             time.sleep(1) | 
			
		
	
		
			
				
					|  |  |  |  |             if consecutive_errors >= 3:   | 
			
		
	
		
			
				
					|  |  |  |  |                 logging.info(f"播放音频文件: {error_path}") | 
			
		
	
		
			
				
					|  |  |  |  |                 subprocess.call([vlc_path, '--play-and-exit', error_path]) | 
			
		
	
		
			
				
					|  |  |  |  |                 consecutive_errors = 0   | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | if __name__ == "__main__":   | 
			
		
	
		
			
				
					|  |  |  |  |     main() |