Kaynağa Gözat

语音包增益3x放大,生成脚本增加后处理幅值放大

lsfoo 3 ay önce
ebeveyn
işleme
32725fdb17

BIN
assets/voices/arrive_1.wav


BIN
assets/voices/arrive_2.wav


BIN
assets/voices/arrive_3.wav


BIN
assets/voices/arrive_4.wav


BIN
assets/voices/arrive_5.wav


BIN
assets/voices/hooking.wav


BIN
assets/voices/ready.wav


BIN
assets/voices/releasing.wav


+ 6 - 0
autostart_diag.txt

@@ -0,0 +1,6 @@
+sys.executable = D:\miniconda3\envs\hookvision\python.exe
+sys.platform = win32
+frozen = False
+config_path = C:\Users\lsfoo\AppData\Roaming\HookVision\autostart.json
+JSON OK: {'enabled': True}
+Registry OK: D:\miniconda3\envs\hookvision\python.exe

+ 33 - 1
tools/generate_voices.py

@@ -17,6 +17,7 @@ VOICES = {
 
 
 def main():
+    import struct
     os.makedirs(OUTPUT_DIR, exist_ok=True)
 
     import win32com.client
@@ -36,7 +37,38 @@ def main():
         speaker.AudioOutputStream = stream
         speaker.Speak(text)
         stream.Close()
-        print(f"生成: {path}")
+        with open(path, 'rb+') as f:
+            data = bytearray(f.read())
+        fmt_chunk = b'fmt '
+        fmt_pos = data.find(fmt_chunk)
+        if fmt_pos == -1:
+            print(f"  跳过音量放大(无 fmt chunk)")
+        else:
+            channels = struct.unpack_from('<H', data, fmt_pos + 10)[0]
+            sample_rate = struct.unpack_from('<I', data, fmt_pos + 12)[0]
+            bits_per_sample = struct.unpack_from('<H', data, fmt_pos + 22)[0]
+            data_chunk = b'data'
+            data_pos = data.find(data_chunk)
+            if data_pos != -1:
+                data_size = struct.unpack_from('<I', data, data_pos + 4)[0]
+                sample_start = data_pos + 8
+                sample_end = sample_start + data_size
+                if bits_per_sample == 16:
+                    fmt = '<' + 'h' * (data_size // 2)
+                    samples = list(struct.unpack_from(fmt, bytes(data[sample_start:sample_end])))
+                    gain = 3.0
+                    samples = [max(-32768, min(32767, int(s * gain))) for s in samples]
+                    data[sample_start:sample_end] = struct.pack(fmt, *samples)
+                elif bits_per_sample == 8:
+                    samples = list(data[sample_start:sample_end])
+                    gain = 3.0
+                    samples = [max(0, min(255, int((s - 128) * gain) + 128)) for s in samples]
+                    data[sample_start:sample_end] = bytes(samples)
+                with open(path, 'wb') as f:
+                    f.write(data)
+                print(f"生成: {path} (增益 {gain}x, {sample_rate}Hz, {bits_per_sample}bit, {channels}ch)")
+            else:
+                print(f"生成: {path} (无 data chunk)")
 
 
 if __name__ == "__main__":