Commit 8d4477a

benny-dou <60535774+benny-dou@users.noreply.github.com>
2025-04-01 09:54:52
feat: add `voice` command to extract voice message
1 parent eb2bb25
Changed files (3)
src/others/extract_audio.py
@@ -17,41 +17,48 @@ from utils import to_int
 # ruff: noqa: RUF001
 
 HELP = f"""
-🎧**视频转音频**
+🎧**消息转音频或语音**
 使用方式:
-1. 以 `{PREFIX.AUDIO}` 回复视频消息提取出音频
-2. 发送视频时, 添加`{PREFIX.AUDIO}`文本描述会同时提取视频音频
+1. `{PREFIX.AUDIO}` 回复消息转换为音频文件
+2. `{PREFIX.VOICE}` 回复消息转换为语音消息
 """
 
 
 async def extract_audio_file(client: Client, message: Message, **kwargs) -> None:
     """Extract audio from video message."""
     # send docs if message == "/audio", without reply
-    if equal_prefix(message.text, prefix=[PREFIX.AUDIO]) and not message.reply_to_message:
+    if equal_prefix(message.text, prefix=[PREFIX.AUDIO, PREFIX.VOICE]) and not message.reply_to_message:
         await send2tg(client, message, texts=HELP, **kwargs)
         return
 
     info = parse_msg(message)
-    if not startswith_prefix(info["text"], prefix=[PREFIX.AUDIO]):
+    command = info["text"]
+    if not startswith_prefix(info["text"], prefix=[PREFIX.AUDIO, PREFIX.VOICE]):
         return
 
-    # reply a message with /audio
+    # reply a message with /audio or /voice
     if message.reply_to_message:
         message = message.reply_to_message
         info = parse_msg(message, silent=True)  # parse again
+    if info["mtype"] == "audio" and startswith_prefix(command, prefix=[PREFIX.AUDIO]):
+        await message.reply("🎧该消息已经为音频, 无需提取")
+        return
+    if info["mtype"] == "voice" and startswith_prefix(command, prefix=[PREFIX.VOICE]):
+        await message.reply("🎧该消息已经为语音, 无需提取")
+        return
 
-    if info["mtype"] != "video":
+    if info["mtype"] not in ["video", "audio", "voice"]:
         return
 
-    msg = "🎬收到视频消息, 开始提取🎧音频..."
+    msg = f"[{info['mtype']}]收到消息, 开始提取🎧音频..."
     if kwargs.get("show_progress"):
         res = await send2tg(client, message, texts=msg, **kwargs)
         kwargs["progress"] = res[0]
     video: str = await message.download()  # type: ignore
     if Path(video).expanduser().resolve().is_file():
-        await modify_progress(text="🎬视频下载完成, 提取🎧音频中...", force_update=True, **kwargs)
+        await modify_progress(text=f"[{info['mtype']}]下载完成, 提取🎧音频中...", force_update=True, **kwargs)
     else:
-        await modify_progress(text="🎬视频下载失败, 请稍后重试...", force_update=True, **kwargs)
+        await modify_progress(text=f"[{info['mtype']}]下载失败, 请稍后重试...", force_update=True, **kwargs)
         return
     path = convert_to_audio(video, ext="m4a")
     if not Path(path).expanduser().resolve().is_file():
@@ -67,7 +74,10 @@ async def extract_audio_file(client: Client, message: Message, **kwargs) -> None
     target_chat = kwargs["target_chat"] if kwargs.get("target_chat") else message.chat.id
     reply_msg_id = kwargs.get("reply_msg_id", 0)
     reply_parameters = get_reply_to(message.id, reply_msg_id)
-    await client.send_audio(to_int(target_chat), Path(path).as_posix(), duration=duration, reply_parameters=reply_parameters)
+    if startswith_prefix(command, prefix=[PREFIX.AUDIO]):
+        await client.send_audio(to_int(target_chat), Path(path).as_posix(), duration=duration, reply_parameters=reply_parameters)
+    elif startswith_prefix(command, prefix=[PREFIX.VOICE]):
+        await client.send_voice(to_int(target_chat), Path(path).as_posix(), duration=duration, reply_parameters=reply_parameters)
     Path(video).unlink(missing_ok=True)
     path.unlink(missing_ok=True)
     await modify_progress(del_status=True, **kwargs)
src/config.py
@@ -71,6 +71,7 @@ class PREFIX:
     CRYPTO = os.getenv("PREFIX_CRYPTO", "/crypto").lower()  # crypto only
     STOCK = os.getenv("PREFIX_STOCK", "/stock").lower()  # stock only
     COMBINATION = os.getenv("PREFIX_COMBINATION", "/combine").lower()
+    VOICE = os.getenv("PREFIX_VOICE", "/voice").lower()
 
 
 class API:
src/handler.py
@@ -278,7 +278,7 @@ def get_social_media_help(chat_id: int | str, ctype: str, prefixes: list[str] |
     if permission["asr"]:
         msg += f"\n🗣**语音转文字**: `{PREFIX.ASR}` 回复语音消息"
     if permission["audio"]:
-        msg += f"\n🎧**视频转音频**: `{PREFIX.AUDIO}` 回复视频消息"
+        msg += f"\n🎧**提取音频或语音**: `{PREFIX.AUDIO}` `{PREFIX.VOICE}` 回复消息"
     if permission["combine"]:
         msg += f"\n💬**合并历史**: `{PREFIX.COMBINATION} #N` 合并最近N条对话历史"
     if permission["ocr"]: