You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.2 KiB
156 lines
5.2 KiB
using NAudio.Wave;
|
|
using Newtonsoft.Json;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace IOTContainer.Common
|
|
{
|
|
public class BaiduSpeech
|
|
{
|
|
private int deviceNumber = 0; // 选择的录音设备下标。多个设备时可设置为用户选择
|
|
private WaveIn waveIn; // waveIn操作类
|
|
private WaveFormat recordingFormat; // 录音格式
|
|
private WaveFileWriter writer; // 录音文件操作类
|
|
StringBuilder result = new StringBuilder();//存储最终识别的结果
|
|
int totalLength = 0;//用来记录总的识别后的结果的长度,判断是否超过缓存最大值
|
|
/// <summary>
|
|
/// 单例模式
|
|
/// </summary>
|
|
public static BaiduSpeech baiduSpeech
|
|
{
|
|
get
|
|
{
|
|
if (_baiduSpeech == null)
|
|
_baiduSpeech = new BaiduSpeech();
|
|
return _baiduSpeech;
|
|
}
|
|
}
|
|
|
|
private static BaiduSpeech _baiduSpeech = new BaiduSpeech();
|
|
|
|
private BaiduSpeech() { }
|
|
/// <summary>
|
|
/// 录音信息初始化
|
|
/// </summary>
|
|
public void InitSpeech()
|
|
{
|
|
try
|
|
{
|
|
recordingFormat = new WaveFormat(16000, 16, 1);
|
|
// 设置麦克风操作对象
|
|
waveIn = new WaveIn();
|
|
waveIn.DeviceNumber = deviceNumber; // 设置使用的录音设备
|
|
waveIn.DataAvailable += OnDataAviailable; // 接收到音频数据时,写入文件
|
|
waveIn.RecordingStopped += OnRecordingStopped; // 录音结束时执行
|
|
waveIn.WaveFormat = recordingFormat;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("语音初始化失败:"+ ex.ToString(), "BaiduSpeech");
|
|
}
|
|
|
|
}
|
|
/// <summary>
|
|
/// 开始录音
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
internal bool StartRecorder(string filename = "speech.wav")
|
|
{
|
|
try
|
|
{
|
|
totalLength = 0;
|
|
// 设置文件操作类
|
|
writer = new WaveFileWriter(filename, recordingFormat);
|
|
result.Clear();
|
|
// 开始录音
|
|
waveIn.StartRecording();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//结束录音
|
|
StopRecorder();
|
|
Log.MyLog.WriteLogFile("录音失败:" + ex.ToString(), "BaiduSpeech");
|
|
}
|
|
return true;
|
|
}
|
|
/// <summary>
|
|
/// 结束录音
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
internal bool StopRecorder()
|
|
{
|
|
waveIn.StopRecording();
|
|
return true;
|
|
}
|
|
/// <summary>
|
|
/// 录音回调函数,写入数据
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void OnDataAviailable(object sender, WaveInEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
byte[] buffer = e.Buffer;
|
|
int bytesRecorded = e.BytesRecorded;
|
|
long maxFileLength = this.recordingFormat.AverageBytesPerSecond * 60;
|
|
var toWrite = (int)Math.Min(maxFileLength - writer.Length, bytesRecorded);
|
|
if (toWrite > 0)
|
|
{
|
|
writer.Write(buffer, 0, bytesRecorded);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("录音写入失败:" + ex.ToString(), "BaiduSpeech");
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 录音结束回调函数
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void OnRecordingStopped(object sender, StoppedEventArgs e)
|
|
{
|
|
writer.Dispose();
|
|
BaiduSpeechApi();
|
|
}
|
|
/// <summary>
|
|
/// 百度语音识别
|
|
/// </summary>
|
|
private string BaiduSpeechApi()
|
|
{
|
|
try
|
|
{
|
|
var APP_ID = "";
|
|
var API_KEY = "";
|
|
var SECRET_KEY = "";
|
|
|
|
var client = new Baidu.Aip.Speech.Asr(APP_ID, API_KEY, SECRET_KEY);
|
|
client.Timeout = 30000; // 修改超时时间
|
|
var data = File.ReadAllBytes("speech.wav");
|
|
// 可选参数
|
|
var options = new Dictionary<string, object>
|
|
{
|
|
{"dev_pid", 1537} //语音模型1536代表普通话,其他请查看官方文档
|
|
};
|
|
client.Timeout = 120000; // 若语音较长,建议设置更大的超时时间. ms
|
|
var result = client.Recognize(data, "pcm", 16000, options);
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
Log.MyLog.WriteLogFile("百度语音识别失败:" + ex.ToString(), "BaiduSpeech");
|
|
return null;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|