С Новым годом! Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 25.02.2021
Сообщений: 2
1

Как записывать звук и воспроизвести как в "Talking Tom"?

04.03.2021, 19:56. Показов 631. Ответов 0

Author24 — интернет-сервис помощи студентам
Здравствуйте! Я хочу создать приложение наподобие "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);
        
        
        
        
        
        
        
        
        }   
    }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2021, 19:56
Ответы с готовыми решениями:

Как воспроизвести звук ?
Здравствуйте. Подскажите как сделать чтобы функция sndPlaySound могла воспроизвести звуковой файл,...

Как воспроизвести звук
люди добрые.выложите пожалуйста книжку,где показано как правильно составлять программу со звуками...

Как воспроизвести звук
Помогите пожалуйста начинающему. (с++) На форме создал 2 кнопки: 1-ая должна включать...

Как воспроизвести звук
Возможно ли написать програму в которой будут использоватся какие-то записи при нажатии...

Как воспроизвести звук программно
Всем привет, помогите плз. Не могу разобратся с воспроизведением звука. Подскажите плз простенький...

0
04.03.2021, 19:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2021, 19:56
Помогаю со студенческими работами здесь

Как воспроизвести звук из ресурсов
Ребят, подскажите пожалуйста, как из ресурсов воспроизвести звук?

Как воспроизвести mp3-звук
Всем здравствуйте. Для wav-файлов всё понятно. Воспроизвести: ...

Как воспроизвести звук в Pydroid 3?
Доброго времени суток. Как воспроизвести звук в Pydroid 3? Для тех, кто не знает, что такое...

Как записывать звук с динамиков?
Можно ли записывать звуки с динамиков/наушников, используя python? Нужно по команде...

Как воспроизвести звук по нажатию на кнопку?
Привет всем! Подскажите пожалуйста как воспроизвести звук при нажатии кнопки в Windows Forms...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru