amine@2
|
1 """
|
amine@2
|
2 @author: Amine SEHILI <amine.sehili@gmail.com>
|
amine@2
|
3 September, 2015
|
amine@2
|
4 """
|
amine@2
|
5
|
amine@2
|
6 from auditok import ADSFactory, AudioEnergyValidator, StreamTokenizer, player_for, dataset
|
amine@10
|
7 import sys
|
amine@2
|
8
|
amine@10
|
9 try:
|
amine@2
|
10
|
amine@10
|
11 # We set the `record` argument to True so that we can rewind the source
|
amine@10
|
12 asource = ADSFactory.ads(filename=dataset.one_to_six_arabic_16000_mono_bc_noise, record=True)
|
amine@2
|
13
|
amine@10
|
14 validator = AudioEnergyValidator(sample_width=asource.get_sample_width(), energy_threshold=65)
|
amine@2
|
15
|
hoelzl@63
|
16 # Default analysis window is 10 ms (float(asource.get_block_size()) / asource.get_sampling_rate())
|
amine@10
|
17 # min_length=20 : minimum length of a valid audio activity is 20 * 10 == 200 ms
|
amine@10
|
18 # max_length=400 : maximum length of a valid audio activity is 400 * 10 == 4000 ms == 4 seconds
|
amine@10
|
19 # max_continuous_silence=30 : maximum length of a tolerated silence within a valid audio activity is 30 * 30 == 300 ms
|
amine@10
|
20 tokenizer = StreamTokenizer(validator=validator, min_length=20, max_length=400, max_continuous_silence=30)
|
amine@2
|
21
|
amine@10
|
22 asource.open()
|
amine@10
|
23 tokens = tokenizer.tokenize(asource)
|
amine@2
|
24
|
amine@10
|
25 # Play detected regions back
|
amine@10
|
26 player = player_for(asource)
|
amine@2
|
27
|
amine@10
|
28 # Rewind and read the whole signal
|
amine@10
|
29 asource.rewind()
|
amine@10
|
30 original_signal = []
|
amine@2
|
31
|
amine@10
|
32 while True:
|
amine@10
|
33 w = asource.read()
|
amine@10
|
34 if w is None:
|
amine@10
|
35 break
|
amine@10
|
36 original_signal.append(w)
|
amine@10
|
37
|
amine@2
|
38
|
amine@10
|
39 original_signal = b''.join(original_signal)
|
amine@10
|
40 player.play(original_signal)
|
amine@2
|
41
|
amine@10
|
42 print("\n ** playing detected regions...\n")
|
amine@10
|
43 for i,t in enumerate(tokens):
|
amine@10
|
44 print("Token [{0}] starts at {1} and ends at {2}".format(i+1, t[1], t[2]))
|
amine@10
|
45 data = b''.join(t[0])
|
amine@10
|
46 player.play(data)
|
amine@2
|
47
|
amine@10
|
48 assert len(tokens) == 8
|
amine@2
|
49
|
amine@10
|
50 asource.close()
|
amine@10
|
51 player.stop()
|
amine@10
|
52
|
amine@10
|
53 except KeyboardInterrupt:
|
amine@10
|
54
|
amine@10
|
55 player.stop()
|
amine@10
|
56 asource.close()
|
amine@10
|
57 sys.exit(0)
|
amine@10
|
58
|
amine@10
|
59 except Exception as e:
|
amine@10
|
60
|
amine@10
|
61 sys.stderr.write(str(e) + "\n")
|
amine@10
|
62 sys.exit(1)
|