Commit 680731c3 authored by lmj_521aiau@163.com's avatar lmj_521aiau@163.com

record

parent f65f329d
......@@ -232,6 +232,13 @@
name = Frameworks;
sourceTree = "<group>";
};
A94D935524F75CE700A886C0 /* Goods */ = {
isa = PBXGroup;
children = (
);
path = Goods;
sourceTree = "<group>";
};
A950F5AD24F4E003007AB63E /* Mine */ = {
isa = PBXGroup;
children = (
......@@ -298,6 +305,7 @@
A95CDF6624E0E8B50066DAE6 /* ShorthandMaster */ = {
isa = PBXGroup;
children = (
A94D935524F75CE700A886C0 /* Goods */,
A950F5B224F4E5A4007AB63E /* Other */,
A950F5AD24F4E003007AB63E /* Mine */,
A95CE03024E151730066DAE6 /* Record */,
......
......@@ -60,16 +60,16 @@ extension SHBaseNavigationController {
/// 重写show 影藏底部tabBar
override func show(_ vc: UIViewController, sender: Any?) {
if children.count > 0 {
// if children.count > 0 {
vc.hidesBottomBarWhenPushed = true
}
// }
super.show(vc, sender: sender)
}
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
if children.count > 0 {
// if children.count > 0 {
viewController.hidesBottomBarWhenPushed = true
}
// }
super.pushViewController(viewController, animated: animated)
}
......
......@@ -39,11 +39,11 @@ class SHBaseTabBarController: UITabBarController {
/// MARK: - 设置子控制器
func configControllers() {
let recordVC = UIStoryboard.init(name: "Record", bundle: nil).instantiateViewController(withIdentifier: "SHRecordViewController") as! SHRecordViewController
addChildVC(vc: recordVC, title: "", image: nil, selectedImage: nil)
// let recordVC = UIStoryboard.init(name: "Record", bundle: nil).instantiateViewController(withIdentifier: "SHRecordListViewController") as! SHRecordListViewController
// let recordVC = UIStoryboard.init(name: "Record", bundle: nil).instantiateViewController(withIdentifier: "SHRecordViewController") as! SHRecordViewController
// addChildVC(vc: recordVC, title: "", image: nil, selectedImage: nil)
let recordVC = UIStoryboard.init(name: "Record", bundle: nil).instantiateViewController(withIdentifier: "SHRecordListViewController") as! SHRecordListViewController
addChildVC(vc: recordVC, title: "", image: nil, selectedImage: nil)
}
/// 添加子控制器
......
......@@ -131,7 +131,7 @@
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="KgC-Ev-sCF">
<rect key="frame" x="0.0" y="44" width="414" height="818"/>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<view key="tableFooterView" contentMode="scaleToFill" id="GRL-bF-Wja">
<view key="tableFooterView" hidden="YES" contentMode="scaleToFill" id="GRL-bF-Wja">
<rect key="frame" x="0.0" y="99.5" width="414" height="159"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
......
......@@ -16,7 +16,7 @@
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rxv-bX-pim">
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rxv-bX-pim">
<rect key="frame" x="0.0" y="44" width="414" height="818"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="点击下方按钮开始会议记录" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e3a-rx-wr2">
......@@ -32,16 +32,9 @@
<constraint firstItem="e3a-rx-wr2" firstAttribute="centerY" secondItem="rxv-bX-pim" secondAttribute="centerY" id="aL1-ev-06b"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aLh-GB-qed">
<rect key="frame" x="20" y="68" width="42" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" editable="NO" textAlignment="natural" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CuZ-hk-v6W">
<rect key="frame" x="20" y="110" width="374" height="431"/>
<rect key="frame" x="0.0" y="44" width="414" height="497"/>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.</string>
<color key="textColor" red="0.13333333333333333" green="0.13333333333333333" blue="0.13333333333333333" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
......@@ -67,24 +60,22 @@
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<constraints>
<constraint firstItem="aLh-GB-qed" firstAttribute="leading" secondItem="DaM-yZ-bVa" secondAttribute="leading" constant="20" id="3It-jy-KaD"/>
<constraint firstItem="q70-64-27V" firstAttribute="centerX" secondItem="DaM-yZ-bVa" secondAttribute="centerX" id="41z-K6-gpE"/>
<constraint firstItem="DjF-HA-js1" firstAttribute="trailing" secondItem="rxv-bX-pim" secondAttribute="trailing" id="6qs-X2-heL"/>
<constraint firstItem="rxv-bX-pim" firstAttribute="top" secondItem="DjF-HA-js1" secondAttribute="top" id="AQZ-df-zOe"/>
<constraint firstItem="clS-Cs-9Yq" firstAttribute="centerX" secondItem="DaM-yZ-bVa" secondAttribute="centerX" id="GOg-af-vD1"/>
<constraint firstItem="DjF-HA-js1" firstAttribute="trailing" secondItem="K9L-No-SyF" secondAttribute="trailing" id="Ivi-Wu-EcZ"/>
<constraint firstItem="CuZ-hk-v6W" firstAttribute="top" secondItem="DjF-HA-js1" secondAttribute="top" constant="66" id="SAI-k0-xV4"/>
<constraint firstItem="CuZ-hk-v6W" firstAttribute="top" secondItem="DjF-HA-js1" secondAttribute="top" id="SAI-k0-xV4"/>
<constraint firstItem="clS-Cs-9Yq" firstAttribute="centerY" secondItem="DaM-yZ-bVa" secondAttribute="centerY" multiplier="1.3" id="TIY-qq-iTt"/>
<constraint firstItem="clS-Cs-9Yq" firstAttribute="top" secondItem="CuZ-hk-v6W" secondAttribute="bottom" constant="20" id="VRW-sn-wwI"/>
<constraint firstItem="DjF-HA-js1" firstAttribute="trailing" secondItem="CuZ-hk-v6W" secondAttribute="trailing" constant="20" id="WLe-kH-sd5"/>
<constraint firstItem="aLh-GB-qed" firstAttribute="top" secondItem="DjF-HA-js1" secondAttribute="top" constant="24" id="dU7-dm-SJD"/>
<constraint firstItem="DjF-HA-js1" firstAttribute="trailing" secondItem="CuZ-hk-v6W" secondAttribute="trailing" id="WLe-kH-sd5"/>
<constraint firstItem="DjF-HA-js1" firstAttribute="bottom" secondItem="rxv-bX-pim" secondAttribute="bottom" id="emW-tz-PTn"/>
<constraint firstItem="q70-64-27V" firstAttribute="centerY" secondItem="DaM-yZ-bVa" secondAttribute="centerY" multiplier="1.7" id="fKQ-PL-Ctd"/>
<constraint firstItem="q70-64-27V" firstAttribute="top" secondItem="K9L-No-SyF" secondAttribute="bottom" id="gBP-hN-9zZ"/>
<constraint firstItem="K9L-No-SyF" firstAttribute="top" secondItem="clS-Cs-9Yq" secondAttribute="bottom" id="gOw-3s-ab5"/>
<constraint firstItem="K9L-No-SyF" firstAttribute="leading" secondItem="DjF-HA-js1" secondAttribute="leading" id="kfe-hx-KQS"/>
<constraint firstItem="rxv-bX-pim" firstAttribute="leading" secondItem="DjF-HA-js1" secondAttribute="leading" id="rbK-25-QCL"/>
<constraint firstItem="CuZ-hk-v6W" firstAttribute="leading" secondItem="DjF-HA-js1" secondAttribute="leading" constant="20" id="ssg-m3-z6O"/>
<constraint firstItem="CuZ-hk-v6W" firstAttribute="leading" secondItem="DjF-HA-js1" secondAttribute="leading" id="ssg-m3-z6O"/>
</constraints>
<viewLayoutGuide key="safeArea" id="DjF-HA-js1"/>
</view>
......@@ -159,12 +150,22 @@
<outlet property="delegate" destination="wHB-ed-c6Y" id="DR7-ka-L5N"/>
</connections>
</tableView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hcc-3O-zgx">
<rect key="frame" x="169" y="723.5" width="76" height="76"/>
<state key="normal" image="record_start"/>
<state key="selected" image="record_stop"/>
<connections>
<action selector="goRecord" destination="wHB-ed-c6Y" eventType="touchUpInside" id="Uju-87-FZr"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<constraints>
<constraint firstItem="Fqf-Ut-95k" firstAttribute="leading" secondItem="DUU-FR-ISH" secondAttribute="leading" id="49u-LG-QQe"/>
<constraint firstItem="hcc-3O-zgx" firstAttribute="centerY" secondItem="Iqb-8q-lkf" secondAttribute="centerY" multiplier="1.7" id="641-XT-zpb"/>
<constraint firstItem="Fqf-Ut-95k" firstAttribute="top" secondItem="DUU-FR-ISH" secondAttribute="top" id="Y0T-Gz-EAD"/>
<constraint firstItem="DUU-FR-ISH" firstAttribute="trailing" secondItem="Fqf-Ut-95k" secondAttribute="trailing" id="aj8-fl-bCj"/>
<constraint firstItem="hcc-3O-zgx" firstAttribute="centerX" secondItem="Iqb-8q-lkf" secondAttribute="centerX" id="rZl-92-1Fz"/>
<constraint firstItem="DUU-FR-ISH" firstAttribute="bottom" secondItem="Fqf-Ut-95k" secondAttribute="bottom" id="z9J-KI-C16"/>
</constraints>
<viewLayoutGuide key="safeArea" id="DUU-FR-ISH"/>
......@@ -175,7 +176,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="r5a-Mv-IXk" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="937.68115942028987" y="42.857142857142854"/>
<point key="canvasLocation" x="978" y="123"/>
</scene>
<!--Record Show View Controller-->
<scene sceneID="sKQ-sR-22k">
......
......@@ -30,6 +30,7 @@ class SHRecordExportAlertView: UIView {
}
@objc @IBAction func cancelBtnClick(_ sender:UIButton){
selectedIndexCallBack?(404)
self.removeFromSuperview()
}
......
......@@ -60,7 +60,6 @@ class SHRecordListViewController: SHBaseViewController {
self.tableView?.deleteRows(at: [indexPath], with: .left)
self.tableView?.endUpdates()
// let range: Range = model.pathFile.range(of: "/record.wav")!
// let location: Int = model.pathFile.distance(from: model.pathFile.startIndex, to: range.lowerBound)
// let subStr = model.pathFile.prefix(location)
......@@ -86,6 +85,11 @@ class SHRecordListViewController: SHBaseViewController {
let mine = UIStoryboard.init(name: "Mine", bundle: nil).instantiateViewController(withIdentifier: "SHMineViewController") as! SHMineViewController
self.navigationController?.pushViewController(mine, animated: true)
}
@IBAction func goRecord(){
let record = UIStoryboard.init(name: "Record", bundle: nil).instantiateViewController(withIdentifier: "SHRecordViewController") as! SHRecordViewController
self.navigationController?.pushViewController(record, animated: true)
}
}
extension SHRecordListViewController: UITableViewDelegate, UITableViewDataSource{
......
......@@ -85,7 +85,7 @@ class SHRecordShowViewController: SHBaseViewController {
// 如果 result 不是 nil,
if result != nil {
// 将 textView.text 设置为 result 的最佳音译
self.recordTextView?.text = result?.bestTranscription.formattedString
self.recordTextView?.attributedText = self.textView_text(result?.bestTranscription.formattedString ?? "")
// 如果 result 是最终,将 isFinal 设置为 true
isFinal = (result?.isFinal)!
}
......@@ -114,7 +114,7 @@ class SHRecordShowViewController: SHBaseViewController {
self.navigationItem.titleView = titleLab
// recordTextView.attributedText = self.textView_text(model!.txt)
recordTextView?.attributedText = self.textView_text("想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽想找个文组/同好交流群治一治懒癌如题!想要进个群治治懒癌!有的话dd一下谢谢啦!么么主要是原耽,但不限于原耽")
recordTextView?.attributedText = self.textView_text("")
recordTextView?.textContainerInset = UIEdgeInsets.init(top: 20, left: 20, bottom: 20, right: 30)
recordTextView?.isEditable = false
......@@ -243,11 +243,12 @@ class SHRecordShowViewController: SHBaseViewController {
let timeRange = content.range(of: time)
let addressRange = content.range(of: address)
let textRange = content.range(of: text)
let attStr = NSMutableAttributedString.init(string: content)
attStr.addAttributes([.font:UIFont.boldSystemFont(ofSize: 18)], range: NSRange(timeRange!, in: content))
attStr.addAttributes([.font:UIFont.boldSystemFont(ofSize: 18)], range: NSRange(addressRange!, in: content))
attStr.addAttributes([.font:UIFont.systemFont(ofSize: 18)], range: NSRange(textRange!, in: content))
if let textRange = content.range(of: text) {
attStr.addAttributes([.font:UIFont.systemFont(ofSize: 18)], range: NSRange(textRange, in: content))
}
return attStr
}
......@@ -268,7 +269,7 @@ class SHRecordShowViewController: SHBaseViewController {
}
@IBAction func copyBtn(_ sender:UIButton){
if self.recordTextView?.text.length == 0 {
if self.model?.txt.length == 0 {
return
}
let board = UIPasteboard.general
......
......@@ -9,6 +9,7 @@
import UIKit
import AVFoundation
import Speech
import PDFGenerator
class SHRecordViewController: SHBaseViewController {
......@@ -18,9 +19,11 @@ class SHRecordViewController: SHBaseViewController {
@IBOutlet var waveBgView: UIView!
@IBOutlet var secondsLabel: UILabel!
@IBOutlet var recorderBtn: UIButton!
@IBOutlet var maskView: UIView!
private var currentModel: SHRecordModel?
private var currentTxt: String?
private var start: Bool = false
private var save: Bool = false
......@@ -64,8 +67,7 @@ class SHRecordViewController: SHBaseViewController {
// 语音引擎,负责提供录音输入
private var audioEngine = AVAudioEngine()
// 文本数据
private var recognitionTaskText: [String]!
private var recognitionTaskText: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
......@@ -73,7 +75,6 @@ class SHRecordViewController: SHBaseViewController {
setupUI()
configPathFile()
configRecorder()
configSpeech()
}
override func setupUI() {
......@@ -84,21 +85,18 @@ class SHRecordViewController: SHBaseViewController {
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(image: UIImage.init(named: "record_nav_user"), style: .plain, target: self, action: #selector(userCilck))
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(image: UIImage.init(named: "record_nav_confirm"), style: .plain, target: self, action: #selector(confirmCilck))
// if CRUserDefaults.isFirstInstall == false{
// let guide = SHRecordGuideView.init(frame: UIApplication.shared.keyWindow!.bounds)
// UIApplication.shared.keyWindow!.addSubview(guide)
// CRUserDefaults.isFirstInstall = true
// }
let export = SHRecordExportAlertView.loadFromNibAndClass(SHRecordExportAlertView.self)!
export.frame = UIApplication.shared.keyWindow!.bounds
UIApplication.shared.keyWindow!.addSubview(export)
export.selectedIndexCallBack = { index in
}
self.view.layoutIfNeeded()
self.view.layoutSubviews()
recordTextView?.attributedText = self.textView_text("")
recordTextView?.textContainerInset = UIEdgeInsets.init(top: 20, left: 20, bottom: 20, right: 30)
recordTextView?.isEditable = false
waveView = SHRecordWaveView(frame: waveBgView.bounds, type: .line, capacity: soundMeterCount)
waveBgView.addSubview(waveView)
}
func setNavTitleAndConfirmBtn(){
let titleLab = UILabel()
titleLab.frame = CGRect.init(x: 0, y: 0, width: 200, height: 44)
......@@ -107,14 +105,116 @@ class SHRecordViewController: SHBaseViewController {
titleLab.font = UIFont.systemFont(ofSize: 16)
titleLab.textAlignment = .center
titleLab.adjustsFontSizeToFitWidth = true
self.navigationItem.titleView = titleLab
self.view.layoutIfNeeded()
self.view.layoutSubviews()
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(image: UIImage.init(named: "record_nav_confirm"), style: .plain, target: self, action: #selector(confirmCilck))
if CRUserDefaults.isFirstInstall == false{
let guide = SHRecordGuideView.init(frame: UIApplication.shared.keyWindow!.bounds)
UIApplication.shared.keyWindow!.addSubview(guide)
CRUserDefaults.isFirstInstall = true
}
}
waveView = SHRecordWaveView(frame: waveBgView.bounds, type: .line, capacity: soundMeterCount)
waveBgView.addSubview(waveView)
@objc func confirmCilck(){
stopRecord()
save = true
saveContent()
let export = SHRecordExportAlertView.loadFromNibAndClass(SHRecordExportAlertView.self)!
export.frame = UIApplication.shared.keyWindow!.bounds
UIApplication.shared.keyWindow!.addSubview(export)
export.selectedIndexCallBack = { index in
if index == 0 {
self.copyBtn()
} else if index == 1{
self.generatePDF()
} else if index == 2{
self.generateWav()
} else if index == 404{
if self.save == true {
self.currentTxt = ""
self.recognitionTaskText = []
self.recorderBtn.setImage(UIImage.init(named: "record_start"), for: .normal)
self.recordTextView.attributedText = self.textView_text("")
self.configPathFile()
self.configRecorder()
self.recorderBtn.isSelected = false
self.secondsLabel.text = "00:00:00"
self.seconds = 0
self.save = false
self.recorder = self.getRecorder()
}
}
}
}
@objc func userCilck(){
if let txt = recognitionTaskText.first, txt.length == 0 {
return
}
// play()
stopRecord()
save = true
if save == true {
currentTxt = ""
recognitionTaskText = []
recorderBtn.setImage(UIImage.init(named: "record_start"), for: .normal)
recordTextView.attributedText = self.textView_text("")
configPathFile()
configRecorder()
recorderBtn.isSelected = false
secondsLabel.text = "00:00:00"
seconds = 0
save = false
recorder = self.getRecorder()
}
let mine = UIStoryboard.init(name: "Mine", bundle: nil).instantiateViewController(withIdentifier: "SHMineViewController") as! SHMineViewController
self.navigationController?.pushViewController(mine, animated: true)
}
@objc @IBAction func recordBtnClick(_ sender:UIButton){
setNavTitleAndConfirmBtn()
sender.setImage(UIImage.init(named: "record_pause"), for: .normal)
sender.isSelected = !sender.isSelected
if sender.isSelected == true {
self.view.sendSubviewToBack(maskView)
recorder?.record()
start = true
configSpeechTask()
waveTimer = SHTimer.scheduledTimer(timeInterval: updateFequency, target: self, selector: #selector(updateMeters), userInfo: nil, repeats: true)
secondTimer = SHTimer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(countSecond), userInfo: nil, repeats: true)
}else{
recorder?.pause()
start = false
if self.recognitionTaskText.count == 0 {
self.recognitionTaskText.append((self.currentTxt ?? "") + "\n")
}else{
var s = ""
if let text = self.currentTxt, text.length > 0 {
s = self.recognitionTaskText.first! + text + "\n"
} else{
s = self.recognitionTaskText.first!
}
self.currentTxt = s
self.recognitionTaskText[0] = s
}
self.currentTxt = ""
speechStop()
timerInvalidate()
}
}
private func getRecorder() -> AVAudioRecorder?{
......@@ -207,10 +307,6 @@ class SHRecordViewController: SHBaseViewController {
catch { print("session active failed") }
}
private func configSpeech(){
recognitionTaskText = [String]()
}
private func configSpeechTask(){
audioEngine = AVAudioEngine()
......@@ -225,10 +321,11 @@ class SHRecordViewController: SHBaseViewController {
// 如果 result 不是 nil,
if result != nil {
// 将 textView.text 设置为 result 的最佳音译
self.currentTxt = result?.bestTranscription.formattedString
if self.recognitionTaskText.count == 0 {
self.recordTextView.text = result?.bestTranscription.formattedString
self.recordTextView.attributedText = self.textView_text(result?.bestTranscription.formattedString ?? "")
}else{
self.recordTextView.text = self.recognitionTaskText.first! + (result?.bestTranscription.formattedString)!
self.recordTextView.attributedText = self.textView_text(self.recognitionTaskText.first! + (result?.bestTranscription.formattedString)!)
}
// 如果 result 是最终,将 isFinal 设置为 true
isFinal = (result?.isFinal)!
......@@ -238,9 +335,15 @@ class SHRecordViewController: SHBaseViewController {
if error != nil || isFinal {
if self.recognitionTaskText.count == 0 {
self.recognitionTaskText.append(self.recordTextView.text)
self.recognitionTaskText.append((self.currentTxt ?? "") + "\n")
}else{
self.recognitionTaskText[0] = self.recordTextView.text
var s = ""
if let text = self.currentTxt, text.length > 0 {
s = self.recognitionTaskText.first! + text + "\n"
} else{
s = self.recognitionTaskText.first!
}
self.recognitionTaskText[0] = s
}
if self.recorderBtn.isSelected == true {
......@@ -269,66 +372,7 @@ class SHRecordViewController: SHBaseViewController {
print("audioEngine couldn't start because of an error.")
}
}
@objc func userCilck(){
play()
if recordTextView.text.length == 0{
return
}
saveContent()
if save == true {
recorderBtn.setImage(UIImage.init(named: "record_start"), for: .normal)
recordTextView.text = nil
configPathFile()
configRecorder()
configSpeech()
recorderBtn.isSelected = false
secondsLabel.text = "00:00:00"
seconds = 0
save = false
recorder = self.getRecorder()
}
}
@objc func confirmCilck(){
stopRecord()
save = true
}
@objc @IBAction func recordBtnClick(_ sender:UIButton){
sender.setImage(UIImage.init(named: "record_pause"), for: .normal)
sender.isSelected = !sender.isSelected
if sender.isSelected == true {
self.view.sendSubviewToBack(maskView)
recorder?.record()
start = true
configSpeechTask()
waveTimer = SHTimer.scheduledTimer(timeInterval: updateFequency, target: self, selector: #selector(updateMeters), userInfo: nil, repeats: true)
secondTimer = SHTimer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(countSecond), userInfo: nil, repeats: true)
}else{
recorder?.pause()
start = false
if self.recognitionTaskText.count == 0 {
self.recognitionTaskText.append(self.recordTextView.text)
}else{
self.recognitionTaskText[0] = self.recordTextView.text
}
self.recognitionTaskText.append(self.recordTextView.text)
speechStop()
timerInvalidate()
}
}
//结束录音
func stopRecord() {
if let recorder = self.recorder {
......@@ -339,8 +383,6 @@ class SHRecordViewController: SHBaseViewController {
}
recorder.stop()
// self.recorder = nil
speechStop()
timerInvalidate()
}else {
......@@ -349,14 +391,11 @@ class SHRecordViewController: SHBaseViewController {
}
func saveContent(){
if self.recordTextView.text.length == 0{
return
}
let model = SHRecordModel()
model.time = Date()
model.address = ""
model.txt = self.recordTextView.text
model.txt = recognitionTaskText.first ?? ""
model.pathFile = postfix_wav_file_path
model.during = seconds
......@@ -369,6 +408,8 @@ class SHRecordViewController: SHBaseViewController {
list?.append(dic)
}
CRUserDefaults.recordList = list
currentModel = model
}
func timerInvalidate(){
......@@ -467,9 +508,82 @@ extension SHRecordViewController{
} catch let error as NSError {
print("get file path error: \(error)")
}
return filePaths;
}
func textView_text(_ text:String) -> NSAttributedString {
let address = "地点: "
let content = address + "\n \n" + text
let addressRange = content.range(of: address)
let attStr = NSMutableAttributedString.init(string: content)
attStr.addAttributes([.font:UIFont.boldSystemFont(ofSize: 18)], range: NSRange(addressRange!, in: content))
if let textRange = content.range(of: text) {
attStr.addAttributes([.font:UIFont.systemFont(ofSize: 18)], range: NSRange(textRange, in: content))
}
return attStr
}
private func copyBtn(){
if self.recordTextView?.text.length == 0 {
return
}
let board = UIPasteboard.general
board.string = self.recordTextView?.text
}
private func generatePDF() {
do {
let range: Range = currentModel!.pathFile.range(of: "/record.wav")!
let location: Int = currentModel!.pathFile.distance(from: currentModel!.pathFile.startIndex, to: range.lowerBound)
let subStr = currentModel!.pathFile.prefix(location)
let documentsFile = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first)!+subStr+"/txt.pdf"
try PDFGenerator.generate(self.recordTextView!, to: documentsFile)
//此三方会把传入控件约束移除 需重新添加
self.recordTextView?.snp.makeConstraints({ (maker) in
maker.top.left.right.equalToSuperview()
maker.bottom.equalTo(secondsLabel.snp.top).offset(-20)
})
// let webvc = SHWebViewController.init()
// webvc.url = documentsFile
// self.navigationController?.pushViewController(webvc, animated: true)
let fileURL = URL.init(fileURLWithPath: documentsFile)
let data = try Data.init(contentsOf: fileURL)
let activityVC = UIActivityViewController(activityItems: [data, fileURL], applicationActivities: nil)
activityVC.completionWithItemsHandler = {
activity, success, items, errot in
// result
}
present(activityVC, animated: true, completion: nil)
} catch let error {
print(error)
}
}
private func generateWav() {
do{
let documentsFile_wav = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first)!.appending(currentModel!.pathFile)
let fileURL_wav = URL.init(fileURLWithPath: documentsFile_wav)
let data_wav = try Data.init(contentsOf: fileURL_wav)
let activityVC = UIActivityViewController(activityItems: [data_wav, fileURL_wav], applicationActivities: nil)
activityVC.completionWithItemsHandler = {
activity, success, items, errot in
// result
}
present(activityVC, animated: true, completion: nil)
} catch let error {
print(error)
}
}
}
extension SHRecordViewController: SFSpeechRecognizerDelegate {
......
......@@ -3,7 +3,6 @@
//
#import "MBProgressHUD+MJ.h"
#import "ZJOauthLoginConfig.h"
//#import "LameTool.h"
#import "AESCipher.h"
#import "UIView+CornerRadii.h"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment