File size: 3,951 Bytes
c5c9261
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
"""
Generate test audio samples for the Voice Detection API.
Creates both human-like and AI-like audio patterns for testing.
"""
import numpy as np
import soundfile as sf
from scipy import signal
import os

def create_human_voice_sample(duration=3.0, sample_rate=16000):
    """
    Create a synthetic human-like voice sample.
    Uses multiple harmonics and natural variations.
    """
    t = np.linspace(0, duration, int(sample_rate * duration))
    
    # Fundamental frequency (typical human voice range: 85-255 Hz)
    f0 = 150  # Hz
    
    # Create harmonics (what makes it sound voice-like)
    audio = np.zeros_like(t)
    for harmonic in range(1, 8):
        frequency = f0 * harmonic
        amplitude = 1.0 / harmonic  # Decreasing amplitude for higher harmonics
        
        # Add slight frequency modulation (vibrato)
        vibrato = 5 * np.sin(2 * np.pi * 5 * t)
        audio += amplitude * np.sin(2 * np.pi * (frequency + vibrato) * t)
    
    # Add amplitude envelope (attack, sustain, release)
    envelope = np.ones_like(t)
    attack_samples = int(0.1 * sample_rate)
    release_samples = int(0.2 * sample_rate)
    
    envelope[:attack_samples] = np.linspace(0, 1, attack_samples)
    envelope[-release_samples:] = np.linspace(1, 0, release_samples)
    
    audio *= envelope
    
    # Add some noise (breath sounds)
    noise = np.random.normal(0, 0.02, len(t))
    audio += noise
    
    # Normalize
    audio = audio / np.max(np.abs(audio)) * 0.8
    
    return audio, sample_rate

def create_ai_voice_sample(duration=3.0, sample_rate=16000):
    """
    Create a synthetic AI-like voice sample.
    More regular patterns, less natural variation.
    """
    t = np.linspace(0, duration, int(sample_rate * duration))
    
    # More regular fundamental frequency
    f0 = 180  # Hz
    
    # Create very regular harmonics (AI voices tend to be more precise)
    audio = np.zeros_like(t)
    for harmonic in range(1, 10):
        frequency = f0 * harmonic
        amplitude = 1.0 / (harmonic * 1.2)
        audio += amplitude * np.sin(2 * np.pi * frequency * t)
    
    # More regular envelope
    envelope = np.ones_like(t)
    attack_samples = int(0.05 * sample_rate)
    release_samples = int(0.1 * sample_rate)
    
    envelope[:attack_samples] = np.linspace(0, 1, attack_samples)
    envelope[-release_samples:] = np.linspace(1, 0, release_samples)
    
    audio *= envelope
    
    # Less noise (AI voices are cleaner)
    noise = np.random.normal(0, 0.005, len(t))
    audio += noise
    
    # Normalize
    audio = audio / np.max(np.abs(audio)) * 0.8
    
    return audio, sample_rate

def main():
    output_dir = "tests/audio_samples"
    os.makedirs(output_dir, exist_ok=True)
    
    print("Creating test audio samples...")
    
    # Create human voice samples
    print("1. Creating human voice sample...")
    human_audio, sr = create_human_voice_sample(duration=3.0)
    human_path = os.path.join(output_dir, "human_voice_test.wav")
    sf.write(human_path, human_audio, sr)
    print(f"   ✅ Saved: {human_path}")
    
    # Create AI voice samples
    print("2. Creating AI voice sample...")
    ai_audio, sr = create_ai_voice_sample(duration=3.0)
    ai_path = os.path.join(output_dir, "ai_voice_test.wav")
    sf.write(ai_path, ai_audio, sr)
    print(f"   ✅ Saved: {ai_path}")
    
    # Create a short sample (for edge case testing)
    print("3. Creating short sample...")
    short_audio, sr = create_human_voice_sample(duration=0.5)
    short_path = os.path.join(output_dir, "short_sample.wav")
    sf.write(short_path, short_audio, sr)
    print(f"   ✅ Saved: {short_path}")
    
    print(f"\n✅ All test audio samples created in: {output_dir}")
    print("\nYou can now test these with:")
    print("  python verify.py tests/audio_samples/human_voice_test.wav")
    print("  python verify.py tests/audio_samples/ai_voice_test.wav")

if __name__ == "__main__":
    main()