Здравствуйте! Я хочу создать приложение наподобие "Talking Tom". Когда я говорю, запись начинается и длится это запись 5 сек а затем воспроизводится. Даже если я перестал что то говорить, пустую тишину записывает и воспроизводит. Как сделать так чтобы запись прекращалась если звук перестал поступать 2 сек. и воспроизводилось то что я сказал за N количество секунд.
Максимальное время записи хочу 10 сек. На одном форуме мне предложили следующее решение.
"Записывай несколько раз по 2 сек и все. Проверяешь, был ли какой-нибудь звук в последней записи. Если был - оставляешь и еще записываешь. Если нет, удаляешь. Потом соединяешь и воспроизводишь". Я не спец в unity, поэтому не знаю как это реализовать через скрипт. Скрипт который я использую(их 2) и они связаны между собой.(кто шарит и так поймет)
Могу скинуть полностью проект если надо!!!
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public static class GameConstants {
public const string PlayerTag = "Player";
public const string GameControllerTag = "GameController";
public const string MecanimTalk = "Talk";
public const string MecanimListen= "Listen";
public const string MecanimIdle = "Idle";
public const string MicrophoneDeviceName = null;// "Built-in Microphone";
public const int IdleRecordingLength = 1;
public const int RecordingLength = 5;
public const int RecordingFrequency = 44100;
public const int SampleDataLength = 1024;
public const float SoundThreshold = 0.025f;
} |
|
C# |
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
| enum PlayerState
{
Idle,
Listening,
Talking
}
[RequireComponent(typeof(AudioSource))]
public class GameController : MonoBehaviour {
private Animator _playerAnimator;
private PlayerState _playerState = PlayerState.Idle;
private AudioSource _audioSource;
private float[] _clipSampleData;
// Use this for initialization
void Start () {
var playerGameObject = GameObject.FindGameObjectWithTag(GameConstants.PlayerTag);
if(playerGameObject != null)
{
_playerAnimator = playerGameObject.GetComponent<Animator>();
}
_audioSource = GetComponent<AudioSource>();
_clipSampleData = new float[GameConstants.SampleDataLength]/*1024*/;
Idle();
}
// Update is called once per frame
private void Update ()
{
/*
* 1- if is in IdleState and the volume is above thresold
* we want to swith to the listen state
*/
if(_playerState == PlayerState.Idle && IsVolumeAboveThresold())
{
SwitchState();
}
}
private bool IsVolumeAboveThresold()
{
if(_audioSource.clip == null)
{
return false;
}
_audioSource.clip.GetData(_clipSampleData, _audioSource.timeSamples); //Read 1024 samples, which is about 80 ms on a 44khz stereo clip, beginning at the current sample position of the clip.
var clipLoudness = 0f;
foreach (var sample in _clipSampleData)
{
clipLoudness += Mathf.Abs(sample);
}
clipLoudness /= GameConstants.SampleDataLength;
Debug.Log("Clip Loudness = " + clipLoudness);
return clipLoudness > GameConstants.SoundThreshold;/*0.025f*/
}
private void SwitchState()
{
switch(_playerState)
{
case PlayerState.Idle:
_playerState = PlayerState.Listening;
Listen();
break;
case PlayerState.Listening:
_playerState = PlayerState.Talking;
Talk();
break;
case PlayerState.Talking:
_playerState = PlayerState.Idle;
Idle();
break;
}
}
private void Idle()
{
/*
* 1- Play Idle animation
* 2- Reset sound after playback
* 3- Contineously record the sound with the lowest duration possible
*/
if (_playerAnimator != null)
{
_playerAnimator.SetTrigger(GameConstants.MecanimIdle);
if (_audioSource.clip != null)// if playback happened
{
_audioSource.Stop();
_audioSource.clip = null;
}
_audioSource.clip = Microphone.Start(GameConstants.MicrophoneDeviceName/*null*/, true, GameConstants.IdleRecordingLength/*1 sec*/, GameConstants.RecordingFrequency/*44100*/);
}
}
private void Listen()
{
/*
* 1- Play Listen animation
* 2- Start recording user sound
* 3- Transition to talking state after some time
*/
if(_playerAnimator != null)
{
_playerAnimator.SetTrigger(GameConstants.MecanimListen);
_audioSource.clip = Microphone.Start(GameConstants.MicrophoneDeviceName /*null*/, false, GameConstants.RecordingLength/*2*/, GameConstants.RecordingFrequency/*44100*/);
Invoke("SwitchState", GameConstants.RecordingLength/*5 sec*/);
}
}
private void Talk()
{
/*
* 1- Play Talk animation
* 2- Stop Recording
* 3- Play recorded sound
* 3- Transition to Idle after the playback
*/
if (_playerAnimator != null)
{
_playerAnimator.SetTrigger(GameConstants.MecanimTalk);
Microphone.End(null);
if(_audioSource.clip != null)
{
_audioSource.Play();
}
Invoke("SwitchState", GameConstants.RecordingLength);
}
}
} |
|