我可以使用语音识别来编写SQL吗?

39

当我在打字时手腕会疼痛,因此我希望开始使用语音识别来编写SQL语句、存储过程和视图。


1
对于任何对语音识别感兴趣的人,我建议在Chromium项目中为此错误修复投票:https://code.google.com/p/chromium/issues/detail?id=120113&q=speech%20grammar&colspec=ID%20Pri%20Mstone%20ReleaseBlock%20Area%20Feature%20Status%20Owner%20Summary#makechanges - Keith Walton
2个回答

72
是的。SQL很适合语音识别(尽管只是像编程语言一样适合),因为它有限的词汇和类似句子的结构。除了格式化SQL使其看起来漂亮之外,我可以比打字更快地口述代码。然而,并非所有人都适合口述代码。在开始时,这可能会令人非常沮丧。那些尝试并坚持下去的人可能是别无选择的人。
我使用的是Dragon NaturallySpeaking 10 Professional。专业版具有创建此类自定义词汇所需的工具。版本9也应该可以正常工作。它很昂贵,因此如果可能的话,请让您工作的公司为其支付费用。还需要一个体面的耳机麦克风。NaturallySpeaking附带的那个不够好(但您可能要先尝试一下,看看它是否适合您)。KnowBrainer是一个提供麦克风建议的好地方。 2009-01-05更新:我已经添加了下面的提示,特定于在SQL Server Management Studio中口述。 2012-01-04更新:我一直在跟踪Microsoft的WSR,希望能够添加工具以轻松创建完全自定义的词汇表,就像我在本教程中使用NaturallySpeaking所做的那样。不幸的是,似乎只能通过API(SAPI)完成此操作。我没有时间编写那些代码,因此在有更好的东西出现之前,我将继续使用NaturallySpeaking编写代码。

准备工作

清理您的数据库名称和代码

如果要口述"SELECT PT_17, PT_28, PT_29 FROM HIK.dbo.PATINFO",那将会很麻烦,但我想这是可能的。你需要设置很多发音,因为NaturallySpeaking不知道"PT_17"应该如何发音。以下方式更适合口述:

SELECT Patient.FirstName, Patient.MiddleName, Patient.LastName FROM Claim.dbo.Patient AS Patient WHERE Patient.LastName LIKE '%smith%'

我切换到我的TSQL词汇来口述上述语句。一直到LIKE语句的所有内容都按原样说出。'%smith%'被口述为“开单引号百分号塞拉迈克印度塔戈酒店百分号闭单引号[暂停]连接词”。使用一致的表别名并始终在字段之前加上它们有助于提高准确性,因为NaturallySpeaking会统计一个单词在另一个单词附近出现的频率。

创建SQL关键字列表

每行放一个单词。您可以选择在单词后面跟着反斜杠(\)和发音。NaturallySpeaking使用一个小型备用词典来确定您添加到词汇表中的单词的发音,因此它没有问题确定SELECTFROMWHERE的发音。它有时可以确定复合词,并且对于像XACT_ABORT这样的东西,它会尽最大努力猜测。我会为这些情况提供发音。您使用的数据库将确定列表包含哪些单词 - 请检查文档以获取关键字列表。您的列表将类似于以下内容,但更长。

SELECT
WHERE
FROM
XACT_ABORT\exact-abort
MAXDOP
NOLOCK\no-lock
LEN
RETURNS
CURSOR
MONEY    

还要添加这些单词

\New-Line
\New-Paragraph
\All-Caps
\All-Caps-On
\All-Caps-Off
\Cap
\Caps-On
\Caps-Off
\No-Caps
\No-Caps-On
\No-Caps-Off
\No-Space
\No-Space-On
\No-Space-Off
\space-bar
\tab-key
a\alpha
b\bravo
c\charlie
d\delta
e\echo
f\foxtrot
g\golf
h\hotel
i\india
j\juliet
k\kilo
l\lima
m\mike
n\november
o\oscar
p\papa
q\quebec
r\romeo
s\sierra
t\tango
u\uniform
v\victor
w\whiskey
x\xray
y\yankee
z\zulu
PM
AM
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
thirteen
fourteen
fifteen
sixteen
seventeen
eighteen
nineteen
twenty
thirty
fourty
fifty
sixty
seventy
eighty
ninety
hundred
thousand
million
billion
trillion

保留此列表,因为您可能需要多次修改并重新创建词汇表以使其符合您的喜好。

创建数据库对象名称的单词列表

这是我在SQL Server中的做法:

SELECT DISTINCT * FROM 
(
SELECT DISTINCT [name] FROM Database1.[dbo].[sysobjects] WHERE xtype not IN ('F', 'S', 'PK', 'D', 'UQ') 
UNION 
SELECT DISTINCT column_name AS [name] FROM Database1.information_schema.[columns]
UNION
SELECT DISTINCT [name] FROM Database2.[dbo].[sysobjects] WHERE xtype not IN ('F', 'S', 'PK', 'D', 'UQ') 
UNION 
SELECT DISTINCT column_name AS [name] FROM Database2.information_schema.[columns]
...
) AS UnionTable

