Unity 使用 Microphone 采集麦克风声音

这篇具有很好参考价值的文章主要介绍了Unity 使用 Microphone 采集麦克风声音。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、获取麦克风,Microphone.devices

2、开始录音,Microphone.Start

3、结束录音,Microphone.End

1、MicrophoneWrapper

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

using System;
using UnityEngine;

public class MicrophoneWrapper : MonoSingleton<MicrophoneWrapper>
{

    private string TAG = "MicrophoneWrapper: ";

    //标记是否有麦克风
    private bool isHaveMic = false;

    //当前录音设备名称
    string currentDeviceName = string.Empty;

    //录音频率,控制录音质量(8000,16000)
    int recordFrequency = 8000;

    //上次按下时间戳
    double lastPressTimestamp = 0;

    //表示录音的最大时长
    int recordMaxLength = 10;

    //实际录音长度(由于unity的录音需先指定长度,导致识别上传时候会上传多余的无效字节)
    //通过该字段,获取有效录音长度,上传时候剪切到无效的字节数据即可
    int trueLength = 0;

    //存储录音的片段
    [HideInInspector]
    public AudioClip saveAudioClip;


    // Start is called before the first frame update
    void Start()
    {

    }


    public void Init()
    {
        //获取麦克风设备,判断是否有麦克风设备
        if (Microphone.devices.Length > 0)
        {
            isHaveMic = true;
            currentDeviceName = Microphone.devices[0];
        }
        else {
            Debug.Log(TAG + " Microphone.devices is null(0) ");
        }
    }



    /// <summary>
    /// 按下录音按钮
    /// </summary>
    /// <param name="eventData"></param>
    public void OnStartRecord()
    {

        StartRecording();
    }

    /// <summary>
    /// 放开录音按钮
    /// </summary>
    /// <param name="eventData"></param>
    public AudioClip OnStopRecord()
    {

        trueLength = EndRecording();
        if (trueLength > 1)
        {

            Debug.Log(TAG+ " return AudioClip data ");
            return saveAudioClip;
           
        }

        Debug.Log(TAG + " return AudioClip is null ");
        return null;

    }


    /// <summary>
    /// 开始录音
    /// </summary>
    /// <param name="isLoop"></param>
    /// <param name="lengthSec"></param>
    /// <param name="frequency"></param>
    /// <returns></returns>
    private bool StartRecording(bool isLoop = false) //8000,16000
    {
        Debug.Log(TAG+"StartRecording   ");

        if (isHaveMic == false || Microphone.IsRecording(currentDeviceName))
        {
            return false;
        }

        //开始录音
        /*
         * public static AudioClip Start(string deviceName, bool loop, int lengthSec, int frequency);
         * deviceName   录音设备名称.
         * loop         如果达到长度,是否继续记录
         * lengthSec    指定录音的长度.
         * frequency    音频采样率  
         */

        lastPressTimestamp = GetTimestampOfNowWithMillisecond();

        saveAudioClip = Microphone.Start(currentDeviceName, isLoop, recordMaxLength, recordFrequency);

        return true;
    }

    /// <summary>
    /// 录音结束,返回实际的录音时长
    /// </summary>
    /// <returns></returns>
    private int EndRecording()
    {
        Debug.Log(TAG+"EndRecording   ");

        if (isHaveMic == false || !Microphone.IsRecording(currentDeviceName))
        {

            Debug.Log(TAG + "EndRecording  Failed ");

            return 0;
        }

        //结束录音
        Microphone.End(currentDeviceName);

        //向上取整,避免遗漏录音末尾
        return Mathf.CeilToInt((float)(GetTimestampOfNowWithMillisecond() - lastPressTimestamp) / 1000f);
    }

    /// <summary>
    /// 获取毫秒级别的时间戳,用于计算按下录音时长
    /// </summary>
    /// <returns></returns>
    private double GetTimestampOfNowWithMillisecond()
    {
        return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000;
    }
}

2、Test_MicrophoneWrapper

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

[RequireComponent(typeof(AudioSource))]
public class Test_MicrophoneWrapper : MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{

    private AudioSource mAudioSource;
    private AudioClip mAudioClip;

    // Start is called before the first frame update
    void Start()
    {
        MicrophoneWrapper.Instance.Init();
        mAudioSource = GetComponent<AudioSource>();
    }


    public void OnPointerDown(PointerEventData eventData)
    {
        this.transform.GetChild(0).GetComponent<Text>().text = "松开播放";
        MicrophoneWrapper.Instance.OnStartRecord();
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        this.transform.GetChild(0).GetComponent<Text>().text = "按下说话录音";
        mAudioClip = MicrophoneWrapper.Instance.OnStopRecord();
        if (mAudioSource != null && mAudioClip != null)
        {
            mAudioSource.PlayOneShot(mAudioClip);
        }
        else {
            Debug.Log(" mAudioSource or mAudioClip is null ");
        }
    }
}

3、MonoSingleton

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

using UnityEngine;

public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance = null;

    private static readonly object locker = new object();

    private static bool bAppQuitting;

    public static T Instance
    {
        get
        {
            if (bAppQuitting)
            {
                instance = null;
                return instance;
            }

            lock (locker)
            {
                if (instance == null)
                {
                    // 保证场景中只有一个 单例
                    T[] managers = Object.FindObjectsOfType(typeof(T)) as T[];
                    if (managers.Length != 0)
                    {
                        if (managers.Length == 1)
                        {
                            instance = managers[0];
                            instance.gameObject.name = typeof(T).Name;
                            return instance;
                        }
                        else
                        {
                            Debug.LogError("Class " + typeof(T).Name + " exists multiple times in violation of singleton pattern. Destroying all copies");
                            foreach (T manager in managers)
                            {
                                Destroy(manager.gameObject);
                            }
                        }
                    }


                    var singleton = new GameObject();
                    instance = singleton.AddComponent<T>();
                    singleton.name = "(singleton)" + typeof(T);
                    singleton.hideFlags = HideFlags.None;
                    DontDestroyOnLoad(singleton);

                }
                instance.hideFlags = HideFlags.None;
                return instance;
            }
        }
    }

    protected virtual void Awake()
    {
        bAppQuitting = false;
    }

    protected virtual void OnDestroy()
    {
        bAppQuitting = true;
    }
}

 文章来源地址https://www.toymoban.com/news/detail-763049.html

到了这里,关于Unity 使用 Microphone 采集麦克风声音的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电脑麦克风输入没声音,如何解决

    麦克风没声音,麦克风设置问题或硬件损坏问题。 若麦克风正常工作,电脑左下角会显示图标。

    2024年02月11日
    浏览(65)
  • 成功解决电脑麦克风不管用、电脑无法录制声音之出现的麦克风Realtek(R) Audio未插入

    成功解决电脑麦克风不管用、电脑无法录制声音之出现的麦克风Realtek(R) Audio未插入 目录 1.解决问题 2.解决方法 电脑无法录制声音,经过查看发现问题,麦克风Realtek(R) Audio未插入 搜索框输入Realtek Audio Console→麦克风阵列→点击取消静音,即可! 哈哈,大功告成! 完工了!!

    2024年02月11日
    浏览(53)
  • 阵列麦克风声音定位-代码python实现-二维与三维声音定位

    FT - 傅立叶变换FT(Fourier Transform) 时域频域转换, 此链接讲的很清晰。 FFT - 快速傅里叶变换 (fast Fourier transform): 计算机计算DFT DTFT - 离散时间傅立叶变换 :时域离散,频域连续 DFT-离散傅立叶变换 :时域离散,频域也离散时域离散,频域连续 相当于对时域的连续信号进行抽

    2023年04月12日
    浏览(36)
  • 笔记本电脑没有麦克风,声音无法找到输入设备

    新买的电脑没有扬声器,电脑声音没有输入设备,在开腾讯会议的时候才发现竟然有这个问题。 网上找原因,哎,找了一大堆每一个靠谱的 这让我想起来上次电脑没有热键的问题,所有问题的终极解决方案,都在源头那里,网上的这些东西都是大家从源头那里吸收消化过的

    2024年02月07日
    浏览(62)
  • macOS录制系统声音及麦克风的三种方法

    首先下载系统声音录制驱动 blackhole ,2ch/16ch/64ch都可,一般用前两个就行了,具体参考:blackhole下载地址,安装之后前往在“audio midi setup”app中即可看到装好的驱动 创建 聚集设备(Aggregate Devices) ,并勾选刚才下载的录制系统声音的驱动,以及想要录制的麦克风(也可以使用外置

    2024年02月06日
    浏览(34)
  • 电脑麦克风没声音怎么办?这3招就可以解决!

    最近有用户在使用电脑麦克风进行视频录制时,发现麦克风没有声音。这是什么原因? 电脑麦克风没有声音怎么办?关于解决方案,我专门整理了三种方法来帮你们,一起来看看吧! 操作环境: 演示机型:华为MateBook 系统版本:Windows 10 很多人反映,win10麦克风没有声音怎么

    2024年02月09日
    浏览(48)
  • 传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集

             使用不同传感器前需要了解其连接及通信方式。对于 ESP-WROOM-32 and INMP441麦克风 是通过 I2S 方式进行通信。具体连接引脚参照下图: ESP-WROOM-32引脚示意图          使用的麦克风为MEMS麦克风,具体规格可参照芯片规格数说明。 INMP441麦克风         I2S音频连接

    2024年02月09日
    浏览(32)
  • vue前端获取/切换麦克风,播放采集音频和采集音量大小

    使用时确保你有如下依赖且版本为Vue2,终端里面运行 重要代码:audio: { deviceId: this.form.chooseMicDeviceId },将上面选的麦克风放到getUserMedia中,即可启用用户自己选择的麦克风 在sendData中可以把数据流传给后端,可以播放/下载采集到的数据流,也可以将数据流转换成file传给后端

    2024年02月08日
    浏览(33)
  • Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

    【写在前面】          之前应公司需要,给公司写过一整套直播的库( 推拉流,编解码),类似于 libobs 。         结果后来因为没有相关项目,便停止开发维护了。         不过里面很多有用的组件,然后也挺好用的,遂开源出来一部分。         因此,本篇就简单讲

    2024年04月27日
    浏览(24)
  • Android麦克风数据采集格式和常见的编码格式

    在 Android 平台上,PCM(脉冲编码调制)数据是一种常用的音频数据表示格式。PCM 是一种无损音频编码,可以捕捉和存储原始音频信号的波形。在 Android 系统中,开发人员可以使用 PCM 数据处理音频信号,以实现音频播放、录音、实时语音通信等功能。 在处理 PCM 数据时,And

    2023年04月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包