将结果复制并粘贴到文本文件中。

为数据库对象名称创建发音

使用与上面列出的相同的格式进行发音。创建这些的简单方法是使用正则表达式搜索和替换功能。在SQL Server Management Studio或Visual Studio中,以下(非标准)正则表达式将为两个单词的混合大小写名称创建发音。

Find: ^{[A-Z][a-z]+}{[A-Z][a-z]+}$
Replace: \0\\\1-\2

请检查发音并清理任何看起来不对的东西。对于缩写词,ASP 变成 `A.S.P.'。也要保留这个列表。如果您决定为其他编程语言创建词汇表,则可能会包括这些单词,如果您是数据库开发人员。

创建一个文本文档,其中包含所有 SQL 代码(视图、存储过程等)

SQL Server:

SELECT * FROM Database1.dbo.[View] UNION SELECT * FROM Database1.dbo.Routine UNION
SELECT * FROM Database2.dbo.[View] UNION SELECT * FROM Database2.dbo.Routine 
...
ORDER BY [Name]

去除注释和字面字符串。正则表达式搜索和替换对此非常有效。

建立你的词汇量

安装NaturallySpeaking并创建一个新用户(如果尚未创建)。

创建新的词汇表

点击"NaturallySpeaking | 管理词汇表..."。点击"新建"。给词汇表取一个适当的名称,例如"SQL"。基于"基本通用-空口述"。当它询问您是否要扫描电子邮件或文档时,请单击取消。

导入单词

点击"单词 | 导入"。添加您创建的两个单词列表并导入它们。

适应写作风格

点击"工具 | 准确性中心"。点击"从您的文档中添加单词到词汇表"。使用默认设置,并选择包含您的代码的文档。

尝试口述一些SQL

您可能想要口述的第一件事是SELECT语句。请记住,在NaturallySpeaking中,SELECT是用于开始选择文本的命令。因此,您需要在口述它之前说"Cap",以便NaturallySpeaking不会混淆。就这样。至少足以让您开始。根据需要修改您的单词列表、发音和单词属性。还有其他一些可以提高准确性和口述速度的方法。当我想到它们时,我将编辑此帖子并在此处添加它们。

在SQL Server Management Studio中口述的提示

如果您在SQL Server Management Studio中口述,可能会注意到非常慢的性能。尝试以下方法以缓解这种情况:

  • 关闭所有工具栏(创建宏以访问常用功能)
  • 尽可能少打开窗格和文档
  • 一次只保留一个数据库打开
  • 完成后隐藏搜索结果(Ctrl+R)
  • 如果所有其他方法都失败了,请关闭并重新打开管理工作室
  • 在编辑窗口中显示制表符,以便更轻松地格式化您的SQL。

SQL Server 2000的查询分析器没有这些问题。


4
做得非常出色,这正是 SO 应该被使用的方式之一(但通常不够频繁)。 - James Curran
1
我甚至不敢尝试超越这个答案。您先生,是SQL口述的大师。 - TheSoftwareJedi
6
如果他没有在提问的同时回答自己的问题,那我会更加印象深刻。 - Sailing Judo
9
这只是我想传达的信息。我遵循了 StackOverflow 的指南:http://stackoverflow.com/questions/18557/how-does-stackoverflow-work-the-unofficial-faq#119658 - Keith Walton
2
@SailingJudo:别来捣乱了。这是被鼓励的。 - Lightness Races in Orbit
显示剩余2条评论

5

http://voicecode.io

最近我发布了VoiceCode,这是我为解决自己的RSI问题所创建的一种语音编码解决方案。

我用它来在Sublime Text和Xcode中编码,也用于一般的电脑使用。它适用于任何语言包括SQL。这个解决方案的优点在于,所有命令都可以链接成“命令短语”,因此您不必像其他语音命令解决方案那样在每个单独的命令之间停顿。

它内置了对所有标准变量名称格式(蛇形命名、驼峰式命名等)的支持,内置了对每个键盘快捷键的所有排列组合的命令(即command-shift-5、command-option-shift-T等),有光标移动命令、应用程序切换命令、窗口切换命令、符号组合命令如"=>", "||", ">="等等。还有更多的命令。而且添加您自己的自定义命令也非常容易。


目前它是基于Mac的Dragon Dictate,但Windows和Linux正在开发中。 - Ben Meyer
@BenMeyer 你在Linux上使用哪个ASR引擎? - Franck Dernoncourt
你还在维护它吗?你能更新你的答案到最新的吗? - John Zabroski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接